23 / 09 / 28

Unreal 笔记之一

Begin Play(1-3)

引擎概述

文件夹

  • 大部分需求都可以通过引擎内工具实现。尽量不要修改引擎,因为升级引擎版本就需要合并修改,这很麻烦

  • 资源采用绝对路径保存,所以资产的移动应当在资源浏览器中完成,除非使用AutoSave文件夹中的自动保存文件覆盖项目文件夹路径下的

  • 项目配置可以覆盖引擎配置,只需要修改config文件夹中的.ini文件

  • 对项目配置最高级的修改位于config文件夹中,但也有引擎配置等方式修改。

  • 项目构建时会生成一个文件夹,包含 Visual Studip项目,编译后的对象文件等。如果项目出现问题但合作成员运作正常,则可以尝试删除 Saved 和 Intermediate 文件夹

  • 引擎和项目都可以接受插件,自定义插件可以通过保存在项目文件夹下的Plugin文件夹中来仅让它作用于项目

资产管理

  • 一种方式是从 DCC 软件导入

  • 另一种项目是从另一个项目迁移

  • Epic 还有 Bridge 这样的平台!

  • 蓝图、粒子、metasound等资产可以在引擎内创建

  • 可以设置资产管理插件来确保导入引擎资产的质量(这样的需求也是可以用蓝图的!)

  • 将引擎指向网络上的共享位置,可以把如着色器编译缓存一类的文件在团队成员间共享,提高资产同步的效率

  • 资产分为主要资产和次要资产,主要资产(如关卡)负责次要资产类型(如模型)的加载

构建流程

  • 虚幻引擎自动化工具负责编译流程

  • 如果项目包含C++代码,首先要编译二进制文件(1)

  • 状态控制优化和调试功能允许为调试性项目和发行性项目启用或禁用如控制台这样的功能

  • 整理好二进制文件后进行烘焙(2)

  • 可以使用常规烘焙或运行中烘焙,后者会在需要的时候烘焙内容,资产会被暂存在Saved文件夹中然后进行打包。(3)

  • 如果要本地化,在打包这一步完成。本地化框架允许对特定资产进行本地化。可以使用资产审计工具进行分配到块(.uassets文件)。

  • 打包之后构建完成!

程序设计概述

编译和测试工具

  • 虚幻引擎项目用C++编写,使用虚幻编译工具进行编译;它是用C#编写的,用于跨平台构建。自行编译引擎时,尽量将项目与引擎放在同一文件夹下。

    虚幻引擎源码以类的集合形式存放,每个集合,加上描述类如何运作的C#文件共同构成模块。

  • 插件是模块和资产的集合。其中一类插件,称作游戏功能插件,允许在运行时激活特定功能。

  • 虚幻引擎支持运行时编译。

  • 虚幻自动化工具包含一些命令,可以调用命令或自定义来形成自动化构建/打包流程。

  • 默认的DebugGame配置允许禁用部分优化便于调试;同时也有测试配置等对应不同场景。

  • 宏向编辑器暴露代码。UCLASS、USTRUCT和UENUM用于向虚幻引擎公开类型。适用于蓝图和编辑器。

  • UPROPORITY用于向引擎暴露Public类成员。用于实现联网或序列化功能。

  • UFunction向虚幻引擎公开函数。

构建模块

  • 虚幻引擎有自己的构件库。

  • 具有单双精度浮点、U整数等常见类型。

  • 可以使用枚举并公开给引擎。

  • 结构体不能应用于蓝图函数。

  • 字符串有FString、FName、FText(内置本地化功能)等常见类型。

  • 数组、类型和集合易于使用(?)

  • 也有变换类型。

  • UObject是虚幻引擎最底层的对象,内存由引擎管理。拓展类需要添加特定前缀(U)。

  • 组件包含关卡中内容的实体表示,父Actor是组件。

  • 只能用NewActor分配新的UObject,用SpawnActor函数分配Actor。UObject会在没有引用时自动销毁。Actor可以通过销毁函数销毁,但垃圾回收会自动进行。

  • 有两类智能指针。

  • 接口允许不相关的类实现可选的函数。接口函数可以在任意对象内调用。建议用C++创建接口,在蓝图中调用。

  • 静态函数库适合为结构体添加功能

  • 数据资产,如数据表和曲线资产适合存储游戏数据。

  • 事件应该在C++中创建。

  • 子系统便于在不修改已有类的前提下延展函数。异步任务图表用于处理异步线程任务。

内存

  • 资产可以通过地图加载,或通过软引用加载。没有任何引用时,对象会被卸载。

  • 硬引用会随着父资产自动加载。但可能导致过度引用和难以剔除,谨慎使用。

  • 垃圾收集器每分钟运行一次,但可以手动重载。

