はじめに
Unityでは、RequireComponentというアトリビュートがあり、依存関係にあるコンポーネントの存在を保証することができます。必要なコンポーネントを付け忘れていたとか、間違えて消してしまったとかUnityエディタ上のちょっとしたミスを減らすことに役立ちます。
Unity 2018.4.9f1で動作確認済みです。
とりあえず使ってみる
実際に RequireComponent を使ってみるため、キャラクターモデルを用意します。今回はSDUnityちゃんを使います。
カスタムのスクリプトUnityChanControllerを用意して、CharacterControllerコンポーネントでキャラを動かすことにします。ざっと以下のスクリプトを用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using UnityEngine; [RequireComponent(typeof(CharacterController))] public class UnityChanController : MonoBehaviour { private CharacterController _controller; private Vector3 _moveVector; public float Speed = 3.0f; public float Gravity = 9.0f; void Start() { _controller = GetComponent<CharacterController>(); } void Update() { if (_controller.isGrounded) { _moveVector = new Vector3 (Input.GetAxis ("Horizontal"), 0, Input.GetAxis ("Vertical")); _moveVector = transform.TransformDirection(_moveVector); _moveVector *= Speed; } _moveVector.y -= Gravity * Time.deltaTime; _controller.Move(_moveVector * Time.deltaTime); } } |
スクリプトのクラス定義の上にRequireComponentアトリビュートが使われています。クラスにtypeof()をかませて、引数に渡してあげるだけで良いです。作成したスクリプトは、キャラクターモデルにアタッチします。
アタッチと同時に、CharacterControllerもアタッチされることがわかります。既に追加されている場合は、アタッチされません。CharacterControllerコンポーネントのみを外そうとする場合は、外せないよと注意されます。
依存関係のコンポーネントの初期設定
RequireComponentアトリビュートは、必要なコンポーネントを追加してくれるだけなので、初期設定までは変えることはできません。CharacterControllerの場合だと、カプセルの高さがモデルと合わない場合が出てくると思います。
Reset関数を用意すると、スクリプト側でコンポーネントのデフォルト値を制御できます。 Reset関数は、スクリプトの追加時、またはスクリプトコンポーネントの右上にある歯車からResetを選ぶ場合によばれます。 試しに、CharacterControllerの高さと中心を変更してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using UnityEngine; [RequireComponent(typeof(CharacterController))] public class UnityChanController : MonoBehaviour { private CharacterController _controller; /// 省略 private void Reset() { /// StartのGectComponentをResetに移した _controller = GetComponent<CharacterController>(); _controller.center = new Vector3(0, 0.5f, 0); _controller.height = 1.0f; } } |
Resetを選択するとCharacterControllerの値が変更される事が確認できました。