PlayerController: 입력 시스템(IMC, IA)을 활성화하고 입력 데이터를 전달.
캐릭터 클래스: 전달받은 입력 데이터를 통해 실제 동작(이동, 점프, 회전, 스프린트 등)을 수행.
SetupPlayerInputComponent 함수
EnhancedInputComponent를 사용해 입력 액션(IA_Move, IA_Jump 등)을 캐릭터 동작 함수와 연결.
키 입력 이벤트에 따라 호출되는 함수:
Triggered: 키를 누르고 있을 때.
Completed: 키에서 손을 뗄 때.
코드 요약:
void ASpartaCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
if (UEnhancedInputComponent* EnhancedInput = Cast<UEnhancedInputComponent>(PlayerInputComponent))
{
if (ASpartaPlayerController* PlayerController = Cast<ASpartaPlayerController>(GetController()))
{
EnhancedInput->BindAction(PlayerController->MoveAction, ETriggerEvent::Triggered, this, &ASpartaCharacter::Move);
EnhancedInput->BindAction(PlayerController->JumpAction, ETriggerEvent::Triggered, this, &ASpartaCharacter::StartJump);
EnhancedInput->BindAction(PlayerController->JumpAction, ETriggerEvent::Completed, this, &ASpartaCharacter::StopJump);
EnhancedInput->BindAction(PlayerController->LookAction, ETriggerEvent::Triggered, this, &ASpartaCharacter::Look);
EnhancedInput->BindAction(PlayerController->SprintAction, ETriggerEvent::Triggered, this, &ASpartaCharacter::StartSprint);
EnhancedInput->BindAction(PlayerController->SprintAction, ETriggerEvent::Completed, this, &ASpartaCharacter::StopSprint);
}
}
}
1️⃣ 이동(Move)
입력된 방향(앞/뒤, 좌/우)에 따라 캐릭터를 이동.
AddMovementInput 함수로 이동 방향과 속도 전달.
코드 요약:
void ASpartaCharacter::Move(const FInputActionValue& value)
{
FVector2D MoveInput = value.Get<FVector2D>();
AddMovementInput(GetActorForwardVector(), MoveInput.X); // 앞/뒤
AddMovementInput(GetActorRightVector(), MoveInput.Y); // 좌/우
}
2️⃣ 점프(StartJump, StopJump)
키를 누르면 점프(Jump()), 키에서 손을 떼면 점프 멈춤(StopJumping()).
코드 요약:
void ASpartaCharacter::StartJump(const FInputActionValue& value)
{
if (value.Get<bool>())
Jump();
}
void ASpartaCharacter::StopJump(const FInputActionValue& value)
{
if (!value.Get<bool>())
StopJumping();
}
3️⃣ 시점 회전(Look)
마우스 이동에 따라 캐릭터의 Yaw(좌우)와 Pitch(상하) 회전을 조정.
AddControllerYawInput, AddControllerPitchInput 함수로 회전 값 전달.
코드 요약:
void ASpartaCharacter::Look(const FInputActionValue& value)
{
FVector2D LookInput = value.Get<FVector2D>();
AddControllerYawInput(LookInput.X); // 좌우 회전
AddControllerPitchInput(LookInput.Y); // 상하 회전
}
4️⃣ 스프린트(StartSprint, StopSprint)
Shift 키를 눌렀을 때 스프린트 속도 적용, 손을 떼면 걷기 속도로 복귀.
MaxWalkSpeed 속성을 사용해 이동 속도 변경.
코드 요약:
void ASpartaCharacter::StartSprint(const FInputActionValue& value)
{
if (GetCharacterMovement())
GetCharacterMovement()->MaxWalkSpeed = SprintSpeed;
}
void ASpartaCharacter::StopSprint(const FInputActionValue& value)
{
if (GetCharacterMovement())
GetCharacterMovement()->MaxWalkSpeed = NormalSpeed;
}
속도 관련 멤버 변수
NormalSpeed = 600.0f;
SprintSpeedMultiplier = 1.5f;
SprintSpeed = NormalSpeed * SprintSpeedMultiplier;
GetCharacterMovement()->MaxWalkSpeed = NormalSpeed;
WASD: 캐릭터가 방향에 따라 이동.
Space: 점프 동작.
Shift: 이동 속도가 증가(스프린트), 손을 떼면 다시 기본 속도로 복귀.
마우스: 카메라 시점 회전.
Enhanced Input System의 입력 바인딩 구조가 깔끔하고 직관적이었음.
PlayerController와 캐릭터 클래스의 역할을 나누어 작업하니 유지보수가 쉬워질 것 같음.
MaxWalkSpeed를 활용한 속도 조정으로 스프린트 효과를 간단히 구현할 수 있었음.