MRが楽しい

MRやVRについて学習したことを書き残す

RequireComponentとReset関数を組み合わせてコンポーネント追加時に必要な参照を自動で設定する

本日は 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);
    }
}

オブジェクトにサンプルスクリプトを設定します。
以下の通り、自動で必要なコンポーネントが追加されると同時に参照の設定も行われました。