【问题标题】:Unity Unet Adjusting a syncvar from a player action? - What am i doing wrong?Unity Unet 从玩家动作调整同步变量? - 我究竟做错了什么?
【发布时间】:2018-12-07 07:37:16
【问题描述】:

我正在尝试一些应该很简单的事情,因为它应该经常发生在游戏中。我允许玩家在世界中生成多维数据集,然后当玩家点击多维数据集时,多维数据集的文本值(以及相关的同步变量计数器)会更改。

但是,这仅在从服务器/客户端组合尝试此操作时有效。我究竟做错了什么?无法找到这方面的教程让我大吃一惊,因为它似乎在游戏中无处不在。

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 是必要的,因为钩子应该管理这个?无论如何,在服务器以外的任何机器上单击多维数据集将永远不会运行命令

谢谢!

【问题讨论】:

    标签: unity3d networking rpc unity3d-unet unity-networking


    【解决方案1】:

    这里的问题是你试图从一个没有权限的对象执行命令(我很确定如果你检查客户端上的控制台日志,当你触发命令时会出现警告)。

    默认情况下,您的场景中唯一具有权限的对象是您的玩家游戏对象,因此命令功能应该在它们上。

    另一种方法是在执行命令之前授予多维数据集权限,并在他们完成操作时接管。

    授予非玩家对象权限: https://unity3d.com/es/learn/tutorials/topics/multiplayer-networking/handling-non-player-objects

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 2013-08-06
      • 1970-01-01
      • 2016-07-18
      • 2018-08-03
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多