目標是實現目標隨攝像機方向的不一樣而進行不一樣方向移動——並且,目標不須要隨攝像機一塊兒旋轉。c#
void HandleKeyboardAction() { var horizontal = Input.GetAxis("Horizontal") * PlayerMotionScaleLevel * Time.deltaTime; var vertical = Input.GetAxis("Vertical") * PlayerMotionScaleLevel * Time.deltaTime; var motion = transform.rotation * new Vector3(horizontal, 0, vertical); var mag = motion.magnitude; motion.y = 0; Player.transform.position += motion.normalized * mag; }
極其簡單的作法,獲取到鍵盤移動的軸以後,用攝像機的旋轉四元數乘一下,便可獲得旋轉後的向量,加上去就ok了。code
須要注意的是這裏用攝像機的四元數旋轉要求攝像機必須只在x和y兩個軸旋轉。orm
先備份一下三維向量的數量值,這是爲了能保證攝像機向上和向下看時,平面x和z軸上的份量不會太小,保持一致的移動速度。it
用四元數旋轉完成後,去除y軸的值,使目標只在當前平面上移動。再用算出來的向量的單位向量乘上以前備份的數量值,獲得平面上移動的偏移向量。io
最後,算出新的位置座標,賦值,完事兒。form