Menu
CoddyTech

입력 액션

Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 47번째.

키를 하나씩 확인하면 스크립트가 키보드에 종속됩니다. 대신 액션은 플레이어가 하는 동작을 나타내며, 프로젝트에서 어떤 키, 스틱, 버튼이 해당 액션을 실행할지 지정합니다. 새 Unity 6 프로젝트에는 이런 액션 세트(InputSystem_Actions 에셋, 프로젝트 전체 액션으로 설정됨)가 포함되어 있으며, 이 에셋의 Player 맵에는 Move(WASD, 화살표 키, 게임패드 왼쪽 스틱), Look(마우스 또는 오른쪽 스틱), Attack(마우스 왼쪽 버튼과 Enter), Interact(누르고 있는 E), Crouch(C), Jump(Space와 게임패드 남쪽 버튼), Previous 및 Next(1과 2), Sprint(왼쪽 Shift)가 있습니다. 이 액션들은 처음부터 활성화되어 있으며, InputSystem.actions.FindAction("Jump")를 사용하면 이름으로 액션을 가져올 수 있습니다. 이 횡스크롤 집게 크레인은 x축과 y축으로 움직이고 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!");
    }
}

액션은 Start에서 한 번만 가져와 InputAction 필드에 저장합니다. Move는 Vector2를 반환합니다. x는 키보드에서 좌우를, y는 위아래를 나타내며, 값은 정규화되므로 W와 D를 함께 누르면 (1, 1)이 아니라 (0.71, 0.71)이 반환됩니다. 크레인은 측면에서 보는 구조이므로 y를 높이에 사용합니다. 위에서 내려다보는 게임이라면 y를 z에 사용합니다. 버튼 액션은 키와 마찬가지로 작동합니다. WasPressedThisFrame(), WasReleasedThisFrame(), IsPressed()를 사용할 수 있습니다. 두 가지 실수로 오류가 발생합니다. 이름을 잘못 쓰면 FindAction이 null을 반환하고(처음 읽을 때 NullReferenceException이 발생함), Move에 ReadValue<Vector3>()를 사용하면 키를 누르는 순간 InvalidOperationException이 발생합니다. Move의 값 형식은 Vector2이기 때문입니다.

challenge icon

챌린지

중급

프로젝트의 액션을 사용해 측량사를 움직이고 깃발을 심으세요.

  1. Start()에서 InputSystem.actions.FindAction("Move"), "Jump", "Attack"을 사용해 moveAction, jumpAction, attackAction을 설정하세요.
  2. Update()에서 moveAction.ReadValue<Vector2>()에 speed를 곱해 이동하세요. y축 입력은 z축으로 이동합니다.
  3. jumpAction.WasPressedThisFrame()일 때 Plant()를 호출하고, Attack을 눌렀을 때 PullUp()을 호출하세요.

‘플레이’를 누르고 깃발 세 개를 심은 다음, 클릭해서 깃발 하나를 뽑으세요. 그런 다음 ‘확인’을 누르세요.

직접 해보기

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()
    {
        // Move, Jump, Attack 액션을 찾는다
    }

    void Update()
    {
        // Move로 이동하고, Jump를 누르면 Plant()를, Attack을 누르면 PullUp()을 호출한다
    }

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

실제 게임 만들기의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드