在Unity中有兩個forward,一個是Transform.forward一個是Vector3.forward。
對於Vector3來說,它只是縮寫。沒有其它任何含義。
- Vector3.forward ,(0,0,1)的縮寫。//在transform.Translate()中使用時,如果不表明坐標系,則為物體的局部坐標,即物體自身的正前方。
- Vector3.right, (1,0,0)的縮寫。
- Vector3.up , (0,1,0)的縮寫。
對於Transform.forward來說,它代表當前物體的物體坐標系的z軸在世界坐標系上的指向。(世界坐標系中的藍色軸)。
如果使用Transform.Translate。需要注意Vector3和Transform是不同的。
1.Spcae.World
transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
transform.Translate(transform.forward * Time.deltaTime, Space.World);
當局部坐標=世界坐標時。
當局部坐標!=世界坐標時。(旋轉30度)
2.Spcae.Self
transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);
transform.Translate(transform.forward * Time.deltaTime, Space.Self);
當局部坐標=世界坐標時。
當局部坐標!=世界坐標時。(旋轉30度)
所以你會發現,當使用transform.Translate時參數是Space.Self。Transform.forward的移動方向會很奇怪。。
原因是transform.Translate
參數Space.Self
需要一個局部坐標系的方向向量,但是transform.forward是世界坐標的方向向量。
所以除非必要,否則別用這句代碼:
transform.Translate(transform.forward * Time.deltaTime, Space.Self);
這會讓你物體的前進方向變的混亂。
應該用:
transform.Translate(transform.forward * Time.deltaTime, Space.World);//或者
transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);
小問題:為什么旋轉30°時,transform.Translate(transform.forward * Time.deltaTime, Space.Self);,這句代碼會讓物體往60°的方向移動呢?
首先transform.forward是自動對物體旋轉值算出前進方向向量的變量。同時 transform.forward是當前物體的物體坐標系的z軸在世界坐標系上的指向。系統根據物理本身的局部坐標系計算出z軸在世界坐標系上的旋轉值是30°,但是你使用transform.Translate並且設置了Space.Self按照局部坐標移動,那么,transform.forward這個30°的世界坐標的旋轉又要根據物體的局部坐標系轉化成局部坐標,那么兩次30°+30°就是最后我們所看到物體往世界坐標的60°旋轉方向移動。