はじめに
今回は他コンポーネントの参照を得る方法についての記事になります!
まずは他コンポーネントにアクセスするとき、GetComponent
やGetComponentInChild
、FindObjectOfType
など様々な方法があると思います。
私が一番使うのはインスペクターを用いる方法で、フィールドに[SerializedField]
を付けてコンポーネントの参照を得ています。
これでも全然良いと思いますが、もう少しだけ考えた方法を見つけましたので、それの紹介をしたいと思います。
やり方
やり方はRequireComponent
とnull合体演算子
*1を用います。
SampleClass1
using UnityEngine; [RequireComponent(typeof(SampleClass2))] public class SampleClass1 : MonoBehaviour { public SampleClass2 CachedSampleClass2 { get { return this._sampleClass2 ?? (this._sampleClass2 = GetComponent<SampleClass2>()); } } private SampleClass2 _sampleClass2; private void Start() { CachedSampleClass2.HogeMethod(); //HogeMethod is called } }
SampleClass2
using UnityEngine; public class SampleClass2 : MonoBehaviour { public void HogeMethod() { Debug.Log("HogeMethod is called"); } }
また一般的にGetComponent
は重い処理とされているので、必要最低限の利用にとどめてください。
Transformコンポーネントのみ注意
どうやらTransformコンポーネントのときに上と同じ要領ですると、null合体演算子は思い通りに動かない可能性があるようです。
Custom == operator, should we keep it? – Unity Blog
そのためTransformコンポーネントのみこのように書き換えてください。
using UnityEngine; public class SampleClass1 : MonoBehaviour { public Transform CachedTransform { get { if (_cachedTransform == null) this._cachedTransform = transform; return _cachedTransform; } } private Transform _cachedTransform; public void Start() { CachedTransform.position += new Vector3(1, 0, 0); } }
ちなみにTransformコンポーネントは必ずゲームオブジェクトにアタッチされているので、RequireComponent
は不要です。
またtransform
も内部的にはGetComponent<Transform>
ですが、どうやら処理速度は少し早くなっているみたいです。
さいごに
この方法では、インスペクターでのアタッチ忘れなどが無く良いと思います。
ただやっぱりプロパティを用いるとコードが長くなりがちなので、個人開発の場合などではインスペクターからでも全然良いような気もします。