ソースコード
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 ); } }
プロパティの定義が短くなってコードがスッキリする