Unity Networking - [command] 函数在不应该执行的时候执行
Unity Networking - [command] function executes when it is not supposed to
我对统一网络和网络本身还很陌生。
游戏:
我有 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);
}
[Command]
标签告诉客户端要在服务器上执行此功能。
在代码 1 的情况下,您的代码调用 CmdShoot()
在服务器上执行,然后检查服务器是否按住 Space(因此只有主机能够拍摄所有内容和客户端)根本无法射击)。
在代码 2 的情况下,您的代码首先检查本地程序是否按住 Space 键(独立于主机或客户端)。如果本地程序持有 space 键,那么它会调用服务器上的 CmdShoot()
。
我对统一网络和网络本身还很陌生。
游戏: 我有 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);
}
[Command]
标签告诉客户端要在服务器上执行此功能。
在代码 1 的情况下,您的代码调用 CmdShoot()
在服务器上执行,然后检查服务器是否按住 Space(因此只有主机能够拍摄所有内容和客户端)根本无法射击)。
在代码 2 的情况下,您的代码首先检查本地程序是否按住 Space 键(独立于主机或客户端)。如果本地程序持有 space 键,那么它会调用服务器上的 CmdShoot()
。