Я довольно новичок в создании сетей единства и сети.Unity Networking - функция [command] выполняется, когда она не должна быть
Игра: У меня есть 2 игрока в многопользовательской игре, где каждый игрок может стрелять.
Проблема:
Code 1 делает оба игрока стрелять (в принимающей игры только), когда хост игрок нажмите клавишу ПРОБЕЛ. Клиент-клиент не может снимать с игры клиента.
Примечание: if (Input.GetKeyDown (KeyCode.Space))
находится внутри метода CmdShoot.
Код 2 выполняется правильно. Хост может снимать в главной игре, и клиент может снимать с игры клиента.
Примечание: if (Input.GetKeyDown (KeyCode.Space))
находится вне метода CmdShoot для кода 2.
Вопрос: В коде 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);
}
Это имеет смысл! Однако, в коде 1, хост И клиент будет стрелять, если хост нажимает пробел! Клиент не стреляет каждый раз. Клиент снимает примерно каждые 5-7 пробелов. –
Я считаю, что скорость передачи по сети регулирует скорость отправки CmdShoot() на клиенте. Для хоста он проверяет каждый раз, когда вызывается Update(), но клиентский CmdShoot() может вызываться каждые 25 мс или около того (не помните значения по умолчанию для скорости передачи по сети). – LapisLazuli
Но почему игрок-клиент стреляет, когда хост нажимает пробел? Я явно говорю, что он не запускает CmdShoot, если это не локальный игрок с 'if (! IsLocalPlayer)' –