2017-09-12 21 views
0

今、私はマルチプレイヤーゲームをプレイしています。プレーヤーは、一定量のバブルを持つ他のプレイヤーに発射物を発射します。一度プレイヤーがすべての泡を失うと、彼らは負けます。UNETの他のプレイヤーの子オブジェクトを破壊するには?

以前の問題は、1つの画面で最初のプレーヤーが2番目のプレーヤーのバブルを撃つことができたということでしたが、2番目のプレーヤーの画面上のすべてのバブルがポップされるわけではないため、何とかネットワーク。

私が見ている問題は、NetworkServer.DestroyがNetworkIdentityによって破壊しようとするGameObjectを見つける必要がありますが、ルートPlayer GameObjectだけがNetworkIdentityコンポーネントを持っていることです。プレーヤーの子オブジェクトの破棄を同期できる最善の方法は何ですか?

+0

私はネットワークに精通していませんが、ここでは解決策を提案しています。 https://docs.unity3d.com/Manual/UNetActions.html 各子オブジェクトに固有の非ネットワークIDを付与し、リモートアクション呼び出しを行うことができます(リンクを参照)。これにより、各クライアント/サーバーはオブジェクトを破壊し、一種の独自のNetworkServer.Destroy呼び出しを作成します。 – Doh09

答えて

0

https://unity3d.com/fr/learn/tutorials/topics/multiplayer-networking/コースは、あなたが説明するゲームと非常に似ています。それは発射された弾丸に付いているBulletスクリプトを持っています。弾丸が何かに触れた場合、それがプレーヤーかどうかを確認し、ダメージを与えます(プレイヤープレハブにはHealthスクリプトが添付されています)。

using UnityEngine; 
using System.Collections; 

public class Bullet : MonoBehaviour { 

    void OnCollisionEnter(Collision collision) 
    { 
     var hit = collision.gameObject; 

     /* Code below is from the original example 
     var health = hit.GetComponent<Health>(); 
     if (health != null) 
     { 
      health.TakeDamage(10); 
     }*/ 

     var bubble = hit.GetComponent<BubbleBehavior>(); 
     if (bubble != null) 
     { 
      bubble.Popped(); // Implement a Popped function doing the magic 
     } 

     Destroy(gameObject); 
    } 
} 

は、あなたのケースでは、あなたは同じことを行うが、その代わりに触れたオブジェクトがプレーヤーであるかどうかをチェックするのは、単にそれがバブルであるかどうかをチェックし、あなたが触れたバブルからやりたいことができます。

元の例では、健康状態(「SyncVar」)が同期されますが、残った泡の数を同期させることができます。

+0

これでは、ネットワークビヘイビアをバブルに追加していますか?すべてのネットワーク動作を個別に生成する必要はありませんか? – zavtra

+0

バブルはすでにネットワークの動作をしているプレーヤーのGameObjectの子です。そのため、「単純な」MonoBehaviorは大丈夫です。バブルのポップが同​​期する必要があるため、触れられたバブルは親のネットワーク動作のコマンドを呼び出すことができます。私はこれがうまくいくと思います。あなたがまだそれを読んでいないなら、私は実際に10、11、12、13の部分にリンクしているチュートを見てみることをお勧めします。 –

関連する問題