2016-06-28 3 views
0

Я довольно новичок в создании сетей единства и сети.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); 

} 

ответ

0

[Command] тег сообщает, что клиент хочет, чтобы выполнить эту функцию на сервере.

В случае кода 1 ваш код вызывает CmdShoot() для выполнения на сервере, а затем проверяет, держит ли сервер пространство вниз (таким образом, только хост может снимать все, а клиент (и) не может снимать вообще).

В случае кода 2 ваш код сначала проверяет, удерживает ли локальная программа пробел (не зависит от хоста или клиента). Если локальная программа удерживает клавишу пробела, она вызывает на сервере CmdShoot().

+0

Это имеет смысл! Однако, в коде 1, хост И клиент будет стрелять, если хост нажимает пробел! Клиент не стреляет каждый раз. Клиент снимает примерно каждые 5-7 пробелов. –

+0

Я считаю, что скорость передачи по сети регулирует скорость отправки CmdShoot() на клиенте. Для хоста он проверяет каждый раз, когда вызывается Update(), но клиентский CmdShoot() может вызываться каждые 25 мс или около того (не помните значения по умолчанию для скорости передачи по сети). – LapisLazuli

+0

Но почему игрок-клиент стреляет, когда хост нажимает пробел? Я явно говорю, что он не запускает CmdShoot, если это не локальный игрок с 'if (! IsLocalPlayer)' –

Смежные вопросы