언리얼엔진5 공부

Unreal Engine: 객체지향 설계의 핵심, Actor Component

Client Side 2025. 12. 17. 23:34

1. Actor Component란?

액터(Actor)의 기능을 모듈화하여 재사용할 수 있게 만든 부품입니다. 특정 기능을 액터 클래스에 직접 코딩하는 대신, 컴포넌트로 분리하면 여러 액터에 쉽게 탈부착할 수 있습니다.

  • 예시: HealthComponent를 하나 만들면, APolice(경찰), ARobber(도둑), 심지어 파괴 가능한 ADoor(문)에도 동일한 체력 시스템을 적용할 수 있습니다.

2. 왜 사용하는가? (장점)

  1. 상속의 한계 극복: 상속 구조가 깊어지면 코드가 복잡해지지만, 컴포넌트는 필요한 기능만 '조립'하므로 유연합니다.
  2. 코드 재사용성: 한 번 잘 만든 컴포넌트는 다른 프로젝트에서도 그대로 사용 가능합니다.
  3. 단일 책임 원칙(SRP): 액터 클래스는 흐름을 제어하고, 상세 로직은 컴포넌트가 담당하여 코드가 깔끔해집니다.

3. C++ 구현 예시

멀티플레이어 게임 'Cop and Robber'에서 사용할 수 있는 간단한 CombatComponent 구조입니다.

Header (.h)

// UActorComponent를 상속받는 클래스
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class AFO_API UCombatComponent : public UActorComponent
{
    GENERATED_BODY()

public:	
    UCombatComponent();

protected:
    // 데미지 수치 (UPROPERTY로 에디터 노출)
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
    float AttackDamage;

    // 실무에서 중요한 '방어적 코드': nullptr 체크 후 사용
    void Attack(AActor* Target);
};

 

Source (.cpp)

void UCombatComponent::Attack(AActor* Target)
{
    // Pointer Validation (안전성 확보)
    if (Target && GetOwner())
    {
        UE_LOG(LogTemp, Log, TEXT("%s가 %s를 공격합니다!"), *GetOwner()->GetName(), *Target->GetName());
        // 실제 데미지 로직...
    }
}

 

4. 취업을 위한 실무 포인트

  • 컴포넌트 리플리케이션: 컴포넌트 내부의 변수도 리플리케이션이 가능합니다. SetIsReplicatedByDefault(true)를 생성자에서 호출해야 합니다.
  • 최적화 (Tick): 컴포넌트가 굳이 매 프레임 계산할 필요가 없다면 PrimaryComponentTick.bCanEverTick = false;로 설정하여 성능을 확보하는 습관이 중요합니다.
  • 의존성 분리: 컴포넌트가 소유자(Owner)가 누구인지 너무 자세히 알게 하지 마세요. 인터페이스(Interface)를 통해 소통하는 것이 훨씬 고급 기술입니다.