Lyra Starter Game 中 GameFeature 类(如 ShooterCore)的加载流程

Lyra Starter Game 中 GameFeature 类(如 ShooterCore)的加载流程

1. GameFeature 系统概述

GameFeature 是 Unreal Engine 5 的一个核心插件系统,用于模块化地扩展游戏功能。在 Lyra Starter Game 中,ShooterCore 是一个典型的 GameFeature 插件,它提供了射击游戏的核心玩法系统。

2. GameFeature 核心组件

2.1 UGameFeatureData 类

UGameFeatureData 是 GameFeature 的核心数据资产类,定义在引擎的 GameFeatures 插件中:

cpp 复制代码
// 定义在 C:\UnrealEngine-5.6.1-release\Engine\Plugins\Runtime\GameFeatures\Source\GameFeatures\Public\GameFeatureData.h
UCLASS(MinimalAPI)
class UGameFeatureData : public UPrimaryDataAsset
{
    GENERATED_BODY()
    
    // 游戏特性的主要行为定义
    UPROPERTY(EditDefaultsOnly, Instanced, Category="Game Feature | Actions")
    TArray<TObjectPtr<UGameFeatureAction>> Actions;
    
    // 需要扫描的主资产类型
    UPROPERTY(EditAnywhere, Category="Game Feature | Asset Manager")
    TArray<FPrimaryAssetTypeInfo> PrimaryAssetTypesToScan;
};

2.2 UGameFeatureAction 类

UGameFeatureAction 是 GameFeature 的具体行为实现,每个 GameFeatureData 包含多个 Action,用于执行特定功能:

  • GameFeatureAction_AddAbilities:添加游戏能力
  • GameFeatureAction_AddInputBinding:添加输入绑定
  • GameFeatureAction_AddWidget:添加 UI 控件
  • GameFeatureAction_AddGameplayCuePath:添加游戏玩法提示路径

3. ShooterCore 插件结构

ShooterCore 插件是一个典型的 GameFeature 插件,其结构如下:

复制代码
ShooterCore/
├── Content/
│   └── ShooterCore.uasset      # GameFeatureData 配置文件
├── Source/
│   └── ShooterCoreRuntime/     # 运行时代码
│       ├── Private/            # 私有实现
│       └── Public/             # 公共接口
└── ShooterCore.uplugin         # 插件描述文件

4. GameFeature 加载流程

4.1 插件注册阶段

  1. 插件发现:引擎启动时,会扫描所有已启用的 GameFeature 插件
  2. GameFeatureData 加载:为每个 GameFeature 插件加载其 GameFeatureData 配置文件(如 ShooterCore.uasset)
  3. 观察者通知 :调用所有观察者的 OnGameFeatureRegistering 方法

Lyra 项目中,ULyraGameFeature_AddGameplayCuePaths 是一个观察者,用于在注册阶段添加 GameplayCue 路径:

cpp 复制代码
// 定义在 LyraGameFeaturePolicy.cpp
void ULyraGameFeature_AddGameplayCuePaths::OnGameFeatureRegistering(const UGameFeatureData* GameFeatureData, const FString& PluginName, const FString& PluginURL)
{
    for (const UGameFeatureAction* Action : GameFeatureData->GetActions())
    {
        if (const UGameFeatureAction_AddGameplayCuePath* AddGameplayCueGFA = Cast<UGameFeatureAction_AddGameplayCuePath>(Action))
        {
            // 添加 GameplayCue 路径
            const TArray<FDirectoryPath>& DirsToAdd = AddGameplayCueGFA->GetDirectoryPathsToAdd();
            if (ULyraGameplayCueManager* GCM = ULyraGameplayCueManager::Get())
            {
                for (const FDirectoryPath& Directory : DirsToAdd)
                {
                    FString MutablePath = Directory.Path;
                    UGameFeaturesSubsystem::FixPluginPackagePath(MutablePath, PluginRootPath, false);
                    GCM->AddGameplayCueNotifyPath(MutablePath, false);
                }
                // 重新构建运行时库
                GCM->InitializeRuntimeObjectLibrary();
            }
        }
    }
}

