【Unity】スクリプトでオブジェクトを見つける

前回までの記事ではスクリプトをアタッチしたGameObjectしか操作できませんでした。そこで、Scene上には追加されているが、スクリプトはアタッチしてないGameObjectを取得する方法について書いていこうと思います。

GameObjectを見つける方法

GameObjectを取得する方法としては、3つあります。

  • ・GameObject.Find()を使用する
  • ・GameObject.FindGameObjectWithTag()を使用する
  • ・public Gameobjectとしてプロトタイプ宣言しておき、Inspectorから指定する

 

大きく分けてこの3つがあります。それでは、それぞれの使い方について説明していきます。

 

GameObject.Find()

GameObject.Find()は引数にScene上に存在するGameObjectの名前をダブルクォーテーションで囲ったものを指定することで取得出来ます。

例えば、Scene上にこのようにCubeが設置されているとします。

スクリーンショット 2015-09-17 19.51.46

このとき設置されているCubeを取得するためには以下のように記述すると取得できます。

見つけるオブジェクトを直接見つけるため直感的でわかりやすいですが、このメソッドは動作が重めなため、Update()の中ではできるだけ動かさないようにしたほうがよいです。使用するときはStart()の時にprivate変数等で確保しておくのがよく使われます。

 

GameObject.FindGameObjectWithTag()

UnityはGameObjectに対してTagを設定することが出来ます。Tagの設定はスクリプトで直接していするか、InspectorのTagから設定します。ちなみにデフォルトではUntaggedが指定されています。GameObject.FindGameObjectWithTag()はこの指定したTagを検索し、その結果見つけたGameObjectを返します。

この例では、PlayerというTagがついたGameObjectを取得しています。

また、Tagは複数のオブジェクトにつけられるため、複数のオブジェクトを一度に取得したい場合があります。その場合、取得したいオブジェクトに同じTagを設定し、 GameObject.FindGameObjectsWithTag()メソッドを使用することで一度に取得することが出来ます。このメソッドは返り値が配列になっているため、注意が必要です。

 

public Gameobjectとしてプロトタイプ宣言しておき、Inspectorから指定する

UnityはスクリプトにGameObjectやfloatなどの変数に対してpublicを付与すると、Inspector上から値を変更することが出来ます。GameObjectの場合、Scene上やPrefabを指定することで、起動直後からすでにGameObjectを取得している状態を確保出来ます。この機能の利点としては、はじめから指定しているため、Findによる検索が行われないため、比較的に軽い処理になります。ただし、その分メモリを使用してしまうため注意が必要です。

またFindによる検索では、GameObject自体がアクティブになっていない状態だと、検索することが出来ません。しかし、Inspector上で指定する場合、アクティブにかかわらずGameObjectを操作できるため、SetActiveがfalseの状態のものをtrueにして表示するといったことも可能です。

プロトタイプ宣言した場合、このようにInspector上に表示されます。

スクリーンショット 2015-09-24 19.41.06

GameObjectにアタッチした後にプロトタイプ宣言のGameObjectを指定すると、アタッチしたものだけに適用されます。また、Assets上のスクリプト本体に指定した場合、ずっと指定が保持されます。

 

終わりに

今回はGameObjectを見つける方法を3種類書いてみました。自分がよく使う方法としては、マネージャー的なオブジェクトはStartの時にFindで探し、表示非表示を繰り返すようなものはInspector上から指定して使うことが多いです。

Insulatorから指定するのは便利ですが、大量のオブジェクトを確保しようとするとプロトタイプ宣言の箇所がとても多くなってしまうので、そこは親オブジェクトだけInspector上から取得し、子オブジェクト等は親オブジェクトから取得するといった工夫をする必要があります。

 

 

次回は、この見つけたGameObjectにアタッチされているスクリプトにアクセスする方法について書いていこうと思います。

 

 

では、また。

 

●この記事を書いた人