본문 바로가기

Unreal 5/메모장

[Unreal 5] Class vs Component

언리얼 5에서 기능을 구현하는 방법은 여러 가지가 있습니다.

오늘은 그 중에서도 Class 에 직접 구현 vs Component 로 나누어 구현 두 방법을 언제 어떨때 써야 하는지 의문이 생기네요.

 

 

만약, NPC의 대화 기능을 구현한다고 생각해 봅시다.

아마도 Trigger Box 를 넣어 놓고, Overlap 을 활용하여 기능을 구현하게 될텐데

 

이를 구현하는 방법에는 NPC 클래스에 직접 멤버로 구현하여 사용을 하거나

TalkTriggerBox = CreateDefaultSubobject<UBoxComponent>(TEXT("Talk Trigger Box"));

 

아니면 그러한 기능을 하는 컴포넌트를 만들고, 해당 컴포넌트를 원하는 액터에 부착할 수 있겠죠.

UCLASS()
class MYPROJECT_API UCR_OverlapBoxComponentBase : public UBoxComponent
{
	GENERATED_BODY()

public: 
	UCR_OverlapBoxComponentBase();

protected:
	AActor* FindOverlappedActorWithTag(const FName &InActorTag) const;
};

 

 

직접 클래스로 구현을 하게 되면, 결국 Inheritance 를 이용하게 되는 것이고,

이는 대화가 가능한 액터를 NPC 클래스 및 하위 객체들만으로 한정하게 됩니다.

 

반대로, 컴포넌트로 구현하게 되면 원하는 액터 어디에나 컴포넌트를 붙여서 기능을 추가해 줄 수 있을 것입니다.

하지만, Component는 결국 객체를 하나 더 들고 있고, 이를 참조하여 무엇이든 호출하게 되는 것이므로 남발하게 되면 성능 면에서 취약할 수 밖에 없습니다.

 

즉, 언제나 그렇듯이 치밀한 설계 아래에서 재사용성과 모듈화, 유지보수를 고려하여 가장 효율적일 것 같은 방법을 생각해야 한다는 것이죠.

 

제 생각에, 다이얼로그를 생성하는 '대화'라는 기능 자체는 NPC 이외에는 가능할 일이 없을 것 같아 보입니다.

때문에 이런 케이스에서 당장은 클래스나 인터페이스에 포함하여 개발을 할 것 같습니다만

 

아마 미래를 생각해 보았을 때, SOLID 원칙에 의거하여 Trigger Box 에게 '대화' 라는 책임을 부여하고, 결과적으로는 해당 컴포넌트를 따로 빼서 개발하는게 옳은 방법일 것 같습니다. 다이얼로그라는게, 뭐 대단한 실시간성과 부하가 드는 작업은 또 아니니까요.

 

애초에 저의 경우, 처음부터 모든 설계를 치밀하게 할 지능도 안되고 그만한 경험도 없습니다.

그렇기 때문에 '이걸 고민할 시간에 그냥 한줄 더 치고 나중에 팀원들과 상의해라' 라는 것이 업무 중에는 타당한 이야기죠.

또한, 나중에 확장성을 고려하여 리팩토링을 해도 좋은 문제입니다.

 

다만 게임 제작은 한 두명이서 하는게 아니기 때문에 어디부터 어디까지가 블루프린트의 영역인지를 미리 고려하는 것도 중요하겠죠.. 어차피 UI쪽에서도 이를 건드리려면 클라이언트와 많은 논의가 필요하기 때문에 사실상 그냥 팀 분위기를 고려하면 되는거겠지만

 

개인적으로는 이런 부분에 대해서 고찰하고 싶기 때문에 한번 생각하는 시간을 가져 보았습니다.

'Unreal 5 > 메모장' 카테고리의 다른 글

[Unreal 5] Delegate 메모  (0) 2024.07.03
[Unreal 5 UMG] CPP로 블루프린트 위젯 바인딩 하기  (0) 2024.04.09