UE中WorldContext
作者:互联网
1 类图
前面对World和Level的关系和源码进行了简单分析,这里介绍WorldContext,同样首先给出类图。
2 WorldContext
在上一篇文章中对World概念及类型做出了简单的分析。那么World不止有一个,类型也不止有一个,UE中是使用什么对World进行管理呢?就是WorldContext。
首先卡看WorldContext代码:
/** FWorldContext
* A context for dealing with UWorlds at the engine level. As the engine brings up and destroys world, we need a way to keep straight
* what world belongs to what.
*
* WorldContexts can be thought of as a track. By default we have 1 track that we load and unload levels on. Adding a second context is adding
* a second track; another track of progression for worlds to live on.
*
* For the GameEngine, there will be one WorldContext until we decide to support multiple simultaneous worlds.
* For the EditorEngine, there may be one WorldContext for the EditorWorld and one for the PIE World.
*
* FWorldContext provides both a way to manage 'the current PIE UWorld*' as well as state that goes along with connecting/travelling to
* new worlds.
*
* FWorldContext should remain internal to the UEngine classes. Outside code should not keep pointers or try to manage FWorldContexts directly.
* Outside code can still deal with UWorld*, and pass UWorld*s into Engine level functions. The Engine code can look up the relevant context
* for a given UWorld*.
*
* For convenience, FWorldContext can maintain outside pointers to UWorld*s. For example, PIE can tie UWorld* UEditorEngine::PlayWorld to the PIE
* world context. If the PIE UWorld changes, the UEditorEngine::PlayWorld pointer will be automatically updated. This is done with AddRef() and
* SetCurrentWorld().
*
*/
USTRUCT()
struct FWorldContext
{
GENERATED_USTRUCT_BODY()
/**************************************************************/
TEnumAsByte<EWorldType::Type> WorldType;
FSeamlessTravelHandler SeamlessTravelHandler;
FName ContextHandle;
/** URL to travel to for pending client connect */
FString TravelURL;
/** TravelType for pending client connects */
uint8 TravelType;
/** URL the last time we traveled */
UPROPERTY()
struct FURL LastURL;
/** last server we connected to (for "reconnect" command) */
UPROPERTY()
struct FURL LastRemoteURL;
UPROPERTY()
UPendingNetGame * PendingNetGame;
/** A list of tag/array pairs that is used at LoadMap time to fully load packages that may be needed for the map/game with DLC, but we can't use DynamicLoadObject to load from the packages */
UPROPERTY()
TArray<struct FFullyLoadedPackagesInfo> PackagesToFullyLoad;
/**
* Array of package/ level names that need to be loaded for the pending map change. First level in that array is
* going to be made a fake persistent one by using ULevelStreamingPersistent.
*/
TArray<FName> LevelsToLoadForPendingMapChange;
/** Array of already loaded levels. The ordering is arbitrary and depends on what is already loaded and such. */
UPROPERTY()
TArray<class ULevel*> LoadedLevelsForPendingMapChange;
/** Human readable error string for any failure during a map change request. Empty if there were no failures. */
FString PendingMapChangeFailureDescription;
/** If true, commit map change the next frame. */
uint32 bShouldCommitPendingMapChange:1;
/** Handles to object references; used by the engine to e.g. the prevent objects from being garbage collected. */
UPROPERTY()
TArray<class UObjectReferencer*> ObjectReferencers;
UPROPERTY()
TArray<struct FLevelStreamingStatus> PendingLevelStreamingStatusUpdates;
UPROPERTY()
class UGameViewportClient* GameViewport;
UPROPERTY()
class UGameInstance* OwningGameInstance;
/** A list of active net drivers */
UPROPERTY(transient)
TArray<FNamedNetDriver> ActiveNetDrivers;
/** The PIE instance of this world, -1 is default */
int32 PIEInstance;
/** The Prefix in front of PIE level names, empty is default */
FString PIEPrefix;
/** The feature level that PIE world should use */
ERHIFeatureLevel::Type PIEWorldFeatureLevel;
/** Is this running as a dedicated server */
bool RunAsDedicated;
/** Is this world context waiting for an online login to complete (for PIE) */
bool bWaitingOnOnlineSubsystem;
/** Handle to this world context's audio device.*/
uint32 AudioDeviceID;
/** Custom description to be display in blueprint debugger UI */
FString CustomDescription;
// If > 0, tick this world at a fixed rate in PIE
float PIEFixedTickSeconds = 0.f;
float PIEAccumulatedTickSeconds = 0.f;
/**************************************************************/
/** Outside pointers to CurrentWorld that should be kept in sync if current world changes */
TArray<UWorld**> ExternalReferences;
/** Adds an external reference */
void AddRef(UWorld*& WorldPtr)
{
WorldPtr = ThisCurrentWorld;
ExternalReferences.AddUnique(&WorldPtr);
}
/** Removes an external reference */
void RemoveRef(UWorld*& WorldPtr)
{
ExternalReferences.Remove(&WorldPtr);
WorldPtr = nullptr;
}
/** Set CurrentWorld and update external reference pointers to reflect this*/
ENGINE_API void SetCurrentWorld(UWorld *World);
/** Collect FWorldContext references for garbage collection */
void AddReferencedObjects(FReferenceCollector& Collector, const UObject* ReferencingObject);
FORCEINLINE UWorld* World() const
{
return ThisCurrentWorld;
}
FWorldContext()
: WorldType(EWorldType::None)
, ContextHandle(NAME_None)
, TravelURL()
, TravelType(0)
, PendingNetGame(nullptr)
, bShouldCommitPendingMapChange(0)
, GameViewport(nullptr)
, OwningGameInstance(nullptr)
, PIEInstance(INDEX_NONE)
, PIEWorldFeatureLevel(ERHIFeatureLevel::Num)
, RunAsDedicated(false)
, bWaitingOnOnlineSubsystem(false)
, AudioDeviceID(INDEX_NONE)
, ThisCurrentWorld(nullptr)
{ }
private:
UWorld* ThisCurrentWorld;
};
标签:UPROPERTY,World,PIE,FWorldContext,WorldContext,UWorld,UE,world 来源: https://www.cnblogs.com/hxhspace/p/16139977.html