0

我对统一网络和网络本身还很陌生。

游戏: 我有 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);

}
4

1 回答 1

0

[Command]标签告诉客户端想要在服务器上执行此功能。

在代码 1 的情况下,您的代码调用CmdShoot()在服务器上执行,然后检查服务器是否正在按住 Space(因此只有主机能够拍摄所有内容而客户端根本无法拍摄)。

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

于 2016-06-28T05:25:21.807 回答