2017-05-30 4 views
1

私はUnityの2人のプレーヤーのための少しの3D-Gameに取り組んでいます。ゲームのコンセプトは、リングを飛ぶ必要があるスペース競争です。追加機能として、私はプレーヤーに他のプレーヤーを押す能力を与えたいと思う。だから、彼らが特定のボタンを押すと、彼らの宇宙船は、他のプレーヤーに当たって少し戻ってくる「衝撃波」を送るべきです。私はこれをPhysics.OverlapSphereとAddExplosionForce関数で実現したかったのです。 ネットワークの機能を持たないローカルの追加シーンでこれをテストしたところ、とてもうまく機能しました。Unity AddExplosionForceはネットワークマネージャーと同期します

私は実際のゲームにこの機能をインポートしたかったので、このエフェクトがローカルプレイヤーに当たっただけで、他のプレイヤーには当てられないという問題があります。もう1つは変わっているだけで、彼のポジションは変わっていません(他のゲームでもそうではありません)。

私はすでにNetwork Managerを使用していますが、「wasd」との通常の動きは両方のプレーヤーで機能しています。私は(それはちょうど標準の例です)を使用しているコードに続いて

Vector3 explosionPos = transform.position; 
Collider[] colliders = Physics.OverlapSphere(explosionPos, radius); 
foreach (Collider hit in colliders) 
{ 
    Rigidbody rb = hit.GetComponent<Rigidbody>(); 

    if (rb != null) 
    rb.AddExplosionForce(power, explosionPos, radius, 3.0F); 
} 

誰かが知っている、私はネットワークの事のために追加する必要が何かありますか?

+0

物理学を計算する権威者がなければ、達成しようとしている効果が非常に難しいと感じています。ネットワークの待ち時間のために、プレイヤー1(能力を起動する)はプレイヤー2がプレイヤー2とは異なる場所にいると見なします。その爆発をプレイヤー2に送信すると、異なる量の力が適用されますゲームのデシンクとあなたはラバーバンディングを取得します。どのクライアントが正しいですか?プレーヤー2のクライアントは常にプレーヤー2の位置が正しいですか?プレイヤー1は能力を使用しているためですか? – Draco18s

答えて

1

提供されたコードで[ClientRpc]機能を実行する[コマンド]機能を作成してみてください。

[Command] 
void CmdOnExplosion(float power, Vector3 explosionPos, float radius, float upwardsMod) 
{ 
    RpcExplode(power, explosionPos, radius, upwardsMod); 
} 

[ClientRpc] 
void RpcExplode(float power, Vector3 explosionPos, float radius, float upwardsMod) 
{ 
    Collider[] colliders = Physics.OverlapSphere(explosionPos, radius); 

    foreach (Collider hit in colliders) 
    { 
     Rigidbody rb = hit.GetComponent<Rigidbody>(); 

     if (rb != null) 
     { 
      rb.AddExplosionForce(power, explosionPos, radius, 3.0F); 
     } 
    } 
} 
関連する問題