2016-08-10 9 views
0

私はユニティに新しいスクリプトを作成するたびに取得したり、追加する一般的な方法は、私は常にすべてのコンポーネントのためのチェックの束をやってしまう私のスクリプトは次のように、依存:だからユニティ:コンポーネント

SpriteRenderer sr = gameObject.GetComponent<SpriteRenderer>(); 

if(sr == null) 
     sr = gameObject.AddComponent<SpriteRenderer>() as SpriteRenderer; 

私は周りに遊んで、コンポーネントでこれを行うための一般的な方法を作ることを決めた、私は自分の新しいスクリプトに単に追加した次のコードを考え出した。そこにこのアプローチの主要な欠点がある、または同じタスクを完了するために他のいくつかのより良い方法がある場合は、おそらく使用している場合

T GetOrAddComponent<T>() where T : Component 
    { 
     T component = gameObject.GetComponent<T>(); 

     if (component == null)  
      component = gameObject.AddComponent<T>() as T; 

     return component; 

    } 

は、私はそれを試してみたと機能がうまく動作しますが、私は思ったんだけど既存の方法私は気づいていないか、または他の方法でメソッドを作成しています。 if文あなたがしたい場合は、1でそれをすべて行うことができ

+1

は目を覚ましスタート/でそれを行うと、何も心配することはありません。 – Everts

+0

私は 'return o.Get ()?? o.Add () '(かなり' Tが冗長であることを確かめてください) – SimpleVar

+0

これはECSゲームエンジンのための全くパターンではありません。 – Fattie

答えて

-2

SpriteRenderer sr; 

if(gameObject.GetComponent<SpriteRenderer>()) 
    sr = gameObject.GetComponent<SpriteRenderer>(); 
else 
    sr = gameObject.AddComponent<SpriteRenderer>() as SpriteRenderer; 

をあなたは潜在的に二回GetComponentコールを作ることになりますが、あなたはより良いコードの構造を好きならそれが可能。私は個人的にあなたがそれをやっているやり方が一番だと思います。あなたがシーン負荷時やstart機能でこれをやっているよう

、より簡潔にするけれども、あなたがいる限り、変数component

public T GetOrAddComponent<T>() where T : Component 
{ 
    if (gameObject.GetComponent<T>()) 
     return gameObject.GetComponent<T>(); 
    else  
     return gameObject.AddComponent<T>() as T; 
} 

でそれを格納するために持つのコンポーネントを直接代わりに返すことができますパフォーマンスの違いはありません。

+0

OPに1回の呼び出しがある間に、GetComponentのダブルコールをお勧めします。 – Everts

+0

さまざまなアプローチを示しています。 –

2

GetComponentメソッドは実際にはシステムに課税しています。モバイル用に開発している場合は、あまりにも多くの場合、読み込み時間に目立った遅れが生じることがあります。

私は個人的にRequireComponentメソッドを使用します。次に、スクリプトはGameObjectに追加された瞬間にコンポーネントを自動的に追加します。次に、コンポーネントの名前をインスペクタのスクリプトオブジェクトのフィールドに手動でドラッグします。

例:

using UnityEngine; 

// PlayerScript requires the GameObject to have a RigidBody component 
[RequireComponent (typeof (RigidBody))] 
public class PlayerScript : MonoBehavior { 
    [SerializeField] 
    private RigidBody rb; 
... 
} 
+0

私は実際にRequirecomponentメソッドを使ったことはありませんでしたが、その利点をうまく説明しました。それを使用した後、私は単純に単一のGetComponent呼び出しを行うことができ、Componentを見つけることが保証されるので、AddComponentに対するチェックや呼び出しは必要ありません。 – user3476873