Menu
CoddyTech

Input Actions

Termasuk bagian Membangun Game Sungguhan dalam perjalanan Unity di Coddy. Pelajaran 47 dari 60.

Menguji tombol satu per satu membuat skrip terikat pada keyboard. Sebuah aksi menamai tindakan pemain, sementara proyek mencantumkan tombol, stik, dan tombol gamepad yang memicunya. Proyek Unity 6 baru sudah dilengkapi sekumpulan aksi (aset InputSystem_Actions, yang ditetapkan sebagai aksi untuk seluruh proyek), dengan peta Player yang memiliki Move (WASD, tombol panah, dan stik kiri gamepad), Look (mouse atau stik kanan), Attack (tombol kiri mouse dan Enter), Interact (E, ditahan), Crouch (C), Jump (Space dan tombol selatan gamepad), Previous dan Next (1 dan 2), serta Sprint (Left Shift). Semuanya aktif sejak awal, dan InputSystem.actions.FindAction("Jump") mengambil salah satunya berdasarkan nama. Mesin capit tampak samping ini bergerak pada sumbu x dan y, lalu mencapit saat tombol Jump ditekan:

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!");
    }
}

Aksi diambil sekali, di Start, lalu disimpan dalam field InputAction. Move memberikan Vector2: x berarti kanan dan kiri, y berarti atas dan bawah pada tombol, dan nilainya dinormalisasi, sehingga menekan W dan D bersamaan menghasilkan (0.71, 0.71), bukan (1, 1). Karena ini tampak samping, mesin capit menggunakan y untuk ketinggian; game yang dilihat dari atas akan menggunakan z. Aksi tombol merespons seperti tombol keyboard: WasPressedThisFrame(), WasReleasedThisFrame(), dan IsPressed(). Dua kesalahan akan menyebabkan error: nama yang salah eja membuat FindAction mengembalikan null (NullReferenceException saat pembacaan pertama), dan ReadValue<Vector3>() pada Move menyebabkan InvalidOperationException begitu sebuah tombol ditekan, karena Move menyimpan Vector2.

challenge icon

Tantangan

Sedang

Jalankan surveyor dan tanam bendera dengan action proyek.

  1. Di Start(), atur moveAction, jumpAction, dan attackAction dengan InputSystem.actions.FindAction("Move"), "Jump", dan "Attack".
  2. Di Update(), berjalanlah dengan mengalikan moveAction.ReadValue<Vector2>() dengan speed, dengan komponen y-nya pada sumbu z.
  3. Panggil Plant() saat jumpAction.WasPressedThisFrame(), dan panggil PullUp() saat tombol Attack ditekan.

Tekan tombol “Main”, tanam tiga bendera, lalu klik untuk mencabut satu bendera. Setelah itu, tekan tombol “Periksa”.

Coba sendiri

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()
    {
        // cari aksi Move, Jump, dan Attack
    }

    void Update()
    {
        // berjalan dengan Move, panggil Plant() saat Jump ditekan, dan PullUp() saat Attack ditekan
    }

    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);
    }
}

Semua pelajaran di Membangun Game Sungguhan

Latihan sendiri: Playground Unity