Gameplay框架

  • 游戏模式是每个关卡都有的一个对象,新关卡的第一件事是创建对应的游戏模式,并覆盖默认配置文件

  • 在关卡间通用的配置应该使用游戏示例

  • 游戏状态用于保存玩家状态

  • 玩家状态是一系列类,存储玩家的游玩信息

  • 角色是一种Pawn,由控制器控制,控制器可以是玩家或AI。

  • 在控制器类中存储所有输入。输入由输入组件处理。

  • 移动组件将输入转化为行动。

  • 作弊管理类用于添加调试功能。可以设置在控制器中使用的作弊类。

  • 每个组件都可以添加Tick。如果没有使用转换和碰撞,最好在物理模拟阶段使用Tick。

  • 玩法技能系统为多人游戏技能设计提供支持。

  • 游戏功能插件允许安全地启用和禁用功能。它会激活到游戏类中。

网络支持

  • 网络框架处理会话、连接和通信。

  • 略。

分析和调试工具

  • 日志系统提供相关功能,可以使用打印字符串蓝图输出。

  • 可是记录器是基于事件的可视化调试工具。记录事件的调试选项和元数据。非常适合用于记录AI行为。

  • 控制台允许运行时修改。可以创建自己的函数和变量,从中调用。

  • UnrealInsights是性能优化工具。它在发布版本中默认不启用。

  • CSV分析器用于帧计时。已经因UnrealInsights的发布而弃用。

  • DumpGPU和Gauntlet用于跨平台分析、自动化测试等功能。

蓝图

可视化脚本系统基于C++,本质上是一个中间层。蓝图内容被视作资产处理。

可视化脚本功能

  • 拓展内置功能,自定义对象。本质上是预制件。

  • 每个关卡有一个关卡蓝图,控制关卡层面的逻辑。关卡蓝图只能引用属于本关卡的Actor。因此,对于通用性质的逻辑,最好使用蓝图类。

  • UMG(虚幻示意图形)是交互开发功能。

  • Sequencer 是过场动画工具。使用事件轨道触发关卡蓝图的代码。

  • 动画蓝图用于控制和混合骨骼动画。

  • 控制绑定用于为角色制作程序化动画。

  • 材质节点用于改变视觉效果。

  • Niagara 用于粒子特效制作。

  • Metasound 用于程序化音频制作。

  • 行为树和场景查询共同驱动AI。

蓝图编辑器

  • 蓝图有很多类型。可以使用三种执行单元:函数、 事件和宏。

  • 函数很像函数,在调用他们的同一帧中执行代码,他因此很适合用来处理数据;

  • 事件不能返回数值,但可以潜在执行。类似协同程序,为动画、效果或其他需要一定时间来完成的事件提供结束点。

  • 宏是一组可以重复使用的节点。编译期间折叠起来的节点会自动展开,向每个实例自动添加节点,有一定性能开销。支持多个输出,非常适合创建分支逻辑。

  • 事件分发器用于蓝图之间的通信。可以在蓝图数据选项卡中定义。用于管理大量对象的通信,很好用。

  • 函数库和宏库独立于任何类,可以通过代码调用,用于拓展功能。

  • 蓝图的 Diff 工具用于复制和粘贴蓝图节点。

  • 有一些功能可以分离蓝图和数据,如曲线资产、数据结构(只包含变量)、和数据表(一种特殊的数据结构)。它们非常适合用于数值设计。十分建议根据项目实际定制更多资产。

Actor

  • 最常见的蓝图类。是可以放置在场景中的对象。Actor蓝图可以直接在编辑器中放置或用代码生成。

  • 一般来说,Actor是通过添加需要的组件来构成的,之后用蓝图来控制。

  • 子Actor组件可以自动附加另一个Actor,把它当作组件来处理;

  • 有许多预制组件,也可以编写自己的组件。

  • Actor 拥有内置事件用于管理生命周期。

  • Actor 蓝图有一个额外图标选项卡叫做构建脚本。

  • Tick是每帧调用的 Actor 事件。可以提供上次调用以来经过的时间用于制作可变帧率,但 Tick 用于承载过多逻辑时开销会比较大。

  • 可以使用定时器来处理周期性逻辑,

  • 时间轴是一组曲线,只要在播放,每次更新时会返回当前曲线的值。这样在构建动画一类功能时候就就不需要Tick 了。

其它

  • 虚幻示意图形是UI工具。

  • 可以拓展右键菜单来执行某些任务。

  • 编辑器实用物件可以在后台被动运行,监听事件,执行资产验证检查。

  • Event Graph 用于将控制台命令进行操作绑定。

  • 蓝图类被视为资产。在加载的时候,引用的资源会载入内存,建议通过引用查看器进行性能检查。可以使用软引用变量来延迟加载。软引用不会强制加载资产。

  • 继承也可能导致不当资产引用。最好先清除中间蓝图的资产引用,包括它们的组件。为了避免空引用,可以在类设置中把他们标记为抽象。

  • 类型转换可以隐式热引用另一个蓝图。

  • 还可以通过C++和蓝图接口等功能减少不必要的继承。

  • 时间分发器允许反转事件。

基本节点

  • 打印节点

  • 调试节点,显示简单的几何图形用于可视化逻辑。

  • 蓝图编辑器窗口选择关卡中的任何蓝图实例,以观察逻辑。还可以设置断点

  • 可视记录器用于基于时间轴记录交互行为,或者把信息附着到标签上。

  • 可以编写单元测试,并通过虚幻引擎的自动化框架进行测试。