캐릭터 동작 함수 구현하기

김민수·2025년 1월 27일

언리얼 C++

목록 보기
28/32

1. 이동 함수 (Move)

void ASpartaCharacter::Move(const FInputActionValue& value)
{
    if (!Controller) return;
    
    const FVector2D MoveInput = value.Get<FVector2D>();

    if (!FMath::IsNearlyZero(MoveInput.X))
    {
        AddMovementInput(GetActorForwardVector(), MoveInput.X);
    }

    if (!FMath::IsNearlyZero(MoveInput.Y))
    {
        AddMovementInput(GetActorRightVector(), MoveInput.Y);
    }
}

(1) 컨트롤러 확인

if (!Controller) return;
  • 현재 캐릭터에 컨트롤러가 할당되어 있는지 확인한다.
  • 컨트롤러가 있어야 방향 계산이 가능하다.

(2) 입력 값 가져오기

const FVector2D MoveInput = value.Get<FVector2D>();
  • FInputActionValue에서 입력 데이터를 2D 벡터(FVector2D) 형식으로 가져온다.
  • 이동 입력은 X축(앞/뒤)Y축(좌/우) 방향의 값을 포함한다.
  • 예시:
    • (X=1, Y=0) : 전진
    • (X=-1, Y=0) : 후진
    • (X=0, Y=1) : 오른쪽
    • (X=0, Y=-1) : 왼쪽

(3) 캐릭터 움직임 구현

if (!FMath::IsNearlyZero(MoveInput.X))
{
	AddMovementInput(GetActorForwardVector(), MoveInput.X);
}
if (!FMath::IsNearlyZero(MoveInput.Y))
{
	AddMovementInput(GetActorRightVector(), MoveInput.Y);
}
  • FMath::IsNearlyZero(MoveInput.X)
    • X축 값이 0에 가까운지 확인한다. (값이 너무 작으면 입력이 없는 것으로 간주)
  • AddMovementInput(GetActorForwardVector(), MoveInput.X)
    • 캐릭터의 앞/뒤 방향(Forward Vector)으로 X축 값만큼 이동한다.
  • AddMovementInput:
    • 캐릭터의 이동을 처리하는 함수
    • 첫 번째 매개변수: 이동 방향(FVector)
      두 번째 매개변수: 이동 스케일(속도)
    • 내부적으로 CharacterMovementComponent가 요청을 받아서 속도를 계산하고, 실제 이동을 구현한다.
  • GetActorForwardVector():
    • 캐릭터가 월드 기준으로 "앞"을 바라보는 방향을 반환한다. (FVector 타입)


2. 점프 함수 (StartJump, StopJump)

void ASpartaCharacter::StartJump(const FInputActionValue& value)
{
	if (value.Get<bool>())
	{
		Jump();
	}
}

void ASpartaCharacter::StopJump(const FInputActionValue& value)
{
	if (!value.Get<bool>())
	{
		StopJumping();
	}
}

(1) 점프 키가 눌렸는 지 확인

if (value.Get<bool>())
  • value.Get<bool>()
    • Enhanced Input System에서 전달된 입력 데이터를 bool 타입으로 가져온다.
    • true : 키 눌림
    • false: 키 눌리지 않음

(2) Jump()

  • 캐릭터가 점프를 시작한다. (Character 클래스에서 제공하는 기본 점프 함수)

(3) StopJumping()

  • 현재 점프 동작을 중단한다. (예: 점프 버튼을 떼면 더 이상 공중으로 올라가지 않음)


3. 카메라 회전 함수 (Look)

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

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

(1) 입력값 가져오기

FVector2D LookInput = value.Get<FVector2D>();
  • value.Get<FVector2D>()
    • 입력 데이터를 2D 벡터(FVector2D) 형식으로 가져온다.
    • LookInput은 X축(좌/우 회전)Y축(상/하 회전) 데이터를 포함한다.

(2) 캐릭터 카메라 좌우 구현

AddControllerYawInput(LookInput.X);
  • 캐릭터의 카메라를 Yaw(좌/우 회전) 값만큼 회전시킨다.
  • AddControllerYawInput:
    • 플레이어 컨트롤러의 Yaw 값을 추가하는 함수

(3) 캐릭터 카메라 상하 구현

AddControllerPitchInput(LookInput.Y);
  • 캐릭터의 카메라를 Pitch(상/하 회전) 값만큼 회전시킨다.
  • AddControllerPitchInput:
    • 플레이어 컨트롤러의 Pitch 값을 추가하는 함수


4. 스프린트 함수

헤더파일 변수 선언

// 이동 속도 관련 프로퍼티들
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float NormalSpeed; // 기본 속도
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float SprintSpeedMultiplier;  // "기본 속도" 대비 몇 배로 빠르게 달릴지 결정
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Movement")
float SprintSpeed; 	// 스프린트 속도

생성자에서 초기화

NormalSpeed = 600.0f;
SprintSpeedMultiplier = 1.7f;
SprintSpeed = NormalSpeed * SprintSpeedMultiplier;

GetCharacterMovement()->MaxWalkSpeed = NormalSpeed;

스프린트 함수 구현

void ASpartaCharacter::StartSprint(const FInputActionValue& value)
{
	if (GetCharacterMovement())
	{
		GetCharacterMovement()->MaxWalkSpeed = SprintSpeed;
	}
}

void ASpartaCharacter::StopSprint(const FInputActionValue& value)
{
	if (GetCharacterMovement())
	{
		GetCharacterMovement()->MaxWalkSpeed = NormalSpeed;
	}
}

(1) 캐릭터 이동 컴포넌트 확인

if (GetCharacterMovement())
  • GetCharacterMovement()의 반환값이 nullptr인지 확인한다.
  • GetCharacterMovement():
    • ACharacter 클래스에 기본 내장된 함수로, 캐릭터의 이동을 처리하는 UCharacterMovementComponent* 포인터를 반환한다.
    • 이동과 관련된 주요 동작(속도, 점프, 중력 등)을 관리하는 핵심 컴포넌트다.

(2) 캐릭터 이동속도 설정

GetCharacterMovement()->MaxWalkSpeed = SprintSpeed;
  • 캐릭터의 이동속도를 SprintSpeed로 설정한다.
profile
안녕하세요

0개의 댓글