Unityでサンプルコードを読んだり、自分で作業したりしています。、そして多くの場合、これはTransform _transform = GetComponent<Transform>()
として変換に対して行われます。
ただし、添付されたゲームオブジェクト変換にはすでにアクセスできます。 transform
、this.transform
またはgameObject.transform
として。ほとんどの場合、GetComponent()
の使用は理解できますが、なぜGameObject
とTransform
最初にスクリプトから2つの項目にアクセスできるのはいつですか?
コメント
- 最終結果に違いはありません。
回答
速度(速いから遅い):
cached _transform >> Component.transform >> Component.GetComponent<Transform>
また、UnityEngine.dll C#バイナリを逆アセンブルすると、トランスフォームがGetComponent(コンポーネントクラスメンバー)を呼び出さず、内部のモノラルランタイムメソッドを呼び出すだけであることがわかります。これが変換コードです。
// UnityEngine.Component public Transform transform { get { return this.InternalGetTransform(); } } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] internal extern Transform InternalGetTransform();
そしてこれが逆アセンブルされたコンポーネントクラスのGetComponentメソッドです。
public extern Component GetComponent(Type type); public T GetComponent<T>() where T : Component { return this.GetComponent(typeof(T)) as T; } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] public extern Component[] GetComponents(Type type);
GetComponentは、ジェネリックを使用する一種の検索関数です。したがって、「キャッシュよりも少し遅いです。
元のソース:
public class Test : MonoBehaviour { Transform _transform; void Start() { _transform = this.transform; _transform = gameObject.GetComponent<Transform>(); } }
バイナリ分解:
public class Test : MonoBehaviour { private Transform _transform; private void Start() { // == UnityEngine.Component::get_transform() this._transform = base.get_transform(); // == UnityEngine.Component::GetComponent<UnityEngine.Transform>() this._transform = base.get_gameObject().GetComponent<Transform>(); } }
回答
As Jinbomによると、ここでの主な違いは速度です。
ただし、これはGameObjectのtransformプロパティの場合のみであることに注意してください。カメラやリジッドボディなどの他のプロパティは単なる便利なプロパティであり、内部でGetComponent <>を呼び出すため、パフォーマンスは同じです。 Unityがキャッシュされたバージョンを返すのではなく、コンポーネントを検索することはすぐには明らかではないため、UnityがUnityのこれらの「ヘルパー」プロパティを無効にしたのはこのためです。
質問で言及されている変換プロパティでは、他のすべてのコンポーネントはGetComponent <>を使用して最初の利用可能な機会にキャッシュされ、その後キャッシュされた値が使用されます。
回答
現在、this.transform
構文により、すべてのゲームオブジェクトにTransformコンポーネントがあると想定できます。 UnityがAPIをGetComponent<>()
構文で更新したのは、将来、Transformのような「特別な」コンポーネントなしでGameObjectsを使用できるようになったと思います。
GameObjectsにTransformsが付属していない「より純粋な」アーキテクチャを使用できます(ただし、エディタはデフォルトで変換を追加する場合があります)。
コメント
-
Transform
は、このように機能する唯一のコンポーネントです。それでも、私は'将来の憶測に頼ることが良い答えになるとは思いません。Unityはこのように動くことについて何の提案も示していません。そのオブジェクトには、位置やサイズなどの物理的状態に関連する情報が含まれている必要があります。 - また、これはコメントのようです。私の質問に答えますが、答えません。
答え
this.transform
が機能する唯一の理由は、MonoBehaviorが動作がアタッチされているGameObjectのTransformコンポーネントの便利なプロパティを実装しているためです。 …それはかなり誤解を招くものです。gameObject.transform
の方が意味的に正しいと思いますが、それは髪の毛を分割します。彼らは同じことをします。
コメント
- これは、私の実際の質問に答えるのに何の役にも立ちません。 何かが機能する唯一の理由は、それが設定されているからです。あなたのポイントは何ですか?
this.transform
と
とGetComponent<Transform>()
の違いについて質問しています。 = “ae9f591fe4″>
。