【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メソッドをコールします。
追加したいコンポーネントはジェネリクス「<>」内にコンポーネントのクラス名を指定します。
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に関しては使用することでプログラムの信頼性が高まります。
使用頻度はそれほど多くないかもしれませんが、どちらも是非覚えておくと良いでしょう。