Search…

C# Script - Lớp Input

24/09/20205 min read
Giới thiệu class Input và hướng dẫn các thao tác với Input trong Unity.

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

ss_1
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 vi Collider của GameObject
  • OnMouseExit: xảy ra khi người dùng di chuyển chuột ra khỏi phạm vi Collider 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ụng KeyCode được quy định sẵn trong Unity. Mỗi KeyCode đạ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ới Key.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.

ss_2
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à -11.

  • Ở 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 đến 1.
  • 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].

c script lớp input

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.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024