오늘 배운 것
1. Character 클래스에 액션 바인딩 추가하기
: PlayerController는 "키나 마우스 입력" 을 감지하고, 각 입력 액션 (IA) 을 활성화해 줄 뿐이다.
그 다음 캐릭터 클래스(SprataCharacter)에서 "어떤 함수가 호출될지" 를 바인딩 해주어야 최종적으로 동작이 이루어진다.
- 정리하자면
1. PlayerController는 SprataInputMappingContext (IMC) 를 활성화한다.
2. 해당 IMC에는 IA_Move, IA_Jump 등의 UIputMappingContext들이 키보드/마우스와 맵핑되어 있다.
3. 캐릭터(SpartaCharacter)가 SetupPlayerInputComponent() 함수를 통해 "각 액션이 발생 했을 때 어떤 함수를 실행할지" 를 등록한다.
4. 이렇게 등록한 함수들이, 실제로 움직이거나 점프하는 등 캐릭터 동작을 수행한다.
- 캐릭터에 액션 바인딩 추가하기




- FIputActionValue
: Enhanced Input에서 액션 값 (축 이동값, 마우스 이동량 등) 을 전달 할 때 사용되는 구조체로, IA에서 설정한 Value Type이다.
- UFUNCTION()
: 입력 바인딩 함수는 언리얼 엔진 리플렉션 시스템과 연동되어야 한다.
UFUNCTION() 을 붙이지 않으면 바인딩에 실패할 수 있다.
- 블루프린트 접근성을 설정하지 않았더라도, 기본적으로 메타데이터가 생성된다.
- 언리얼 엔진의 입력 처리 시스템은 바인딩된 함수가 리플렉션 시스템을 통해 접근 가능한지 확인한다.
- BindAction 함수
- 첫 번째 인자
: 어떤 UIputAction과 연결할지 (예 : MoveAction)
- 두 번째 인자
: 액션이 발생하는 트리거 이벤트 (Triggered, Ongoing, Completed 등)
- 세 번째 인자 / 네 번째 인자
: 액션 발생 시 실행할 객체(this)와 함수 포인터
- 점프와 스프린트 함수 분리
: "키를 누를 때" 와 "뗄 때" 가 다르게 처리될 수 있으므로 두 함수로 분리한다.
2. 캐릭터 이동 함수 구현하기
- Move 함수 구현하기
void ASpartaCharacter::Move(const FInputActionValue& value)
{
// 컨트롤러가 있어야 방향 계산이 가능
if (!Controller) return;
// Value는 Axis2D로 설정된 IA_Move의 입력값 (WASD)을 담고 있음
// 예) (X=1, Y=0) → 전진 / (X=-1, Y=0) → 후진 / (X=0, Y=1) → 오른쪽 / (X=0, Y=-1) → 왼쪽
const FVector2D MoveInput = value.Get<FVector2D>();
if (!FMath::IsNearlyZero(MoveInput.X))
{
// 캐릭터가 바라보는 방향(정면)으로 X축 이동
AddMovementInput(GetActorForwardVector(), MoveInput.X);
}
if (!FMath::IsNearlyZero(MoveInput.Y))
{
// 캐릭터의 오른쪽 방향으로 Y축 이동
AddMovementInput(GetActorRightVector(), MoveInput.Y);
}
}
SpartaCharacter.cpp
- FInputActionValue::Get<FVector2D>()
: IA_Move가 Axis2D로 설정되어 있으므로, 2차원 벡터 형태로 입력이 들어온다.
W(앞) / S(뒤) / D(오른쪽) / A(왼쪽)을 동시에 누를 수도 있으므로, (1, 1) 같은 형태도 가능하다.
- AddMovementInput(방향, 크기)
-첫 번째 파라미터
: 월드 좌표 기준 이동 방향 (Forward, Right 등)
- 두 번째 파라미터
: 이동 스케일 (속도)
- 내부적으로 CharacterMovementComponent가 이 요청을 받아 속도를 계산하고, 실제 이동을 구현한다.
3. 캐릭터의 점프 함수 구현하기
- StartJump, StopJump 함수 구현하기
void ASpartaCharacter::StartJump(const FInputActionValue& value)
{
// Jump 함수는 Character가 기본 제공
if (value.Get<bool>())
{
Jump();
}
}
void ASpartaCharacter::StopJump(const FInputActionValue& value)
{
// StopJumping 함수도 Character가 기본 제공
if (!value.Get<bool>())
{
StopJumping();
}
}
SpartaCharactre.cpp
- value.Get<bool>()
: Enhanced Input System에서 전달된 입력 값을 bool로 가져온다.
이 값은 점프 키 (예 : 스페이스바) 가 눌렸는지 여부를 나타낸다.
- true : 키가 눌린다.
- false : 키가 눌리지 않는다.
- StopJumping(), Jump()
: Character 클래스에서 기본 제공되는 함수로, 캐릭터가 점프를 하거나 멈추도록 만들어 준다.
4. 캐릭터의 기본 시점 회전 구현하기
- Look 함수 구현하기
void ASpartaCharacter::Look(const FInputActionValue& value)
{
// 마우스의 X, Y 움직임을 2D 축으로 가져옴
FVector2D LookInput = value.Get<FVector2D>();
// X는 좌우 회전 (Yaw), Y는 상하 회전 (Pitch) // 좌우 회전
AddControllerYawInput(LookInput.X);
// 상하 회전
AddControllerPitchInput(LookInput.Y);
}
SpartaCharacter.cpp
- AddControllerYawInput()
: 카메라의 Yaw 축 (수평 회전) 을 변경
- AddControllerPitchInput()
: 카메라의 Pitch 축 (수직 회전) 을 변경
- 실제 어느 방향으로 얼마나 회전할지는, 프로젝트 세팅 -> Input -> Mouse Sesitivity 나 LookInput에 곱해줄 스케일 (Modifires)를 통해 조정할 수 있다.
5. 스프린트 동작 구현하기
- 스프린트 관련 멤버 변수 및 함수 설정하기
- 언리얼 엔진의 CharacterMovementComponent에는 MaxWalkSpeed라는 속성이 있다.
MaxWalkSpeed 값을 변경하면, 캐릭터의 이동 속도가 즉시 바뀐다.
- Shift 키를 누르는 순간 MaxWalkSpeed를 "빠른 속도" 로, Shift 키를 뗄 때 (또는 놓았을 때) 다시 "기본 속도" 로 돌려 놓으면, 스프린트 효과를 낼 수 있다.
- 우선, 캐릭터 클래스 SpartaCharacter.h 파일에서 스프린트 관련 멤버 변수를 추가해야한다.
protected:
// 이동 속도 관련 프로퍼티들
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float NormalSpeed; // 기본 걷기 속도
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float SprintSpeedMultiplier; // "기본 속도" 대비 몇 배로 빠르게 달릴지 결정
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Movement")
float SprintSpeed; // 실제 스프린트 속도
SpartaCharacter.h
#include "GameFramework/CharacterMovementComponent.h"
ASpartaCharacter::ASpartaCharacter()
{
NormalSpeed = 600.0f;
SprintSpeedMultiplier = 1.5f;
SprintSpeed = NormalSpeed * SprintSpeedMultiplier;
GetCharacterMovement()->MaxWalkSpeed = NormalSpeed;
}
SpartaCharacter.cpp
- SprintSpeedMultiplier
: 예) 1.5f -> "기본 속도의 1.5배"
"Shift 키를 누른 상태" 에서 이동 속도가 얼마나 빨라질지 결정
필요에 따라 2.0f, 1.2f 등 자유롭게 조정 가능
- SprintSpeed
: "Shift 키를 누른 상태" 에서 적용할 실제 속도값
예) NormalSpeed 600 * 1.5f = 900
숫자를 고정해두거나, 생성자에서 SprintSpeed = NormalSpeed * SprintSpeedMultiplier; 로 연산할 수도 있다.
- StartSprint, StopSprint 함수 구현하기
: 이제 Shift 키를 누를 때와 뗄 때를 인식해, MaxWalkSpeed를 조정해주는 함수를 작성한다.
void ASpartaCharacter::StartSprint(const FInputActionValue& value)
{
// Shift 키를 누른 순간 이 함수가 호출된다고 가정
// 스프린트 속도를 적용
if (GetCharacterMovement())
{
GetCharacterMovement()->MaxWalkSpeed = SprintSpeed;
}
}
void ASpartaCharacter::StopSprint(const FInputActionValue& value)
{
// Shift 키를 뗀 순간 이 함수가 호출 // 평상시 속도로 복귀
if (GetCharacterMovement())
{
GetCharacterMovement()->MaxWalkSpeed = NormalSpeed;
}
}
SpartaCharacter.cpp
- GetCharacterMovement()
: ACharacter 클래스에 기본 내장된 함수로, UCharacterMovementComponent* 포인터를 반환한다.
여기서 MaxWalkSpeed 등의 이동 관련 설정을 바꿀 수 있다.
- AddMovementInput()
: 키 입력 때 마다 "어느 방향으로 이동" 할지 전달하는 함수
- MaxWalkSpeed
: "최대 이동속도가 얼마인지" 를 결정한다.
위의 2개를 함께 작동해 캐릭터가 더 빨리 달릴 수 있게 된다.
오늘 배운 것에서 개인적으로 중요하다고 생각하는 것
- GetCharacterMovement()
: ACharacter 클래스에 기본 내장된 함수로, UCharacterMovementComponent* 포인터를 반환한다.
여기서 MaxWalkSpeed 등의 이동 관련 설정을 바꿀 수 있다.
'본캠프 TIL' 카테고리의 다른 글
| 06.16 Unreal 본캠프) 4번 과제 Pawn 클래스 3D 캐릭터 만들기 (1) (0) | 2026.06.16 |
|---|---|
| 06.15 Ureal 본캠프) State Machine 설계를 통한 캐릭터 동작 애니메이션 적용하기 (1) | 2026.06.15 |
| 06.11 Unreal 본캠프) Enhanced Input System 활용하여 입력 매핑 구현 (0) | 2026.06.11 |
| 06.10 Unreal 본캠프) Character 클래스 활용하여 캐릭터 구현 (0) | 2026.06.10 |
| 06.09 Unreal 본캠프) 3번 과제 회전발판과 움직이는 장애물 (0) | 2026.06.09 |