Developer

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

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

AddComponentとRequireComponent

Unityにおけるゲームオブジェクトへのコンポーネント追加は、ヒエラルキービューからAddComponentボタンを押してコンポーネントを選択・追加する方法が一般的ですが、ヒエラルキーから操作する都合上、この操作はゲームシーンを再生する前に限定されます。

ですがUnityでは、AddComponentメソッドを使用することでゲームシーンの再生中に動的にコンポーネントを追加することも可能です。

今回はこのAddComponentメソッドの使い方と、依存関係にあるコンポーネントを自動で追加するRequireComponentの使い方を合わせて紹介します。

AddComponentでスクリプトからコンポーネントを追加する

スクリプトからコンポーネントを追加するには、ターゲットとなるゲームオブジェクトからAddComponentメソッドをコールします。
追加したいコンポーネントはジェネリクス「<>」内にコンポーネントのクラス名を指定します。

1
2
3
void Start() {
    gameObject.AddComponent<Rigidbody>();
}

実行されるとコンポーネントが追加されます。

「gameObject.」という記述は、このスクリプトが適用されているゲームオブジェクト自体を指します。
例えば別のゲームオブジェクトにコンポーネントを追加したいのであれば、下記のように事前にゲームオブジェクトを取得しておきましょう。

1
2
3
4
void Start() {
    GameObject sample = GameObject.Find("SampleObjct");
    sample.AddComponent<BoxCollider>();
}

(参考)
GameObject.Findを具体例付きで解説
Transform.Findとは?GameObject.Findとの違いは?

少し応用的な使い方としては、AddComponentの戻り値はGetComponentと同じく対象のコンポーネントが返ります。
追加したコンポーネントのプロパティにも即座にアクセス可能です。

1
2
3
4
void Start() {
    var rb = gameObject.AddComponent<Rigidbody>();
    rb.useGravity = false;
}

もちろん、別途GetComponentをしてもOKです。

RequireComponentでコンポーネントを自動追加する

依存するコンポーネントの追加し忘れや誤削除によるエラーを回避するために使用します。

例えば下記の例では、自作のSampleスクリプトがアタッチされたゲームオブジェクトではRigidbodyコンポーネントが必須となるように制御されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;
 
[RequireComponent(typeof(Rigidbody))] // クラスの外に記述します。
 
public class Sample : MonoBehaviour {
 
    void Start() {
 
    }
 
    void Update() {
 
    }
}

Sampleスクリプトをアタッチと同じタイミングで、Rigidbodyコンポーネントもアタッチされます。(すでにアタッチされている場合を除く)

Sampleスクリプトをアタッチしている限り強制されるため、ヒエラルキーからコンポーネントを削除しようとしてもエラーとなります。

ちなみに1回の記述でコンポーネント3つまで同時に指定できます。

1
[RequireComponent(typeof(Rigidbody), typeof(Animator), typeof(BoxCollider))]

※記述を分ければ何個でも可です。

まとめ

以上、AddComponentとRequireComponentメソッドの使い方について紹介しました。
RiquireComponentに関しては使用することでプログラムの信頼性が高まります。
使用頻度はそれほど多くないかもしれませんが、どちらも是非覚えておくと良いでしょう。

連載目次リンク

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

Unity実践編 - 目次リンク

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