문제 상황
기관총을 구현하는 과정에서 트리거가 되는 키를 N초 이상 누르고 있을 때 총탄이 발사되게 하고 싶은데 Enhanced Input Action 노드의 몇몇 핀이 같은 액션에 실행된다.
기능 이해와 테스트
나는 특정 키를 눌렀을 때 기관총이 예열을 시작하고, N₁초가 지났을 때 발사를 시작하며, 발사를 마친 기관총은 N₂초가 지났을 때 다시 발사를 할 수 있게 구현하고 싶었다.
그러나, 나는 Input Action과 Input Context Mapping, Enhanced Input Action 노드를 잘 모르는 상태로 기능을 구현하려고 했다. 한 번 이것들이 어떤 동작을 하는지 이해해 보자.
가장 먼저 Input Action이다. Input Action은 플레이어의 특정 입력 액션을 트리거하는 이벤트를 정의한다. Input Action의 예는 다음과 같다.
- IA_Attack : 특정 키가 눌렸을 때 트리거 (Value Type : bool, Triggers : Pressed)
- IA_Aiming : 특정 키가 약간 눌렸을 때 트리거 (Value Type : float, Triggers : Pressed, Modifiers : Deadzone 0.3 ~ 0.5)
- IA_SuperJump : 특정 키가 3초 동안 눌렸을 때 트리거 (Value Type : bool, Triggers : Hold / Hold Time Threshold : 3)
- 등등..
위와 같이 입력 액션에 대해 트리거하는 이벤트를 정의하는 것이 Input Action이다.
다음은 Input Mapping Context이다. Input Mapping Context 은 개발자가 정의한 Input Action을 어떤 입력 키에 연결할 것인지 정의한다. Input Mapping Context의 예는 다음과 같다.
- IA_Attack : Oculus Touch (R) Trigger Touch (오큘러스 퀘스트 2의 오른쪽 컨트롤러 트리거 버튼을 눌렀을 때 - 눌림 여부)
- IA_Aiming : Oculus Touch (R) Trigger Axis (오큘러스 퀘스트2의 오른쪽 컨트롤러 트리거 버튼을 눌렀을 때 - 눌림 강도)
- IA_SuperJump : Oculus Touch (R) A Press (오큘러스 퀘스트2의 오른쪽 컨트롤러 A 버튼을 눌렀을 때)
- 등등..
위와 같이 이전에 정의한 Input Action에 어떤 입력 키를 연결할 것인지 정의하는 것이 Input Mapping Context다.
마지막은 Enhanced Input Action 노드다. 해당 노드는 이전에 저장한 IMC를 연결한 뒤 Input Action의 결과 값에 따라 원하는 로직이 실행되도록 연결하는 노드다.
아무튼 이렇게 원리를 이해하고 사용하면 되는데 기능만 일단 대충 어떻게 구현하려는 나쁜 습관 때문에 시간만 날렸다. 그래서 위처럼 이론을 제대로 이해하고 다음과 같이 테스트를 진행했다.
이런 방식으로 Input Action부터 Input Mapping Context, Enhanced Input Action 노드에 대해 이해하고 사용했다. 다만, 아직도 애매한 점은 몇 가지 남아있는데 어떤 입력을 시작하던 Started에 연결된 로직이 2번 실행된다는 점과 여러 Trigger가 설정돼 있을 때의 우선순위 처리 관련된 부분이다.
이 부분은 Consume Lower Priority Enhanced Input Mappings 옵션등 여러 가지 부분을 조금 더 테스트해 봐야 될 것 같은데, 아직 굳이 필요하지는 않아서 추후에 알아보려고 한다.
아무튼 이렇게 입력 시스템에 대해 테스트해 보고 알아봤다.
결과
아래처럼 원하는 기능을 정상적으로 구현할 수 있었다.
배운 점
- 툴팁에는 많은 것들이 적혀 있다. 잘 살펴보자.
- 동작 결과가 내 예상과 다르다면, 동작 원리를 다시 한번 살펴보고 이해하자.
- 문제가 생기면 문제에 대한 가설을 세우고, 가설을 검증하기 위한 테스트를 진행해 보며, 그 결과를 기록하자.
더 알아볼 것들
- Oculus Quest의 컨트롤러를 활용한 3차원적 액션 트리거 방법
- Triggers 우선순위
참고 링크
'개발 > 언리얼' 카테고리의 다른 글
[Blueprint] Linetrace (0) | 2024.01.09 |
---|---|
[Blueprint] Timeline (0) | 2024.01.03 |
[Blueprint] Projectile Movement (0) | 2023.12.27 |
[Blueprint] 데미지 처리와 콜리전 채널 (0) | 2023.12.25 |
[Blueprint] 기묘한 For Loop와 Delay의 관계 (0) | 2023.12.24 |