Unity Networking - [command]函数在不应该执行的时候执行

本文关键字:执行 候执行 不应该 Networking command 函数 Unity | 更新日期: 2023-09-27 17:52:59

我对unity networking和networking本身相当陌生。

游戏:我有一个2人多人游戏,每个玩家都可以射击。

问题:

代码1使双方玩家射击(仅在主机游戏中),当主机玩家按空格键。客户端玩家不能在客户端游戏中投篮。

注意:if (Input.GetKeyDown (KeyCode.Space))在CmdShoot方法中。

代码2正确执行。主机可以在主机游戏中射击,客户端可以在客户端游戏中射击。

注:if (Input.GetKeyDown (KeyCode.Space))在代码2的CmdShoot方法之外。

问题:在代码1中,为什么客户端不能射击,为什么主机让两个玩家都射击?

代码1:

// Update is called once per frame
void Update () {
    if (!isLocalPlayer) {
        return;
    }
    CmdShoot ();
}
[Command]
void CmdShoot(){
    if (Input.GetKeyDown (KeyCode.Space)) {
        GameObject force_copy = GameObject.Instantiate (force) as GameObject;
        force_copy.transform.position = gameObject.transform.position + gameObject.transform.forward;
        force_copy.GetComponent<Rigidbody>().velocity = gameObject.transform.forward * force.GetComponent<Force>().getSpeed();
        NetworkServer.Spawn (force_copy);
        Destroy (force_copy, 5);
    }
}
代码2:

// Update is called once per frame
void Update () {
    if (!isLocalPlayer) {
        return;
    }
    if (Input.GetKeyDown (KeyCode.Space)) {
        CmdShoot ();
    }
}
[Command]
void CmdShoot(){
    GameObject force_copy = GameObject.Instantiate (force) as GameObject;
    force_copy.transform.position = gameObject.transform.position + gameObject.transform.forward;
    force_copy.GetComponent<Rigidbody>().velocity = gameObject.transform.forward * force.GetComponent<Force>().getSpeed();
    NetworkServer.Spawn (force_copy);
    Destroy (force_copy, 5);
}

Unity Networking - [command]函数在不应该执行的时候执行

[Command]标签告诉客户端想要在服务器上执行这个函数。

在代码1的情况下,您的代码调用CmdShoot()在服务器上执行,然后检查服务器是否按住空间(因此只有主机能够拍摄一切,客户端(s)不能拍摄)。

在代码2的情况下,你的代码首先检查本地程序是否按住空格键(独立于主机或客户端)。如果本地程序持有空格键,则它调用服务器上的CmdShoot()