ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1068) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (181) N
      • Unreal (69)
      • Unity (101) N
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • C
  • 티스토리챌린지
  • 포인터
  • SQL
  • 문자열
  • string
  • 프로그래머스
  • 유니티
  • C++
  • 언리얼
  • 배열
  • 파이썬
  • c#
  • 오블완
  • 백준
  • 함수
  • 그래픽스
  • 클래스
  • 알고리즘
  • Unity

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[Unity] New Input System 키 입력을 스크립트에 전달하여 처리하기
게임엔진/Unity

[Unity] New Input System 키 입력을 스크립트에 전달하여 처리하기

2023. 7. 25. 11:26

1. 로직을 제어할 스크립트(script) 부착하기

Player 게임 오브젝트에 키 입력값을 전달받고, 해당 로직을 제어할 스크립트를 만들어서 붙여줬다.

입력이 들어왔을 때, 해당 내용을 전달해주는 방법을 설정할 수 있는 'Behavior'

  • Send Messages, Broadcast Messages  :  유니티의 Send Message 기능을 사용하여 특정 함수를 호출하는 방식
  • Invoke Unity Events, Invoke C Sharp Events  :  유니티나 C#의 이벤트 기능을 사용하는 방식
  • 위 방식들을 스크립트에서 사용하기 위해서는 다음과 같은 네임스페이스 적용이 필요
using UnityEngine.InputSystem;

Send Messages 기능을 사용할 경우

  • 특정 키가 들어오면, 특정한 함수를 자동으로 호출하는 방식
  • Broadcast Messages의 경우, 하위 계층에 있는 오브젝트들까지 제어를 할 수 있다.
  • 함수명이 "On + Actions name"으로 구성된다.
    • 예를 들어, "Move"라는 Actions가 있다면, 함수명은 "OnMove"
  • 위와 같이 함수명을 구성한 후 해당 Actions의 키 입력이 들어왔을 경우, OnMove() 함수를 찾아간다.

현재 Player 캐릭터에 적용하도록 만들어 놓은 Action Map엔 "Move"와 "Jump" Actions가 있다.

 

해당 Actions에서 받는 키를 입력하게 되면, On + Actions name 이름인 함수를 자동으로 호출하게 된다.

void OnMove(InputValue value) // "Move" Actions에 해당하는 키 입력 시 자동 호출
{
   ...
}

void OnJump()                 // "Jump" Actions에 해당하는 키 입력 시 자동 호출
{
  // Jump는 Action Type을 "Button"으로 설정했기 때문에 따로 매개변수가 없다.
  // 함수가 호출되면 키가 입력된 것, 호출되지 않으면 입력되지 않은 것으로 간주한다.
   ...
}

Tip) Action Type이 "Value"인 키 호출은 입력과 입력되지 않을 때, 이렇게 두 번 호출된다.

void OnMove(InputValue value)
{
   Vector2 input = value.Get<Vector2>();
   // 이전 게시글을 보면, "Move" Actions에 해당하는 키 리턴은 'Vector2'로 받기로 했다.
   
   Debug.Log($"SEND_MESSAGE : {input}");
}

상하좌우 아무 키나 눌러보면 다음과 같이 함수가 두 번 호출된다.

Input Actions의 Actions에 대한 키 Properties 중 Mode를 "Digital Normalized"로 설정하면 위와 같이 정규화된 값을 입력 받는다.

즉, 키를 누를 때는 해당 키 입력에 대한 함수 호출이 이루어지고, 키를 다시 뗄 때 또한 함수 호출이 이루어진다.

 

실습으로 OnMove() 함수 하나만 로직을 작성해보자.

private Vector3 moveDirection;
private float moveSpeed = 4f;


void Update()
{
   bool hasControl = (moveDirection != Vector3.zero);
   if(hasControl)
   {
      transform.rotation = Quaternion.LookRotation(moveDirection);
      transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
   }
}


void OnMove(InputValue value)
{
     Vector2 input = value.Get<Vector2>();                   
     if(input != null)
     {
         moveDirection = new Vector3(input.x, 0f, input.y);
         Debug.Log($"SEND_MESSAGE : {input.magnitude}");
     }
}

Invoke Unity Events 기능을 사용할 경우

  • Unity의 Event 방식을 사용
  • 해당 Actions에 대한 키 입력이 들어왔을 경우, 설정한 이벤트 함수를 호출해준다.

유니티 이벤트 호출 방식처럼 호출할 함수를 설정해주면 된다.

"PlayerActions"에 대한 Actions 이벤트 함수들 설정

기존 로직은 똑같으므로 함수만 Invoke Unity Events 방식에 맞게 조금 수정해주었다.

public void OnMove(InputAction.CallbackContext context)
{
   Vector2 input = context.ReadValue<Vector2>();
   if(input != null)
   {
      moveDirection = new Vector3(input.x, 0f, input.y);
      Debug.Log($"UNITY_EVENTS : {input.magnitude}");
   }
}

public void OnJump(InputAction.CallbackContext context)
{
   if(context.performed)  // Action Type이 "Button"일 경우 키가 눌렸는지 체크
   {
      // 점프 로직
   }
}

Send Messages와 달리 "On + Actions name"으로 함수명을 지을 필요는 없으나, 이벤트 함수에 대한 네이밍 규칙, On을 적용해주었다. 그리고 인스펙터(Inspector) 창에서 이벤트 함수를 추가해주었다.

주의할 점이 있는데, 함수의 접근지정자를 public으로 해줘야 Inspector 창에서 이벤트 함수 등록을 할 수 있다.

이벤트 함수로, Player 스크립트에 있는 OnMove 함수 등록

[Unity] New Input System #2 | 키 입력을 스크립트에 전달하여 처리하기 (tistory.com)

저작자표시 (새창열림)

'게임엔진 > Unity' 카테고리의 다른 글

[Unity] 애니메이션 레이어 사용하기  (0) 2023.07.31
[Unity] 애니메이션 블랜드 사용하기  (0) 2023.07.31
[Unity] New Input System 세팅하기  (0) 2023.07.24
[Unity] Input Action을 사용해야 하는 이유  (0) 2023.07.24
[Unity] Input Manager (키보드 입력, 마우스 클릭, 조이스틱 등)  (0) 2023.07.24
    '게임엔진/Unity' 카테고리의 다른 글
    • [Unity] 애니메이션 레이어 사용하기
    • [Unity] 애니메이션 블랜드 사용하기
    • [Unity] New Input System 세팅하기
    • [Unity] Input Action을 사용해야 하는 이유
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바