본문 바로가기

Unreal

[Unreal] Lyra 프로젝트 분석 - 03. Modular Gameplay Actor

GameFrameworkComponentManager

이것은 클래스에 컴포넌트를 자유롭게 탈부착하는데 이용한다. 

그런데 컴포넌트를 장착할 때 순서가 중요할 수 있다.(예를 들면 종속성)

그래서 RegisterInitState 로 초기화 방식을 정할 수 있다. 

게임플레이 태그 Spawned, DataAvailable, DataInitialized, GameplayReady 네 가지로 초기화 방식을 정한다.

 

 

 

PawnExtensionComponent

폰에 컴포넌트를 붙일 때 중재자 역할을 한다.

Tick을 사용하지 않고 델리게이트를 사용해 효율적임

다른 폰 컴포넌트들의 관리자기 때문에 보다 먼저 초기화되어야 한다. 

언리얼은 무조건 native C++ class가 SCS(블루프린트 클래스)보다 먼저 초기화 되기 때문에 관리자를 native로,

이후에 추가될 컴포넌트를 모두 SCS로 만들어주면 된다. 

 

OnRegister에서 컴포넌트 부착 시작

 

RegisterInitStateFeature에서 RegisterInitState의 단계를 사용하기 위해 인스턴스의 컴포넌트들을 등록한다.

컴포넌트 들은 FeatureName으로 구분한다. UnRegisterInitStateFeature로 해제해야함 

 

BindOnActorInitStateChanged

Actor에 등록된 Feature Component의 InitState 변경 감지 

모든 컴포넌트의 상태변경을 감지해야하므로 Feature Name을 None으로

 

TryToChangeInitState

상태변경 가능한지 판별을 하고 가능하다면  나의 InitState를 변경  시도 

 

CheckDefaultInitialization

상태를 강제 변경 , 상태가 변경될때까지 계속해서 상태배열을 순회하며 시도한다.

 

CanChangeInitState

상태 변경이 Spawned->Data_Available->Data_Initialized->GamePlayReady 순서로 이루어지는데

매개변수 CurrentState, DesiredState에 따라 상태 변경 가능한지 여부를 반환한다. 

DataAvailable->DataInitialized 변경시에는 별도로 HaveAllFeaturesReachedInitState함수를 사용한다.

HaveAllFeaturesReachedInitState(state)는 액터에 바인드된 모든 feature들이 state에 도달해야 true를 반환한다.

 

 

 

HeroComponent

캐릭터의 Input, Camera Mode 관리 

PawnExtensionComponent에서 추가로 HandleChangeInitState 함수를 가지고 있다.

관리자가 상태를 변경한다면 관리받는 컴포넌트들이 상태 변경에 따라 데이터를 핸들링하는 함수다.

 

CanChangeInitState

HeroComponent는 PawnExtensionComponent가 DataInitialized가 되면 승인한다.

PawnExtensionComponent는 컴포넌트들이 모두 Available 되는 것을 기다리고 있으므로 Available에 있다.

모든 컴포넌트들이 Available되면 PawnExtensionComponent가 Initialized되고 다른 컴포넌트들도 Initialized된다.

 

이렇게 Tick을 사용하지 않고 서로의 상태 변경에 따라 OnActorInitStateChanged, CheckDefaultInitialization

을 이용해서 Spawned->Data_Available->Data_Initialized->GamePlayReady로 상태가 변경되는 것이다.

 

상태를 변경하는 시점은 PawnExtensionComponent가 폰에 부착되어 있어야 하고 PlayerState가 있어야한다.

그 시점은 Possess이후다. Possess가 되고 플레이어 입력을 설정하는 부분이 SetupPlayerInputComponent다.

여기서 CheckDefaultInitialization로 상태를 강제 업데이트한다. (Spawned->Available)