Lyra源码分析002:LyraGame文件夹

项目目录:

我将为每个文件提供详细的行级代码分析,解释每行代码的意义和使用方法。

📁 LyraGameModule.cpp - 游戏模块入口

// Copyright Epic Games, Inc. All Rights Reserved.

#include "Modules/ModuleManager.h"  // 包含模块管理器头文件,提供模块系统功能


/**
 * FLyraGameModule - Lyra游戏模块类
 */
class FLyraGameModule : public FDefaultGameModuleImpl  // 继承自UE的默认游戏模块实现类
{
	virtual void StartupModule() override  // 重写模块启动方法,在模块加载时调用
	{
		// 这里可以初始化游戏特定的系统、注册类型、设置管理器等
		// 例如:RegisterComponentTypes(), InitializeSubsystems()
	}

	virtual void ShutdownModule() override  // 重写模块关闭方法,在模块卸载时调用
	{
		// 这里可以清理资源、取消注册、保存状态等
		// 例如:CleanupSubsystems(), SavePersistentData()
	}
};

// 将FLyraGameModule注册为主要的游戏模块
// 参数1: 模块类名,参数2: 模块名称,参数3: 模块显示名称
IMPLEMENT_PRIMARY_GAME_MODULE(FLyraGameModule, LyraGame, "LyraGame");

使用方法

// 在其他地方获取模块实例
FLyraGameModule& GameModule = FModuleManager::LoadModuleChecked<FLyraGameModule>("LyraGame");

// 添加启动逻辑示例:
void StartupModule() override
{
    // 注册自定义组件
    RegisterCustomComponents();
    
    // 初始化游戏系统
    UMyGameSystem::Initialize();
}



📁 README.md - 项目说明文档

# Lyra  // 项目标题

The Lyra project is to provide a bootstrapping game for Unreal Engine.  // Lyra项目旨在为虚幻引擎提供一个启动游戏
Lyra is intended to be a living sample that shows how we build scalable games around the engines core technology.
// Lyra旨在成为一个活生生的示例,展示我们如何围绕引擎核心技术构建可扩展的游戏

作用:项目定位说明,帮助开发者理解Lyra的设计目的。


📁 LyraLogChannels.h - 日志通道声明

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once  // 头文件保护,防止重复包含

#include "Logging/LogMacros.h"  // 包含UE日志宏定义

class UObject;  // 前向声明UObject类

// 声明Lyra通用日志分类,使用EXTERN表示在别处定义
// LYRAGAME_API: DLL导出宏,确保符号可见性
// DECLARE_LOG_CATEGORY_EXTERN: 声明外部日志分类宏
// LogLyra: 日志分类名称, Log: 默认日志级别, All: 编译进所有配置
LYRAGAME_API DECLARE_LOG_CATEGORY_EXTERN(LogLyra, Log, All);

// 声明经验系统专用日志分类
LYRAGAME_API DECLARE_LOG_CATEGORY_EXTERN(LogLyraExperience, Log, All);

// 声明技能系统专用日志分类
LYRAGAME_API DECLARE_LOG_CATEGORY_EXTERN(LogLyraAbilitySystem, Log, All);

// 声明队伍系统专用日志分类
LYRAGAME_API DECLARE_LOG_CATEGORY_EXTERN(LogLyraTeams, Log, All);

// 声明获取客户端/服务器上下文字符串的函数
// ContextObject: 可选的上下文对象,用于确定网络角色
LYRAGAME_API FString GetClientServerContextString(UObject* ContextObject = nullptr);

使用方法

// 在代码中使用日志
UE_LOG(LogLyra, Log, TEXT("Game initialized"));
UE_LOG(LogLyraAbilitySystem, Warning, TEXT("Ability %s failed to activate"), *AbilityName);

// 获取网络上下文
FString Context = GetClientServerContextString(this);
UE_LOG(LogLyra, Display, TEXT("[%s] Player joined game"), *Context);



📁 LyraLogChannels.cpp - 日志通道实现

// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraLogChannels.h"    // 包含对应的头文件
#include "GameFramework/Actor.h" // 包含Actor类,用于获取网络角色

// 定义在头文件中声明的日志分类
// DEFINE_LOG_CATEGORY: 实际定义日志分类的实现
DEFINE_LOG_CATEGORY(LogLyra);
DEFINE_LOG_CATEGORY(LogLyraExperience);
DEFINE_LOG_CATEGORY(LogLyraAbilitySystem);
DEFINE_LOG_CATEGORY(LogLyraTeams);

