【初心者Unity】スクリプトからコンポーネントを追加する方法
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
AddComponentとRequireComponent
Unityにおけるゲームオブジェクトへのコンポーネント追加は、ヒエラルキービューからAddComponentボタンを押してコンポーネントを選択・追加する方法が一般的ですが、ヒエラルキーから操作する都合上、この操作はゲームシーンを再生する前に限定されます。
ですがUnityでは、AddComponentメソッドを使用することでゲームシーンの再生中に動的にコンポーネントを追加することも可能です。
今回はこのAddComponentメソッドの使い方と、依存関係にあるコンポーネントを自動で追加するRequireComponentの使い方を合わせて紹介します。
AddComponentでスクリプトからコンポーネントを追加する
スクリプトからコンポーネントを追加するには、ターゲットとなるゲームオブジェクトからAddComponentメソッドをコールします。
追加したいコンポーネントはジェネリクス「<>」内にコンポーネントのクラス名を指定します。
void Start() { gameObject.AddComponent<Rigidbody>(); }
実行されるとコンポーネントが追加されます。
「gameObject.」という記述は、このスクリプトが適用されているゲームオブジェクト自体を指します。
例えば別のゲームオブジェクトにコンポーネントを追加したいのであれば、下記のように事前にゲームオブジェクトを取得しておきましょう。
void Start() { GameObject sample = GameObject.Find("SampleObjct"); sample.AddComponent<BoxCollider>(); }
(参考)
GameObject.Findを具体例付きで解説
Transform.Findとは?GameObject.Findとの違いは?
少し応用的な使い方としては、AddComponentの戻り値はGetComponentと同じく対象のコンポーネントが返ります。
追加したコンポーネントのプロパティにも即座にアクセス可能です。
void Start() { var rb = gameObject.AddComponent<Rigidbody>(); rb.useGravity = false; }
もちろん、別途GetComponentをしてもOKです。
RequireComponentでコンポーネントを自動追加する
依存するコンポーネントの追加し忘れや誤削除によるエラーを回避するために使用します。
例えば下記の例では、自作のSampleスクリプトがアタッチされたゲームオブジェクトではRigidbodyコンポーネントが必須となるように制御されます。
using UnityEngine; [RequireComponent(typeof(Rigidbody))] // クラスの外に記述します。 public class Sample : MonoBehaviour { void Start() { } void Update() { } }
Sampleスクリプトをアタッチと同じタイミングで、Rigidbodyコンポーネントもアタッチされます。(すでにアタッチされている場合を除く)
Sampleスクリプトをアタッチしている限り強制されるため、ヒエラルキーからコンポーネントを削除しようとしてもエラーとなります。
ちなみに1回の記述でコンポーネント3つまで同時に指定できます。
[RequireComponent(typeof(Rigidbody), typeof(Animator), typeof(BoxCollider))]
※記述を分ければ何個でも可です。
まとめ
以上、AddComponentとRequireComponentメソッドの使い方について紹介しました。
RiquireComponentに関しては使用することでプログラムの信頼性が高まります。
使用頻度はそれほど多くないかもしれませんが、どちらも是非覚えておくと良いでしょう。