Input là 1 thành phần quan trọng trong bất kì ứng dụng nào, có rất nhiều thông điệp thường dùng để lấy thông tin từ keyboard, mouse như KeyDown
, KeyUp
, MouseDoubleClick
, ... với Unity, Input cũng quan trọng và là thành phần không thể thiếu.
OnMouse event
Đây là sự kiện cơ bản thường được sử dụng trong Unity cho phép lập trình viên dùng chuột máy tính để tương tác với các đối tượng trong game.
Giả sử trong game có 1 GameObject, ví dụ như 1 quả boom. Khi người chơi click chuột vào nó thì quả boom đó sẽ phát nổ. Để làm được điều này sử dụng hàm OnMouseDown
được hiện thực sẵn bởi Unity. Hàm này sẽ được tự động gọi mỗi khi người dùng click vào đối tượng. Vậy công việc tới đây khá đơn giản, chỉ cần hiện thực 1 hàm thể hiện 1 vụ nổ và trong hàm OnMouseDown
, sẽ có 1 lời gọi đến hàm này.
Dưới đây là 1 ví dụ đơn giản minh họa. Khi người dùng click vào GameObject là bức hình thì tại cửa sổ Console sẽ in ra dòng chữ “You clicked me
”
using UnityEngine; using System.Collections; public class Controller : MonoBehaviour { void OnMouseDown() { Debug.Log ("You clicked me !!"); } }
Ngoài OnMouseDown
còn có thêm 1 số hàm liên quan:
OnMouseUp
: xảy ra khi người dùng thả chuột khi đã click chuột trước đó.OnMouseEnter
: xảy ra khi người dùng di chuyển chuột đi vào phạm viCollider
của GameObjectOnMouseExit
: xảy ra khi người dùng di chuyển chuột ra khỏi phạm viCollider
của GameObject.
Cách sử dụng các hàm này tương tự với OnMouseDown.
GetMouseButton
Các sự kiện OnMouse
làm việc khá hiệu quả và thường được sử dụng khi cần phát hiện và xử lý khi người dùng click chuột. Tuy nhiên nó có 1 số điểm còn hạn chế.
Trở về ví dụ quả boom ở trên. Giả sử muốn dùng chuột để di chuyển quả boom đi 1 vị trí khác và sau đó mới kích nổ nó. Rõ ràng ở đây gặp 1 vấn đề là hàm OnMouseDown
sẽ được gọi khi Mouse click xuống mà không cần biết đó là Mouse left hay Mouse right. Quả boom sẽ phát nổ ngay khi vừa click vào mà chưa kịp di chuyển.
Vậy bây giờ muốn sử dụng chuột trái để di chuyển và chuột phải để kích hoạt thì sao ?
Điều đó có thể thực hiện dễ dàng bằng cách sử dụng các hàm Input.GetMouseButton(x)
. Cụ thể.
- Hàm
Input.GetMouseButton(0)
đại diện cho Mouse Left. - Hàm
Input.GetMouseButton(1)
đại diện cho Mouse Center. - Hàm
Input.GetMouseButton(2)
đại diện cho Mouse Right.
Lưu ý: Các hàm trên cần phải được gọi liên tục sau mỗi frame để sự kiện được kiểm tra chính xác.
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { if (Input.GetMouseButtonDown(0)) Debug.Log("Mouse left click."); if (Input.GetMouseButtonDown(1)) Debug.Log("Mouse center click."); if (Input.GetMouseButtonDown(2)) Debug.Log("Mouse right click."); } }
Nhập dữ liệu từ bàn phím
Đây là 1 dạng input thường xuyên sử dụng khi lập trình các game trên Windows, là nơi sử dụng bàn phím vật lý. Những hành động thường gặp là chạy, nhảy và tấn công đối thủ sẽ được gắn vào các phím trên keyboard. Để lấy input từ bàn phím có 2 cách:
GetKey(hay GetButton)
GetAxis
GetKey và GetButton
Trong Unity, GetKey
hay GetButton
là cách mà nhận input từ bàn phím thông qua class Input
. Điểm khác biệt giữa 2 cách này là:
GetKey
sử dụngKeyCode
được quy định sẵn trong Unity. MỗiKeyCode
đại diện cho 1 phím bấm.GetButton
sẽ sử dụng tên do chính lập trình viên tự quy định để đại diện cho 1 phím bất kì. Chẳng hạn có thể đặt “DauCach
” đại diện cho phím Space. Về cơ bản lúc này “DauCach
” tương đương vớiKey.Space
Để thêm 1 tên đại diện cho phím bất kì có thể vào Edit → Project Settings → Input menu. Với Name
là tên thay thế cho phím và PostiveButton
chính là phím cần đại diện.
void Update () { // Lấy Input theo GetKey bool down = Input.GetKeyDown(KeyCode.Space); bool held = Input.GetKey(KeyCode.Space); bool up = Input.GetKeyUp(KeyCode.Space); // Lấy Input theo GetButton bool down = Input.GetButtonDown("Jump"); bool held = Input.GetButton("Jump"); bool up = Input.GetButtonUp("Jump"); // Do something. }
GetAxis
Điểm khác biệt giữa GetAxis
so với các phương thức GetKey
hay GetButton
là không trả về giá trị true
hay false
như thông thường mà sẽ trả về 1giá trị float
có phạm vi nằm trong khoảng [-1;1]
phụ thuộc vào thời gian nhấn giữ của 1phím.
GetAxis
thường làm việc cùng lúc với 2 phím đồng thời được khai báo cụ thể trong Input Manager.
Một phím gọi là Negative Button, phím còn lại gọi là Positive Button. có giá trị lần lượt là -1
và 1
.
- Ở trạng thái bình thường, cả 2 phím này không được nhấn hàm sẽ trả về giá trị
0
. - Khi trạng thái của phím PositiveButton thay đổi, hàm sẽ tăng giá trị từ
0
lên đến1
. - Khi nhả phím ra nó sẽ giảm giá trị trở về
0
.
Tương tự như vậy với Negative Button với khoảng [-1, 0]
.
Thời gian thay đổi các cặp giá trị [0, 1]
[1,0]
, [0, -1]
[-1,0]
có thể được điều chỉnh bằng thuộc tính Gravaity thông qua Input Manager.
Thiết lập thời gian từ 0
đến 1
sẽ tăng dần đều, từ 1
trở về 0
sẽ giảm dần đều... để phù hợp với từng trường hợp cụ thể của Game.
Ứng dụng của GetAxis
GetAxis
được sử dụng rất nhiều trong việc di chuyển Player trong game theo thời gian thực. Giá trị của hàm phụ thuộc vào thời gian nhấn giữ phím do đó có thể dùng để di chuyển nhân vật nhanh hay chậm theo ý muốn dễ dàng.