2017-05-12 7 views
1

トリガーまたはコリジョンがある場合、そのgameObjectをターゲットにして、接続されている各スクリプトのプロパティにアクセスできます。私はこれのようにすることができたが、より良い方法の権利がなければならないことを知っている?GameObjectsのプロパティがトリガー/コリジョンを起こしたときにターゲットを設定する最も簡単な方法は?

ここで、 "BoxManager"というラベルのついたゲームオブジェクトに貼り付けられたスクリプトをターゲットにし、BoxManagerのプロパティ "isHeld"をターゲットにしたいと考えています。残りの部分を行うより良い方法はありますか?

void OnTriggerStay2D(Collider2D target) 
{ 
    if (target.gameObject.tag == "Box") 
    { 
     if (target.attachedRigidbody.GetComponent<BoxManager>().isHeld == false) 
     { 
      target.attachedRigidbody.AddForce(transform.right * thrust); 
     } 
    } 
} 
+0

:以下

は全体のスクリプトの例は、どのように見えるかですか?メンバーにアクセスするためのコンポーネントの取得は、通常の方法です。 – Everts

答えて

2

まず、target.attachedRigidbody.GetComponent<BoxManager>()は完全に不要で冗長です。私は人々がtarget.attachedRigidbody.gameObject.transform.GetComponent<BoxManager>();のようなコードでさらに悪化するのを見てきました。それらはすべて1つのGameObjectに接続されているため、同じことをしています。

あなたはそれをtarget.GetComponent<BoxManager>();にすることができます。衝突時に別のスクリプトを取得するためにすべての時間をGetComponent機能を使用するためとして、


、それは大丈夫です。それは、スクリプトの中で変数にアクセスする前に、衝突中にGameObjectに接続された別のスクリプトを取得する最も簡単な方法です。

OnTriggerStay2Dでは、GetComponentを実行する必要がありますが、迷惑をかけることがあります。チェックするスクリプトがたくさんあるときは、もっと迷惑になります。

トリッキーな方法はDictionaryを使用することです....

void OnTriggerStay2D(Collider2D target){} 

そして、あなたは衝突後、ターゲットからあなたBoxManagerスクリプトにアクセスする必要があります。

これはあなたのコリジョン機能です。 Start関数では、辞書を初期化し、Collider2Dをキーとして使用し、値としてBoxManagerを使用します。

ゲームプレイ中にCollider2DBoxManagerのGameObjectsをインスタンス化して破棄すると、この辞書が更新されます。

Dictionary<Collider2D, BoxManager> scriptID = new Dictionary<Collider2D, BoxManager>(); 

その後、あなたの衝突関数内、BoxManagerコンポーネントを取得するためのキーとしてTryGetValuetarget変数を使用します。このような

何か。実際に

void OnTriggerStay2D(Collider2D target) 
{ 
    if (target.CompareTag("Box")) 
    { 
     BoxManager result; 
     scriptID.TryGetValue(target, out result); 

     if (!result.isHeld) 
     { 

     } 
    } 
} 

、あなたの場合%このオブジェクトは、それに接続BoxManagerスクリプトを持っていることを100確認、あなたが行うことができTryGetValue機能なしで1行のコードで:

void OnTriggerStay2D(Collider2D target) 
{ 
    if (target.CompareTag("Box")) 
    { 
     BoxManager result = scriptID[target]; 
    } 
} 

上記のtarget.CompareTagを使用すると、BoxManagerスクリプトを使用せずにオブジェクトを検出する機会を減らすことができます。 target.gameObject.tagtarget.CompareTagに変更したことに注目してください。 target.CompareTagを使用することをお勧めします。ガードとしてtarget.CompareTag("Box")を使用しているときにTryGetValueContainsKey機能を使用する必要がないように

は今のコードはBoxManager result = scriptID[target];で簡素化されました。何の残りの部分を行うには

Dictionary<Collider2D, BoxManager> scriptID = new Dictionary<Collider2D, BoxManager>(); 
public BoxManager boxManagerPrefab; 

void Start() 
{ 
    //Register your BoxManager instances to the Dictionary 
    for (int i = 0; i < 5; i++) 
    { 
     BoxManager bc = Instantiate(boxManagerPrefab) as BoxManager; 
     //Use Isntance ID of the Script as id 
     Collider2D cld2D = boxManagerPrefab.GetComponent<Collider2D>(); 
     scriptID.Add(cld2D, bc); 
    } 
} 

void OnTriggerStay2D(Collider2D target) 
{ 
    if (target.CompareTag("Box")) 
    { 
     BoxManager result = scriptID[target]; 

     if (!result.isHeld) 
     { 
      target.attachedRigidbody.AddForce(transform.right * thrust); 
     } 
    } 
} 
+0

私は詳細な答えを感謝します。まだいくつかのOOPのコンセプトの周りに私の頭を包み込み、私が望むものをターゲットにするより論理的な方法がなければならないことを知っていました。アドバイスをいただきありがとうございます。あなたがお勧めする正式な文書のほかに、良い統一のリソース? – Pyreal

+0

UnityはOOPではなくCBSEを使用しますが、あなたは両方を使用できます。ほとんどのことは、GameObjectにスクリプトを添付することによって行われます。 Official Unity C#チュートリアルについては、[こちら](https://unity3d.com/learn/tutorials/s/scripting)をご覧ください。あなたが本当にUnityを学びたいのであれば、それらの[プロジェクトチュートリアル](https://unity3d.com/learn/tutorials)の1つまたは複数に従うことをお勧めします。あなたはそれを行うことによって 多くを学ぶでしょう。 – Programmer

+0

彼らはあなたにユニティ固有のものを教えます。 – Programmer

関連する問題