1. 程式人生 > >unity小總結

unity小總結

四元數旋轉問題

在Unity裡,尤拉旋轉的旋轉順序是Z、X、Y,這在相關的API文件中都有說明,例如Transform.Rotate。其實文件中說得不是非常詳細,還有一個細節我們需要明白。如果你仔細想想,就會發現有一個非常重要的東西我們沒有說明白,那就是旋轉時使用的座標系。給定一個旋轉順序(例如這裡的Z、X、Y),以及它們對應的旋轉角度(α,β,r),有兩種座標系可以選擇: 1.繞座標系E下的Z軸旋轉α,繞座標系E下的Y軸旋轉β,繞座標系E下的X軸旋轉r,即進行一次旋轉時不一起旋轉當前座標系; 2.繞座標系E下的Z軸旋轉α,繞座標系E在繞Z軸旋轉α後的新座標系E'下的Y軸旋轉β,繞座標系E'在繞Y軸旋轉β後的新座標系E''下的X軸旋轉r, 即在旋轉時,把座標系一起轉動;

很容易知道,這兩種選擇的結果是不一樣的。但如果把它們的旋轉順序顛倒一下,其實結果就會一樣。說得明白點,在第一種情況下、按ZXY順序旋轉(世界座標系旋轉)和在第二種情況下、按YXZ順序旋轉是一樣的(自身座標系旋轉)。證明方法可以看下這篇文章。而Unity文件中說明的旋轉順序指的是在第一種情況下的順序。

transform.Roate 預設是自身座標新,按照YXZ順序旋轉和一起旋轉是一樣的效果。 ---------------------  作者:媽媽說女孩子要自立自強  來源:CSDN  原文:https://blog.csdn.net/candycat1992/article/details/41254799  版權宣告:本文為博主原創文章,轉載請附上博文連結!

位移問題

transform.position+= 是按照世界座標系進行的

transform.translate 預設的是自身座標系

接下來我們講一講,Vector3.forward和transform.forward的區別,Vector3.forward的值永遠是(0,0,1)(這裡的(0,0,1)根據是Space.self還是world),而transform.forward我們可以理解為其對應物體的z軸方向,是一個向量,而不是一個座標,但是我們應當把它看成世界座標系內的,而不是區域性座標系內的。而transform的屬性可以在我上面提到的對比來思考。是繼承關係。

想要讓物體向前移動,在transform.translate()上和直接修改transform.position上,差別是挺大的。

transform.position 本身就是世界座標。

1、transform.position+= vector3.forward 

等於是在世界座標的z軸前進。

2、transform.position+=transform.forward 

等於是物體自身座標系的z軸前進。

3、transform.translate(vector3.forward,space.self) 

等於是自身座標系的z軸前進。

效果等同於2。

4、transform.translate(transform.forward,space.self) 

這個用法會引起很怪異和鬼畜的後果,不建議使用。

5、transform.translate(vector3.forward,space.world)

等於是讓物體沿著世界座標的z軸前進。

效果等同於1。

6、transform.translate(transform.forward,space.world)

等於是讓物體沿著“物體自身座標z軸在世界座標上的方向”前進(等同與物體沿著自身z軸前進)。

效果等同於2。

有些同學可能不太理解以上部分的含義,沒關係,我們可以先記住,在後面自然就懂了。但我這裡還是要講一下。

對於translate(a,b)函式,如果省略b,系統將把它預設為space.self,意思是在自身座標系進行a向量方向的移動,如果b為space.world,那麼物體就在世界座標系上進行a向量方向的移動。還是不懂得話大家可以自己寫一個小Demo試驗一下,不要怕麻煩,學習從來沒有捷徑。

最後,總結一下,除了translate這種比較特殊的函式,其他的,比如SimpleMove,DrawLine等,如果要在遊戲物體前方進行操作,一概使用transform.forward,但是要注意,他只是個模為1的向量,別忘了根據自己的需求靈活變化,這裡需要大家自行體會!

參考:https://blog.csdn.net/kaluluosi111/article/details/17206655

          https://blog.csdn.net/ithot/article/details/68485587 ---------------------  作者:煙雨迷離半世殤  來源:CSDN  原文:https://blog.csdn.net/qq_15020543/article/details/80777249  版權宣告:本文為博主原創文章,轉載請附上博文連結!

延時處理函式:

銷燬的時候,可以用destroy(“”,延時時間),另外destroy還有一個立即銷燬,永遠刪除的,destroyImmediate

延時invoke和invokerepeating。

另外還可以考慮協程。