公開日:2023/05/25  更新日:2023/05/25

Unityのfind関数の使い方

 Unityのfindとはゲームオブジェクトを見つけて取得することができる関数だ。
 この記事を読む前に、C#でのスクリプトの開き方、基本的な構文の作り方、変数、演算子がわからない場合は先に以下の記事で確認してほしい。
UnityのC#の書き方
UnityのC#の変数・演算子
if文の条件分岐

 また、Unityの基礎知識や操作などがわからない場合は先に以下の記事を確認してほしい。
Unityの基礎まとめ

 find関数の使い方を紹介していく。

Find関数の使い方目次

GameObject.Find関数
Transform.Find関数
目次にもどる

GameObject.Find関数

 GameObject.Find関数はゲームオブジェクトを取得することが可能だ。
 以下のようにスクリプトのStartメソッドに記述しよう。今回探すゲームオブジェクトはCubeで名前はCube1とする。Cube1以外にもう一つゲームオブジェクトを作成し、以下のスクリプトをアタッチして再生しよう。
 GameObject a = GameObject.Find("Cube1");としてCube1のゲームオブジェクトを取得してaに代入している。
 次の文は以下の通り。
 Cube1のゲームオブジェクトのコンポーネントのTransformを取得してbに代入している。
 Vector3 c = b.position;でbのTransformの位置をcに代入。
 c.x += 3f;でcのxの値に3を加算し、b.position = c;でbに代入する。再生するとcube1がx方向に3移動する。

 だが、GameObject.Findには弱点がある。まず、全てのアクティブなゲームオブジェクトを調べるため重い点に注意しよう。扱うゲームオブジェクトが少なければそこまでではないが、本格的にゲームを作るとなると扱うゲームオブジェクトも増え、重さが増す。
 特にUpdateメソッドなどで定期的に処理してしまうとカクつきの大きな原因となる。
 Startメソッドなどで使用して、値を変数に格納しておく使い方をするといい。
 また、アクティブではないゲームオブジェクトは検索できない点にも注意。
 ゲームオブジェクトがアクティブであれば以下のようにチェックマークがついている。

 アクティブではないゲームオブジェクトはアタッチされたコンポーネントが全て無効になりスクリプトがUpdate関数を呼ばなくなる。
目次にもどる

Transform.Find関数

 Transform.Find関数の使い方を紹介していく。
 この関数は自身の全ての子のゲームオブジェクトを検索可能となっている。
 親子関係についてよくわからない場合は先に以下の記事を確認してみてほしい。
親子関係について

 CubeとSphereとCapsuleを作成し、Sphereの名前をSphere1としてCubeの子にしよう。Capsuleの名前をCapsule1としてSphere1の子にしよう。


 以下のようにスクリプトのStartメソッドに記述し、Cubeにアタッチしよう。
 Transform a = transform.Find("Sphere1");として子のSphere1を取得している。
 残りの処理は先ほどのスクリプトと同じであり、再生するとSphere1がX軸方向に3移動する。

 同様にa = transform.Find("Sphere1/Capsule1");として子のCapsule1を取得している。階層の1つ下であれば直接指定でOKだが、階層が2つ下以降の場合はSphere1/Capsule1のようにパスを書く必要がある。
 残りの処理はほぼ同様。c.y += 3f;としてあるので再生するとCapsule1がY軸方向に3移動する。

 GameObject.Findと比較して異なる点はいくつかある。

 特に大きな違いとしては、子ゲームオブジェクトだけの探索となるので重くなりづらい点、アクティブではないゲームオブジェクトも取得できる点があげられる。
 ただし、Transform.Findを使わずとも、例えば以下のように記述してシリアル化(シリアライズ)し、事前にゲームオブジェクトを指定しておく手もある。

 特に階層が深くなってくるとTransform.Findでパスを書くのはなかなか面倒(また、何らかの原因で階層構造を変える時にも支障が出る)。個人的にはよほどのことがない限り、シリアル化で子ゲームオブジェクトの取得を行うのをおすすめする。

UnityのC#の基礎まとめへ戻る

page top