今天試著了解如何讓使用者輸入,操作Input的形式,之後就能夠利用Input的參數和碰撞觸發的事件進行使用者互動,觸發各式各樣的遊戲事件。以下程式碼 //變數定義 的部分在撰寫程式時不用寫。
鍵盤、滑鼠、遊戲搖桿、觸控螢幕、麥克風......等等。
之前在角色移動中有寫到
Input.GetKey("a"),如果按a鍵,就會執行往上的位移。
if (Input.GetKey("a"))
{
this.gameObject.transform.Translate(new Vector2(-5, 0) * Time.deltaTime);
}
由例子中的if用法可以知道,Input.GetKey()是一個布林值,成立(輸入)就會true。
接收輸入主要有兩種寫法:GetKey 和 GetButton 。
1.GetKey:
//變數定義
public static bool GetKey (string name);
public static bool GetKey (KeyCode key);
//使用方法
if(Input.GetKey("a")){} //按下a鍵
if(Input.GetKey(KeyCode.Mouse0)){} //按下滑鼠左鍵
Keycode是unity內的enumeration(列舉),提供各種按鍵的名字,可仔細看看。不知道名字就查吧!
GetKey的好處是很直白明瞭,是用上非常快速,但官方仍建議使用GetButton,因為GetButton可以自訂義功能按鍵。(在遊戲中設置更改攻擊按鍵,就是這個XD)
2.GetButton:
GetButton搭配Input Manager使用,可以自訂事件的按鍵(非常物件導向呢)
//變數定義
public static bool GetButton (string buttonName);
//使用方法
if (Input.GetButton("Fire1")){}
建置Input Manager
Edit → Project Settings → Input Manager
可以看到Fire1這個事件下的操控,Positive Button預設是鍵盤left ctrl鍵
GetKeyDown : 按鍵是否按下,按下時會回傳True。
GetKeyUp: 按鍵是否放開,放開時會回傳True。
GetKey: 按鍵是否持續壓著,按鍵壓著就會一直回傳True。
其他一樣:
GetButtonDown : 按鍵是否按下,按下時會回傳True。
GetButtonUp: 按鍵是否放開,放開時會回傳True。
GetButton: 按鍵是否持續壓著,按鍵壓著就會一直回傳True。
輸入任何鍵
//使用方法
if(Input.anyKey){}
if(Input.anyKeyDown){}
滑鼠
1.按鍵編碼規則,左鍵(0),右鍵(1),中鍵(2),附加按鈕(3~6)
_________
| 0 | 2 | 1 |
_________ 我是滑鼠
| |
| |
_________
2.點擊除了Input.GetKey(KeyCode.Mouse0),也可以寫GetMouseButton
public static bool GetMouseButton (int button); //變數定義
if(Input.GetMouseButton(0)){}//使用方法
一樣有三種狀態
Input.GetMouseButton(0)
Input.GetMouseButtonDown(1)
Input.GetMouseButtonUp(2)
3.滑鼠座標(x,y,z)
public static Vector3 mousePosition ; //變數定義
//使用方法
Vector3 mousePos = Input.mousePosition; //返回三位數(x,y,z)
4.滾輪(0,y)
傳回(0,y)的2維變數,通常會使用Input.mouseScrollDelta.y,只取y值。
public static Vector2 mouseScrollDelta ; //變數定義
//使用方法
Vector3 pos = sphere.position;
pos.y += Input.mouseScrollDelta.y * scale;
transform.Position = pos;
讀取軸
連續移動的輸入除了GetKey / GetButton,也可以使用GetAxis取得X或Y軸數據來設置。
有GetAxis還有GetAxisRaw差別在於
GetAxis回傳-1到1之間的浮點數,例如0.4。
GetAxisRaw只回傳-1、0、1。
//變數定義
public static float GetAxis(string axisName);
public static float GetAxisRaw(string axisName);
//使用方法
//滑鼠上的Axis
float x = horizontalSpeed * Input.GetAxis("Mouse X"); //水平鼠標偏移
float v = verticalSpeed * Input.GetAxis("Mouse Y");//垂直鼠標偏移
float scroll = Input.GetAxis("Mouse ScrollWheel");//滾輪
//鍵盤上的Axis
float h = Input.GetAxis("Horizontal");//A、D或左右
float v = Input.GetAxis("vertical");//W、S或上下
改寫移動方法,利用Time.deltaTime;調整移動速率,讓每幀移動速率相同,因此選擇GetAxisRaw。
void Update()
{
float Ypos = Input.GetAxisRaw("Horizontal") * Time.deltaTime;
float Xpos = Input.GetAxisRaw("vertical") * Time.deltaTime;
transform.Position = new Vector3(Xpos, Ypos, 0);
}
更多輸入功能請參閱:Input