在Unity中有兩個forward,一個是Transform.forward一個是Vector3.forward。spa
對於Vector3來講,它只是縮寫。沒有其它任何含義。3d
對於Transform.forward來講,它表明當前物體的物體座標系的z軸在世界座標系上的指向。(世界座標系中的藍色軸)。code
若是使用Transform.Translate。須要注意Vector3和Transform是不一樣的。orm
他們之間的區別主要體如今在不一樣座標系時的反映上。blog
transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
transform.Translate(transform.forward * Time.deltaTime, Space.World);
當局部座標=世界座標時。it
當局部座標!=世界座標時。(旋轉30度)io
transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);
transform.Translate(transform.forward * Time.deltaTime, Space.Self);
當局部座標=世界座標時。form
當局部座標!=世界座標時。(旋轉30度)class
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°旋轉方向移動。
vector3.forward的值永遠等於(0,0,1)。
transform.forward的值則等於當前物體的自身座標系z軸在世界座標上指向,所以不必定等於(0,0,1),可是其magnitude長度是1。
這也就是爲何,transform.forward 轉換爲self自身座標系時會有這種結果。
在world世界座標系——space.world上的狀況則徹底相反。
所以,想要讓物體向前移動,在transform.translate()上和直接修改transform.position上,差異是挺大的。transform.position 自己就是世界座標。
經常使用的移動方法總結下來有如下幾種:
一、
//等因而在世界座標的z軸前進。 transform.position += vector3.forward
二、
//等因而物體自身座標系的z軸前進。 transform.position += transform.forward
三、
//等因而物體自身座標系的z軸前進。效果等同於2。 transform.Translate(vector3.forward * Time.deltaTime,Space.Self) ;
四、
//上面出現的奇葩結果就是這個用法引發的,建議不是特殊須要別用這個用法。
transform.Translate(transform.forward * Time.deltaTime,Space.Self)
五、
//等因而在世界座標的z軸前進。效果等同於1。 transform.Translate(vector3.forward * Time.deltaTime,Space.World)
六、
//等因而讓物體沿着「物體自身座標z軸在世界座標上的方向」前進(等因而物體自身座標系的z軸前進)。效果等同於2。 transform.Translate(transform.forward * Time.deltaTime,Space.World)