今回はゲームオブジェクトにアタッチされている各種コンポーネントを、スクリプトから取得してみます。Unity入門者向け記事です。
スクリプト内では、さまざまな方法でコンポーネントを取得して、使用しています。
なお、20行目の GetComponent は Start メソッド内で実行していて、取得したコンポーネントを Start メソッドの外で定義した meshRenderer 変数に格納しています。ゲーム実行中に繰り返し使用するコンポーネントは、必要になるたびに GetComponent するのではなく、このように Start や Awake のなかで取得してクラスの変数に記憶しておくと処理負荷を軽減できることがあります。この考え方を キャッシュ(する)と言います。
自分のオブジェクトに該当のコンポーネントがある場合はそれを取得するので勘違いしないよう注意しましょう。
上記コードでは 34 行目で取得した Rigidbody コンポーネントを一時的な変数に格納し、その後 AddForce で力を加えています。
これも GetComponentInParent と同様、自分のオブジェクトに該当のコンポーネントがある場合はそれを取得するので勘違いしないよう注意しましょう。
上記コードでは 42 行目で取得した Rigidbody コンポーネントを一時変数に格納せず、そのまま AddForce で力を加えています。
今回は以上です。感想・質問・要望等、お待ちしております (´▽`)
(この記事の使用環境: Unity2018.1.0f2 (.NET4.x Equivalent)、Windows10)
環境設定
まずは今回のテストを行うのにあたっての環境設定です。オブジェクトの配置
オブジェクト(Cube)を下図のように、階層構造になるよう配置します。3Dプロジェクトです。各オブジェクトにコンポーネントを追加・設定しておく
上図を参考に、各オブジェクトに以下のようにコンポーネントを追加・設定しておきます。- Parent オブジェクト: Rigidbody を追加する
- MeMyself オブジェクト: 適当な色(白以外)をつけた Material をセットしておく。また、これから説明するスクリプトもアタッチする。Rigidbodyは追加しないこと
- Child オブジェクト:特に変更不要。Rigidbodyは追加しないこと
- ChildsChild オブジェクト: Rigidbody を追加する
サンプルスクリプト
今回使用するサンプルスクリプトはこちら。MeMyself オブジェクトにアタッチして使います。スクリプト内では、さまざまな方法でコンポーネントを取得して、使用しています。
スクリプトの解説
では上記コードの解説です。1. コンポーネントをインスペクターから指定する(11行目)
使用するコンポーネントをインスペクターからセットする方法です。これが最も簡単かもしれませんね。ただしプレハブ化した場合は他のオブジェクトへの参照設定は外れてしまうなど、この方法だけでは対応できない場面もあります。2. GetComponent でコンポーネントを取得する(20行目)
自分のオブジェクトのアタッチされているコンポーネントを取得するには、GetComponent メソッドを使用します。<> の中には取得するコンポーネントの種類を指定します。今回は MeshRenderer を指定しています。なお、20行目の GetComponent は Start メソッド内で実行していて、取得したコンポーネントを Start メソッドの外で定義した meshRenderer 変数に格納しています。ゲーム実行中に繰り返し使用するコンポーネントは、必要になるたびに GetComponent するのではなく、このように Start や Awake のなかで取得してクラスの変数に記憶しておくと処理負荷を軽減できることがあります。この考え方を キャッシュ(する)と言います。
3. GetComponentInParent でコンポーネントを取得する(34行目)
GetComponentInParent メソッドを使うと、自分のオブジェクトが該当するコンポーネントを持たない場合、親の方向に向かってコンポーネントを探し、取得します。自分のオブジェクトに該当のコンポーネントがある場合はそれを取得するので勘違いしないよう注意しましょう。
上記コードでは 34 行目で取得した Rigidbody コンポーネントを一時的な変数に格納し、その後 AddForce で力を加えています。
4. GetComponentInChildren でコンポーネントを取得する(42行目)
GetComponentInChildren メソッドを使うと、自分のオブジェクトが該当するコンポーネントを持たない場合、子の方向に向かってコンポーネントを探し、取得します。これも GetComponentInParent と同様、自分のオブジェクトに該当のコンポーネントがある場合はそれを取得するので勘違いしないよう注意しましょう。
上記コードでは 42 行目で取得した Rigidbody コンポーネントを一時変数に格納せず、そのまま AddForce で力を加えています。
5. GetComponentsInChildren で複数のコンポーネントを取得する(48行目)
GetComponentsInChildren メソッドを使うと、自分とその子の階層にあるすべてのオブジェクトから、該当するコンポーネントをすべて取得します。
上記コードでは 48 行目で取得した複数の MeshRenderer コンポーネントを一時変数に格納した後、foreach 文の中で処理しています(54行目~)。
参考:動かしてみた動画
以上の設定を行ったものを動かしてみた動画はこちら。まとめ
コンポーネントを取得する処理は Unity を使う上で基本となるものです。しっかり覚えておきましょう。今回は以上です。感想・質問・要望等、お待ちしております (´▽`)
(この記事の使用環境: Unity2018.1.0f2 (.NET4.x Equivalent)、Windows10)
コメント