// 实现获取客户端/服务器上下文字符串的函数
FString GetClientServerContextString(UObject* ContextObject)
{
	ENetRole Role = ROLE_None;  // 初始化网络角色为无

	// 检查ContextObject是否是AActor类型
	if (AActor* Actor = Cast<AActor>(ContextObject))
	{
		Role = Actor->GetLocalRole();  // 获取Actor的本地网络角色
	}
	// 如果不是Actor,检查是否是ActorComponent
	else if (UActorComponent* Component = Cast<UActorComponent>(ContextObject))
	{
		Role = Component->GetOwnerRole();  // 获取组件所属Actor的网络角色
	}

	// 如果成功获取到网络角色
	if (Role != ROLE_None)
	{
		// 根据角色返回对应的字符串:Authority=服务器,其他=客户端
		return (Role == ROLE_Authority) ? TEXT("Server") : TEXT("Client");
	}
	else
	{
		// 在编辑器环境下处理
#if WITH_EDITOR  // 编辑器编译时包含的代码
		if (GIsEditor)  // 检查是否在编辑器中运行
		{
			extern ENGINE_API FString GPlayInEditorContextString;  // 声明外部变量
			return GPlayInEditorContextString;  // 返回编辑器播放上下文
		}
#endif
	}

	// 默认返回空括号
	return TEXT("[]");
}

📁 LyraGameplayTags.h - 游戏标签声明

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "NativeGameplayTags.h"  // 包含原生游戏标签支持

namespace LyraGameplayTags  // 将标签组织在命名空间中
{
	// 声明标签查找函数
	// TagString: 要查找的标签字符串
	// bMatchPartialString: 是否允许部分匹配
	LYRAGAME_API	FGameplayTag FindTagByString(const FString& TagString, bool bMatchPartialString = false);

	// 声明能力激活失败相关标签
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_IsDead);      // 因死亡激活失败
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_Cooldown);    // 因冷却激活失败
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_Cost);        // 因成本激活失败
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_TagsBlocked); // 因标签阻塞激活失败
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_TagsMissing); // 因标签缺失激活失败
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_Networking);  // 因网络问题激活失败
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_ActivationGroup); // 因激活组激活失败

	// 声明能力行为标签
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Behavior_SurvivesDeath);   // 能力在死亡后存活

	// 声明输入标签
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Move);        // 移动输入
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Look_Mouse);  // 鼠标视角输入
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Look_Stick);  // 摇杆视角输入
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Crouch);      // 蹲下输入
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_AutoRun);     // 自动奔跑输入

	// 声明初始化状态标签(有明确顺序)
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InitState_Spawned);         // 状态1: 已生成
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InitState_DataAvailable);   // 状态2: 数据可用
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InitState_DataInitialized); // 状态3: 数据初始化
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(InitState_GameplayReady);   // 状态4: 游戏就绪

	// 声明游戏事件标签
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(GameplayEvent_Death);        // 死亡事件
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(GameplayEvent_Reset);        // 重置事件
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(GameplayEvent_RequestReset); // 请求重置事件

	// 声明SetByCaller标签(用于技能效果中的数据传递)
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(SetByCaller_Damage);         // 伤害值
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(SetByCaller_Heal);           // 治疗值

	// 声明作弊标签
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Cheat_GodMode);             // 上帝模式
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Cheat_UnlimitedHealth);     // 无限生命

	// 声明状态标签
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Status_Crouching);          // 蹲下状态
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Status_AutoRunning);        // 自动奔跑状态
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Status_Death);              // 死亡状态
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Status_Death_Dying);        // 濒死状态
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Status_Death_Dead);         // 死亡完成状态

	// 声明移动模式标签映射
	LYRAGAME_API	extern const TMap<uint8, FGameplayTag> MovementModeTagMap;       // 标准移动模式映射
	LYRAGAME_API	extern const TMap<uint8, FGameplayTag> CustomMovementModeTagMap; // 自定义移动模式映射

	// 声明标准移动模式标签
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_Walking);     // 行走模式
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_NavWalking);  // 导航行走
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_Falling);     // 下落模式
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_Swimming);    // 游泳模式
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_Flying);      // 飞行模式
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_Custom);      // 自定义模式
};

📁 LyraGameplayTags.cpp - 游戏标签实现

// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraGameplayTags.h"        // 包含对应的头文件
#include "Engine/EngineTypes.h"      // 包含引擎类型,如MovementMode
#include "GameplayTagsManager.h"     // 包含游戏标签管理器
#include "LyraLogChannels.h"         // 包含日志通道

