나만의 작은 도서관

[TIL][C++] 250822 MMO 서버 개발 85일차: [언리얼] 액터와 컴포넌트(Component)의 관계 본문

Today I Learn

[TIL][C++] 250822 MMO 서버 개발 85일차: [언리얼] 액터와 컴포넌트(Component)의 관계

pledge24 2025. 8. 23. 01:38
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

[언리얼] 액터와 컴포넌트(Component)의 관계

  • 액터는 컴포넌트를 가지기 위한 그릇과 같은 개념. 어떤 컴포넌트를 소유하고 있느냐로 인해 액터의 특징이 결정된다.
    • Actor: 레벨에 배치하거나 월드에 스폰되는 오브젝트로서, Component를 소유하는 컨테이너 역할을 한다.
      • Ex. 캐릭터, 총알, 상자 등…
    • Component: 특정 행동 및 기능을 정의한 클래스. 액터에 붙어서(Attack) 기능을 제공하는 모듈의 역할을 한다.
      • Ex. StaticMeshComponent, BoxComponent

 

이해를 돕기 위한 예시 1. 빈 액터

  • 액터를 드래그해서 배치하면 빈 액터가 만들어진다. 빈 액터를 클릭하고 디테일 패널을 보면 부착된 컴포넌트들을 확인할 수 있는데, 가장 기본이 되는 컴포넌트에 씬 컴포넌트만 붙어있는 걸 확인할 수 있다.
  • 빈 액터를 배치해도 아무것도 보이지 않는 이유도 여기에 있다. 씬 컴포넌트와 씬 컴포넌트 아래에 붙어있는 카메라 컴포넌트는 시각적으로 무언가 보이게하는 역할을 하지 않기 때문에 아무것도 보이지 않는 것이다.

 

이해를 돕기 위한 예시 2. 큐브 액터

  • 빈 액터가 아닌 큐브 액터를 드래그해서 씬에 배치하면 빈 액터와 달리 무언가 보인다. 이는 빈 액터에 없던 static Mesh 컴포넌트가 붙어있기 때문이며, static Mesh 컴포넌트는 3D모델을 통해 눈에 직접 보이는 형태로 렌더링 하는 역할을 한다.

 

이해를 돕기 위한 예시 3. 라이트 액터

  • 라이트 액터는 빛 표현 역할을 담당하는 light 컴포넌트가 붙어있어 빛을 방출하고 주면을 보이도록 한다.

 

추가 자료

 

이해를 돕기 위한 예시 3. 라이트 액터

  • 라이트 액터는 빛 표현 역할을 담당하는 light 컴포넌트가 붙어있어 빛을 방출하고 주면을 보이도록 한다.

결론

  • 액터에 어떤 컴포넌트를 붙이느야에 따라 액터의 기능이 결정된다.

 

 

언리얼은 수많은 컴포넌트를 지원한다.

  • 언리얼의 모든 객체는 UObject로 표현되며, 그룻에 해당하는 대상은 AActor로, 행동 및 기능에 해당하는 대상은 UActorComponent로부터 파생되어 정의되어 있다.
  • 위 그림과 같이 굉장히 많은 컴포넌트들이 이미 언리얼 내에 만들어져 있으며, 내가 원하는 컴포넌트가 이 중에 있다면 해당 컴포넌트를 사용하면 된다.

 

원하는 컴포넌트가 없다면?

  • 만들어 쓰면된다. C++ 클래스에서 UActorComponent를 상속받고, 해당 클래스에서 원하는 기능을 정의하면 된다.

 

UActorComponent 상속 시 자동으로 생성되는 C++ 기본 구조 알아보기

#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "MyComponent.generated.h"

UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class PROJECT_API UMyComponent : public UActorComponent
{
    GENERATED_BODY()

public:	
    // 생성자
    UMyComponent();

protected:
    // 게임 시작 시 호출
    virtual void BeginPlay() override;

public:	
    // 매 프레임 호출
    virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
};

 

UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableCompontent))

  • 블루프린트에서 이 컴포넌트를 추가 가능하게 해주는 설정.

BeginPlay

  • 컴포넌트가 게임 시작 시 또는 Actor가 Spawn 된 후 호출되는 함수
  • Actor의 BeginPlay와 별도이며, BeginPlay보다 조금 뒤에 호출된다.
    • 그래서 Owner Actor에 안전하게 접근이 가능하다.

TickComponent

  • 컴포넌트 전용 Tick. 매 프레임 호출된다.
  • Actor와 독립적으로 Tick당 실행할 로직을 적어놓는다.
  • PrimaryComponentTick.bCanEverTick이 true인 경우에만 동작한다.