Menu
CoddyTech

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.

challenge icon

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.

  1. Trong Start(), thiết lập moveAction, jumpAction và attackAction bằng InputSystem.actions.FindAction("Move"), "Jump" và "Attack".
  2. Trong Update(), di chuyển bằng cách nhân moveAction.ReadValue<Vector2>() với speed, trong đó trục y của giá trị đầu vào tương ứng với trục z.
  3. Gọi Plant() khi jumpAction.WasPressedThisFrame() trả về true, và gọi PullUp() 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ế

Tự luyện tập: Playground Unity