web-dev-qa-db-ja.com

GameObject.FindObjectOfType <>()vs GetComponent <>()

私はいくつかのチュートリアルシリーズを行っており、これら2つが非常に似た方法で使用されるのを見てきました。誰かがそれらの違いを説明でき、可能であれば、一方を他方の代わりに使用する場合の例を示してほしいと期待していました(実際にそれらが類似していると想定) !)。

private LevelManager levelManager;

void Start () {
    levelManager = GameObject.FindObjectOfType<LevelManager>();
}

そして

private LevelManager levelManager;

void Start () {
    levelManager = GetComponent<LevelManager>();
}
12
JonHerbert

使いたくない

_void Start () {
    levelManager = GameObject.FindObjectOfType<LevelManager>();
}
_

それはしばしば。特にstartについて

しかし、あなたの質問に答えるために、これらの2つの機能は実際にはあまり似ていません。 1つは外部呼び出し、もう1つは内部呼び出しです。
では、違いは何ですか?

  1. _GameObject.FindObjectOfType_は、シーン全体を対象とした検索であり、答えを得るのに最適な方法ではありません。実際、Unityは非常に遅いと公に述べています nity3D APIリファレンス-FindObjectOfType

  2. GetComponent<LevelManager>();はローカル呼び出しです。この呼び出しを行っているファイルが何であっても、それがアタッチされているGameObjectのみを検索します。そのため、インスペクターでは、ファイルは同じインスペクターウィンドウで他のもののみを検索します。メッシュレンダラー、メッシュフィルターなど、または子オブジェクト。ただし、これについては別の呼びかけがあると思います。
    また、最初に参照する場合は、これを使用して他のGameObjectのコンポーネントにアクセスできます(以下を参照)。

解決:

tag関数でawake検索を実行することをお勧めします。

_private LevelManager levelManager;

void Awake () {
    levelManager = GameObject.FindGameObjectWithTag ("manager").GetComponent<LevelManager>();
}
_

タグを追加して、GameObjectにスクリプトLevelManagerをタグ付けすることを忘れないでください。 (ゲームオブジェクトをクリックし、インスペクタの上部を見て、タグ->タグを追加をクリックします

あなたはそれを行うか、または行うことができます

_public LevelManager levelManager;
_

そして、ゲームオブジェクトをインスペクターのボックスにドラッグします。

どちらのオプションも_GameObject.FindObjectOfType_を実行するよりもはるかに優れています。

お役に立てれば

15
iSkore

2つの違いがあります。

1.)GetComponent<T>同じゲームオブジェクトに接続されている場合にのみコンポーネントを見つけます。 GameObject.FindObjectOfType<T>一方、階層全体を検索し、一致する最初のオブジェクトを返します!

2.)GetComponent<T>は、Componentを継承するオブジェクトのみを返しますが、GameObject.FindObjectOfType<T>は本当に気にしません。

5
walther