배운 내용
언리얼 엔진에서 입력 처리는 PlayerController → Input Mapping Context(IMC) → Character Class 순서로 이루어진다.
SpartaCharacter): SetupPlayerInputComponent()에서 "각 액션 발생 시 어떤 함수를 실행할지"를 바인딩.즉, PlayerController가 입력을 감지하고, IMC가 키를 매핑해주고, Character 클래스에서 실제 동작을 구현하는 구조.
SpartaCharacter.hUFUNCTION()
void Move(const FInputActionValue& value);
UFUNCTION()
void StartJump(const FInputActionValue& value);
UFUNCTION()
void StopJump(const FInputActionValue& value);
UFUNCTION()
void Look(const FInputActionValue& value);
UFUNCTION()
void StartSprint(const FInputActionValue& value);
UFUNCTION()
void StopSprint(const FInputActionValue& value);
SpartaCharacter.cpp
BindAction()을 통해 각 InputAction을 함수에 연결.void ASpartaCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent* EnhancedInput = Cast<UEnhancedInputComponent>(PlayerInputComponent))
{
if (ASpartaPlayerController* PlayerController = Cast<ASpartaPlayerController>(GetController()))
{
if (PlayerController->MoveAction)
{
EnhancedInput->BindAction(PlayerController->MoveAction, ETriggerEvent::Triggered, this, &ASpartaCharacter::Move);
}
if (PlayerController->JumpAction)
{
EnhancedInput->BindAction(PlayerController->JumpAction, ETriggerEvent::Triggered, this, &ASpartaCharacter::StartJump);
EnhancedInput->BindAction(PlayerController->JumpAction, ETriggerEvent::Completed, this, &ASpartaCharacter::StopJump);
}
if (PlayerController->LookAction)
{
EnhancedInput->BindAction(PlayerController->LookAction, ETriggerEvent::Triggered, this, &ASpartaCharacter::Look);
}
if (PlayerController->SprintAction)
{
EnhancedInput->BindAction(PlayerController->SprintAction, ETriggerEvent::Triggered, this, &ASpartaCharacter::StartSprint);
EnhancedInput->BindAction(PlayerController->SprintAction, ETriggerEvent::Completed, this, &ASpartaCharacter::StopSprint);
}
}
}
}
BindAction()의 역할
Triggered, Completed 등)&ASpartaCharacter::Move)Move)코드
void ASpartaCharacter::Move(const FInputActionValue& value)
{
if (!Controller) return;
FVector2D MoveInput = value.Get<FVector2D>();
if (!FMath::IsNearlyZero(MoveInput.X))
{
AddMovementInput(GetActorForwardVector(), MoveInput.X);
}
if (!FMath::IsNearlyZero(MoveInput.Y))
{
AddMovementInput(GetActorRightVector(), MoveInput.Y);
}
}
핵심 개념
FInputActionValue::Get<FVector2D>()
IA_Move가 Axis2D로 설정되어 있기 때문에, X, Y값을 2D 벡터로 가져옴.(1,0) → 전진, (0,1) → 오른쪽 이동.AddMovementInput(방향, 크기)
GetActorForwardVector() → 캐릭터 정면 방향 이동.GetActorRightVector() → 캐릭터 오른쪽 방향 이동.코드
void ASpartaCharacter::StartJump(const FInputActionValue& value)
{
if (value.Get<bool>())
{
Jump();
}
}
void ASpartaCharacter::StopJump(const FInputActionValue& value)
{
if (!value.Get<bool>())
{
StopJumping();
}
}
핵심 개념
Jump() & StopJumping()은 ACharacter 기본 제공 함수.value.Get<bool>() → 점프 키(스페이스바)가 눌렸는지 확인.true면 점프 시작, false면 점프 중지.코드
void ASpartaCharacter::Look(const FInputActionValue& value)
{
FVector2D LookInput = value.Get<FVector2D>();
AddControllerYawInput(LookInput.X);
AddControllerPitchInput(LookInput.Y);
}
핵심 개념
AddControllerYawInput(X) → 좌우(Yaw) 회전AddControllerPitchInput(Y) → 상하(Pitch) 회전StartSprint, StopSprint)멤버 변수 추가 (SpartaCharacter.h)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float NormalSpeed;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float SprintSpeedMultiplier;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Movement")
float SprintSpeed;
초기화 (SpartaCharacter.cpp)
ASpartaCharacter::ASpartaCharacter()
{
NormalSpeed = 600.0f;
SprintSpeedMultiplier = 1.5f;
SprintSpeed = NormalSpeed * SprintSpeedMultiplier;
GetCharacterMovement()->MaxWalkSpeed = NormalSpeed;
}
StartSprint / StopSprint
void ASpartaCharacter::StartSprint(const FInputActionValue& value)
{
if (GetCharacterMovement())
{
GetCharacterMovement()->MaxWalkSpeed = SprintSpeed;
}
}
void ASpartaCharacter::StopSprint(const FInputActionValue& value)
{
if (GetCharacterMovement())
{
GetCharacterMovement()->MaxWalkSpeed = NormalSpeed;
}
}
핵심 개념
MaxWalkSpeed 값 변경을 통해 이동 속도 조절SprintSpeedMultiplier를 활용해 속도를 조절 (ex. 1.5배 빠르게)배운 점 정리
SetupPlayerInputComponent()에서 BindAction()을 통해 액션을 함수와 연결한다.Move), 점프 (Jump), 시점 회전 (Look), 스프린트 (Sprint)를 구현했다.MaxWalkSpeed 값을 조절하면 손쉽게 캐릭터 속도를 바꿀 수 있다.다음 목표: 애니메이션을 적용해 더 자연스럽게 만들기.