2016-11-01 7 views
3

ユニティは、read only 変数によってvector.magnitude/sqrMagnitude /正規化された値にアクセスすることができ、そのC#の機能または単一性のものであるかどうかはわかりません。しかし、ベクトルを変更せずに複数回使用するかどうかを知りたいのですが、値を再計算するか、前の計算から戻します。確実にこの質問に答えるためにはUnity VectorN変数は再計算されていますか?

https://docs.unity3d.com/ScriptReference/Vector3.html

+0

ユニティサポートにお問い合わせください – Bijan

答えて

4

、1が実行されたバイトコードに見なければなりません。つまり、Telerikの逆コンパイラでUnityEngine.dllを開いて、そのクラスで何が起こっているのかを確認するだけです。私の場合、ファイルはC:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dllにありました。

は、ここでは、 UnityEngine.Vector3クラスの(部分的な)内容を見ることができます。

enter image description here enter image description here

はあなたを約Vector3.magnitudeVector3.sqrMagnitudeVector3.normalizedを知りたいと思いました。 .magnitudeのためのコードは次のとおりです。

public float magnitude 
    { 
     get 
     { 
      return Mathf.Sqrt(this.x * this.x + this.y * this.y + this.z * this.z); 
     } 
    } 

これは、ベクトルの大きさをcomputates読み取り専用プロパティのstraighforward実装です。ご覧のように、キャッシュは行われません。 sqrMagnitudeを見てみましょう。

public float sqrMagnitude 
    { 
     get 
     { 
      return this.x * this.x + this.y * this.y + this.z * this.z; 
     } 
    } 

いいえ、ここではキャッシングは必要ありません。しかし、.normalizedが面白いです。私たちをリードし

public Vector3 normalized 
    { 
     get 
     { 
      return Vector3.Normalize(this); 
     } 
    } 

public static Vector3 Normalize(Vector3 value) 
    { 
     float single = Vector3.Magnitude(value); 
     if (single <= 1E-05f) 
     { 
      return Vector3.zero; 
     } 
     return value/single; 
    } 

静的メソッドVector3.magnitudeは、メンバー関数の実装としてではなく、ofcourseの明示的なVector3入力パラメータと同じです。

逆コンパイルされたバイトコードからわかるように、.sqrtMagnitude,.magnitudeまたは.normalizedを計算するとキャッシングは行われません。したがって、これらの値を1回だけ計算し、可能であれば再利用してパフォーマンスを向上させることが賢明です。

関連する問題