游戏功能(Game Features) 和 模块化Gameplay(Modular Gameplay) 插件可以帮助开发人员为项目创建独立功能。使用插件来构建功能有多种优势,比如确保项目代码的纯净和可读性,避免不相关的功能意外交互或产生依赖,以及确保功能可以轻松转移到其他项目。在开发随着时间改变功能集的产品时,或者在多个产品之间共享功能和技术时,这种特性尤为重要。
初始设置
参照以下步骤可以让你的项目添加一个或多个基于插件的独立功能:
-
如果这是你第一次在项目中添加此类功能,则首先要激活游戏功能和模块化Gameplay插件。要将其激活,请打开虚幻引擎5编辑器主窗口中的 编辑(Edit) 下拉菜单,然后选择 插件(Plugins) 。一旦 插件(Plugins) 窗口打开,找到并启用游戏功能插件和模块化Gameplay插件。你可以在左侧面板的 Gameplay类别中找到这两个插件。
-
在启用插件后,编辑器将提示你需要重新启动。在重新启动编辑器前,点击 添加(Add) 按钮。
-
点击 添加(Add) 后会打开 新建插件(New Plugin) 窗口。你需要新建一个插件来包含新的功能。插件不限定类型。在这个示例中,我们已经选择了 仅内容(Content Only) 作为类型,并将插件命名为
MyStandaloneFeature
。 -
确保你的项目在项目的
/Plugins/GameFeatures/
目录下。 -
在 插件(Plugins) 窗口中点击 立即重新启动(Restart Now) 按钮来重新启动编辑器,或关闭编辑器后再重新打开它。
-
在重新启动时,你可以在看到 消息日志(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)
-
-
使用 内容浏览器(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的共同父类,你应该设置多个"添加组件"操作,覆盖所有合适的基类。
添加数据注册表
"添加数据注册表"操作可以将整个数据注册表添加到你的项目中。使用你要添加的数据注册表资产的路径来配置操作。如需了解数据注册表的更多信息,请参见数据注册表页面。
添加数据注册表源
假如要添加一个数据源并流送到数据注册表中,你需要使用"添加数据注册表源(Add Data Registry Source)"操作。你必须为每个数据源配置路径,配置将加载数据源的数据注册表的名称,以及相关的优先级和使用标记。如果游戏功能在启动时加载,则相应的标识符将填充下拉列表。如需更多信息,请参见"数据注册表"页面的数据注册表源部分。