4.2 插件加载阶段

  1. 依赖检查:检查插件的依赖是否已满足
  2. 资源预加载:根据 GameFeatureData 配置预加载所需资源
  3. 观察者通知 :调用所有观察者的 OnGameFeatureLoading 方法

Lyra 项目中,ULyraGameFeature_HotfixManager 是一个观察者,用于在加载阶段处理热修复:

cpp 复制代码
// 定义在 LyraGameFeaturePolicy.cpp
void ULyraGameFeature_HotfixManager::OnGameFeatureLoading(const UGameFeatureData* GameFeatureData, const FString& PluginURL)
{
    if (ULyraHotfixManager* HotfixManager = Cast<ULyraHotfixManager>(UOnlineHotfixManager::Get(nullptr)))
    {
        HotfixManager->RequestPatchAssetsFromIniFiles();
    }
}

4.3 插件激活阶段

  1. Action 激活 :遍历 GameFeatureData 中的所有 GameFeatureAction,调用它们的 OnGameFeatureActivating 方法
  2. 世界集成:将 GameFeature 集成到当前游戏世界中
  3. 观察者通知 :调用所有观察者的 OnGameFeatureActivating 方法

GameFeatureAction_AddAbilities 为例,它会在激活时为指定的 Actor 类添加能力:

cpp 复制代码
// 定义在 GameFeatureAction_AddAbilities.cpp
void UGameFeatureAction_AddAbilities::OnGameFeatureActivating(FGameFeatureActivatingContext& Context)
{
    FPerContextData& ActiveData = ContextData.FindOrAdd(Context);
    
    if (!ensureAlways(ActiveData.ActiveExtensions.IsEmpty()) || 
        !ensureAlways(ActiveData.ComponentRequests.IsEmpty()))
    {
        Reset(ActiveData);
    }
    Super::OnGameFeatureActivating(Context);
}

4.4 插件运行阶段

GameFeature 激活后,其定义的功能(如能力、输入、UI 等)将在游戏中生效。

4.5 插件停用阶段

  1. Action 停用 :遍历 GameFeatureData 中的所有 GameFeatureAction,调用它们的 OnGameFeatureDeactivating 方法
  2. 资源清理:清理 GameFeature 使用的资源
  3. 观察者通知 :调用所有观察者的 OnGameFeatureDeactivating 方法

4.6 插件卸载阶段

  1. 资源卸载:卸载 GameFeature 使用的资源
  2. 插件移除:从系统中移除 GameFeature
  3. 观察者通知 :调用所有观察者的 OnGameFeatureUnregistering 方法

5. ShooterCore 插件的具体加载流程

5.1 插件描述文件

ShooterCore.uplugin 定义了插件的基本信息和依赖:

json 复制代码
{
    "FileVersion": 3,
    "Version": 1,
    "VersionName": "1.0",
    "FriendlyName": "ShooterCore",
    "Description": "Gameplay systems for Game1 / Shooter Game",
    "Category": "Game Features",
    "ExplicitlyLoaded": true,
    "EnabledByDefault": false,
    "BuiltInInitialFeatureState": "Registered",
    "Modules": [
        {
            "Name": "ShooterCoreRuntime",
            "Type": "Runtime",
            "LoadingPhase": "Default"
        }
    ],
    "Plugins": [
        {
            "Name": "GameplayAbilities",
            "Enabled": true
        },
        {
            "Name": "ModularGameplay",
            "Enabled": true
        },
        // 其他依赖插件
    ]
}

5.2 运行时模块初始化

ShooterCoreRuntimeModule.cpp 定义了模块的初始化和关闭逻辑:

cpp 复制代码
// 定义在 ShooterCoreRuntimeModule.cpp
void FShooterCoreRuntimeModule::StartupModule()
{
    // 模块初始化逻辑
}

