项目目录:


我将为每个文件提供详细的行级代码分析,解释每行代码的意义和使用方法。
📁 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游戏的核心基础设施,提供了强大的可扩展性、可维护性和调试支持。
6609

被折叠的 条评论
为什么被折叠?



