ユニティネットワーキングとネットワーキングそのものはかなり新しいです。ユニティネットワーキング - [コマンド]機能が実行されていないときに実行する
ゲーム: 私は各プレーヤーが撮影できる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);
}
これは意味があります。しかし、コード1では、ホストがスペースバーを押していると、ホストANDクライアントが撃ちます!クライアントは毎回撃つわけではありません。クライアントは、約5-7スペースバープレスごとに撮影します。 –
私はネットワークの送信レートがクライアント上のCmdShoot()の送信レートを抑制していると考えています。ホストの場合は、Update()が呼び出されるたびにクライアントのCmdShoot()が呼び出されるたびにチェックされます(ネットワーク送信レートのデフォルト値は覚えていません)。 – LapisLazuli
しかし、ホストがスペースバーを押したときにクライアントプレーヤーが撮影する理由は何ですか? 'if(!isLocalPlayer)'を持つローカルプレイヤーでない場合は、CmdShootを実行しないよう明示的に指示します。 –