본문 바로가기

Unreal

[Unreal] Lyra 프로젝트 분석 - 06. Game Feature

Common User

맵을 로딩하기 위한 플러그인 

 

CommonSession_HostSessionRequest

CommonSessionSubSystem에 전달하는 객체

MapID(맵경로)와 CmdArgs(Experience 이름)을 갖는다.

CreateHostingRequest함수로 생성하고 바로 계속 사용하려면 바로 저장해야 dangling나지 않는다. 

 

CommonSessionSubsystem::HostSession

GetWorld()->ServerTravel에서 MapID와 ExtraArgs를 이용해서 MapLoad를 시작한다.

GameModeBase에서 ExtraArgs를 받아 Parse해서 Experience의 이름을 저장한다.

 

 

 

Game Feature

런타임중에 Action에 해당하는 기능들을 끄고 켤 수 있다. 

 

ExperienceManagerComponent::OnExperienceLoadComplete에서 Game Feature Plugin의 URL을 저장한다.

그리고 로딩도 해주고 활성화도 해준다. 활성화 성공하면 OnGameFeaturePluginLoadComplete함수가 불린다.

모든 GameFeature Plugin이 로딩, 활성화되면 OnExperienceFullLoadComplete를 실행하고 여기서 

GameFeature Action들을 활성화시킨다.

 

GameFeature Action을 활성화시킬 때 어떤 PIE에서 활성화시킬 지 모르기 때문에 WorldContext를 넘겨준다.

(GameFeature은 Engine에 종속적이므로 어떤 World인지 모름)

 

 

GameFeatureAction_AddInput

어떤 MappingContext를 사용할 지 선택 가능 

AddInputConfig로 MappingContext추가, RemoveInputConfig로 MappingContext제거한다.

GameFeature Action은 엔진에 종속적이므로 PIE를 껐다 켜도 계속 InputConfig설정을 다시하기 때문에 

Reset으로 RemoveInputConfig해줘야 한다. FPerContextData는 Reset을 위한 정보를 담는 구조체다.

 

GameFeatureAction이 추가 될 때 AddToWorld에 AddExtensionHandler한다.

델리게이트가 아니라 이벤트인데 차이는 델리게이트는 브로드캐스트하면 모든 구독한 함수를

실행하는 반면 이벤트는 조건에 맞는 함수만 실행한다. 그래서 EventName이 Extension_Added인 경우에 

AddInputConfig를 실행한다. 

 

AddExtensionHandler할 때 Pawn이 생성되지 않았을 수 있으므로 HeroComponent::InitializePlayerInput에서

(이 시점에서는 Pawn이 있는 것이 확정됨) SendGameFrameworkComponentExtensionEvent로 NAME_BindInputsNow

이벤트를 보내 AddInputConfig를 실행한다.