iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
自我挑戰組

用unity製作2DRPG雛形-沒有大野狼的小紅帽系列 第 12

12.unity使用者輸入(GetKey與GetButton)

今天試著了解如何讓使用者輸入,操作Input的形式,之後就能夠利用Input的參數和碰撞觸發的事件進行使用者互動,觸發各式各樣的遊戲事件。以下程式碼  //變數定義  的部分在撰寫程式時不用寫。

輸入的硬體

鍵盤、滑鼠、遊戲搖桿、觸控螢幕、麥克風......等等。

取得輸入

之前在角色移動中有寫到
Input.GetKey("a"),如果按a鍵,就會執行往上的位移。

if (Input.GetKey("a"))
     {
        this.gameObject.transform.Translate(new Vector2(-5, 0) * Time.deltaTime);
     }  

由例子中的if用法可以知道,Input.GetKey()是一個布林值,成立(輸入)就會true。
接收輸入主要有兩種寫法:GetKeyGetButton

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


上一篇
11.unity地圖障礙物(Tilemap Collider 2D)
下一篇
13.unity 文字&關閉遊戲
系列文
用unity製作2DRPG雛形-沒有大野狼的小紅帽30

尚未有邦友留言

立即登入留言