Transform組件是每個游戲對象必須有的一個組建,因為你創建一個空物體,它也有該組建,因為unity3d是面向組建開發的一款游戲引擎。通過一張圖片來看看它的屬性
你可以在通過代碼查看這些屬性的區別
Debug.Log("position " + transform.position); //世界坐標的位置 Debug.Log("localPosition " + transform.localPosition); //相對於父位置的坐標 即把父物體當作自己的中心 Debug.Log("eulerAngles " + transform.eulerAngles);//世界坐標歐拉⾓度 Debug.Log("localEulerAngles " + transform.localEulerAngles);//相對於⽗級的變換的旋轉歐拉⾓度 Debug.Log("localScale " + transform.localScale);//相對於父位置的縮放 Debug.Log("localRotation " + transform.localRotation);//相對於父位置的旋轉 Debug.Log("rotation " + transform.rotation);//世界坐標的旋轉
上面提到了父位置?那是什么意思呢?
現在創建兩個cube 命名為cube1和cube2 把cube2作為cube1的子對象,如圖。
可以看到,cube1的坐標(1,0,0) cube2的坐標為(0,0,5)
那么通過transform.localPosition獲取cube2的坐標則為(0,0,5)
如果用transform.position獲取cube2的坐標則為(1,0,5)
那么寫個腳本測試下。寫個腳本掛載到cube2上
在腳本的Start方法中如下寫
void Start() { Debug.Log("cube2的世界坐標為:" + transform.position); Debug.Log("cube2的本地坐標為:" + transform.localPosition); }
運行后看結果
因為:cube2把父對象(Cube1)當作了自己的的中心。所以是(0,0,5),那它的世界坐標則為(1,0,5),知道了這個position那localRotation也是同樣的道理
但有沒有注意到。這里的歐拉角(eulerAngles),rotation和Rotate(),都是用於旋轉,那他們有什么區別呢。剛開始我也是犯糊塗
Rotate()方法需要一個vector3三維向量,rotation是用四元素旋轉(Quaternion)
來看看聖典上面的解釋:
歐拉角(eulerAngles)旋轉很好理解。當你改變Transform組建中的 x,y,z的角度。就是改變其歐拉角
現在來看看rotation屬性和Rotate()方法之間有什么區別
我認為通過測試是對兩者差異的最好理解。
先看Rotate()方法
在場景中創建一個Capsule,寫個腳本。代碼如下
void Update() { transform.Rotate(Vector3.up * 5); }
運行看看效果:
可以看到對象是旋轉一直是在累加5,如果你感覺不出來。我這里調試。一幀一幀給你看
然后用旋轉同樣的角度。測試rotation屬性
void Update() { transform.rotation = Quaternion.Euler(Vector3.up * 5); }
同樣看效果
從上圖可以看出,Capsule旋轉到5就不動了。也就是每次旋轉都是同樣的值,
所以:我的理解是:
Rotate()方法是:旋轉多少度。在原有的基礎上累加,即旋轉了多少角度。又旋轉了多少角度,是在原有的基礎上在旋轉
rotation屬性是:旋轉到某個角度,就是是在update中每幀都執行(我這里測試是放在了update中)。但每次旋轉到的角度動是5,所以是旋轉到5度。一直都是
比如你只想讓他旋轉到多少,用rotation;假如想讓他一直轉,可以用Rotate
rotation直接改變了數值,以達到旋轉效果
Rotate應用一個的旋轉角度每秒1度慢慢的旋轉物體
當然:rotation()還可以通過插值旋轉,
關於插值的理解:
http://www.unitymanual.com/blog-42778-2524.html?_dsign=7036aadd