今回はUnityのComponent(コンポーネント)の話を見ていきたいと思います。
これはUnityで作品を作る上で非常に重要な話となってきます!
なぜならUnityでは、移動も、回転も、描画も、カメラも、自作したプログラムでさえも、何もかもが基本的に「Component」という形をとって動いているからです。
今回はまずComponentとはなんなのかを学びましょう。
続けて次のような、プログラム上での操作方法を学んでいきましょう!
・「AddComponent」で追加してみよう!
・「destroy」を使えば削除も出来る!
非常に重要な「Component」という機能と、それを操作する関数たち。
ぜひここでマスターしてしまいましょう!
それではよろしくお願いいたします!
Componentとは
まずそもそもコンポーネントとは何なのでしょう?
コンポーネントとは一言で言うと「オブジェクトやゲームでの処理に関する心臓部」だと言われています。
例えばUnity上で「カメラ」や「ライト」など、何か処理を行うオブジェクトの中で実際に処理を行っているのがコンポーネントなのです。
と言っても言葉で言ってもわらからないですよね…
しかしこれはエディタ上で見てみれば一目でわかります!
次のはエディタ上でコンポーネントを見てみましょう。
エディタ上で見るComponent
エディタ上で見てみれば、オブジェクトが何のコンポーネントを所持しているか一目でわかります。
以下の画像は「Cube」というオブジェクトをクリックし、選択している画面です。
選択中のオブジェクトが保持しているコンポーネントが、Inspectorウィンドウに一覧表示されています。
画像の例では、Cubeオブジェクトは「Transform」「Cube(Mesh File)」「Box Collider」「Mesh Renderer」「Default-Material」といったコンポーネントを所持していることがわかりますね!
つまりこの「Cubeオブジェクト」は、座標などを管理するTransform、実際に描画を行うMesh Renderer、当たり判定を行うBox Colliderといった各種コンポーネントが組み込まれて、処理を実行しているおかげで機能しているんです!
それをより実感したい人は、Inspectorウィンドウ上のコンポーネントを右クリックで出てくる「Remove Component」を押してコンポーネントを破棄して回ってみてください。
Cubeオブジェクトが何も機能しない、なんの描画もされない空っぽのオブジェクトになってしまうことがわかると思います。
またコンポーネントを新たに追加したい場合は「AddComponentボタン」を押すか、コンポーネントをオブジェクトへ「ドラッグ&ドロップ」で投げ込みましょう。
これだけで新たに機能が追加が行えるのも理解できると思います。
この辺りの、GameObjectとComponentの関係は、以下の記事でさらに詳しく追求をしています。
ぜひ次に進む前に読んでみてください!
Unityでとても重要な部分なので、ぜひ目を通しておくことをお勧めします。
プログラム上でComponentを触ろう!
ここまででエディタ上でコンポーネントの扱い方を見てきました。
次はスクリプト上での、コンポーネントとの付き合い方を見ていきましょう。
「GetComponent」でまずは取得!
スクリプト上でコンポーネントを取得する場合は「GetComponent関数」を利用しましょう。
サンプルは以下の通りです。
今回は「Transform」「BoxCollider」コンポーネントを取得しています。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestScript : MonoBehaviour { void Start () { // Transformコンポーネントを取得 Transform t = this.gameObject.GetComponent<Transform>(); // Transformコンポーネントを取得 BoxCollider b = this.gameObject.GetComponent<BoxCollider>(); } }
取得さえできれば、あとはこちらのものです。
例えば「Transformコンポーネント」の中身を書き換えることで座標移動を行ったり。
「BoxColliderコンポーネント」の中身を編集し当たり判定の領域を変更したりすることも可能です。
またgetcomponentを使った後、初心者のやりたくなることの一つが移動や回転だと思います。
以下の記事でその辺りのの説明を行っていますので、オブジェクトを自在に操作したい人はぜひお読みください。
「AddComponent」で追加してみよう!
次にコンポーネントの追加を行ってみましょう。
これを覚えれば、例えば「特定条件下でのみオブジェクトにコンポーネントを追加!」なんてこともできるようになります。
これを実現するためには「AddComponent関数」を使います。
サンプルは以下の通りです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestScript : MonoBehaviour { void Start () { // Rigidbodyコンポーネントを追加 this.gameObject.AddComponent<Rigidbody> (); } }
今回はRigidbodyコンポーネントをオブジェクトへ追加しています。
追加した瞬間、物理演算の挙動が開始されます。
ちなみにRigidbodyを利用した物理演算について知りたい方は、以下の記事をご覧ください。
「destroy」を使えば削除も出来る!
最後に削除を行ってみましょう!
削除は非常にシンプルです。
「GetComponent関数」として取得したコンポーネントを、Destroy関数で削除するだけです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestScript : MonoBehaviour { void Start () { BoxCollider b = this.gameObject.GetComponent<BoxCollider> (); Destroy (b); } }
これでオブジェクトからBoxColliderコンポーネントが削除され、当たり判定がなくなりました。
またDestroy関数もこちらの記事でまとめていますので、詳しくない人は目をとしておきましょう!
オブジェクトやコンポーネントを破棄できる重要な関数です!
実は第二引数で時限式の破棄処理も簡単に行えるんです。
まとめ
今日はコンポーネントについて見てきました。
コンポーネントは、Unityの処理全般の心臓部です。
GameObjectへ自在に付け替えを行えるようになることで、Unity上で出来ることが大幅に上がります!
ぜひ上手に使いこなしましょう。