Thao tác đầu vào
Thuộc phần Xây dựng trò chơi thực tế trong hành trình Unity của Coddy. Bài học 47 trên 60.
Kiểm tra từng phím một khiến script bị ràng buộc với bàn phím. Hành động gọi tên việc người chơi làm, còn dự án liệt kê các phím, cần điều khiển và nút kích hoạt hành động đó. Một dự án Unity 6 mới có sẵn một bộ hành động (tài nguyên InputSystem_Actions, được đặt làm bộ hành động dùng chung cho toàn dự án). Trong đó, bản đồ Player có Move (WASD, các phím mũi tên và cần trái của tay cầm chơi game), Look (chuột hoặc cần phải), Attack (nút chuột trái và Enter), Interact (giữ E), Crouch (C), Jump (Space và nút phía nam của tay cầm chơi game), Previous và Next (1 và 2), cùng Sprint (Left Shift). Các hành động này được bật ngay từ đầu, và InputSystem.actions.FindAction("Jump") lấy một hành động theo tên. Cần cẩu gắp thú nhìn từ bên cạnh này di chuyển theo trục x và y, rồi gắp khi nhấn Jump:
using UnityEngine;
using UnityEngine.InputSystem;
public class ClawCrane : MonoBehaviour
{
public float speed = 3f;
private InputAction moveAction;
private InputAction jumpAction;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
transform.position += new Vector3(input.x, input.y, 0f) * speed * Time.deltaTime;
if (jumpAction.WasPressedThisFrame())
Debug.Log("Grab!");
}
}Các hành động được tìm một lần trong Start, rồi lưu trong các trường InputAction. Move trả về một Vector2: x là trái và phải, y là lên và xuống trên bàn phím. Giá trị này đã được chuẩn hóa, nên nhấn W và D cùng lúc sẽ cho (0.71, 0.71) thay vì (1, 1). Đây là góc nhìn bên, nên cần cẩu dùng y làm chiều cao; trò chơi có góc nhìn từ trên xuống sẽ dùng z. Các hành động dạng nút hoạt động giống như phím: WasPressedThisFrame(), WasReleasedThisFrame() và IsPressed(). Có hai lỗi có thể xảy ra: viết sai tên khiến FindAction trả về null (gây NullReferenceException ở lần đọc đầu tiên), còn gọi ReadValue<Vector3>() trên Move sẽ gây InvalidOperationException ngay khi bạn nhấn giữ một phím, vì Move chứa một Vector2.
Thử thách
Trung bìnhĐiều khiển nhân viên đo đạc di chuyển và cắm cờ bằng các hành động của dự án.
- Trong
Start(), thiết lậpmoveAction,jumpActionvàattackActionbằngInputSystem.actions.FindAction("Move"),"Jump"và"Attack". - Trong
Update(), di chuyển bằng cách nhânmoveAction.ReadValue<Vector2>()vớispeed, trong đó trục y của giá trị đầu vào tương ứng với trục z. - Gọi
Plant()khijumpAction.WasPressedThisFrame()trả về true, và gọiPullUp()khi nhấn Attack.
Nhấn Chơi, cắm ba lá cờ rồi nhấp chuột để nhổ một lá. Sau đó nhấn Kiểm tra.
Tự làm thử
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Surveyor : MonoBehaviour
{
public float speed = 4f;
public int flags = 3;
public GameObject flagPrefab;
private InputAction moveAction;
private InputAction jumpAction;
private InputAction attackAction;
private List<GameObject> planted = new List<GameObject>();
void Start()
{
// Tìm các hành động Move, Jump và Attack
}
void Update()
{
// Di chuyển bằng Move, gọi Plant() khi nhấn Jump và PullUp() khi nhấn Attack
}
void Plant()
{
if (flags == 0) return;
Vector3 spot = new Vector3(transform.position.x, 0.75f, transform.position.z);
planted.Add(Instantiate(flagPrefab, spot, Quaternion.identity));
flags--;
Debug.Log("Flags left: " + flags);
}
void PullUp()
{
if (planted.Count == 0) return;
GameObject last = planted[planted.Count - 1];
planted.RemoveAt(planted.Count - 1);
Destroy(last);
flags++;
Debug.Log("Flags left: " + flags);
}
}
Tất cả bài học trong Xây dựng trò chơi thực tế
1Văn bản trên màn hình
Canvas và văn bảnHiển thị điểm sốĐịnh dạng sốĐồng hồ đếm ngượcÔn tập: Đồng hồ tốc độ7Điều khiển thời gian
Tạm dừng bằng timeScaleChuyển động chậmThời gian không bị co giãnÔn tập: Bullet Time2Nút bấm và màn hình
Nút bấm và onClickLambdaKết nối trong InspectorBật và tắt bảngThanh máuÔn tập: Cửa hàng nâng cấp5Lưu dữ liệu với PlayerPrefs
Lưu một sốTải với giá trị mặc địnhĐiểm cao nhấtLưu cài đặtÔn tập: Tiền xu trong ngân hàng3Trình quản lý trò chơi
Một script chạy trò chơiSingletonCác trạng thái trò chơiChuyển đổi trạng tháiÔn tập: Trình quản lý vòng chơi6Dự án: trò chơi chạy vô tận
Ba làn đườngChướng ngại vật phía trước9Hệ thống đầu vào mới
Hai hệ thống đầu vàoBàn phím và chuộtĐược nhấn trong khung hình nàyThao tác đầu vàoÔn tập: chuyển đổi đầu vàoTự luyện tập: Playground Unity