关于GameInstance的介绍请看大钊的文章
《InsideUE4》GamePlay架构(九)GameInstance - 知乎
先来看看RPG里的gameinstance都有哪些接口
void AddDefaultInventory(URPGSaveGame* SaveGame, bool bRemoveExtra = false);
URPGSaveGame* GetCurrentSaveGame();
bool LoadOrCreateSaveGame();
bool HandleSaveGameLoaded(USaveGame* SaveGameObject);
void GetSaveSlotInfo(FString& SlotName, int32& UserIndex) const;
bool WriteSaveGame();
void ResetSaveGame();
virtual void HandleAsyncSave(const FString& SlotName, const int32 UserIndex, bool bSuccess);
?从这些接口可以看出,GameInstance里面是处理全局相关的数据逻辑。
例如加载游戏,暂停游戏,保存游戏,重置游戏,保存全局设置等逻辑。
现在来看看加载关卡的流程
首先引起设置切换关卡的信息
?
GEngine->SetClientTravel( World, *Cmd, TravelType );
void UEngine::SetClientTravel( UWorld *InWorld, const TCHAR* NextURL, ETravelType InTravelType )
{
FWorldContext &Context = GetWorldContextFromWorldChecked(InWorld);
// set TravelURL. Will be processed safely on the next tick in UGameEngine::Tick().将在UGameEngine::tick()中的下一个勾号上安全处理。
Context.TravelURL = NextURL;
Context.TravelType = InTravelType;
}
?
?然后Tick函数里进行判断,调用
EBrowseReturnVal::Type UEngine::Browse( FWorldContext& WorldContext, FURL URL, FString& Error )
正常会调用LoadMap函数加载地图,里面会进行一系列的操作,如清理上个关卡的信息等,后面调用UWorld::BeginPlay()开是初始化流程(LoadMap里面会调用SetGameMode,会创建GameMode对象,创建GameMode对象后,GameModeBase::PreInitializeComponents()也会创建GameState对象)。
下篇继续GameMode逻辑。
|