昨天的文章已把場景與平面偵測做好,今天要繼續說明角色蛇的移動
目錄
移動機制說明
變數宣告
介面按鈕設定
前進
旋轉
介面中會有上、下、左、右四個按紐,觸控哪個按鈕,角色肥遺就會往那個方向旋轉然後前進。
在開始寫肥遺的一切移動之前,要先寫按鈕如何控制肥遺。因為會有4個方向,所以這邊寫了一個class來為方向方向,這樣在之後要判別方向比較方便。
static class Dir
{
public const int Top = 0;
public const int Right = 1;
public const int Down = 2;
public const int Left = 3;
public const int no = -1;
}
再來是宣告幾個變數在之後會用到的變數
儲存按鈕按下的方向
int inputDir = Dir.no;
儲存目前的方向
int Direction = Dir.Right;
用來儲存不同按鈕前進的方向
Vector3 movement;
是否要旋轉
bool rotating = false;
用來判斷順時鐘逆時鐘
bool turntoright = false;
累積旋轉度數
float rotateangle = 0;
用來儲存原本的角度
float oriAngle = 90;
先為按鈕增加Trigger Event,PointDown跟PointUp,決定當按鈕壓下以及放開時,物件要發生的動作。根據按下的按鈕更改inputDir變數。
以向上按鈕來說,需要注意的是在按下這顆按鈕之前,原方向可能是向右或向左,用if else去判斷之前可能的方向,來決定要順時鐘還是逆時鐘旋轉,並且把rotating變數設為true(準備旋轉)。
在不同按鈕按下的函式中,改變movement變數,例如按下向上按鈕,movement.z = 1f ,根據座標以此類推。
在FixedUpdate中,判斷如果有輸入方向,就用rigibody的MovePosition函式來移動肥遺。
void FixedUpdate(){
if(inputDir != Dir.no) {
rb.MovePosition(rb.position + movement * movespeed * Time.fixedDeltaTime);
}
}
也是在FixedUpdate()中進行:
if (rotating){//判斷有沒有旋轉
rotateangle += rotatespeed * Time.deltaTime;
if (rotateangle < 90f){ //還沒轉玩90度
if (turntoright)
{
transform.localRotation = Quaternion.Euler(0, transform.localEulerAngles.y + rotatespeed * Time.deltaTime, transform.localEulerAngles.z);
}
else
{
transform.localRotation = Quaternion.Euler(0, transform.localEulerAngles.y - rotatespeed * Time.deltaTime, transform.localEulerAngles.z);
}
}
else
{
if (turntoright)
{
transform.localRotation = Quaternion.Euler(0, oriAngle - 90f, transform.localEulerAngles.z);
oriAngle = oriAngle + 90f;
}
else
{
transform.localRotation = Quaternion.Euler(0, oriAngle + 90f, transform.localEulerAngles.z);
oriAngle = oriAngle - 90f;
}
rotating = false;
rotateangle = 0;
}
}
以上就是比較簡單的旋轉以及移動囉,那肥移走迷宮的這個系列就到這邊,我們明天下一個系列見~