2026. 4. 14. 20:57ㆍUnreal
https://tjdgus123.tistory.com/44
< 언리얼 C++ > 캐릭터와 입력 시스템
Pawn VS Character?언리얼에서 플레이어가 조종할 수 있는 오브젝트의 기본 단위는 "Pawn"이다. 그리고 Character 클래스는 Pawn을 상속받은 자식 클래스이다. 그럼 뭘 써야할까? 두 클래스의 차이를 알아
tjdgus123.tistory.com
이 내용에서 이어집니다.
캐릭터의 이동은 다음과 같이 구현된다.
PlayerController
↓
IMC 활성화 (어떤 키가 어떤 IA에 연결되는지 등록)
↓
Character::SetupPlayerInputComponent() → IA와 함수 연결 (바인딩)
↓
실제 함수 실행 → Move() / Jump() / Look() / Sprint()
PlayerController는 "키가 눌렸다"는 것을 감지하고,
Character는 "그 키가 눌렸을 때 어떤 함수를 실행할지"를 등록한다.
지금 전 내용에서는 함수를 찾는 것 까지 진행했고, 이제 그 함수를 구현해보려고 한다.
캐릭터 클래스에서 입력 액션 연결의 개념
PlayerController는 키나 마우스 입력을 감지하고 각 입력 액션을 활성화해줄 뿐 캐릭터 클래스에서 어떤 함수가 호출될지를 직접 바인딩 해줘야 동작이 이루어진다.
캐릭터에 액션 바인딩 추가




이러한 구조로 진행된다. 이제 핵심 함수에 대해서 알아보려고 한다.
SetupPlayerInputComponent()
Character에서 입력과 함수를 연결하는 함수이다.
게임 시작 시 엔진이 자동으로 한 번 호출한다.
주요 개념
Cast<T> (포인터)
언리얼의 안전한 형변환 함수이다.
부모 타입 포인터를 자식 타입으로 변환하며, 실패하면 nullptr을 반환한다.
반드시 if로 결과를 확인해서 안전하게 작성해야 한다.

BindActiron( IA, TriggerEvent, 객체, 함수포인터)
특정 IA가 발생했을 때 어떤 함수를 실행할지 등록하는 함수이다.
| 인자 | 설명 |
| 1번 : IA | 어떤 입력 액션과 연결할지 |
| 2번 : TriggerEvent | 언제 함수를 호출할지 |
| 3번 : this | 함수가 속한 객체 |
| 4번 : 함수포인터 | 실행할 함수 |
TriggerEvent의 종류는 다음과 같다.
- Triggered : 키를 누르고 있는 동안 매 프레임
- Started : 키를 누른 첫 순간 한 번만
- Completed : 키에서 손을 뗀 순간
점프 / 스프린트는 누를 때와 뗄 때가 다르게 동작하기 때문에 각각 Start, Stop으로 나눠서 Triggered와 Completed를 따로 바인딩한다.
Move()

주요 함수
FInputActionValue
Enhenced Input이 바인딩된 함수에 전달하는 입력값 구조체이다.
IA의 Value Type에 맞춰 꺼내야 한다.
Value.Get<FVector2D>() // Axis2D로 설정된 IA_Move
Value.Get<float>() // Axis1D
Value.Get<bool>() // Bool
여기서 Move함수에 인자로 참조값을 받는 이유는 Move()는 트리거로 바인딩되어 있어서 키를 누르고 있는 동안 매 프레임마다 호출되는데, 초당 60프레임이면 1초에 60번이 호출되는 셈이다.
그러면 함수가 호출될 때마다 FInputActionValue 객체를 통째로 계속 복사해오기 때문에 불필요한 낭비를 하게 되는데, 참조로 받아오면 복사 없이 원본 데이터를 그대로 가리키기만 해서 코드가 훨씬 가벼워진다.
AddMovementInput ( 방향, 크기 )
직접 위치를 바꾸는 게 아닌, CharacterMovementComponenet에 "이 방향으로 이동해줘" 라고 요청하는 함수이다.
물리, 충돌, 중력 처리는 컴포넌트가 자동으로 한다.
Jump()

주요 개념
Jump()
Acharacter가 기본으로 제공하는 함수이다.
내부적으로 CharacterMovementComponent의 점프 로직을 호출한다.
점프 높이는 GetCharacterMovement()->JumpZVelocity로 조정할 수 있다.
StopJumping()
점프를 중단시키는 ACharacter 기본 제공 함수이다.
키를 떼는 순간 상승을 멈추고 중력의 영향을 받도록 처리한다.
두 함수 모두 직접 구현할 필요 없이 호출만 하면 되어 편리하다.
ACharacter를 상속받으면 자동으로 사용할 수 있다.
Look()

주요 함수
AddControllerYawInput (값)
Controller의 Yaw(좌우) 회전값을 더해주는 함수이다.
SpringArm이 bUsePawnControlRotation = true 이기 때문에 Controller가 회전하면 카메라도 자동으로 따라간다.
AddControllerPitchInput (값)
Controller의 Pitch(상하) 회전값을 더해주는 함수이다.
마우스 Y축을 IMC에서 Negate처리한 이유도 여기에 있다.
마우스를 위로 올리면 카메라도 위를 보는 것이 일반적인 게임의 조작법인데, 언리얼 좌표계에서는 위 방향이 음수라서 반전이 필요하다.
Sprint()

MyCharacter.h


MyCharacter.cpp
MaxWalkSpeed
캐릭터의 최대 이동속도를 결정하는 CharacterMovementComponent의 속성이다.
이 값을 바꾸는 것만으로 스프린트를 구현할 수 있다.
SprintSpeedMultiplier를 EditAnywhere로 선언했기 때문에 에디터 디테일 패널에서 숫자만 바꾸면 바로 속도 조절이 가능하다.
정리
- SetupPlayerInputComponenet() 는 게임 시작 시 자동으로 호출되며, IA와 함수를 연결하는 곳이다.
- Cast<UEnhancedInputComponent>로 캐스팅 후 BindAction()으로 바인딩한다.
- 바인딩할 함수에는 반드시 UFUNCTION()을 붙인다.
- ETriggerEvent::Triggered = 누르는 동안, Completed = 손을 뗀 순간.
- FInputActionValue::Get<T>()에서 T는 IA의 Value Type과 일치해야 한다.
- AddMovementInput()은 직접 위치를 바꾸지 않고 MovementComponent에 요청한다.
- Jump() / StopJumping()은 ACharacter 기본 제공 함수, 상속받으면 바로 사용 가능하다.
- AddControllerYawInput() / AddControllerPitchInput()으로 Controller 회전을 변경한다.
- 스프린트는 GetCharacterMovement()->MaxWalkSpeed를 바꿔서 구현한다.
'Unreal' 카테고리의 다른 글
| 언리얼 엔진 애니메이션 블루프린트 정리 (0) | 2026.04.16 |
|---|---|
| 리플렉션 / UBT / UHT / CDO 정리 (0) | 2026.04.15 |
| < 언리얼 C++ > 캐릭터와 입력 시스템 (0) | 2026.04.14 |
| 언리얼 DAY9 언리얼 블루프린트 정리 (0) | 2026.03.03 |
| 내일배움캠프 Day 6 플랫폼 게임 만들기 (0) | 2026.03.01 |