unreal 공부(캐릭터 동작 구현과 입력 처리하기)25.01.27

Virus·2025년 1월 27일
0

1. PlayerController와 캐릭터 클래스의 역할

PlayerController: 입력 시스템(IMC, IA)을 활성화하고 입력 데이터를 전달.
캐릭터 클래스: 전달받은 입력 데이터를 통해 실제 동작(이동, 점프, 회전, 스프린트 등)을 수행.

2. 입력 액션 바인딩

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);
        }
    }
}

3. 캐릭터 동작 구현

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;

4. 테스트 결과

WASD: 캐릭터가 방향에 따라 이동.
Space: 점프 동작.
Shift: 이동 속도가 증가(스프린트), 손을 떼면 다시 기본 속도로 복귀.
마우스: 카메라 시점 회전.

5. 오늘의 느낀 점

Enhanced Input System의 입력 바인딩 구조가 깔끔하고 직관적이었음.
PlayerController와 캐릭터 클래스의 역할을 나누어 작업하니 유지보수가 쉬워질 것 같음.
MaxWalkSpeed를 활용한 속도 조정으로 스프린트 효과를 간단히 구현할 수 있었음.

0개의 댓글

관련 채용 정보