はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】他コンポーネントの参照を得るより良い方法

はじめに

今回は他コンポーネントの参照を得る方法についての記事になります!

まずは他コンポーネントにアクセスするとき、GetComponentGetComponentInChildFindObjectOfTypeなど様々な方法があると思います。

私が一番使うのはインスペクターを用いる方法で、フィールドに[SerializedField]を付けてコンポーネントの参照を得ています。

これでも全然良いと思いますが、もう少しだけ考えた方法を見つけましたので、それの紹介をしたいと思います。

やり方

やり方はRequireComponentnull合体演算子*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>ですが、どうやら処理速度は少し早くなっているみたいです。

さいごに

この方法では、インスペクターでのアタッチ忘れなどが無く良いと思います。

ただやっぱりプロパティを用いるとコードが長くなりがちなので、個人開発の場合などではインスペクターからでも全然良いような気もします。