必須コンポーネントの指定
依存コンポーネントを指定する
スクリプトの実行に別のコンポーネントが必須の場合、GetComponent() メソッドでゲームオブジェクトに含まれるコンポーネントを取り出して対話することができますが、ゲームオブジェクトに必要なコンポーネントが含まれていない可能性があります。
コンポーネントとなるクラスは、UnityEngine.RequireComponent 属性で依存しているコンポーネントを宣言できます。コンポーネントが A が正しく動作するにはコンポーネント B を同じゲームオブジェクトに登録していなければならないという依存関係がある場合、コンポーネント A で、この属性を使ってコンポーネント B に依存していることを宣言します。
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public sealed class RequireComponent : Attribute
RequireComponent 属性は複数設定することができるため、クラスが複数のコンポーネントに依存している場合、重複して RequireComponent 属性を指定できます。
public RequireComponent(Type requiredComponent);
この属性の requiredComponent パラメータには、依存先となるコンポーネントの型を指定します。
Unity は RequireComponent クラスを持つコンポーネントがゲームオブジェクトに追加されると、対象のゲームオブジェクトが依存するコンポーネントを持っているかどうかを調べ、持っていない場合は自動的に依存先のコンポーネントも追加します。また、依存するコンポーネントを解除しようとすると(依存元が存在する限り)エラーを出します。
using UnityEngine; [RequireComponent(typeof (MagicalDevice))] public class MagicalGirl : MonoBehaviour { void Start() { var device = GetComponent<MagicalDevice>(); Debug.Log("Raising Heart, Set up!"); device.SetUp(); } }
using UnityEngine; public class MagicalDevice : MonoBehaviour { public void SetUp() { Debug.Log("Stand by Ready!"); } }
コード1は、MagicalDevice クラスに依存する MagicalGirl クラスの例です。MagicalGirl クラスでは Start() メソッドで GetComponent() メソッドを呼び出し、MagicalDevice オブジェクトを要求します。従って、MagicalGirl コンポーネントを登録しているゲームオブジェクトには MagicalDevice コンポーネントも登録されている必要があります。
MagicalGirl クラスは RequireComponent 属性で MagicalDevice コンポーネントが必須であることを指定しているため、MagicalGirl コンポーネントをゲームオブジェクトに追加すると、そのゲームオブジェクトが MagicalDevice コンポーネントを持たない場合、自動的に MagicalDevice コンポーネントも追加されます。
また、MagicalGirl コンポーネントを持つゲームオブジェクトから MagicalDevice コンポーネントを解除しようとするとエラーが発生します。依存関係にあるコンポーネントを解除する場合、先に依存元である MagicalGirl コンポーネントを外さなければ、MagicalDevice コンポーネントを外せません。
このように、コンポーネントを組み合わせる場合、コンポーネントの間に依存関係が生まれるため、あるコンポーネントを持っていることが正常動作の条件となるような場合は RequireComponent 属性を付加するべきです。これによって、必要なコンポーネントを加え忘れたり、誤って削除してしまうことを防げます。
実行時に Destroy() メソッドでコンポーネントを削除することもできません。「Console」ウィンドウにエラーが表示され、コンポーネントの削除に失敗することが確認できます。
より安全に必須コンポーネントにアクセスするには GetConpoment() メソッドの結果が null かどうかを調べ、null の場合はスクリプトからコンポーネントを追加するというコードにするという方法もあります。
var device = GetComponent<MagicalDevice>(); if (device == null) device = AddComponent<MagicalDevice>();
こうすれば、RequireComponent 属性とは無関係に、コンポーネントが存在しなければ必要なコンポーネントを追加されるので、コンポーネントが存在することを移行のコードに対して保証できます。