Unreal Engine/개념정리

[UE5] - Actor, Pawn, Character

KimGeon-U 2025. 1. 24. 20:11

액터 (Actor)

  • 컨텐츠를 구성하는 기본 단위
    • class AActor : public UObject
  • 월드안에 배치되어 상호작용 하거나 동작할 수 있는것.
  • 입력처리를 위한 컨트롤러가 없다. 
    • Pawn, Character에서의 사용 가능성 및 GetOwner()를 사용한 컨트롤러 접근을 위해 Actor.h내 전방선언
    • Actor 기반의 Trigger를 참조하거나 상호작용하기위해
    • 입력 이벤트를 바인딩하여 입력처리가 가능하다 (문열기 상호작용 등)
  • 입력이 필요없거나 환경 요소 및 비활성 오브젝트 구현시 사용
  • Translation : SetActorLocation / AddActor[Local,World]Offset
  • Rotate : SetActorRotation / AddActorWorld[Local,World]Rotation
  • Transform : SetActorTransform(FTransform)

 

폰 (Pawn)

  • Actor를 상속받는 하위클래스
    • class APawn : public AActor, public INavAgentInterface
  • 컨트롤러를 통해 AI 조작 또는 플레이어 빙의가 가능한 객체
  • SetupPlayerInputComponent를 사용한 입력처리 가능
  • C++ Class 생성시 RootComponent는 nullptr이다.
    • 개발자가 명시적으로 Component를 추가해야한다.
  • 언리얼 엔진 내 내비게이션 기능을 통해 이동 제어 가능
    • NavMovementComponent 기반의 Component를 통해 제어
    • 월드 내 내비게이션 메시를 기반으로 경로를 계산한다. (NavMeshBoundsVolume)
    • AIController과 연동하여 MoveToLocation, MoveToActor를 사용한 이동 제어
  • AI Controller / Player Controller를 통해 조작이 필요한 객체들을 대상으로 사용한다.
    • 차량, 드론, 비행기 등
    • AI - 인간형이 아닌 오브젝트
  • Rotation : AddController[Roll,Pitch,Yaw]Input
  • AI : MoveToLocation / MoveToActor

 

 

캐릭터 (Character)

  • Pawn을 상속받는 하위클래스
    • class ACharacter : public APawn
  • 인간형 폰이며, 플레이어 또는 NPC의 주요 컴포넌트들을 포함하고 있다.
    • CapsuleComponent(RootComponent) : 충돌처리
    • SkeletalMeshComponent : 캐릭터의 3D모델 및 애니메이션 렌더링
    • CharacterMovementComponent : 이동(걷기, 점프, 중력, 앉기 등)처리
  • 멀티플레이 네트워크 환경에서 캐릭터들의 움직임을 자동으로 동기화 한다.
    • Character 생성자 내 리플리케이션 활성화가 되어있다. 
  • CharacterMovementComponent 내 추가 이동 함수
    • LaunchCharacter - 물리처리를 통한 이동
    • MaxWalkSpeed - 걷기 속도 변경
      • Crouch()시 기존의 AddMovementInput()과의 속도차이를 볼 수 있다.

 

 

Character.cpp 생성자 - Default Value, Default Component Setting

ACharacter::ACharacter(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
  // ...
  
	bUseControllerRotationPitch = false;
	bUseControllerRotationRoll = false;
	bUseControllerRotationYaw = true;

  // CapsuleComponent
	CapsuleComponent = CreateDefaultSubobject<UCapsuleComponent>(ACharacter::CapsuleComponentName);
	CapsuleComponent->InitCapsuleSize(34.0f, 88.0f);
	CapsuleComponent->SetCollisionProfileName(UCollisionProfile::Pawn_ProfileName);
	RootComponent = CapsuleComponent;

  // Arrow Component
	ArrowComponent = CreateEditorOnlyDefaultSubobject<UArrowComponent>(TEXT("Arrow"));
	if (ArrowComponent)
	{
    // ...
	}

  // CharacterMovement
	CharacterMovement = CreateDefaultSubobject<UCharacterMovementComponent>(ACharacter::CharacterMovementComponentName);
	if (CharacterMovement)
	{
		CharacterMovement->UpdatedComponent = CapsuleComponent;
	}

  // SkeletalMesh
	Mesh = CreateOptionalDefaultSubobject<USkeletalMeshComponent>(ACharacter::MeshComponentName);
	if (Mesh)
	{
    // ...
	}

  // GravityDirection
	ReplicatedGravityDirection = UCharacterMovementComponent::DefaultGravityDirection;
}