2017-03-28 9 views
0

非常に簡単なマルチプレイヤーシューティングになると私は自分のPlayerプレハブに次の階層を持っています。階層クライミングと降順ユニティ

Hierarchy

それはこのように動作する、Controllerオブジェクトはプレーヤーの入力を扱うスクリプトを持って、PlayerShipオブジェクトは、スクリプトなどを撮影し、移動、方向転換のすべてを持っており、Cameraはそれが聞こえるだけのようで、Aカメラを動かすためのスクリプトがいくつか付いています。

新しいPlayerがインスタンス化されるとき、Controlスクリプトは関連するPlayerShipを見つける必要があります。これは、次のコードを使用して達成することができる

_playerShip = gameObject.transform.parent.gameObject.transform.FindChild("PlayerShip").GetComponent<PlayerShip>(); 

正常に動作し、唯一のものは非常に、不格好洗練と脆いに見えるように私には、あります。したがって、私は同じことを達成するためのより良い、より効率的、あまり醜い方法があるのだろうかと思いますか?これが呼び出されていない場合は

答えて

0

すべてのフレームには、このことを考慮してください。

_playerShip = GameObject.Find("PlayerShip").GetComponent>PlayerShip>(); 

がここに上記について詳しく読む:https://docs.unity3d.com/ScriptReference/GameObject.Find.html

これに内のすべてのフレームの外観呼び出されている場合: https://docs.unity3d.com/ScriptReference/GameObject.FindWithTag.html

どちらか一方がわかりやすいはずです。

編集:私は誤解している可能性があります。コントローラがplayerShipの親であるように階層を並べ替えるでしょうか?そうすれば、親を通って兄弟に行くのではなく、子供だけを見ることができるはずです。まず

1

_playerShip = gameObject.transform.parent.gameObject.transform.FindChild("playerShip").GetComponent<PlayerShip>(); 

は冗長です。つまり、フォルダ名を行うだけのよう

_playerShip = gameObject.transform.parent.FindChild("playerShip").GetComponent<PlayerShip>(); 

あるいは使用「/」に減少させることができます。

_playerShip = GameObject.Find("Player/playerShip").GetComponent<PlayerShip>(); 

さて、代わりにオブジェクトをインスタンス化し、後でそれを探して、あなたが実際にそれをインスタンス化し、同時に参照を取得することができます。

GameObject obj = Instantiate(prefab,Vector3.zero,Quaternion.identity) as GameObject; 
_playerShip = obj.GetComponent<PlayerShip>(); 

それはあなたがNetwork.Instantiateでインスタンス化したネットワークゲームの場合:今

GameObject obj = Network.Instantiate(prefab,Vector3.zero,Quaternion.identity,0) as GameObject; 
_playerShip = obj.GetComponent<PlayerShip>(); 

ControlスクリプトにPlayerShip参照を送信します。