namespace LyraGameplayTags  // 在同一个命名空间中实现
{
	// 定义能力激活失败标签,包含注释说明
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_ActivateFail_IsDead, "Ability.ActivateFail.IsDead", 
		"Ability failed to activate because its owner is dead.");  // 标签名,实际字符串,描述

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_ActivateFail_Cooldown, "Ability.ActivateFail.Cooldown", 
		"Ability failed to activate because it is on cool down.");

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_ActivateFail_Cost, "Ability.ActivateFail.Cost", 
		"Ability failed to activate because it did not pass the cost checks.");

	// 定义能力行为标签
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Behavior_SurvivesDeath, "Ability.Behavior.SurvivesDeath", 
		"An ability with this type tag should not be canceled due to death.");

	// 定义输入标签
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(InputTag_Move, "InputTag.Move", "Move input.");
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(InputTag_Look_Mouse, "InputTag.Look.Mouse", "Look (mouse) input.");
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(InputTag_Look_Stick, "InputTag.Look.Stick", "Look (stick) input.");

	// 定义初始化状态标签(有明确的顺序说明)
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(InitState_Spawned, "InitState.Spawned", 
		"1: Actor/component has initially spawned and can be extended");  // 状态1

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(InitState_DataAvailable, "InitState.DataAvailable", 
		"2: All required data has been loaded/replicated and is ready for initialization");  // 状态2

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(InitState_DataInitialized, "InitState.DataInitialized", 
		"3: The available data has been initialized for this actor/component, but it is not ready for full gameplay");  // 状态3

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(InitState_GameplayReady, "InitState.GameplayReady", 
		"4: The actor/component is fully ready for active gameplay");  // 状态4

	// 定义游戏事件标签
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(GameplayEvent_Death, "GameplayEvent.Death", 
		"Event that fires on death. This event only fires on the server.");  // 仅服务器触发

	// 定义SetByCaller标签
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(SetByCaller_Damage, "SetByCaller.Damage", 
		"SetByCaller tag used by damage gameplay effects.");  // 用于伤害效果

	// 定义作弊标签
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Cheat_GodMode, "Cheat.GodMode", 
		"GodMode cheat is active on the owner.");

	// 定义状态标签
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Status_Crouching, "Status.Crouching", 
		"Target is crouching.");

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Status_Death, "Status.Death", 
		"Target has the death status.");

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Status_Death_Dying, "Status.Death.Dying", 
		"Target has begun the death process.");  // 开始死亡过程

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Status_Death_Dead, "Status.Death.Dead", 
		"Target has finished the death process.");  // 完成死亡过程

	// 定义移动模式标签
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_Walking, "Movement.Mode.Walking", 
		"Default Character movement tag");

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_NavWalking, "Movement.Mode.NavWalking", 
		"Default Character movement tag");

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_Falling, "Movement.Mode.Falling", 
		"Default Character movement tag");

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_Swimming, "Movement.Mode.Swimming", 
		"Default Character movement tag");

	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_Flying, "Movement.Mode.Flying", 
		"Default Character movement tag");

	// 定义自定义移动模式标签(需要扩展)
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_Custom, "Movement.Mode.Custom", 
		"This is invalid and should be replaced with custom tags.  See LyraGameplayTags::CustomMovementModeTagMap.");

	// 定义标准移动模式映射表
	// 将UE的MovementMode枚举映射到对应的GameplayTag
	const TMap<uint8, FGameplayTag> MovementModeTagMap =
	{
		{ MOVE_Walking, Movement_Mode_Walking },      // 行走模式 -> Movement_Mode_Walking标签
		{ MOVE_NavWalking, Movement_Mode_NavWalking }, // 导航行走 -> Movement_Mode_NavWalking标签
		{ MOVE_Falling, Movement_Mode_Falling },      // 下落模式 -> Movement_Mode_Falling标签
		{ MOVE_Swimming, Movement_Mode_Swimming },    // 游泳模式 -> Movement_Mode_Swimming标签
		{ MOVE_Flying, Movement_Mode_Flying },        // 飞行模式 -> Movement_Mode_Flying标签
		{ MOVE_Custom, Movement_Mode_Custom }         // 自定义模式 -> Movement_Mode_Custom标签
	};

	// 定义自定义移动模式映射表(初始为空,需要项目扩展)
	const TMap<uint8, FGameplayTag> CustomMovementModeTagMap =
	{
		// 在这里添加自定义移动模式,例如:
		// { CMOVE_Sliding, TAG_Custom_Sliding },
		// { CMOVE_WallRunning, TAG_Custom_WallRunning }
	};

	// 实现标签查找函数
	FGameplayTag FindTagByString(const FString& TagString, bool bMatchPartialString)
	{
		// 获取全局的游戏标签管理器单例
		const UGameplayTagsManager& Manager = UGameplayTagsManager::Get();
		
		// 尝试精确查找标签,false表示不进行错误报告
		FGameplayTag Tag = Manager.RequestGameplayTag(FName(*TagString), false);

		// 如果精确查找失败且允许部分匹配
		if (!Tag.IsValid() && bMatchPartialString)
		{
			FGameplayTagContainer AllTags;  // 创建标签容器
			Manager.RequestAllGameplayTags(AllTags, true);  // 获取所有已注册的标签

			// 遍历所有标签寻找部分匹配
			for (const FGameplayTag& TestTag : AllTags)
			{
				// 检查标签字符串是否包含搜索字符串
				if (TestTag.ToString().Contains(TagString))
				{
					// 记录部分匹配信息
					UE_LOG(LogLyra, Display, TEXT("Could not find exact match for tag [%s] but found partial match on tag [%s]."), 
						*TagString, *TestTag.ToString());
					Tag = TestTag;  // 设置找到的标签
					break;  // 找到第一个匹配就退出
				}
			}
		}

		return Tag;  // 返回找到的标签(如果没找到则返回无效标签)
	}
}

