コガネブログ

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

【Unity】GetComponent の結果をキャッシュしておくためのクラス

ソースコード

using UnityEngine;

namespace Kogane
{
    /// <summary>
    /// GetComponent の結果をキャッシュしておくためのクラス
    /// </summary>
    public sealed class ComponentCache<T>
    {
        private T    m_cache;
        private bool m_isCached;

        public T Get( GameObject gameObject )
        {
            // UnityEngine.Object の null チェックは少し負荷がかかるため
            // bool 値で判定するようにしています
            if ( m_isCached ) return m_cache;
            if ( m_cache != null ) return m_cache;

            m_cache    = gameObject.GetComponent<T>();
            m_isCached = m_cache != null;

            return m_cache;
        }
    }
}

使用例

Before

using UnityEngine;

public class Example : MonoBehaviour
{
    private Rigidbody m_rigidbodyCache;

    public Rigidbody rigidbody
    {
        get
        {
            if ( m_rigidbodyCache == null )
            {
                m_rigidbodyCache = GetComponent<Rigidbody>();
            }

            return m_rigidbodyCache;
        }
    }

    private void Awake()
    {
        Debug.Log( rigidbody );
    }
}

After

using Kogane;
using UnityEngine;

public class Example : MonoBehaviour
{
    private readonly ComponentCache<Rigidbody> m_rigidbodyCache = new ();

    public Rigidbody rigidbody => m_rigidbodyCache.Get( gameObject );

    private void Awake()
    {
        Debug.Log( rigidbody );
    }
}

プロパティの定義が短くなってコードがスッキリする