close
在遊戲中,很多時候都需要知道物件與目標之間的距離,例如施放範圍技能時,需要依照距離來判定傷害等等。
 
 
在 Unity 裡,有內建的方法可以幫助我們取得座標點的距離長度
 
// 取得座標點的距離長度
Vector2.magnitude;
Vector3.magnitude;

// 取得兩點座標之間的距離長度
Vector2.Distance( A, B );
Vector3.Distance( A, B );
 
 
magnitude 的就是 ((x * x) + (y * y)) 再開根號。
這邊針對 magnitude 做說明,說明為何 magnitude 這算法是用來算該座標位置的距離長度的:
 
Vector2 v2 = new Vector2(1.0f, 0.0f);

// 使用 v2.magnitude 取得距離長度, 
// distance 結果為 1
float distance = v2.magnitude;
 
 
大家都知道兩點座標求距離的公式,公式如下

image01.png

 
大家可以假設 A 點為 (1, 1),B 點為 (0, 0)
套入公式後為 (((1 * 1) - (0 * 0)) + ((1 * 1) - (0 * 0))) 再開根號
大家可以看到 0 * 0 其實是沒意義的,所以可以簡化成 ((1 * 1) + (1 * 1)) 再開根號
 
這算法是否跟 Vector2.magnitude 一樣呢?((x * x) + (y * y)) 再開根號!
Vector3.magnitude 也一樣,只是多了一個 Z,((x * x) + (y * y) + (z * z)) 再開根號。
 
 
假設我們有兩個座標位置,分別為 pos1、pos2
 
Vector2 pos1 = new Vector2( 10.0f, 15.0f );
Vector2 pos2 = new Vector2( 10.0f, 12.0f );
 
 
以下提供三種求距離長度的方式:
 
這邊講解一下,pos1 - pos2 的意思等同於 new Vector2(pos1.x - pos2.x, pos1.y - pos2.y)。
 
方法一
 
// 使用公式, 算出 distance = 3
float x = pos1.x - pos2.x;
float y = pos1.y - pos2.y;
float distance = Mathf.Sqrt( (x * x) + (y * y) );

// 以下做法跟方法一是一樣的
Vector2 pos = (pos1 - pos2);
float distance = Mathf.Sqrt( (pos.x * pos.x) + (pos.y * pos.y) );
 
 
方法二
 
// 使用內建的 Vector2.Distance, 算出 distance = 3
float distance = Vector2.Distance( pos1, pos2 );
 
 
方法三
 
// 使用 Vector2.magnitude, 算出 distance = 3
Vector2 pos = (pos1 - pos2);
float distance = pos.magnitude;

// 以下作法跟方法三是一樣的
float distance = (pos1 - pos2).magnitude;
 

 

arrow
arrow
    文章標籤
    Unity C# Vector magnitude
    全站熱搜

    岳 發表在 痞客邦 留言(0) 人氣()