Unity survival shooter tutorial教程中控制人物移動(dòng)的代碼如下:
Vector3 movement;
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
movement.Set (h, 0f, v);
movement = movement.normalized * speed * Time.deltaTime;
playerRigidbody.MovePosition (transform.position + movement);
但是發(fā)現(xiàn)當(dāng)人物掉頭之后,按鍵控制會(huì)反過來叛本,即w鍵
變成向后,s鍵
向前。原來得到的h,v的正負(fù)是世界坐標(biāo)系的味赃,因此人物掉頭,得到的正負(fù)就錯(cuò)了虐拓。
解決辦法
方法1:
if (v > 0)
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
else if (v < 0)
transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
方法2:
if (v > 0)
transform.position += transform.forward * moveSpeed * Time.deltaTime;
else if (v < 0)
transform.position -= transform.forward * moveSpeed * Time.deltaTime;
方法3:
if (v!=0)
transform.position += transform.forward * v* moveSpeed * Time.deltaTime;
上述方法可以看出心俗,這里需要弄清楚transform.Translate()
和transform.position
,Vector3.forward
和 transform.forward
的區(qū)別
vector3.forward
的值永遠(yuǎn)等于(0蓉驹,0城榛,1)。transform.forward
的值則等于當(dāng)前物體的自身坐標(biāo)系z軸在世界坐標(biāo)上指向态兴,因此不一定等于(0,0,1)狠持,但是其長度是1。transform.position
是世界坐標(biāo)瞻润。transform.translate
是自身坐標(biāo)系
因此想要物體向前移動(dòng):
想要讓物體向前移動(dòng)喘垂,在transform.translate()上和直接修改transform.position上甜刻,差別是挺大的。
1正勒、transform.position+= vector3.forward
等于是在世界坐標(biāo)的z軸前進(jìn)得院。
2、transform.position+=transform.forward
等于是物體自身坐標(biāo)系的z軸前進(jìn)章贞。
3祥绞、transform.translate(vector3.forward,Space.Self)
等于是自身坐標(biāo)系的z軸前進(jìn)鸭限。效果等同于2蜕径。
函數(shù)默認(rèn)參數(shù)是Space.Self
4、transform.translate(transform.forward,Space.Self)
會(huì)出現(xiàn)奇葩結(jié)果败京。
5兜喻、transform.translate(vector3.forward, Space.World)
等于是讓物體沿著世界坐標(biāo)的z軸前進(jìn)。
效果等同方式1赡麦。
6虹统、transform.translate(transform.forward,Space.World)
等于是讓物體沿著“物體自身坐標(biāo)z軸在世界坐標(biāo)上的方向”前進(jìn)(等同與物體沿著自身z軸前進(jìn))。
效果等同于方式2隧甚。
-
transform.translate(transform.forward,Space.Self)
在自身坐標(biāo)系下繞著自身的z軸车荔,結(jié)果也是有點(diǎn)奇葩。
總結(jié)
要想控制人物在自身基礎(chǔ)上前進(jìn)戚扳。主要方法為:
-
transform.position+=transform.forward
在世界坐標(biāo)系下忧便,向人物自身的前方方向行走 -
transform.translate(transform.forward,Space.World)
在世界坐標(biāo)系下,向人物自身的前方方向行走 -
transform.translate(vector3.forward帽借,Space.Self)
在自身坐標(biāo)系下珠增,向前方行走
其他
想實(shí)現(xiàn)人物左右移動(dòng)的話,方法類似砍艾,不再贅述蒂教,主要是把
Input.GetAxisRaw("Vertical");
改為Input.GetAxisRaw("Horizontal");
forward
改為right
if (h > 0)
transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
else if (h < 0)
transform.Translate(-Vector3.right* moveSpeed * Time.deltaTime);
或者
if (h > 0)
transform.position += transform.right* moveSpeed * Time.deltaTime;
else if (h < 0)
transform.position -= transform.right* moveSpeed * Time.deltaTime;
參考
- Unity3d vector3.forward和transform.forward的區(qū)別
https://blog.csdn.net/u013227473/article/details/53462823