游戏功能和模块化Gameplay

构建你可以轻松激活、停用或在项目之间共享的独立功能。

Choose your operating system:

Windows

macOS

Linux

选择实现方法:

Blueprints

C++

游戏功能(Game Features)模块化Gameplay(Modular Gameplay) 插件可以帮助开发人员为项目创建独立功能。使用插件来构建功能有多种优势,比如确保项目代码的纯净和可读性,避免不相关的功能意外交互或产生依赖,以及确保功能可以轻松转移到其他项目。在开发随着时间改变功能集的产品时,或者在多个产品之间共享功能和技术时,这种特性尤为重要。

初始设置

参照以下步骤可以让你的项目添加一个或多个基于插件的独立功能:

  1. 如果这是你第一次在项目中添加此类功能,则首先要激活游戏功能和模块化Gameplay插件。要将其激活,请打开虚幻引擎5编辑器主窗口中的 编辑(Edit) 下拉菜单,然后选择 插件(Plugins)。一旦 插件(Plugins) 窗口打开,找到并启用游戏功能插件和模块化Gameplay插件。你可以在左侧面板的 Gameplay 类别中找到这两个插件。

  2. 在启用插件后,编辑器将提示你需要重新启动。在重新启动编辑器前,点击 添加(Add) 按钮。

  3. 点击 添加(Add) 后会打开 新建插件(New Plugin) 窗口。你需要新建一个插件来包含新的功能。插件不限定类型。在这个示例中,我们已经选择了 仅内容(Content Only) 作为类型,并将插件命名为 MyStandaloneFeature

  4. 确保你的项目在项目的 /Plugins/GameFeatures/ 目录下。

  5. 插件(Plugins) 窗口中点击 立即重新启动(Restart Now) 按钮来重新启动编辑器,或关闭编辑器后再重新打开它。

  6. 在重新启动时,你可以在看到 消息日志(Message Log)加载错误(Load Errors) 中看到以下文本:

    "资产管理器设置中不包含类型为GameFeatureData的资产条目;为了让游戏功能插件正常运行,必须提供该条目。将条目添加到PrimaryAssetTypesToScan?(Asset Manager settings do not include an entry for assets of type GameFeatureData, which is required for game feature plugins to function. Add entry to PrimaryAssetTypesToScan?)"

    如果你看到此文本,点击"将条目添加到PrimaryAssetTypesToScan?(Add entry to PrimaryAssetTypesToScan?)"即可解决问题。编辑器将对 DefaultEngine.ini 进行适当的更改,将来不会再显示该消息。或者,你可以手动设置 主要资产类型(Primary Asset Type),方法是:打开 编辑(Edit) 下拉菜单,选择 项目设置(Project Settings),然后导航至 游戏(Game) 分段下的 资产管理器(Asset Manager) 类别。在 要扫描的主要资产类型(Primary Asset Types to Scan) 下,添加一个使用 GameFeatureData 基本类的名为 GameFeatureData 的主要资产类型,然后将目录 /Game/Unused 添加到 目录(Directories) 数组。最后,展开 规则(Rules) 并将 烘焙规则(Cook Rule) 设置为 始终烘焙(Always Cook)

  7. 使用 内容浏览器(Content Browser) 导航到你插件的顶层内容文件夹。在这种情况下,其名称为 MyStandaloneFeature Content。在 资产面板(Asset Panel) 中右键点击,展开上下文菜单中的 杂项(Miscellaneous),然后选择 数据资产(Data Asset),即可创建新的 数据资产(Data Asset)。在类列表中,选择 GameFeatureData 并将新资产命名为你为插件指定的名称;在这种情况下,资产的名称必须是 MyStandaloneFeature

完成这些步骤之后,你的独立功能将设置为在引擎(或编辑器)启动时加载。

你现在可以开发功能本身,并添加用于实现该功能的 操作(Actions)。 有四种类型的操作:

  • 添加作弊(Add Cheats) 操作将会扩展 作弊管理器(Cheat Manager),创建新的"作弊代码"或扩展现有作弊代码。作弊代码对于调试很有帮助,可以自动从发行版中删除。~(波浪号)键可以打开控制台,你可以在运行项目时在这里输入作弊代码。

  • 添加组件(Add Components) 操作将会获取Actor子类的列表,并可以选择性地加入一组组件。这是使用游戏功能和模块化Gameplay插件的最常见方式,因为组件非常适合用来封装各种类型的行为。

  • 添加数据注册表(Add Data Registry) 操作会将一个或多个数据注册表添加到项目中。数据注册表可以用来高效存储和检索全局注册数据。

  • 添加数据注册表源(Add Data Registry Source) 操作会将一个或多个数据表添加到现有数据注册表中。

