void UGameInstance::InitializeStandalone() { // Creates the world context. This should be the only WorldContext that ever gets created for this GameInstance. WorldContext = &GetEngine()->CreateNewWorldContext(EWorldType::Game); WorldContext->OwningGameInstance = this; // In standalone create a dummy world from the beginning to avoid issues of not having a world until LoadMap gets us our real world UWorld* DummyWorld = UWorld::CreateWorld(EWorldType::Game, false); DummyWorld->SetGameInstance(this); WorldContext->SetCurrentWorld(DummyWorld); Init(); }
bool UGameInstance::InitializePIE(bool bAnyBlueprintErrors, int32 PIEInstance) { UEditorEngine* const EditorEngine = CastChecked<UEditorEngine>(GetEngine()); // Look for an existing pie world context, may have been created before WorldContext = EditorEngine->GetWorldContextFromPIEInstance(PIEInstance); if (!WorldContext) { // If not, create a new one WorldContext = &EditorEngine->CreateNewWorldContext(EWorldType::PIE); WorldContext->PIEInstance = PIEInstance; } WorldContext->OwningGameInstance = this; const FString WorldPackageName = EditorEngine->EditorWorld->GetOutermost()->GetName(); // Establish World Context for PIE World WorldContext->LastURL.Map = WorldPackageName; WorldContext->PIEPrefix = WorldContext->PIEInstance != INDEX_NONE ? UWorld::BuildPIEPackagePrefix(WorldContext->PIEInstance) : FString(); const ULevelEditorPlaySettings* PlayInSettings = GetDefault<ULevelEditorPlaySettings>(); // We always need to create a new PIE world unless we're using the editor world for SIE UWorld* NewWorld = nullptr; const EPlayNetMode PlayNetMode = [&PlayInSettings]{ EPlayNetMode NetMode(PIE_Standalone); return (PlayInSettings->GetPlayNetMode(NetMode) ? NetMode : PIE_Standalone); }(); const bool CanRunUnderOneProcess = [&PlayInSettings]{ bool RunUnderOneProcess(false); return (PlayInSettings->GetRunUnderOneProcess(RunUnderOneProcess) && RunUnderOneProcess); }(); if (PlayNetMode == PIE_Client) { // We are going to connect, so just load an empty world NewWorld = EditorEngine->CreatePIEWorldFromEntry(*WorldContext, EditorEngine->EditorWorld, PIEMapName); } else if (PlayNetMode == PIE_ListenServer && !CanRunUnderOneProcess) { // We *have* to save the world to disk in order to be a listen server that allows other processes to connect. // Otherwise, clients would not be able to load the world we are using NewWorld = EditorEngine->CreatePIEWorldBySavingToTemp(*WorldContext, EditorEngine->EditorWorld, PIEMapName); } else { // Standard PIE path: just duplicate the EditorWorld NewWorld = EditorEngine->CreatePIEWorldByDuplication(*WorldContext, EditorEngine->EditorWorld, PIEMapName); } // failed to create the world! if (NewWorld == nullptr) { FMessageDialog::Open(EAppMsgType::Ok, NSLOCTEXT("UnrealEd", "Error_FailedCreateEditorPreviewWorld", "Failed to create editor preview world.")); return false; } NewWorld->SetGameInstance(this); WorldContext->SetCurrentWorld(NewWorld); WorldContext->AddRef(EditorEngine->PlayWorld); // Tie this context to this UEngine::PlayWorld* // @fixme, needed still? // make sure we can clean up this world! NewWorld->ClearFlags(RF_Standalone); NewWorld->bKismetScriptError = bAnyBlueprintErrors; Init(); return true; }