ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [UE5] PawnExtension
    UE5/Lyra Clone Coding 2025. 1. 31. 23:12

    Pawn의 생성을 위해 먼저 Pawn의 초기화를 담당하는 컴포넌트를 만들어야 한다.

     

    Lyra Experience의 특징추상화 레벨이 매우 높다는 것에 있다.

     

    예를 들어, 보통 기존에는 Character의 입력을 위해 Character.cpp 파일의 SetupPlyaerInputComponent에서 캐릭터의 입력을 지정해주는 일을 했다. 그러나 이는 입력이 캐릭터에 종속이 된다는 것을 의미한다.

     

    따라서 컴포넌트를 활용해서 부착하는 형식으로 항상 갈아낄 수 있도록 구조를 만들어 준다.

     

    컴포넌트 초기화에 있어 순서 또한 중요한데, 생성 시에 이 순서가 보장되지 않는다. 따라서 GameplayTag를 활용해 순서를 지정해주어야한다.

    void UZSGameInstance::Init()
    {
    	Super::Init();
    
    	UGameFrameworkComponentManager* ComponentManager = GetSubsystem<UGameFrameworkComponentManager>(this);
    	if (ensure(ComponentManager))
    	{
    		const FZSGameplayTags& GameplayTags = FZSGameplayTags::Get();
    
    		ComponentManager->RegisterInitState(GameplayTags.InitState_Spawned, false, FGameplayTag());
    		ComponentManager->RegisterInitState(GameplayTags.InitState_DataAvailable, false, GameplayTags.InitState_Spawned);
    		ComponentManager->RegisterInitState(GameplayTags.InitState_DataInitialized, false, GameplayTags.InitState_DataAvailable);
    		ComponentManager->RegisterInitState(GameplayTags.InitState_GameplayReady, false, GameplayTags.InitState_DataInitialized);
    	}
    }

     

     

    GameInstance의 초기화 과정에서 ComponentManager를 통해 태그의 순서에 맞추어 초기화가 진행되도록 지정해준다.

     

    이제, Pawn의 초기화 전반을 관리하기 위한 컴포넌트 생성이 필요하다. 그것을 ZSPawnExtensionComponent라고 이름짓는다.

    전반적인 초기화를 담당하는 PawnExtension 컴포넌트에 각각의 초기화 컴포넌트를 부착한다

     

    그리고 PawnExtension 컴포넌트에 Hero의 초기화(카메라, 입력 등 플레이어가 제어하는 시스템의 초기화를 담당)를 담당하는 컴포넌트, Network의 초기화를 담당하는 컴포넌트, Item의 초기화를 담당하는 컴포넌트 등을 부착하는 방식으로 구조를 설계하여 종속성을 최소화할 수 있다.

     

    물론, Character와 Hero의 종속성은 제거했지만(캐릭터와 플레이어의 제어까지도 종속성을 제거함을 의미), Hero와 PawnExtension의 종속성은 남아있는 것이 아닌가? 라고 생각할 수 있다. 하지만 이 또한 Lyra에서는 해결을 했다.

     

     

    이제 본격적으로, 초기화 프로세스를 진행해보자.

     

    먼저, 생성자에서 모든 Tick을 비활성화해준다. (Chacter, PawnExtension, Hero)

    UZSPawnExtensionComponent::UZSPawnExtensionComponent(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
    {
    	PrimaryComponentTick.bStartWithTickEnabled = false;
    	PrimaryComponentTick.bCanEverTick = false;
    }

     

    매 프레임마다 검사하는 대신, 델리게이트와 같은 이벤트를 이용해서 매우 효율적인 검사방식을 보여준다.

     

     

    또한 PawnExtension컴포넌트는 최우선적으로 생성되는 것을 보장 받아야한다. (관리하는 컴포넌트들이 있으므로)

    이를 어떻게 보장받을 수 있을까?

     

    언리얼 엔진에서는 내부적으로 Native C++로 생성한 것을 우선한다. 이것을 이용해서 PawnExtension 컴포넌트의 생성을 우선받을 수 있다.

    AZSCharacter::AZSCharacter()
    {
    	// Inactive Tick
    	PrimaryActorTick.bStartWithTickEnabled = false;
    	PrimaryActorTick.bCanEverTick = false;
    
    	// Create PawnExtComponent
    	PawnExtComponent = CreateDefaultSubobject<UZSPawnExtensionComponent>(TEXT("PawnExtensionComponent"));
    }

     

    위와 같이 캐릭터 컴포넌트에 PawnExtension 컴포넌트를 CreateDefaultSubobject를 이용해 생성해주고

    ZSHero를 상속받은 HeroComponent

    HeroComponent의 경우에는 블루프린트로써 생성해준다면 PawnExtensionComponent는 HeroComponent의 생성보다 먼저 생성됨을 보장받을 수 있다.

    'UE5 > Lyra Clone Coding' 카테고리의 다른 글

    [UE5] Camera  (0) 2025.02.05
    [UE5] PawnExtension(2) - 구성 요소 분석  (0) 2025.02.03
    [UE5] Experience  (0) 2025.01.23
    [UE5] AssetManager Scan  (0) 2025.01.21
    [UE5] AssetManager  (0) 2025.01.21
Designed by Tistory.