前言
繼上回的內容處裡好手把輸入,我接下來開始處理玩家物件的方向,這也是我之前腦袋卡住最久的部分,有些問題現在解決了,回想起來內容有點白癡白癡的,畢竟第一次碰寫程式啊,這篇主要是說明我腦袋運轉不是很順利的過程,與其他不會程式的讀者共勉之。
我現在有Input後我想轉彎
Vector3 moveDir = Vector3.forward;
Quaternion currentRotation;
public float moveSpeed;
public float invoTime;
public float invoRepeat;
void Start()
{
//InvokeRepeating("Move", invoTime, invoRepeat);
}
void Move()
{
transform.Translate(moveDir);
}
void Update()
{
//Move
transform.Translate(moveDir * moveSpeed * Time.deltaTime);
if (Gamepad.all[0].dpad.up.isPressed)
moveDir = Vector3.forward;
if (Gamepad.all[0].dpad.down.isPressed)
moveDir = Vector3.back;
......
dpad有16行就不全貼出來了,InvokeRepeating則是為了測試其他移動方法先隱藏了,現在要做的是轉向時的邏輯處裡,當時寫出來的是
if (moveDir = Vector3.forward)
if(Gamepad.all[0].dpad.left.isPressed)
{
transform.rotation(0,90,0);
moveDir = Vector3.left;
}
......
我很喜歡Vector3,但if和else真的不懂可以有and嗎,所以現在是物體亂轉時間
上一段結果不盡理想,程式動不了,以後記來說是因為對程式寫法的不熟悉、不明白教學資源給的邏輯和固執導致的種種錯誤。
if和else可以有and嗎
if的設定上在拜讀其他巴友的文章後
if (moveDir = Vector3.forward)要更改成if (moveDir == Vector3.forward)
才不會被認為在給予數值,且if也不給你亂算數學(可......可惡)。
兩層的if可以寫成if (moveDir = Vector3.forward && Gamepad.all[0].dpad.left.isPressed)
if簡單的測試後沒有問題就決定這樣解決了。
執著於Vector3
只看了一個單元的教學就開專案實屬過急,逛了一圈Unity Documentation也沒有結果,最後是VSCode提醒有個Rotate也可以轉,transform.rotation(0,90,0);改為transform.Rotate(0,90,0);測試後沒有問題,但依然不知道if底下為啥不能放transform.rotation就是了。
物件可以轉彎了,但物件的Local座標卻跟著改變了導致Vector3.forward也所指的「前方」轉了個方向。
Local座標轉換後依然「向前」,直到輸入其他指令,Vector3.forward指令從Global的Z軸改到X軸導致即使Vector3.left有作用也看起來沒作用。
眾裡尋他千百度 ,那人卻在上一行亂轉
經過兩天鑽磨問題和兩天放爛後,在使用
transform.Translate///moveDir * 有的沒的///moveDir = transform.Translate()
等偏方後,解法突然出現了,『既然轉彎後物件依然「向前」那只要轉彎就好了啊』,頓時物件豁然開朗自由擺盪,前幾天的我如笑話一樣。
跑了一輪論壇後發現要用Quaternion.Euler(0,0,0)用來固定轉向而不被時間與輸入次數影響,這下移動與旋轉的第一部份就搞定了,剩下就是前進時不能後退這類不准縮頭的if要寫了,最後PO上前後程式碼對比。
希望有幫助到需要的人。