使用方法

// 检查能力激活条件
if (AbilitySystemComponent->HasMatchingGameplayTag(LyraGameplayTags::Ability_ActivateFail_IsDead))
{
    // 处理死亡状态下的能力激活失败
    return;
}

// 发送游戏事件
FGameplayEventData EventData;
UGameplayMessageSubsystem::Get().BroadcastMessage(LyraGameplayTags::GameplayEvent_Death, EventData);

// 查找标签
FGameplayTag MoveTag = LyraGameplayTags::FindTagByString("InputTag.Move");
FGameplayTag PartialTag = LyraGameplayTags::FindTagByString("Damage", true); // 部分匹配

// 获取移动模式对应的标签
if (const FGameplayTag* MovementTag = LyraGameplayTags::MovementModeTagMap.Find(MovementMode))
{
    // 使用对应的移动标签
    AbilitySystemComponent->SetLooseGameplayTagCount(*MovementTag, 1);
}



📁 LyraGame.Build.cs - 模块构建配置

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;  // 使用UnrealBuildTool命名空间

public class LyraGame : ModuleRules  // 继承ModuleRules类,定义模块构建规则
{
	public LyraGame(ReadOnlyTargetRules Target) : base(Target)  // 构造函数,接收目标规则
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;  // 使用显式或共享预编译头

		// 公共包含路径 - 其他模块包含这些头文件时使用的路径
		PublicIncludePaths.AddRange(
			new string[] {
				"LyraGame"  // 添加LyraGame目录到公共包含路径
			}
		);

		// 私有包含路径 - 仅本模块内部使用的头文件路径
		PrivateIncludePaths.AddRange(
			new string[] {
				// 当前为空,可以添加模块私有头文件路径
			}
		);

		// 公共依赖模块 - 其他模块依赖本模块时自动依赖的这些模块
		PublicDependencyModuleNames.AddRange(
			new string[] {
				"Core",                    // 核心功能:基础类型、容器、字符串等
				"CoreOnline",              // 核心在线功能:基础在线服务
				"CoreUObject",             // 核心UObject系统:反射、序列化
				"ApplicationCore",         // 应用核心:平台抽象、应用程序生命周期
				"Engine",                  // 引擎核心:游戏框架、世界、关卡
				"PhysicsCore",             // 物理核心:碰撞、物理查询
				"GameplayTags",            // 游戏标签系统:GameplayTag管理
				"GameplayTasks",           // 游戏任务系统:异步游戏任务
				"GameplayAbilities",       // 游戏技能系统 (GAS):技能、效果、属性
				"AIModule",                // AI模块:行为树、环境查询、感知
				"ModularGameplay",         // 模块化游戏玩法:Actor组件模块化
				"ModularGameplayActors",   // 模块化游戏角色:模块化Pawn和Character
				"DataRegistry",            // 数据注册表:结构化数据管理系统
				"ReplicationGraph",        // 复制图:优化的网络复制
				"GameFeatures",            // 游戏功能系统:运行时游戏功能管理
				"SignificanceManager",     // 重要性管理器:性能优化
				"Hotfix",                  // 热修复系统:运行时内容更新
				"CommonLoadingScreen",     // 通用加载屏幕:标准化加载界面
				"Niagara",                 // Niagara粒子系统:下一代VFX
				"AsyncMixin",              // 异步混合:异步操作辅助
				"ControlFlows",            // 控制流:复杂的流程控制
				"PropertyPath"             // 属性路径:反射属性访问
			}
		);

