2024/01/31 TIL

양우창·2025년 1월 31일

내일배움캠프 TIL

목록 보기
17/22

배운 내용

  1. 캐릭터 클래스에서 입력 액션 바인딩의 개념

언리얼 엔진에서 입력 처리는 PlayerController → Input Mapping Context(IMC) → Character Class 순서로 이루어진다.

  • PlayerController: 키보드/마우스 입력을 감지하고, 해당 Input Action (IA) 을 활성화한다.
  • IMC (Input Mapping Context): 키와 UInputAction(예: IA_Move, IA_Jump 등)을 맵핑해놓은 설정 파일.
  • Character Class (SpartaCharacter): SetupPlayerInputComponent()에서 "각 액션 발생 시 어떤 함수를 실행할지"를 바인딩.

즉, PlayerController가 입력을 감지하고, IMC가 키를 매핑해주고, Character 클래스에서 실제 동작을 구현하는 구조.

  1. 캐릭터 클래스에서 액션 바인딩 추가하기
    SpartaCharacter.h
  • 카메라(SpringArm, CameraComponent) 및 입력 처리를 위한 함수 선언.
  • UFUNCTION()을 붙여야 언리얼 리플렉션 시스템에서 정상적으로 인식 가능.
UFUNCTION()
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

  • EnhancedInputComponent로 캐스팅 후, 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()의 역할

  • 첫 번째 인자: 연결할 UInputAction
  • 두 번째 인자: 입력이 감지되는 타이밍 (Triggered, Completed 등)
  • 세 번째/네 번째 인자: 호출할 함수 (ex. &ASpartaCharacter::Move)
  1. 캐릭터 이동 구현 (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(방향, 크기)

    • 캐릭터 이동 요청을 CharacterMovementComponent에 전달.
    • GetActorForwardVector() → 캐릭터 정면 방향 이동.
    • GetActorRightVector() → 캐릭터 오른쪽 방향 이동.
  1. 점프 구현 (StartJump, StopJump)

코드

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면 점프 중지.
  1. 카메라 회전 (Look)

코드

void ASpartaCharacter::Look(const FInputActionValue& value)
{
    FVector2D LookInput = value.Get<FVector2D>();

    AddControllerYawInput(LookInput.X);
    AddControllerPitchInput(LookInput.Y);
}

핵심 개념

  • AddControllerYawInput(X) → 좌우(Yaw) 회전
  • AddControllerPitchInput(Y) → 상하(Pitch) 회전
  • 감도를 조정하려면 Input Settings에서 Mouse Sensitivity 조정 or LookInput에 스케일 조정
  1. 스프린트 구현 (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배 빠르게)
  • Shift 키를 누르면 속도가 빨라지고, 떼면 다시 기본 속도로 복귀

배운 점 정리

  • PlayerController → IMC → Character Class 순서로 입력이 처리된다.
  • SetupPlayerInputComponent()에서 BindAction()을 통해 액션을 함수와 연결한다.
  • 이동 (Move), 점프 (Jump), 시점 회전 (Look), 스프린트 (Sprint)를 구현했다.
  • MaxWalkSpeed 값을 조절하면 손쉽게 캐릭터 속도를 바꿀 수 있다.

다음 목표: 애니메이션을 적용해 더 자연스럽게 만들기.

profile
내배캠 언리얼 엔진 1기

0개의 댓글