Unreal 게임 개발 과정 TIL

Today's I Learning

본캠프 TIL

06.12 Unreal 본캠프) 캐릭터 동작 구현과 입력 처리하기

Sunlight__ 2026. 6. 12. 15:47

 

 오늘 배운 것

 

1. Character 클래스에 액션 바인딩 추가하기

 : PlayerController는 "키나 마우스 입력" 을 감지하고, 각 입력 액션 (IA) 을 활성화해 줄 뿐이다.

   그 다음 캐릭터 클래스(SprataCharacter)에서 "어떤 함수가 호출될지" 를 바인딩 해주어야 최종적으로 동작이 이루어진다.

 - 정리하자면

1. PlayerController는 SprataInputMappingContext (IMC) 를 활성화한다.
2. 해당 IMC에는 IA_Move, IA_Jump 등의 UIputMappingContext들이 키보드/마우스와 맵핑되어 있다.
3. 캐릭터(SpartaCharacter)가 SetupPlayerInputComponent() 함수를 통해 "각 액션이 발생 했을 때 어떤 함수를 실행할지" 를 등록한다.
4. 이렇게 등록한 함수들이, 실제로 움직이거나 점프하는 등 캐릭터 동작을 수행한다.

 

 - 캐릭터에 액션 바인딩 추가하기

SpartaCharacter.h
SpartaCharacter.cpp

  - 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 등의 이동 관련 설정을 바꿀 수 있다.