		// 私有依赖模块 - 仅本模块内部使用的模块
		PrivateDependencyModuleNames.AddRange(
			new string[] {
				"InputCore",               // 输入核心:原始输入处理
				"Slate",                   // Slate:UI框架核心
				"SlateCore",               // Slate核心:UI渲染和布局
				"DeveloperSettings",       // 开发者设置:项目设置管理
				"EnhancedInput",           // 增强输入系统:现代化输入处理
				"NetCore",                 // 网络核心:低级网络功能
				"RHI",                     // 渲染硬件接口:图形API抽象
				"Projects",                // 项目系统:项目文件管理
				"Gauntlet",                // Gauntlet:自动化测试框架
				"UMG",                     // 虚幻运动图形:基于Slate的UI系统
				"CommonUI",                // 通用UI:跨平台UI组件
				"CommonInput",             // 通用输入:跨平台输入映射
				"GameSettings",            // 游戏设置:设置管理系统
				"CommonGame",              // 通用游戏:通用游戏框架
				"CommonUser",              // 通用用户:用户管理和登录
				"GameSubtitles",           // 游戏字幕:字幕显示系统
				"GameplayMessageRuntime",  // 游戏消息运行时:游戏内消息传递
				"AudioMixer",              // 音频混合器:高级音频处理
				"NetworkReplayStreaming",  // 网络回放流:游戏回放记录
				"UIExtension",             // UI扩展:动态UI组件管理
				"ClientPilot",             // 客户端导览:自动化客户端测试
				"AudioModulation",         // 音频调制:动态音频控制
				"EngineSettings",          // 引擎设置:引擎配置
				"DTLSHandlerComponent",    // DTLS处理组件:加密网络通信
			}
		);

		// 动态加载模块 - 运行时根据需要加载的模块
		DynamicallyLoadedModuleNames.AddRange(
			new string[] {
				// 当前为空,可以添加运行时加载的模块
			}
		);

		// 公共定义 - 预处理器宏定义
		// 在测试/发布版本中使用DrawDebug函数时生成编译错误
		PublicDefinitions.Add("SHIPPING_DRAW_DEBUG_ERROR=1");

		// 设置游戏调试器支持
		SetupGameplayDebuggerSupport(Target);

		// 设置Iris网络复制支持(UE5.1+的新网络系统)
		SetupIrisSupport(Target);
	}
}

使用方法

// 扩展模块依赖示例:
PublicDependencyModuleNames.Add("MyCustomModule");
PrivateDependencyModuleNames.Add("MyInternalModule");

// 添加条件依赖
if (Target.bBuildEditor)
{
    PrivateDependencyModuleNames.Add("UnrealEd");  // 仅在编辑器构建时依赖
}

// 添加平台特定依赖
if (Target.Platform == UnrealTargetPlatform.Android)
{
    PrivateDependencyModuleNames.Add("AndroidPlatformFeatures");
}


🎯 核心架构总结

1. 模块生命周期管理

  • FLyraGameModule 处理模块的初始化和清理

  • 使用标准的UE模块系统确保正确的加载顺序

2. 分层日志系统

  • 分类日志便于调试和过滤

  • 网络上下文识别帮助调试复制问题

  • 专用的日志分类提高可维护性

3. 标签驱动架构

  • 声明-定义模式:头文件声明,cpp文件定义

  • 分类组织:能力、输入、状态、事件等分类

  • 映射系统:将枚举值映射到标签

  • 查找功能:支持精确和模糊查找

4. 模块化依赖管理

  • 公共依赖:接口依赖,影响依赖本模块的其他模块

  • 私有依赖:实现依赖,仅内部使用

  • 功能模块化:清晰的职责分离

5. 扩展性设计

  • 自定义移动模式支持

  • 模块化的游戏功能系统

  • 可扩展的标签体系

这些文件共同构成了Lyra游戏的核心基础设施,提供了强大的可扩展性、可维护性和调试支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值