Unity Unet Настраиваете синхвар из действия игрока? - Что я делаю не так?

Я пытаюсь сделать что-то довольно простое, как это должно происходить в играх довольно часто. Я разрешаю игрокам создавать кубы в мире, а затем, когда игрок нажимает на куб, текстовое значение куба (и связанный с ним счетчик syncvar) изменяются.

Однако это работает ТОЛЬКО при попытке сделать это из комбинации сервер/клиент. Что я делаю не так? Я поражен тем, что не могу найти туториалы по этому поводу, потому что это кажется повсеместным в играх.

SpawnCube.cs (прикрепляется к каждому игроку)

 if (Input.GetKeyDown (KeyCode.Mouse1)) {
            RaycastHit hit;
            if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 1000f, layers)) {

                SpawnedCubeController scc = hit.collider.gameObject.GetComponent<SpawnedCubeController>();
                if (scc != null) {
                    print ("HIT A CUBE");
                    scc.CmdAdjustCounter (1);
                } else {
                    Vector3 hitPos = new Vector3(hit.point.x, hit.point.y + .5f, hit.point.z);

                    Quaternion look = Quaternion.LookRotation(hitPos - this.transform.position);
                    CmdSpawnCube(hitPos, look);
                }


            }
        }

А потом мясо находится в SpawnedCubeController.cs, который привязан к порожденному кубу.

public class SpawnedCubeController : NetworkBehaviour {

[SyncVar(hook = "OnChangeCounter")]
public int counter = 10;
private TextMeshProUGUI text;

public void OnChangeCounter(int newCount) {
    if (text == null)
        text = gameObject.GetComponentInChildren<TextMeshProUGUI> ();

    text.text = "" + newCount;
}

[Command]
public void CmdAdjustCounter(int amount) {
    this.counter -= amount;

    if (this.counter <= 0) {
        Destroy (this.gameObject);
    }

    if (isServer) 
        RpcUpdateCounter (counter);
}

[ClientRpc]
public void RpcUpdateCounter (int amount) {
    text.SetText ("" + amount);
}

В моем примере каждый может создавать и вращать кубы просто отлично, однако я не могу на всю жизнь заставить всех иметь возможность выполнять команду.

Я даже не думаю, что RpcUpdateCounter необходим, так как хук должен управлять этим? Несмотря на это, нажатие куба на любом компьютере, кроме сервера, никогда не запустит команду

Спасибо!


person stackdev    schedule 28.06.2018    source источник


Ответы (1)


Проблема здесь в том, что вы пытаетесь выполнить команду из объекта без полномочий (я почти уверен, что если вы проверите журналы консоли на клиенте, предупреждение появится при запуске команды).

Единственными объектами на вашей сцене, которые по умолчанию имеют права доступа, являются игровые объекты вашего игрока, поэтому командная функция должна быть на них.

Другой способ сделать это — дать полномочия кубам перед выполнением команды и взять их на себя, когда они завершат действие.

Предоставить права доступа неигровым объектам: https://unity3d.com/es/learn/tutorials/topics/multiplayer-networking/handling-non-player-objects

person Lotan    schedule 17.07.2018