Page cover

地牢结构

概述

进入地牢

大厅

地牢层数

离开地牢

模块结构

地牢实例 Dungeon Instance

DungeonInstance.c
class CHARMINGCRAFT_API ANativeBaseDungeonInstance : public AInfo
{
	GENERATED_BODY()

public:
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	bool bHasHub = true;
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	int32 MaxChildDungeonsPerInstance = 1;
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	bool bLoadDungeonsWorldsByNeed = true; 
	
	// Predefine the map for each child dungeons
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	TArray<TSoftObjectPtr<UWorld>> ChildDungeonsWorlds;
	// 
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	TArray<FCharmingCraftWorld> ChildDungeonsWorldsInstance;
	// Define player in which child dungeons, for example, <PlayerA, 3> means
	// PlayerA is in 3rd ChildDungeon;
	UPROPERTY(BlueprintReadWrite, EditAnywhere)
	TMap<ACharacter *, int> DungeonInstancePlayerData;
};

地牢实例包含该地牢的所有层的地图 Uworld 并且在玩家加载地牢时动态地生成在场景中并由DungeonHandler 管理,当玩家退出地牢时该实例会被 DungeonHandler 摧毁.

ChildDungeonsWorlds 该数组存储地牢实例的所有地图模板, index 0 指向的是 地牢大厅/准备场所

ChildDungeonsWorldsInstance 该数组存储当前地牢实例加载的世界实例, 地牢加载的世界实例应当与世界管理器中也存在一份引用并且在地牢实例摧毁时也应该在世界管理器中摧毁

DungeonInstancePlayerData 存储玩家当前在这个地牢实例中的探索进度, TMap的第一个元素是玩家对象,第二个元素是当前地牢层数

在最初版本地牢中不提供额外的房间比如说购买或者功能性房间, 要拓展这部分内容需要对玩家在地牢中探索的数据结构进行更换

地牢处理器 Dungeon Handler

DungeonHandler.c
class CHARMINGCRAFT_API UNativeDungeonHandler : public UObject, public ICoreManagerInterface
{
	GENERATED_BODY()

public:
	UPROPERTY(BlueprintReadWrite, VisibleAnywhere)
	TSet<TObjectPtr<ANativeBaseDungeonInstance>> LoadedDungeonInstances;

public:
	UNativeDungeonHandler();

	bool AddInstanceToSet(ANativeBaseDungeonInstance * DungeonInstance);
	

public:
	virtual UCharmingCraftInstance* GetGameInstance_Implementation() override;
};

地牢处理器 存储游戏加载的 地牢实例 ,每当玩家创建新的地牢时地牢处理器会加载地牢实例到 LoadedDungeonInstances 中并通知世界管理器加载当前玩家探索地牢层的世界地图随时准备展示到玩家视野中. 当地牢内所有玩家退出或地牢关闭/失效时, 地牢处理器则会首先通知世界管理器移除该地牢实例所加载的地牢地图并在移除完毕后再移除地牢实例.

Last updated