要添加操作,请打开你刚创建的数据资产。展开 操作(ACTIONS) 类别,显示名为 操作(Actions) 的数组。将元素添加到该数组中,并将其设置为合适的操作类型。你可以在下方小节中找到每种操作类型的进一步指导。

每种操作类型一个。对于给定的插件,你可以根据需要拥有任意数量的操作。

在添加操作后,如果你的游戏功能看起来没有生效,那么可能需要重启一次编辑器。这是因为,GameFeatureData资产在编辑器启动期间加载,这意味着,创建GameFeatureData资产之后若不重新启动,将会导致该资产无法运行。你只需要在最初创建资产时重新启动;在后续的会话中更新资产时则不需要重新启动。

添加作弊

"添加作弊"操作将会在游戏中注册 作弊管理器扩展(Cheat Manager Extension)。 这让开发人员可以在独立功能中创建自己的调试命令(或"作弊代码"),并让这些命令在功能生效后随时可用。由于作弊管理器和作弊管理器扩展都是调试工具,因此不会在发行版中实例化。

添加组件

"添加组件"操作会遍历Actor和组件对,并尝试将每个组件的一个实例添加到配对的Actor中。你可以指定在客户端还是服务器上添加组件,还是两者都添加;默认情况下,客户端和服务器都会添加组件。

为了保证你的功能完全封装在插件中,你添加的组件将来自插件自身,而Actor类将是内置的引擎类,例如 Pawn 或项目中继承自引擎类的子类,例如常见的 MyPawn。理想情况下,组件应该能处理与你的功能相关的所有程序逻辑和数据存储。

通过最大限度降低与项目的Actor子类进行交互的需求,你可以轻松地在另一个项目中实现你的功能。

不要对Actor基类使用"添加组件"操作,因为不支持这种操作,并且系统将忽略这部分操作。相反,你应该尽可能确定哪些Actor子类会用到组件,指定该类。假如有多个类应该接收组件但没有继承自Actor的共同父类,你应该设置多个"添加组件"操作,覆盖所有合适的基类。

要接收"添加组件"操作中的组件,你的Actor必须在 游戏框架组件管理器(Game Framework Component Manager) 中注册;通常是在其 开始播放(Begin Play) 事件中注册。方法是,获取全局游戏框架组件管理器,调用其 添加接收器(Add Receiver) 函数,将Actor作为 接收器(Receiver) 参数传入。无论激活了多少游戏功能,Actor仅需要使用 添加接收器(Add Receiver) 一次即可。要从Actor中删除与游戏功能关联的所有组件,请使用游戏框架组件管理器的 删除接收器(Remove Receiver) 函数。

AddReceiver.png

在Actor的 开始播放(Begin Play) 事件中注册以便接收组件。

要接收"添加组件"操作中的组件,你的Actor必须使用 UGameFrameworkComponentManager 单例注册,并将自身传入 AddReceiver 函数。这步通常在 BeginPlay 中完成。代码如下:

if (UGameFrameworkComponentManager* ComponentManager = GetGameInstance()->GetSubsystem<UGameFrameworkComponentManager>())
{
    ComponentManager->AddReceiver(this);
}

添加数据注册表

"添加数据注册表"操作可以将整个数据注册表添加到你的项目中。使用你要添加的数据注册表资产的路径来配置操作。如需了解数据注册表的更多信息,请参见数据注册表页面。

添加数据注册表源

假如要添加一个数据源并流送到数据注册表中,你需要使用"添加数据注册表源(Add Data Registry Source)"操作。你必须为每个数据源配置路径,配置将加载数据源的数据注册表的名称,以及相关的优先级和使用标记。如果游戏功能在启动时加载,则相应的标识符将填充下拉列表。如需更多信息,请参见"数据注册表"页面的数据注册表源部分。