Unity Unet Настройка синквара из действий игрока? - Что я делаю неправильно? - PullRequest
0 голосов
/ 28 июня 2018

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

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

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 необходим, поскольку хук должен справиться с этим? В любом случае, нажатие на куб на любом компьютере, кроме сервера, никогда не запускает команду

Спасибо!

1 Ответ

0 голосов
/ 17 июля 2018

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

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

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

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

...