2016-06-28 63 views
0

我是相當新的團結網絡和網絡本身。Unity網絡 - [命令]功能執行時,它不應該

遊戲: 我有2個玩家多人遊戲,每個玩家可以射擊。

問題:

代碼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()時都會檢查,但可能每隔25 ms調用一次客戶端的CmdShoot()(不記得網絡發送速率的默認值)。 – LapisLazuli

+0

但是爲什麼客戶端播放器在主機按下空格鍵時會拍攝?我明確地告訴它不運行CmdShoot,如果它不是具有'if(!isLocalPlayer)'的本地播放器' –