コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】MonoBehaviour を継承して処理を改善する

MonoBehaviour を継承したクラスで transform や rigidbody を使用するときの注意として
transform や rigidbody は内部で毎回 GetComponent しているようです

そうなると、これらのプロパティにアクセスするたびに
GetComponent が実行されることになるので処理が少し遅くなってしまいます

僕はそれを防ぐたびに transform や rigidbody に初めてアクセスされた時にだけ
GetComponent をする MonoBehaviour を用意して使っています

using UnityEngine;

public class MonoBehaviourCustom : MonoBehaviour
{
    private Transform mTransform;
    private Rigidbody mRigidbody;

    /// <summary>
    /// Transform コンポーネントを返します
    /// </summary>
    public new Transform transform
    { 
        get
        {
            // 初めてアクセスされた時にだけ GetComponent する
            if ( mTransform == null )
            {
                mTransform = GetComponent<Transform>();
            }
            return mTransform;
        }
    }
    
    /// <summary>
    /// Rigidbody コンポーネントを返します
    /// </summary>
    public new Rigidbody rigidbody
    { 
        get
        {
            // 初めてアクセスされた時にだけ GetComponent する
            if ( mRigidbody == null )
            {
                mRigidbody = GetComponent<Rigidbody>();
            }
            return mRigidbody;
        }
    }
}
using UnityEngine;

public class Example : MonoBehaviourCustom
{
    private void Update()
    {
        transform.Translate( Vector3.one );
        rigidbody.AddForce( Vector3.one );
    }
}