(2018/5/15 更新:「参考:GameObject.Find 系関数の処理速度の検証結果」を追記)


今回はシーン上に配置されているゲームオブジェクトを、スクリプトから取得してみます。

スクリーンショット (450).png

0. サンプルスクリプト

まずはすべての例を載せたサンプルスクリプトをお見せします。
こちら。【1-A】から【3】まで、6種類の方法を書き並べてみらものです。スクリプトによって見つけた他のゲームオブジェクトを、gameObjectほにゃらら という変数に格納しています。この変数を使うことで、他のゲームオブジェクトを操作することができるようになります。


インスペクターでは下図のように設定しておきます。
スクリーンショット (522).png

1. インスペクターから指定する例

上記コードのコメント【1-A】【1-B】で示したのは、ゲームオブジェクトをインスペクターから指定する例です。
public アクセス修飾子、または [SerializeField] 属性を付けることで、対象のゲームオブジェクト変数に格納するゲームオブジェクトをインスペクターから指定することができるようになります。

ただし public 修飾子は、その変数の値を外部のクラス、外部のスクリプトから自由に参照・編集できるようにするという意味合いを持つものなので、あまりに乱用すると設計がぐちゃぐちゃになる危険性があります。
インスペクターから指定したいという目的であれば、[SerializeField] 属性を使うのが無難かもしれません。

インスペクターから指定する方法は簡単で使いやすいのですが、プレハブ化した場合は外部のゲームオブジェクトへの参照は外れてしまうので注意が必要です。

2. GameObject.ほにゃららメソッドを使って取得する例

次に、GameObject.ほにゃらら というメソッドを使ってゲームオブジェクトを取得する方法です。
上記コードの【2-A】【2-B】【2-C】で示したものです。

【2-A】GameObject.Find メソッドを使っています。これは対象のゲームオブジェクトをその名前から見つけるものです。単純で使いやすいようですが、処理負荷が高いため、毎フレーム呼び出すような使い方は推奨されません。

【2-B】GameObject.FindWithTag メソッドを使っています。これは対象のゲームオブジェクトを、そのゲームオブジェクトにあらかじめ付けられたタグを手掛かりに見つけるものです。GameObject.Find メソッドと比べて処理負荷がかなり軽くなるようです。

【2-C】GameObject.FindGameObjectsWithTag メソッドを使っています。これもタグで対象のゲームオブジェクトを見つけるものですが、こちらは同じタグを付けられたゲームオブジェクトが複数あれば、それらすべてを取得します。


【2-A】【2-B】【2-C】は、いずれも GameObject クラスの Static メソッドです。
Unity の スクリプトリファレンス はこちら。
Unity のスクリプトリファレンスは、プログラミングそのものの入門者にとってはなかなか読むのが難しいかもしれませんが、Unity のスクリプトを使っていくうえで必ず必要になるものです。 最初からすべて理解することはできなくても、分からないメソッドなどを見つけたらスクリプトリファレンスで調べてみる習慣を付けておくとよいと思います。

参考:GameObject.Find 系関数の処理速度の検証結果

GameObject.Find 系関数の処理速度の検証結果をまとめた記事を見つけました。
やはり GameObject.Find と GameObject.FindWithTag では処理速度が大きく異なるようです。
(GameObject.FindGameObjectWithTag は GameObejct.FindWithTag と同じ処理です)

3. Transform.Find メソッドを使って、子のゲームオブジェクトを見つける

Transform コンポーネントはゲームオブジェクトの位置や回転、スケールなどの情報を持つものですが、スクリプトから Transform クラスのメソッドを使って、親子関係に関する操作を行うこともできます。

上記コードの【3】では Transform.Find メソッドを使って、Hierarchy ビュー上で親子関係になっているゲームオブジェクトの、子のゲームオブジェクトを見つけています。
(正しく言うと、親の Transform から Find メソッドを使って、子の Transform を見つけ、そのゲームオブジェクトを変数に格納しています)

これも【2-A】で示した GameObject.Find よりも処理負荷の軽いメソッドです。


取得したゲームオブジェクトを操作する例

さて、ゲームオブジェクトを取得して変数に格納したら、さまざまな操作が可能になります。

上記コードの例では、Updateメソッド内で、マウスの左ボタンを押している間、変数 gameObject3 に格納したゲームオブジェクトを前方に移動させるという処理が書かれています。
ゲームオブジェクトの Transform コンポーネントを操作する、という考え方です。

コンポーネントの取得や操作についてはまた別途記事にしたいと思っています。

まとめ

今回はスクリプトを使ったゲームオブジェクトの取得方法を紹介しました。
基本中の基本ですが大切な考え方が含まれているので、繰り返し使ってしっかり覚えましょう。


今回は以上です。感想・質問・要望等、お待ちしております (´▽`)
(この記事の使用環境: Unity2018.1.0f2 (.NET4.x Equivalent)、Windows10)
follow us in feedly

おすすめ Unity 入門書

Unity入門者の方は、まずは一冊だけでも入門書をやってみるのをおすすめします。