【Unity】transformとGetComponent()の違い

UnityのtransformプロパティとGetComponent<Transform>()メソッド、それぞれの違いについてみていきましょう

transformプロパティ

transformプロパティも実際にはComponentクラスのインスタンスであり、GameObjectのTransformコンポーネントを参照します。transformComponentクラスを継承したTransformコンポーネントの特別な参照であり、すべてのGameObjectに必ず含まれる基本的なコンポーネントです。

transformプロパティは、MonoBehaviour(の基本クラスであるComponent)を継承したクラスから直接アクセスできる特別なプロパティで、そのGameObjectにアタッチされているTransformコンポーネントへのショートカットです。

GetComponent<Transform>()メソッド

これに対してGetComponent<Transform>()メソッドは、GameObjectが持つ任意のコンポーネントを取得するための汎用的な方法であり、Transform型を指定することでTransformコンポーネントを取得しますが、transformプロパティのように直接的で効率的なアクセス方法ではありません。

まとめ

したがって、transformGetComponent<Transform>()の両方がTransformコンポーネントへのアクセスを提供しますが、transformはより直接的で高速なアクセスを提供するため、Transformコンポーネントにアクセスする標準的な方法とされています。

サンプル

void Update()
{
    transform.Translate(new Vector2(1, 0) * Time.deltaTime);
}

プロパティの情報を見る

Componentクラス抜粋

public class Component : Object
{
    //
    // 概要:
    //     The Transform attached to this GameObject.
    //     このGameObjectにアタッチされているTransform
    public extern Transform transform
    {
        [MethodImpl(MethodImplOptions.InternalCall)]
        [FreeFunction("GetTransform", HasExplicitThis = true, ThrowsException = true)]
        get;
    }

どちらが高速か?

transformプロパティの方がGetComponent<Transform>()メソッドよりも高速です。

Unity内部でtransformプロパティはGameObjectのTransformコンポーネントへの直接的な参照としてキャッシュされています。これは、GameObjectが作成されるときに自動的に設定され、そのGameObjectのライフタイム中に常に利用可能です。したがって、transformプロパティを使用すると、追加の検索処理やキャスト処理なしに即座にTransformコンポーネントにアクセスできるため、非常に高速です。

一方で、GetComponent<Transform>()メソッドは実行時にコンポーネントの検索を行います。このメソッドは、指定された型のコンポーネントがGameObjectにアタッチされているかを検査し、見つかった場合はその参照を返します。この検索プロセスにはわずかながら時間がかかるため、transformプロパティを使用する場合に比べてパフォーマンスコストが高くなります。

特に、ゲームのフレームごとの更新など、頻繁にアクセスが必要な場合は、このパフォーマンス差が顕著になることがあります。そのため、Transformコンポーネントへのアクセスが必要な場合は、可能な限りtransformプロパティを使用することが推奨されます。

Unity

Posted by hidepon