本日は Unity の小ネタ枠です。
RequireComponentとReset関数を組み合わせてコンポーネント追加時に必要な参照を自動で設定する方法についてです。
RequireComponent
RequireComponent 属性は同一オブジェクトに必要とするコンポーネントの依存関係を設定します。
本属性を設定したコンポーネントをオブジェクトに追加すると、必要なコンポーネントが同一オブジェクトに存在しない場合、自動でオブジェクトへの追加を行います。
docs.unity3d.com
using UnityEngine; [RequireComponent(typeof(Rigidbody))] public class PlayerScript : MonoBehaviour { Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { rb.AddForce(Vector3.up); } }
MonoBehaviour.Reset
MonoBehaviour.Reset 関数はコンポーネントをデフォルト値にリセットします。
本関数は Inspector のコンテキストメニューの[Reset]ボタンを押したとき、またはコンポーネントを初めて追加したときに呼び出されます。
また本関数はエディタモードでのみ呼び出されます。
docs.unity3d.com
using UnityEngine; public class ResetExample : MonoBehaviour { public GameObject target; void Reset() { //Output the message to the Console Debug.Log("Reset"); if (!target) target = GameObject.FindWithTag("Player"); } }
コンポーネント追加時に必要な参照を自動で設定する
RequireComponent と Reset 関数を組み合わせて必要なコンポーネントの追加とその参照の設定を同時に行うことができます。
以下のサンプルスクリプトを作成しました。
・ReferenceExample.cs
using UnityEngine; [RequireComponent(typeof(Rigidbody))] public class ReferenceExample : MonoBehaviour { public Rigidbody rb; /// <summary> /// コンテキストメニューの[Reset]ボタンを押したとき、またはコンポーネントを初めて追加したときに呼び出される /// </summary> void Reset() { // 必要なコンポーネントの参照を取得する rb = GetComponent<Rigidbody>(); } void FixedUpdate() { rb.AddForce(Vector3.up); } }
オブジェクトにサンプルスクリプトを設定します。
以下の通り、自動で必要なコンポーネントが追加されると同時に参照の設定も行われました。