2016-06-28 18 views
0

ユニティネットワーキングとネットワーキングそのものはかなり新しいです。ユニティネットワーキング - [コマンド]機能が実行されていないときに実行する

ゲーム: 私は各プレーヤーが撮影できる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では、ホストがスペースバーを押していると、ホストANDクライアントが撃ちます!クライアントは毎回撃つわけではありません。クライアントは、約5-7スペースバープレスごとに撮影します。 –

+0

私はネットワークの送信レートがクライアント上のCmdShoot()の送信レートを抑制していると考えています。ホストの場合は、Update()が呼び出されるたびにクライアントのCmdShoot()が呼び出されるたびにチェックされます(ネットワーク送信レートのデフォルト値は覚えていません)。 – LapisLazuli

+0

しかし、ホストがスペースバーを押したときにクライアントプレーヤーが撮影する理由は何ですか? 'if(!isLocalPlayer)'を持つローカルプレイヤーでない場合は、CmdShootを実行しないよう明示的に指示します。 –

関連する問題