Developer

【初心者Unity】スクリプトからコンポーネントを追加する方法
2022.10.31
Lv1

【初心者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に関しては使用することでプログラムの信頼性が高まります。
使用頻度はそれほど多くないかもしれませんが、どちらも是非覚えておくと良いでしょう。

連載目次リンク

「初心者のための」Unityゲーム制作 目次

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次