void FShooterCoreRuntimeModule::ShutdownModule()
{
    // 模块关闭逻辑
}

5.3 GameFeatureData 配置

ShooterCore.uasset 配置文件包含了 ShooterCore 的所有 GameFeatureAction,如:

  • 添加射击游戏的核心能力
  • 注册输入映射
  • 添加 UI 控件
  • 配置游戏玩法提示

6. Lyra 自定义的 GameFeature 策略

LyraGameFeaturePolicy 是 Lyra 项目自定义的 GameFeature 策略类,用于控制 GameFeature 的加载模式和观察者:

cpp 复制代码
// 定义在 LyraGameFeaturePolicy.h
UCLASS(MinimalAPI, Config = Game)
class ULyraGameFeaturePolicy : public UGameFeaturesProjectPolicies
{
    GENERATED_BODY()
    
public:
    // 获取单例实例
    static ULyraGameFeaturePolicy& Get();
    
    // 初始化游戏特性管理器
    virtual void InitGameFeatureManager() override;
    
    // 关闭游戏特性管理器
    virtual void ShutdownGameFeatureManager() override;
    
    // 获取游戏特性加载模式
    virtual void GetGameFeatureLoadingMode(bool& bLoadClientData, bool& bLoadServerData) const override;
};

7. 总结

GameFeature 是 Lyra Starter Game 中实现模块化功能扩展的核心机制,ShooterCore 作为一个典型的 GameFeature 插件,其加载流程遵循了 Unreal Engine 5 的 GameFeature 生命周期:

  1. 注册阶段:发现插件并加载 GameFeatureData
  2. 加载阶段:检查依赖并预加载资源
  3. 激活阶段:执行 GameFeatureAction 并集成到游戏世界
  4. 运行阶段:功能生效
  5. 停用阶段:清理资源和功能
  6. 卸载阶段:移除插件

通过这种模块化的设计,Lyra Starter Game 可以灵活地扩展和管理游戏功能,提高代码的可维护性和复用性。

关键文件路径

  1. GameFeature 核心定义:C:\UnrealEngine-5.6.1-release\Engine\Plugins\Runtime\GameFeatures\Source\GameFeatures\Public\GameFeatureData.h
  2. Lyra GameFeature 策略:c:\Users\ChenChao\Documents\GitCode\LyraStarterGame_5.6\Source\LyraGame\GameFeatures\LyraGameFeaturePolicy.h
  3. ShooterCore 插件描述:c:\Users\ChenChao\Documents\GitCode\LyraStarterGame_5.6\Plugins\GameFeatures\ShooterCore\ShooterCore.uplugin
  4. GameFeatureAction 实现:c:\Users\ChenChao\Documents\GitCode\LyraStarterGame_5.6\Source\LyraGame\GameFeatures\

通过理解 GameFeature 的加载流程,开发者可以更好地利用这一机制来扩展和定制 Lyra Starter Game 的功能。

相关推荐
菩提小狗21 分钟前
小迪安全2023-2024|第5天:基础入门-反弹SHELL&不回显带外&正反向连接&防火墙出入站&文件下载_笔记|web安全|渗透测试|
笔记·安全·web安全
rainbow688933 分钟前
Linux文件描述符与重定向原理
c++
Wentao Sun39 分钟前
致敬软件创业者2026
笔记·程序人生
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:GUI桌面应用开发的实现
python·学习·flutter
CodeSheep程序羊1 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
编程小白20262 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
学历真的很重要2 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程与线程(补充版)
学习·职场和发展·系统架构·系统架构师
深蓝海拓2 小时前
PySide6,QCoreApplication::aboutToQuit与QtQore.qAddPostRoutine:退出前后的清理工作
笔记·python·qt·学习·pyqt
酒鼎2 小时前
学习笔记(3)HTML5新特性(第2章)
笔记·学习·html5
L***一2 小时前
2026届大专跨境电商专业毕业生就业能力提升路径探析
学习