从零开始,走完一条虚幻引擎 5官方学习路线
这份教程把 Epic 官方 Unreal Engine for New Users(虚幻引擎新用户指南)的完整路线,整理成一条可以直接照着走的中文学习地图: 装好引擎 → 建出第一个项目 → 看懂编辑器 → 玩转视口 → 选一条官方路线(程序员 / 设计师 / 美术)→ 打包成能玩的游戏。 每一步都配官方原版截图、快捷键表、动手练习和检查清单。走完官方路线后,进阶篇继续深入蓝图、动画、材质、地形、Niagara、PCG 与 MetaHuman。
先看整条路线:官方是怎么安排新手的
Epic 官方新用户指南把入门拆成 4 个必做步骤、1 个岔路口(三条学习路线)和 1 个收尾步骤。照着走,不会迷路。
官方路线的核心逻辑
先让「眼睛和手」熟悉编辑器(界面 + 视口),再让「脑子」选一个方向深入。前 4 步不要求你懂任何编程或美术基础。
三条路线不是三选一终身
官方建议三条都了解,但先完整走完一条。设计师路线最贴近“做出一个能玩的关卡”,也是很多人推荐的第一条。
最容易被跳过的一步
第 4 步「视口操作」。它看起来只是操作技巧,但后面 90% 的效率差距都来自这里——请务必动手练一遍。
这份教程怎么用
- 照着顺序走:侧边栏就是路线顺序,读完一节就勾掉一节(勾选状态存在你自己的浏览器里)。
- 别只看不动手:每个阶段末尾都有「动手练习」,做完再进下一节。看教程的收获 ≤ 20%,动手的收获 ≥ 80%。
- 图片可点击放大:文中所有截图都来自 Epic 官方文档,点一下看大图。
- 版本说明:本教程以官方文档 UE 5.8 页面为准进行整理;界面在 5.3–5.8 之间差异很小,个别位置变动不影响学习。旧版本请以「帮助 → 引擎文档」中的同页内容对照。
进阶篇:官方路线之后的六个系统
官方新用户路线解决“怎么用引擎”,但不覆盖蓝图全貌、动画系统、材质节点、地形材质、Niagara、PCG 与 MetaHuman。 本教程在本页 06 之后补了 07–12 共六个进阶专题,并在附录提供节点速查与中英术语表 —— 需要时直接跳转过去。
建议的阅读顺序
先做官方入门四步 + 设计师路线(能做出完整可玩关卡);再学进阶篇的 07 蓝图全解与 08 动画系统; 然后按目标挑:做场景查 09/10,做表现查 11,做大世界或数字人查 12。不要从材质节点表开始背。
安装虚幻引擎:先把“工作台”搭好
官方 Step 1:Install Unreal Engine。装引擎本身不难,难的是别在一开始踩坑(路径、组件、磁盘)。
1. 先确认你的电脑跑得动
官方把要求分成「最低」和「推荐」两档。UE5 的 Lumen(全局光照)和 Nanite(虚拟几何体)是吃配置的大户,如果显卡不支持,可以用传统光照方案,但学习体验会打折扣。
| 项目 | 官方最低要求 | 官方推荐配置 |
|---|---|---|
| 操作系统 | Windows 10 22H2(64 位)或 Windows 10 企业版 21H2(64 位) | Windows 11 |
| 处理器 | — | 四核 Intel 或 AMD,2.5 GHz 或更快 |
| 内存 | — | 32 GB RAM |
| 显卡 | 支持 DirectX 12 的显卡 + 最新驱动 | 支持 DX12,显存 8 GB 或以上 |
| 运行库 | DirectX 终端用户运行库(2010 年 6 月版) | 保持显卡驱动为最新 |
| 硬盘 | 官方未给出硬性数字,但引擎 + 派生数据缓存(DDC)+ 示例项目实际占用很大,建议预留 150–200 GB 的 SSD 空间 | |
2. 还需要装什么软件
必备:Epic Games Launcher
官方发行版引擎的唯一入口。装引擎、更新版本、管理插件、下载 Fab 资源都在这里。注册 Epic 账号免费。
走程序员路线才需要:Visual Studio
写 C++ 用。安装时务必勾选 “使用 C++ 的游戏开发” 工作负载(含“桌面开发 C++”与 Unreal Engine 安装程序组件)。官方当前推荐 Visual Studio 2026,UE 5.6 时代常用 VS 2022。
进阶:移动端 / 主机 SDK
打包 iOS / Android 需要对应平台 SDK;主机平台必须使用源码版引擎,无法用启动器里的预编译版本。
可选:第三方调试工具
如 RenderDoc(抓帧分析)、Visual Studio 调试器。新手阶段可以先用引擎自带的 Output Log 与 Unreal Insights。
3. 七步装好引擎
-
注册并登录 Epic 账号
到 Epic Games 官网注册账号。启动器里也可以先点 Sign In Later(稍后登录)进入,但下载引擎前必须登录。
官方截图:Epic Games Launcher 下载页,选对应系统版本下载安装。 -
安装 Epic Games Launcher 并登录
安装包很小,几分钟即可。打开后如果已有账号就选 Sign In with an Existing Epic Games Account;也可以用第三方平台账号登录并绑定。
-
进入 Unreal Engine 面板 → 库(Library)
启动器左侧选 Unreal Engine,再点上方 Library 标签,这里管理你本机安装的所有引擎版本。
官方截图:Launcher 的 Unreal Engine 面板,包含 Library(已安装)与 Marketplace 等入口。 -
点 “+” 添加引擎版本
点 + 图标会出现引擎版本列表。新手直接选最新的正式版(例如 5.6 / 5.8),不要选带 Preview 字样的预览版——预览版用于尝鲜,插件与教程适配度低。
-
选择安装位置与组件
点版本旁的 Options(选项)可以改安装目录并勾选组件。这里是全篇最值得花 2 分钟的地方:
组件 作用 体积参考 新手建议 Core Components 引擎运行必需的官方核心文件 ≈ 25.8 GB 必勾(Required) Starter Content 默认素材:地图、网格体、贴图等,方便快速搭建场景 ≈ 443 MB 建议勾选,练习时很好用 Templates and Feature Packs 用于从官方模板与功能包创建项目 ≈ 1.9 GB 建议勾选(要用 First Person 模板就必须有) Engine Source 查看引擎源码,用于阅读 / 修改引擎本身 ≈ 6.8 GB 新手先不勾,体积很大 MetaHuman Creator Core Data MetaHuman 数字人相关的核心数据 ≈ 5.3 GB 不做数字人就不勾 Editor symbols for debugging 调试符号,崩溃时提供更详细的调用栈信息 数十 GB 遇到崩溃再装 Target Platform 为目标平台补装源码支持(如 Android、iOS、Linux) 视平台而定 按需勾选 上表体积取自官方截图中的 5.6 安装界面示例:那次勾选后的下载体积约 12.3 GB,安装后占用约 28.5 GB。不同版本、不同组件选择会明显不同——这也说明为什么一开始就要留足磁盘空间。
官方截图:安装选项(Installation Options)面板,可改路径并选择组件。 三条避坑建议:① 安装路径只用英文和数字,不要出现中文、空格或特殊符号——这是后面打包、编译报错的常见根源;② 放在 SSD 上,加载速度差别巨大;③ 给杀毒软件加上 DDC 与项目目录的排除项,否则编译与保存会被拖慢。 -
点击 Install,等待下载完成
体量通常是几十 GB,视版本与组件而定。下载中可以暂停(Pause)或取消(Cancel),恢复时点 Resume(继续)。下载期间别断网切换网络。
-
点 Launch 启动引擎
安装完成后会变成 Launch 按钮,点一下就能打开引擎(第一次启动会做初始化,比较慢)。之后可以在 Library 里点 Quick Launch 把引擎固定到启动器侧栏,下次一键打开。
官方截图:安装完成后点击 Launch 启动引擎。
4. 装好之后的日常维护(了解即可)
校验安装(Verify)
引擎起不来、文件疑似损坏时:Library 里点引擎版本旁的箭头 → Verify,自动比对并修复丢失/损坏的文件。这是最常用的“一键修复”。
改动已安装组件
忘了勾 Starter Content 或调试符号?同样在版本旁的 Options 里补勾,只下载新增部分。
热修(Hotfix)更新
小版本修复会提示更新,点 Update 即可。大版本升级请先备份项目——跨大版本升级有可能需要转换资源。
多个版本共存
可以同时安装 5.4 / 5.6 / 5.8。但一个项目在升级到新版本后无法回退到旧版本打开,重要项目请先复制备份。
插件(Plugins)
第三方插件在 Library → 引擎版本 → Installed Plugins 中安装,装完重启引擎生效。插件与引擎版本不匹配是启动失败的常见原因。
卸载引擎
Library 中版本旁的 Remove。注意:卸载引擎不会删除你的项目文件。
✅ 本阶段检查清单
官方原文:Install Unreal Engine · Hardware and Software Specifications
创建第一个项目:从模板出发
官方 Step 2:Create your First Project in Unreal。选对模板和项目设置,能省掉后面很多返工。
1. 启动引擎:打开项目浏览器
从 Launcher 点 Launch,或直接双击引擎图标,会先出现 Unreal Project Browser(项目浏览器)。这是所有项目的起点:左边选模板,右边设默认值,下方填名称与位置。
2. 看懂项目浏览器的四个区域
| 区域 | 名称 | 作用 |
|---|---|---|
| 1 | Recent Projects 与模板分类 | 最近打开的项目,以及按类别过滤模板(Games / Film & Video / Architecture 等) |
| 2 | 模板列表 | 当前分类下的可选模板,鼠标悬停可看预览与说明 |
| 3 | Project Defaults(项目默认设置) | 蓝图 / C++、目标平台、画质预设、是否包含 Starter Content、光线追踪等开关 |
| 4 | Project Creation Menu | 设置项目名称、存储位置,以及创建按钮 |
3. 模板怎么选
| 模板 | 内容 | 适合谁 |
|---|---|---|
| Blank | 空项目,不含任何额外的游戏功能 | 想完全自己搭、或做非游戏内容(影视、可视化) |
| First Person | 自带第一人称角色蓝图与输入,可立即走动环视 | 官方新用户路线推荐;程序员与设计师路线的起点 |
| Third Person | 第三人称角色蓝图,含动画与相机跟随 | 想做动作 / 冒险类,需要看到角色本体 |
| Top Down | 俯视角角色与相机 | 双摇杆射击、策略向原型 |
| Handheld AR | 演示手持设备上的 AR 常用功能 | 做移动端 AR |
| Virtual Reality | 演示 VR 常用功能(运动控制、传送等) | 做 VR 内容 |
| Vehicle | 带一辆可驾驶的载具 | 竞速 / 驾驶类原型 |
4. 推荐的创建参数(与官方教程保持一致)
- 模板:First Person
- Blueprint 还是 C++:零基础选 Blueprint(可视化编程,立即能改);打算走程序员路线选 C++。官方说明:Blueprints 类项目同样可以后续添加 C++ 类,两者可混合使用。
- Target Platform:Desktop(桌面);要发移动端再改。
- Quality Preset:Maximum(画质优先),机器吃力就选 Scalable。
- Starter Content:勾选,方便随手拿现成素材搭场景。
- 项目名称:英文命名,例如
MyFirstProject;位置:全英文路径,且放在系统盘之外的分区更好。
5. 进项目后的三件事
先玩一下
点工具栏的 Play(快捷键 Alt+P),用 WASD 走动、鼠标环视,按 Esc 退出试玩。先感受“模板已经给了你什么”。
保存关卡
按 Ctrl+S 保存当前关卡。养成“动手三分钟就保存”的习惯,UE 没有自动保存。
看一眼内容浏览器
打开 Content Drawer(Ctrl+Space),认识
/Content/FirstPerson/…的目录结构——蓝图的命名与分层方式,就是你后面自己的工程该有的样子。
✅ 本阶段检查清单
认识编辑器界面:八个面板,各管一摊
官方 Step 3:Unreal Editor Interface。把界面看成“八个工种”,你就不会再找不到东西放哪。
八个区域一览
| # | 名称 | 它负责什么 | 什么时候看它 |
|---|---|---|---|
| 1 | Menu Bar 菜单栏 | 文件、编辑、窗口、工具、构建、帮助等全局命令 | 新建关卡、打开项目设置、打开/关闭面板 |
| 2 | Main Toolbar 主工具栏 | 保存、当前关卡、模式切换、内容快捷创建、播放控制、平台菜单 | 几乎每一次操作:保存 → 试玩 → 打包 |
| 3 | Viewport Toolbar 视口工具栏 | 变换与吸附、相机视角、视图模式与显示标记、性能与视口选项 | 调视觉表现、选中物体做变换时 |
| 4 | Level Viewport 关卡视口 | 显示关卡内容(相机、Actor、灯光…),你大部分时间都待在这里 | 摆放、调整、预览一切 |
| 5 | Outliner 大纲 | 关卡内所有内容的层级树,可搜索、分组、隐藏 | “这个物体在哪?” |
| 6 | Details 细节面板 | 显示选中 Actor 的所有属性、组件与材质 | “怎么改它的参数?” |
| 7 | Content Drawer 内容抽屉 | 临时弹出的内容浏览器窗口,管理工程内的所有资源 | 找资源、拖资源进场景时 |
| 8 | Bottom Toolbar 底部工具栏 | 内容抽屉、输出日志与命令行、Tracing、DDC、Live Coding、保存状态、修订控制 | 查报错、看日志、编译 C++ |
逐个认识:官方截图对照
三个“原来如此”的小知识
内容抽屉 vs 内容浏览器
「抽屉」是临时弹出、鼠标移开就收起的版本;「浏览器」是常驻窗口。功能一样,抽屉更适合全屏工作时快速拿资源。
大纲里的“高亮联动”
在视口里点中一个物体,大纲对应行会高亮;反过来在大纲里选中,视口里也会被框出来。选中状态是全编辑器共享的。
细节面板就是“属性面板”
蓝图、材质、蓝图里的每个节点,选中后都会在细节面板显示属性。学会用搜索框,是新手进阶的第一个效率拐点。
🧪 动手练习(5 分钟)
选中与定位
在视口里点选模板场景中的台阶或墙(例如官方示例里的 Ramp),观察它同时在大纲里高亮、细节面板里出现属性。
改一个值
在细节面板找到 Transform → Location,把 Z 改大 200,回车,看物体在视口里“飞”起来。再按 Ctrl+Z 撤销,按 Ctrl+Y 重做。
试一次视图模式
视口工具栏把视图模式从 Lit 切到 Unlit,再切到 Wireframe,理解“渲染表现”和“几何结构”的区别。
故意制造一次报错
随便拖一个资源到视口,再打开底部 Output Log 看一眼日志长什么样。习惯看日志,比背快捷键更值钱。
✅ 本阶段检查清单
视口操作与快捷键:把引擎“用顺手”
官方 Step 4:Viewport Controls。这是全篇最该动手的一节——它决定了你之后做同样一件事要花 3 秒还是 30 秒。
0. 先统一缩写
| 缩写 | 含义 |
|---|---|
| LMB | 鼠标左键(Left Mouse Button) |
| MMB | 鼠标中键 / 滚轮按下(Middle Mouse Button) |
| RMB | 鼠标右键(Right Mouse Button) |
1. 选择物体
| 视口 | 操作 | 效果 |
|---|---|---|
| 透视视口 | 点击 LMB | 选中光标下的物体,替换当前选择 |
| 按住 Ctrl 或 Shift + 点击 LMB | 把光标下的物体加入当前选择(多选) | |
| 正交视口 | 点击 LMB | 选中光标下的物体,替换当前选择 |
| 按住 LMB 拖拽 | 拉出框选矩形,选中范围内的多个物体 | |
| Shift + 按住 LMB 拖拽 | 把框选范围内的物体加入选择;Ctrl+RMB 拖拽则是从选择中移除 |
2. 导航:在场景里自由移动
| 视口 | 操作 | 效果 |
|---|---|---|
| 透视 | 按住 LMB 拖拽 | 相机前后移动并左右转向(像是“边走边转头”) |
| 按住 RMB 拖拽 | 只旋转视角,环视场景(最常用!) | |
| 按住 LMB + RMB 拖拽,或按住 MMB 拖拽 | 相机上下左右平移,不改变朝向 | |
| 滚动 MMB 滚轮 | 相机按步进前后移动 | |
| 正交 | 按住 LMB 拖拽 | 拉框选择多个物体 |
| 按住 RMB 拖拽 | 平移相机 | |
| 按住 LMB + RMB 拖拽 | 相机前后移动(相当于缩放) | |
| 滚动 MMB 滚轮 | 相机按步进前后移动 |
3. 相机速度与“飞行”操作
按住 RMB 时,视口会进入“飞行模式”,此时可以像 FPS 游戏一样移动相机——这是搭场景时最爽的一组操作:
| 操作 | 效果 |
|---|---|
| 按住 RMB + 滚动滚轮 | 加快 / 减慢相机移动速度(场景很大时必备) |
| 按住 RMB + W / 小键盘 8 / ↑ | 相机前进 |
| 按住 RMB + S / 小键盘 2 / ↓ | 相机后退 |
| 按住 RMB + A / 小键盘 4 / ← | 相机左移 |
| 按住 RMB + D / 小键盘 6 / → | 相机右移 |
| 按住 RMB + E / 小键盘 9 / Page Up | 沿世界坐标向上移动 |
| 按住 RMB + Q / 小键盘 7 / Page Down | 沿世界坐标向下移动 |
| 按住 RMB + R / F | 沿局部坐标上移 / 下移(贴地飞行很有用) |
| 按住 RMB + Z / 小键盘 1 | 拉大相机视野(FOV) |
| 按住 RMB + C / 小键盘 3 | 缩小相机视野(FOV) |
4. 聚焦与环绕:像看模型一样检查物体
| 操作 | 效果 |
|---|---|
| 按 F | 把相机聚焦到当前选中的物体上 |
| 按住 Alt + LMB 拖拽 | 围绕一个轴心点环绕观察 |
| 按住 Alt + RMB 拖拽 | 推拉相机(贴近 / 远离轴心) |
| 按住 Alt + MMB 拖拽 | 沿视线方向 左右上下平移轨道 |
5. 移动、旋转、缩放物体
| 快捷键 | 工具 | 说明 |
|---|---|---|
| Space | 循环切换 | 在移动 → 旋转 → 缩放之间轮换 |
| Q | 选择工具 | 只用鼠标选择,不显示变换轴 |
| W | 移动工具 | 拖动三色箭头沿轴移动 |
| E | 旋转工具 | 拖动三色圆环绕轴旋转 |
| R | 缩放工具 | 拖动轴端方块缩放 |
| 按住 V | 顶点吸附 | 移动时吸附到其他几何体的顶点上,拼接模型神器 |
| 按住 MMB 拖动轴心 | 临时移轴 | 把选中物体的轴心临时挪到别处再变换(例如绕门轴旋转门) |
6. 显示控制与常用编辑器快捷键
| 快捷键 | 作用 |
|---|---|
| G | 切换游戏模式(Game Mode):视口只渲染游戏画面,隐藏编辑器图标与辅助线,用来检查真实效果 |
| Ctrl+R | 开关实时渲染(real-time):关掉后画面静止,便于精细调整或省性能 |
| F11 | 切换沉浸模式:视口全屏 |
| Ctrl+Space | 打开内容抽屉 |
| Ctrl+S / Ctrl+Shift+S | 保存当前 / 全部保存 |
| Ctrl+Z / Ctrl+Y | 撤销 / 重做 |
| Alt+P / Esc | 开始试玩(Play)/ 退出试玩 |
| Ctrl+Alt+F11 | Live Coding 编译 C++ 代码(程序员路线常用) |
| Alt+G/H/J/K | 视口相机切换到 透视 / 顶视 / 前视 / 侧视(不同版本可能有差异,以视口工具栏的下拉菜单为准) |
视口还有个隐藏功能:按住视口左上角的视角标签拖动,可以拖出新的视口;视口工具栏里的布局按钮支持切分成 2×2 等多视口布局,同时用透视 + 顶视 + 前视对齐物体非常高效。
🧪 动手练习(10 分钟,务必做)
飞行绕场景一圈
按住 RMB 不放,用 WASD 在模板场景里飞一圈,途中用滚轮调一次速度。感受“速度太慢 → 调快”的节奏。
用 F 键练习“回位”
飞远到看不清场景,然后在大纲里点选一个物体按 F,相机瞬间聚焦过去。这是迷路时的救命键。
Alt 环绕检查一个物体
选中一个箱子,按住 Alt+LMB 绕它一圈,再用 Alt+RMB 推近看细节。
把轴心挪到边缘再旋转
选中一个物体,按住 MMB 把轴心拖到它的一侧,按 E 旋转——你会发现物体绕新轴心转动。这就是做“门”的原理。
顶点吸附拼两块地板
按住 V 移动一个物体,让它吸附到另一个物体的顶点上,体会精确对齐。
G 键对比游戏画面
按 G 隐藏编辑器辅助显示,看看“玩家真正会看到什么”。
✅ 本阶段检查清单
岔路口:三条官方学习路线怎么选
官方 Step 5:Choose a Learning Track。走完前四步,你已经会开项目、会看界面、会操作视口——现在该决定“用引擎做什么”。
程序员路线
用 C++ 从零编写第一人称冒险游戏:角色、输入、相机、物品数据、拾取、装备、发射物。
设计师路线
用 蓝图做出一整个可玩的解谜关卡:灰盒关卡、钥匙开门、HUD、机关、平台、陷阱、敌人、结束状态。
美术路线
给已经做好的关卡做一次完整 Art Pass:导入素材、打光、材质、后处理、音效、特效。
你可能适合,如果……
你有任何语言的编程基础,喜欢“逻辑可控、结构清晰”,想真正掌握引擎底层机制;或者你打算长期做独立开发、需要处理性能与大型工程的可维护性。
你需要准备什么
安装 Visual Studio(勾选 C++ 游戏开发工作负载)+ 引擎 5.6.1 或更新版本。官方提示:5.6.0 存在一个已知问题,会导致从 C++ 创建蓝图时失败。
你会做出什么
一个 C++ 编写的第一人称角色:能用增强输入系统响应按键、有第一人称相机与手臂模型、能拾取物品、装备到手上、发射投射物——并且物品数据用数据资产(Data Asset)与数据表(Data Table)管理,方便扩展。
官方对 C++ 与蓝图的说法
蓝图是可视化编码工具,上手快;但复杂度上升后会变得难以阅读与维护。大型项目里 C++ 更简洁、性能更好、更易管理。两者可以协作:用 C++ 写基类,再派生出蓝图给策划调参数。
你可能适合,如果……
你想“尽快做出能玩的东西”,对关卡、机制、玩家体验更感兴趣,而不是写代码;或者你是策划 / 独立开发者,需要一个人把玩法原型搭出来。
你需要准备什么
完成前面的入门四步即可,不需要写代码。官方建议先了解其他 Getting Started 页面,如果做过程序员路线,可以直接复用它做出来的角色。
你会做出什么
一个完整的解谜冒险关卡:用 灰盒(grayboxing) 流程搭出关卡结构,用蓝图做钥匙与门、HUD、光开关与箱子谜题、移动平台、陷阱与伤害、敌人、冲刺、结束状态,还有一个“生成新箱子”的 Bonus 机制。
为什么很多人从这里开始
它把「关卡设计思维」和「蓝图」绑在一起教:先想清楚玩家怎么走、怎么被卡住、怎么获得反馈,再动手实现。做完这一条,你对“游戏是怎么跑起来的”会有完整认知。
你可能适合,如果……
你的兴趣在画面、氛围、声音与特效上;或者你已经会用建模 / 贴图工具,想知道“素材进引擎之后该怎么用”。
你需要准备什么
官方建议先走完设计师路线(本路线直接从这个关卡的成果接着做)。官方还提供两种状态的示例工程:一份是设计路线刚结束的干净版本,一份是做完 Art Pass 的成品版本。
你会做出什么
给解谜关卡做一次完整美术升级:导入素材、用聚光/点光/矩形光塑造氛围、做材质与材质实例的父子体系、加后处理体积控制画面风格、用后处理材质做受击效果、用 MetaSounds 生成程序化音乐、给角色加上分地面材质的脚步声、用 Niagara 做视觉特效。
它会教你最重要的一件事
非破坏性工作流:材质实例、后处理、参数化实例——都是“改一次、全局生效、随时回退”。这是引擎美术与“直接改图”最本质的区别。
一眼对比
| 程序员路线 A | 设计师路线 B | 美术路线 C | |
|---|---|---|---|
| 核心工具 | C++ / Visual Studio | 蓝图 Blueprints | 材质、灯光、MetaSounds、Niagara |
| 课程数 | 8 节 | 11 节(含 Bonus) | 11 节 |
| 前置要求 | 入门四步 + Visual Studio;引擎 5.6.1+ | 入门四步 | 建议先完成设计师路线 |
| 最大收获 | 掌握引擎的代码框架与数据驱动思路 | 掌握关卡设计与游戏循环的搭建 | 掌握画面与声音的表现工作流 |
| 推荐顺序 | 第 2 顺位 | 第 1 顺位(最推荐先做) | 第 3 顺位 |
| 官方示例工程 | 教程内按步骤建立 | 提供(约 75 MB) | 提供两个状态版本 |
程序员路线:用 C++ 写一个第一人称冒险游戏
官方:Code a First-Person Adventure Game。目标是学会“用代码扩展引擎”,而不是从零造轮子。
开始之前
- 先读完前面 4 个入门页面(安装、建项目、界面、视口)。
- 按官方文档装好 Visual Studio:Set Up Visual Studio for Unreal Engine。安装时必须勾选 C++ 游戏开发相关组件,否则引擎无法自动生成工程文件。
- 使用 UE 5.6.1 或更新版本(5.6.0 有导致“从 C++ 创建蓝图失败”的已知问题)。
8 节课课程表
01搭建并编译你的项目
从 C++ 模板新建一个代码项目,跑通“改代码 → 编译 → 引擎里看到变化”的完整链路。
02用输入操作(Input Actions)创建玩家角色
用增强输入系统的 Input Action 与 Input Mapping Context,搭建可复用的输入配置。
03配置角色移动
把输入事件绑定到角色的移动与视角旋转上。
04添加第一人称相机、网格体与动画
用 C++ 给角色挂上相机组件、第一人称手臂网格体,并接上动画。
05管理物品与数据
用 Item 数据结构体、数据资产(Data Asset)与数据表(Data Table)来定义物品。
06创建可重生的拾取物
用 C++ 编写自定义拾取物,并让它在关卡里刷新与重生。
07让角色装备物品
实现可装备物品,并把它吸附到角色手上的插槽(Socket)。
08实现投射物
用 C++ 实现发射物,并在游戏中按输入生成、飞行与命中。
这条路线会用到的高频概念
| 概念 | 一句话解释 |
|---|---|
| UCLASS / UPROPERTY / UFUNCTION | 把 C++ 类、变量、函数暴露给引擎与蓝图系统的宏,写在声明上方 |
| Input Action / Mapping Context | 增强输入系统:前者定义“一个动作”,后者定义“哪些按键触发它”,可整体切换 |
| Component | 挂在 Actor 上的功能模块(相机、网格体、移动、碰撞都是组件) |
| Struct / Data Asset / Data Table | 数据驱动的三件套:结构定义字段,资产存单个配置,数据表批量存多行 |
| Spawn / Destroy | 运行时生成与销毁 Actor,是“拾取物重生”“发射子弹”的基础 |
| Live Coding | 引擎运行中直接编译 C++ 并热加载,避免反复重启编辑器 |
C++ 新手最容易踩的 5 个坑
- 改了 .h 头文件必须重新编译,否则蓝图里看不到新变量;修改头文件后建议停止 Play 再编译。
- IntelliSense 报红但能编译成功:VS 的索引可能过期,先执行一次编译再判断真假错误。
- 编译报错只看第一条:UBT 的后续错误常常是第一条引发的连锁反应。
- 不要手动改 Binaries / Intermediate:删掉这两个目录再重新生成工程文件,比手改更快。
- 类名前缀别乱起:A 开头是 Actor 子类、U 开头是 Object 子类,这是引擎约定,违反会造成难以排查的问题。
✅ 本阶段检查清单
设计师路线:用蓝图做出一个完整的解谜关卡
官方:Design a Puzzle Adventure Game。这条路线最像“真的在做游戏”,也是多数新手的推荐第一站。
你会做出的东西
玩法循环
找钥匙 → 开门 → 进新房间 → 操作开关 → 过平台 → 躲陷阱与敌人 → 到达终点。
系统清单
拾取、门锁、HUD、物理开关、移动平台、伤害与复活、敌人 AI 基础、冲刺、结束状态。
工作方法
灰盒(grayboxing)→ 机制验证 → 打磨表现。先做“能玩”,再做好看。
11 节课课程表
01项目设置与关卡灰盒(Blockout)
开始规划、设计并用灰盒搭出解谜冒险关卡,练习视图模式、物体变换与资源整理。
02制作一把钥匙
用蓝图创建一个玩家可以拾取的钥匙。
03用钥匙开门
配置 BP_DoorFrame,让门能变色,并且只有匹配的 BP_Key 才能打开。
04玩家 HUD
用 UMG 做一个简单的抬头显示界面,在玩家拾取物品时更新。
05谜题:开关与箱子
用材质、物理与蓝图做一个由箱子激活的开关。
06谜题:移动平台
用蓝图做出移动平台,并学习如何调试自己的脚本。
07陷阱与伤害
制作会对玩家造成伤害的环境蓝图,并搭建玩家被击败后的游戏结束循环。
08创建敌人
搭建游戏逻辑,做出能造成伤害、也会受到伤害的敌人角色。
09给玩家加冲刺
用输入操作(Input Actions)给角色加入冲刺能力。
10完成关卡
收束整个游戏循环,并给玩家配置一个明确的结束状态。
★Bonus:生成新的箱子
给游戏加一个新机制:让 BP_Cube 在达到上限前不断生成。
范例题:蓝图里的高频节点
| 节点 / 概念 | 用途 | 典型场景 |
|---|---|---|
| Event BeginPlay | Actor 生成时执行一次 | 初始化血量、设置初始颜色 |
| Event Tick | 每帧执行 | 持续检测、随时间变化(慎用,性能敏感) |
| OnComponentBeginOverlap | 碰撞体被进入时触发 | 摄像机触发区、陷阱、拾取 |
| Cast To | 把 Actor 转成具体类型后访问它的变量/函数 | 门的蓝图里判断“来的是不是钥匙” |
| Timeline / Lerp | 随时间插值 | 门开合、平台移动 |
| Set Material / 动态材质实例 | 运行时改材质参数 | 门变色、开关亮起、受击闪烁 |
| Print String | 在屏幕上打印调试信息 | 不确定事件有没有触发时的第一手段 |
adventuredesigner 文件夹放进你的 Unreal Projects 目录(Windows 默认在 C:\Users\用户名\Documents\Unreal Projects),即可对照成品学习。卡住时看成品,是最高效的调试方式。✅ 本阶段检查清单
美术路线:给关卡做一次完整的 Art Pass
官方:Art Pass for a Puzzle Adventure Game。把灰盒变成有气氛的场景,且全程使用“可回退”的工作流。
11 节课课程表
01设置项目并导入素材
配置项目、把外部素材导入引擎并整理好。
02给场景打光
用聚光灯(Spot Light)、点光源(Point Light)、矩形光(Rect Light)塑造氛围。
03创建材质与材质实例
用材质与材质实例为关卡铺上表面质感。
04进阶材质实例
用动态材质实例做一个可交互的技术演示。
05添加后处理体积
用后处理体积(Post Process Volume)控制关卡的观感与性能。
06在 UI 上使用后处理材质
用材质做出由玩法驱动的屏幕后处理效果。
07调整环境光照特性
在低洼处加浓雾、在天空加暴风云,增强气氛。
08给火焰陷阱加音效
把音效接进蓝图,让机关“出声”。
09制作程序化音乐
用内置的 MetaSounds 合成器创作环境背景音乐。
10给角色加脚步声
让角色在不同材质的地面上发出不同的脚步声。
11给游戏添加视觉特效
用内置的 Niagara 视觉特效系统做出特效。
这条路线反复在教的一件事:非破坏性
| 做法 | 优点 | 对应课程 |
|---|---|---|
| 建材质 + 材质实例 | 改一次父材质,所有实例同时更新;调参不用碰节点图 | 第 3 课 |
| 用参数化的动态材质实例 | 运行时按玩法改画面,无需复制多份材质 | 第 4、6 课 |
| 后处理体积按区域划分 | 不同房间不同氛围,互不干扰,可单独回退 | 第 5 课 |
| MetaSounds 程序化音乐 | 一段逻辑生成变化,不必准备大量音频文件 | 第 9 课 |
✅ 本阶段检查清单
最后一步:打包,让游戏离开编辑器
官方 Last Step:Packaging Unreal Engine Projects。打包之后,你的游戏可以在任意一台没有装引擎的电脑上运行。
1. 打包到底是什么
编辑器里运行游戏时,资源是“就地读取 + 实时处理”的;打包则是把项目转换成一个独立的、目标平台能直接运行的程序集合。这个过程由几个子操作组成,官方把它们拆得很清楚:
| 构建操作 | 做了什么 | 典型用途 |
|---|---|---|
| Build | 编译代码 | 开发过程中编译工程 |
| Cook | 把资源烘焙成目标平台能用的格式 | 为测试或分发做准备 |
| Stage | 把烘焙结果与运行所需文件按目录结构摆好 | 准备测试 / 分发 |
| Package | 把 Stage 的结果打包成可分发的产物 | 准备测试 / 分发 |
| Deploy | 部署到目标设备 | 在非本机平台上测试 |
| Run | 在目标设备上启动 | 在非本机平台上测试 |
两种烘焙方式
| 方式 | 说明 |
|---|---|
| By the book(默认) | 打包前把所有资源烘焙好。成品启动快、行为稳定,正式分发用这个。 |
| On the fly | 运行时按目标平台请求临时烘焙。适合快速迭代测试,正式发行不推荐。开关就在 Platforms 菜单里的 Enable cooking on the fly。 |
2. 选对构建配置(Build Configuration)
| 配置 | 特点 | 用途 |
|---|---|---|
| Debug | 编译引擎与项目源码,关闭优化,包含符号 | 引擎与项目调试,最慢 |
| DebugGame | 编译项目源码,关闭优化,包含符号 | 只调试项目逻辑,比 Debug 快 |
| Development(默认) | 开启除最耗时项之外的全部优化,保留控制台命令与统计工具 | 开发期测试;性能与可调试性平衡 |
| Test | 包含调试工具但性能接近发行版,用于内部测试 | QA 测试 |
| Shipping | 关闭控制台命令、统计与性能分析工具,性能最好 | 正式分发给玩家 |
3. 打包前的必做检查
设置游戏默认地图
Project Settings → Maps & Modes 里把 Editor Startup Map(编辑器启动地图)和 Game Default Map(游戏默认地图)都指向你的关卡。默认地图没设对,打包出来的游戏会黑屏或进错场景。
官方截图:在项目设置里指定编辑器启动地图与游戏默认地图。 保存一切
关闭编辑器前保存所有关卡与资源(Ctrl+Shift+S)。有未保存内容时打包容易失败或产物缺内容。
确认代码能编译
程序员路线项目先完整编译一次;蓝图项目确认没有会导致编译失败的损坏蓝图(试试 Play 一遍)。
检查平台与 SDK
打 Windows 包不需要额外 SDK;打 Android / iOS / 主机需要先装对应平台组件与 SDK(主机必须用源码版引擎)。
4. 打包(Windows 桌面平台)
打开打包菜单
主工具栏点 Platforms → Windows → Package Project。同一菜单里还有 Packaging Settings(例如是否使用 Pak 文件、压缩方式、分块)可以先调整。
选择输出目录
选一个英文路径的空目录(例如
D:\Builds\MyGame)。不要选项目目录内部,避免把产物打进下一次打包的输入里。等待打包完成
首次打包最慢(要烘焙全部资源)。底部会显示进度,可以取消。打包日志在
<项目>\Saved\Logs里。运行成品
到输出目录里找到同名的
.exe(在Windows子目录下),双击运行——此时引擎已经完全不参与,这就是“你的游戏”。官方截图:在输出目录中运行生成的 exe。
Saved\Logs 里的日志;② 用 Project Launcher 或命令行加 -log 参数打包,可以看到完整日志;③ 新手 90% 的失败原因是中文路径、默认地图未设置、代码编译错误、资源引用丢失(内容浏览器里出现“!”的资源)。进阶:命令行与 Project Launcher
当你要重复打包、或给不同平台出包时,可以用 Unreal Automation Tool(UAT) 命令行,或用编辑器里的 Project Launcher 做自定义打包配置(自定义烘焙、增量打包、多平台变体)。这两者都属于“自动化打包”,学会之后可以把发布流程压缩成一条命令。
@echo off
REM 命令行打包示例(请把路径和版本号换成你自己的)
"D:\UE\UE_5.6\Engine\Build\BatchFiles\RunUAT.bat" BuildCookRun ^
-project="D:\Projects\MyGame\MyGame.uproject" ^
-noP4 -platform=Win64 -clientconfig=Shipping ^
-cook -allmaps -build -stage -pak -archive ^
-archivedirectory="D:\Builds\MyGame"
参数含义:-cook 烘焙资源 · -build 编译 · -stage 整理目录 · -pak 打包成 Pak · -archive 输出到指定目录 · -clientconfig=Shipping 指定构建配置。
5. 分发:把游戏交到别人手里
- 压缩打包整个输出目录(不是只给 exe),发给朋友解压即可运行。
- 目标机器需要相应的 DirectX 运行库与显卡驱动;Windows 10/11 通常已具备。
- 要上架平台(如 Steam、itch.io)时,还需准备商店页、截图、宣传片等素材;引擎侧的产物结构在各平台基本一致,主要差异在 SDK 与签名。
- 正式发布建议切换 Shipping 配置并再次完整测试一次——包括存档、分辨率、窗口模式、按键设置。
✅ 本阶段检查清单
官方原文:Packaging Unreal Engine Projects · Sharing and Releasing Projects
进阶篇:把引擎真正用起来的六个系统
前六节是“官方新用户路线”,从这里开始是“能做出东西”的部分:蓝图、动画、材质、地形、特效,以及 PCG / MetaHuman 这类生产力插件。
蓝图全解:种类、编辑器、组件、变量与节点
蓝图(Blueprint)是虚幻引擎的可视化脚本系统:不用写一行 C++,也能做出完整的游戏逻辑。这一节把它的“全貌”讲清楚。
👇 本节内置节点速查库:在下面输入框里敲英文节点名或中文(多关键词用空格分隔,例如 cast to、延迟、trace),立刻看到该节点的作用、输入输出与常见坑。可检索引擎全部蓝图节点(17,000+ 条),其中 304 条高频节点附中文讲解。
7.1 一句话理解蓝图
蓝图是把 C++ 类、函数、变量“包装”成节点与连线的可视化脚本:你在图表里连线,编辑器在背后把它编译成字节码交给引擎执行。 所以它不是玩具——官方用它做出了《堡垒之夜》里的大量玩法逻辑(官方明确说过 Fortnite 的很多玩法系统就是蓝图写的)。
对策划/美术友好
不需要编译环境,改完即生效,迭代速度极快。
与 C++ 互通
蓝图可以继承 C++ 类,也可以被 C++ 调用;两者能混着用。
上限在于组织
蓝图能做完整游戏,难点是当逻辑变多时如何保持可读、可维护。
7.2 蓝图有哪些种类(重点)
“蓝图”是一个统称,实际工程里有下面这些成员。看懂这张表,你就能明白别人说的“写个蓝图”到底指什么。
| 类型 | 是什么 | 典型用途 |
|---|---|---|
| Blueprint Class 蓝图类 | 最常用的一种:从某个父类派生出的资产,可包含组件、变量、函数与事件图表 | 门、拾取物、武器、敌人等一切游戏对象 |
| Level Blueprint 关卡蓝图 | 每个关卡自带一份的蓝图,只能操作当前关卡里的 Actor | 关卡专属逻辑:过场触发、一次性机关、关卡流程 |
| Animation Blueprint 动画蓝图 | 专门驱动角色动画的蓝图,有独立的 Event Graph 与 Anim Graph | 走/跑/跳的切换、状态机、混合空间(见第 08 章) |
| Widget Blueprint 控件蓝图 | UMG 界面蓝图,用可视化方式拼 UI 并绑定数据 | HUD、血条、菜单、背包界面 |
| Blueprint Interface 蓝图接口 | 一组“函数声明的集合”,任何蓝图都可以实现它 | 让“能互动的物体”统一响应玩家的交互 |
| Blueprint Macro Library 宏库 | 存放可复用宏(Macro)的库,宏是内联展开的节点组 | 封装通用的流程控制与逻辑片段 |
| Blueprint Function Library 函数库 | 存放静态函数的库,可在任意蓝图里直接调用 | 项目级的工具函数(数学、字符串、查表) |
| Data-Only Blueprint 纯数据蓝图 | 只有数据与继承关系、没有图表;用于做变体 | 从同一个父类派生出一批只改默认值的资产 |
| Editor Utility Blueprint 编辑器工具蓝图 | 运行在编辑器里的蓝图,可以批量处理资源 | 批量改命名、批量设置属性、自动生成关卡内容 |
| 其他可视化图表 | 材质图表、Niagara 图表、Control Rig 图表等也采用类似的节点编辑方式 | 材质(第 09 章)、特效(第 11 章)、动画绑定 |
7.3 蓝图编辑器的构成(对照官方界面)
| 区域 | 作用 | 要点 |
|---|---|---|
| 工具栏 | Compile(编译)、Save、Browse(在内容浏览器中定位)、Find in Blueprints、Play/Simulate | 改完逻辑先 Compile,报错看 Compiler Results |
| Components 组件面板 | 树状列出该蓝图拥有的组件,可增删、重命名、调整层级 | “蓝图能看见啥、能碰到啥”都由这里决定 |
| My Blueprint 我的蓝图 | 集中管理变量、函数、宏、事件分发器与所有图表 | 项目变大后,这里是整理逻辑的第一现场 |
| Viewport 视口 | 预览蓝图的默认形态,可像关卡视口一样直接拖拽组件 | 选中组件后可在右侧细节里改它的默认属性 |
| Event Graph 事件图表 | 写“逻辑”的地方:事件 → 节点 → 结果 | 每个蓝图的主要战场 |
| Construction Script 构造脚本 | 在“对象构建时”执行的图表(编辑器里摆放时就会跑) | 用来做程序化摆放、根据参数自动生成子对象 |
| Details 细节面板 | 显示当前选中对象(组件/节点/类默认值)的属性 | 选中节点时,很多节点行为也在这里调整 |
| Class Defaults 类默认值 | 该蓝图所有实例共享的默认属性 | 在这里改的是“模板”,不是某一个实例 |
| Debug 调试面板 | 断点、观察值、执行追踪 | 逻辑不生效时的第一手段 |
7.4 组件(Components):蓝图的手和脚
蓝图类本身只是一个“容器”,真正干活的是挂在它身上的组件。理解组件层级,是理解 UE 对象结构的关键一步。
Actor 与 Component 的关系
Actor 是可以被放进关卡的对象(有位置、能被选中);Component 是挂在 Actor 上的功能模块。 一个 Actor 可以没有组件(只是个逻辑载体),也可以挂几十个组件(例如角色:胶囊碰撞 + 骨骼网格体 + 相机 + 弹簧臂 + 移动组件)。
两种组件的区别
SceneComponent 有变换(位置/旋转/缩放),可以嵌套成层级;ActorComponent 没有变换,只提供功能(例如生命值管理、AI 逻辑)。 所有能“看得见、碰得到”的组件都是 SceneComponent 的子类。
层级与附加(Attach)
组件可以互相附加:父组件移动,子组件跟着动。骨骼网格体还能附加到骨骼插槽(Socket)上——把武器挂到角色手上就是这么做的。
移动性(Mobility)
Static 不可移动、Stationary 只旋转不移动、Movable 完全可动。选错会导致运行时无法移动,或失去光照烘焙优化。
| 常用组件 | 作用 | 典型场景 |
|---|---|---|
| StaticMeshComponent | 显示静态网格体 | 门、箱子、平台、道具 |
| SkeletalMeshComponent | 显示带骨骼的角色/生物 | 角色、敌人、可动装置 |
| CameraComponent / SpringArmComponent | 相机与“弹簧臂”(自动避障的第三人称相机) | 第一/第三人称视角 |
| Box / Sphere / Capsule Collision | 碰撞与触发体积 | 拾取范围、陷阱触发、交互区 |
| AudioComponent | 播放音效,支持空间衰减 | 机关音效、环境音 |
| PointLight / SpotLight / RectLight | 局部光源 | 台灯、火炬、室内补光 |
| NiagaraComponent | 挂载粒子特效 | 火焰、烟雾、命中特效 |
| DecalComponent | 贴花(投射在表面上的贴图) | 血迹、弹孔、涂鸦 |
| WidgetComponent | 把 UMG 界面渲染在 3D 空间里 | 头顶血条、交互提示 |
| CharacterMovement / ProjectileMovement RotatingMovement / InterpTo | 移动类组件:角色移动、抛射物、自转、平滑跟随 | 一切与位移有关的行为 |
| SplineComponent | 样条曲线,可让物体沿曲线运动 | 巡逻路线、相机轨道、管道 |
| PhysicsConstraintComponent | 物理约束(铰链、弹簧) | 可开的门、悬挂物、绳索 |
7.5 变量与数据类型
| 类型 | 说明 | 常见用途 |
|---|---|---|
| Boolean / Byte / Integer / Float / String / Name / Text | 基础数据类型 | 开关、计数、速度、显示文本(Text 支持本地化) |
| Vector / Rotator / Transform / LinearColor | 数学与空间类型 | 位置、朝向、坐标变换、颜色 |
| Struct(结构体) | 把多个字段打包成一个类型 | 物品数据、伤害参数、存档条目 |
| Enum(枚举) | 一组具名选项 | 角色状态(Idle/Walk/Run/Jump)、门的状态 |
| Object Reference | 指向场景中某个具体对象 | “这扇门要开的是哪个开关” |
| Class Reference | 指向某个类而不是实例 | “生成哪一种敌人” |
| Array / Set / Map | 容器 | 物品栏、已解锁列表、ID→数据 的映射 |
| Interface / Delegate | 接口与委托(事件分发器) | 解耦通信、观察者模式 |
| 变量开关 | 含义 |
|---|---|
| Instance Editable | 该变量显示在关卡实例的细节面板中,可逐个实例改值 |
| Blueprint Read Only | 只允许在蓝图里读,不能在图表中赋值(保护数据) |
| Private | 只允许本蓝图访问 |
| Expose on Spawn | 生成(Spawn)该 Actor 时可以直接传值 |
| Slider Range / Value Range | 给数值变量一个滑条范围,避免手输越界 |
| Replication | 多人游戏中的网络同步(进阶) |
7.6 事件、函数、宏与流程控制
Event 事件
逻辑的入口。BeginPlay(生成时一次)、Tick(每帧)、EndPlay(销毁时)、碰撞事件、输入事件、自定义事件(可被其它蓝图调用)。
Function 函数
可复用的逻辑单元,有输入/输出引脚与局部变量;勾选 Pure 变成无执行引脚的“取值节点”,勾选 Call In Editor 可直接在细节面板点按钮执行。
Macro 宏
内联展开的节点组,可以做流程控制(ForLoop 本身就是宏)。与函数的区别:宏能共享外部变量、支持多执行引脚,但不会被复用为单份代码。
Event Dispatcher 事件分发器
蓝图版的“订阅-通知”机制:一个蓝图发出事件,多个蓝图订阅响应。适合“门开了 → 灯亮 + 播放音效 + 计分”这类一对多通知。
Blueprint Interface 接口
定义一组函数契约,任何蓝图都能实现。好处:不需要 Cast 到具体类型,就能对“所有可交互物体”发消息。
Timeline 时间轴
蓝图内的时间曲线:给定时长与曲线,输出 0→1 的插值。做门开合、平台升降、颜色渐变最方便,比手写 Lerp + Tick 更稳。
| 常用流程控制节点 | 作用 |
|---|---|
| Branch | 条件分支(if/else) |
| Sequence | 把执行流拆成 0、1、2… 多条,按顺序执行 |
| Do Once / FlipFlop / Gate / MultiGate | 只执行一次 / 交替执行 / 开关闸门 / 循环多路分发 |
| ForEachLoop / While / ForLoop | 遍历数组、映射或循环计数 |
| Delay / Retriggerable Delay | 延时执行(注意:基于 Tick,游戏暂停时也会受影响) |
| Set Timer by Event / by Function | 定时器:可重复、可暂停、可清除,比 Delay 更可控 |
| Select | 根据索引/枚举值选择输出 |
| Switch on Int / String / Enum | 多分支选择,枚举分支最推荐 |
7.7 蓝图之间怎么“说话”(通信)
| 方式 | 做法 | 什么时候用 |
|---|---|---|
| 直接引用 | 把对象拖进图表,直接读它的变量、调它的函数 | 两者关系固定、生命周期一致(如角色 → 相机) |
| Cast To | 把传入的 Actor 转换成具体类型后访问成员 | 不确定传进来的是什么,但知道期望类型 |
| Blueprint Interface | 调用者只需知道接口函数,不需要知道对方类型 | “所有可交互物体”“所有可受伤目标” |
| Event Dispatcher | 发布-订阅:一对多通知 | 一个事件要触发多个系统 |
| GameMode / GameState / GameInstance | 用全局对象做“中转站”存共享状态 | 分数、关卡进度、跨关卡数据 |
| Get All Actors Of Class | 按类查询场景中所有对象 | 快速原型;正式项目慎用(性能与耦合) |
7.8 调试与优化
六种调试手段
① Compiler Results:编译报错与警告;② 断点(节点上按 F9):暂停并检查引脚值; ③ Watch Value:把某个变量固定在蓝图里实时显示;④ Print String:最土但最快的打点; ⑤ Draw Debug 系列:画线、画球、画箭头看射线与范围;⑥ Simulate(模拟运行):不接管控制权地跑逻辑,边跑边看。
性能三条铁律
① 别在 Tick 里做重活:改用定时器(Set Timer by Event)或事件驱动; ② 别每帧 Cast / 查询:把引用缓存在变量里,用 Is Valid 判断; ③ 数组遍历要注意规模:几千次循环每帧跑一次,就是卡顿的来源。
BP_ 蓝图类 · WBP_ 控件蓝图 · ABP_ 动画蓝图 · E_ 枚举 · ST_ 结构体 · M_ 材质 · MI_ 材质实例 · NS_ Niagara 系统 · T_ 贴图 · SM_ 静态网格体 · SK_ 骨骼网格体 · AM_ 动画蒙太奇 · AS_ 动画序列。
目录按功能分(Blueprints/、Art/、Audio/、Maps/),别让所有资产躺在根目录。🧪 动手练习(30 分钟)
做一个会亮的灯
新建蓝图类(父类 Actor),加 StaticMesh(圆柱体)+ PointLight + Box Collision,当玩家进入碰撞盒时把灯的颜色改成红色,离开时改回白色。
加入“可交互”接口
新建 Blueprint Interface,添加函数
Interact;让灯实现它;在关卡蓝图里按 E 键(用增强输入)调用面前的 Actor 的 Interact——体会“不需要 Cast”的写法。用变量做数据驱动
给灯加一个
LightColor向量变量并勾选 Instance Editable,在关卡里摆三盏灯分别设成不同颜色。用时间轴做渐亮
用 Timeline 让亮度在 0.5 秒内从 0 过渡到 5000,替换掉原来的瞬间切换。
故意调一次 bug
在 Interact 里打一个断点,运行游戏按 E,观察调试器停在断点并检查引脚值。
✅ 检查清单
官方原文:Overview of Blueprints Visual Scripting · Blueprint Variables · Blueprint Communications · Level Blueprint
动画与动作系统:从动画序列到动画蓝图
角色怎么动起来、怎么在走/跑/跳之间自然切换、怎么播一次性动作(挥刀、受击)——这一节是角色表现的核心。
8.1 先搞懂这几个名词
| 名词 | 含义 |
|---|---|
| Skeletal Mesh 骨骼网格体 | 可以变形的模型(角色、生物),由骨骼驱动。 |
| Skeleton 骨架 | 骨骼层级本身,是多个骨骼网格体与动画共享的“骨架标准”。这就是为什么换模型不换动画。 |
| Bone / Socket 骨骼 / 插槽 | 骨骼是骨架节点;插槽是挂在骨骼上的命名点(例如 hand_r 上的武器插槽)。 |
| Animation Sequence 动画序列 | 一段关键帧动画资产(走、跑、跳…)。 |
| Animation Blueprint 动画蓝图 | 根据游戏状态“实时决定播放什么、怎么混合”的逻辑蓝图。 |
| Anim Montage 动画蒙太奇 | 把动画序列做成带分段、可被代码触发的“动作”,例如攻击、交互、受击。 |
| Physics Asset 物理资产 | 给角色加的碰撞体(布娃娃、受击反馈)。 |
| Persona 动画编辑器集合 | 打开骨骼网格体/动画/动画蓝图时的编辑器统称。 |
8.2 动画序列(Animation Sequence)
界面构成
视口:预览动画,可切换显示骨骼、网格体、仅骨骼;骨骼树:选择骨骼并查看层级; 时间轴:关键帧、通知轨道、曲线轨道;细节:动画资产属性(帧率、长度、压缩、Additive 设置等);Asset Browser:直接切换到同骨架的其它动画。
导入动画的正确姿势
导入 FBX 时,Skeleton 要选择已有的骨架(而不是新建),并勾选 Import Animations;否则每次导入都会生成新骨架,导致动画无法共用。 官方还提醒:如果导出时结束帧带小数(例如 30.7),可能产生导入误差,建议在 DCC 里对齐整帧。
关键帧与插值
关键帧之间的插值方式会影响手感:Linear 生硬但精确,Cubic/自动 更平滑。可以只对某根骨骼做手动调整,再按 Add Key 记录。
压缩(Compression)
动画体积来自压缩设置。项目里可创建 Bone Compression Settings 与 Curve Compression Settings 资产,按角色类型统一管理精度——但要注意,精度过高会显著增大包体。
Additive 与 Root Motion
Additive 动画是“在原姿势上叠加偏移”(例如呼吸、受伤抖动);Root Motion 让动画本身驱动位移(例如翻滚、攀爬),需要在动画与角色移动组件里都打开。
录制动画
编辑器里可以直接 Record:把在关卡/动画蓝图里发生的动画录成新的动画序列。官方也支持在 Control Rig 里改完姿势后 Bake 成新的动画序列。
8.3 动画通知(Animation Notifies)
- Notify(点):在某一帧触发一次。用于“脚步声”“生成特效”“伤害判定”。
- Notify State(区间):在某段区间内持续生效。用于“武器碰撞体开启窗口”“无敌帧”“拖尾特效”。
- 内置类型:粒子通知、音效通知、布料通知、Camera Shake 等;也可以写自定义 Notify 类,在动画蓝图里接收并处理。
- 实践建议:把“表现”放在通知里(音效、特效、镜头抖动),把“规则”放在蓝图/代码里,两者用同一个动作触发点衔接。
8.4 动画蓝图(Animation Blueprint):两张图
动画蓝图是角色动画的大脑。它有两块图表,分工非常清晰:
Event Graph(事件图表)
和普通蓝图一样写逻辑:读取角色速度、是否在空中、是否在瞄准,把结果写进变量。常用事件是 Blueprint Update Animation(每帧或按需更新)。
Anim Graph(动画图表)
负责“算出最终姿势(Pose)”:把动画序列、状态机、混合节点连起来,最后接到 Output Pose。这里不写普通逻辑,只做动画运算。
8.5 状态机(State Machine):动画的“主干道”
| 元素 | 作用 |
|---|---|
| State 状态 | 一个动画状态(Idle / Walk / Run / Jump…),内部可以放单个序列、混合空间或另一套子图表 |
| Transition 转换 | 状态之间的连线,需要写“布尔条件”(在转换规则图里)与混合时长(Blend Duration) |
| Entry / 入口 | 状态机的起点,指向初始状态 |
| Conduit 管道 | 可复用的“条件中转站”,多个转换共用同一套判断 |
| State Alias 状态别名 | 把一组状态打包命名,简化转换连线(比如“所有地面状态”) |
| State 事件 | 进入/离开状态时触发(On Entered / On Left),可播放音效或重置参数 |
8.6 混合空间(Blend Space):把“速度”变成动画
| 概念 | 说明 |
|---|---|
| 1D / 2D | 1D 用一个轴(通常是速度)在走/跑之间混合;2D 用两个轴做方向性混合 |
| Axis Settings 轴设置 | 给轴命名并设范围,例如 Speed 0–600、Direction -180–180 |
| Sample 样本 | 轴上的一个个动画(放到坐标点上的动画序列) |
| Triangulation 三角剖分 | 决定样本之间的插值方式(None / Tangential / Radial),影响过渡手感 |
| Smoothing / Damping | 平滑时间与阻尼,避免输入抖动导致动画抽搐 |
| Aim Offset | 混合空间的特例:用鼠标/瞄准方向做上下左右偏移 |
8.7 动画蒙太奇(Anim Montage):一次性动作的标准做法
| 概念 | 说明 |
|---|---|
| Section 分段 | 把蒙太奇切成“起手 / 循环 / 收招”等段,可设置下一段(Next Section)与循环 |
| Slot 插槽 | 蒙太奇进入动画蓝图的“入口”。动画蓝图里用 Slot 节点(如 DefaultSlot)接收蒙太奇,实现“上半身播放攻击、下半身继续跑” |
| Slot Group | 插槽分组,用于管理多个插槽的优先级 |
| Notify | 蒙太奇上的通知,用来在动作的某一刻造成伤害、生成特效 |
| Child Montage | 子蒙太奇:继承父蒙太奇的分段结构,只替换其中某段动画(例如同一套攻击动作换不同武器) |
| 播放方式 | 蓝图节点 Play Anim Montage(角色)、Montage Play(动画实例);停止用 Stop Anim Montage |
8.8 重定向与骨骼控制:IK Rig / Control Rig
IK Rig 与 IK Retargeter
不同角色的骨架不同(Mixamo 的骨骼与 UE5 小人的骨骼结构不一样),IK Retargeter 可以把一套动画重定向到另一个角色上。 流程:为源角色建 IK Rig → 为目标角色建 IK Rig → 新建 IK Retargeter 指定两者 → 导出重定向后的动画。
Control Rig
程序化的骨骼控制:可以给角色加一套控制器(FK/IK、极向量、样条),用于手 K 动画、做姿势修正、或者做“脚部贴合斜坡”这类动态效果。 Control Rig 可以在动画蓝图里运行(Post Process 阶段),也可以在 Sequencer 里直接 K 帧。
Full Body IK / IK 求解器
UE5 提供了一套开箱可用的 IK 求解器(肢体、脊柱、样条等),配合 Control Rig 使用;官方文档里每个求解器都有独立参考页。
常见组合
手部 IK 贴合武器握把、脚部 IK 贴合不平地面、看向目标的头部 IK、上半身朝向镜头(Aim Offset)。这些都能在动画蓝图的 Anim Graph 里叠加在基础动画之上。
8.9 Sequencer:做关卡动画与过场
- 常见轨道:Transform(位移旋转)、Skeletal Animation(角色动画)、Camera Cuts(多机位切换)、Audio、Event(触发蓝图事件)、Material Parameter(驱动材质)。
- 关键帧操作:选中轨道按 Enter 打帧;曲线编辑器可精细调整缓动;支持自动打帧(Auto Key)。
- 相机与镜头:用 Cine Camera Actor 拍摄,Camera Cuts 轨道做镜头切换,可设置焦距、光圈、景深。
- 输出成片:用 Movie Render Queue(Movie Render Pipeline 插件)离线渲染高质量序列帧或视频,比录屏质量高得多。
- 在游戏里播放:用蓝图节点播放 Level Sequence,或作为过场切入;也可以用 Sequencer 驱动游戏内动画(例如开门镜头)。
8.10 快速上手工作流(推荐顺序)
先用模板自带的角色
第三人称模板已经配好了动画蓝图、状态机与混合空间。先打开
ABP_Manny对照阅读,比从零写快十倍。导入外部动画(例如 Mixamo)
下载 FBX(不带皮肤更轻)→ 导入时选择目标 Skeleton → 若骨架不同,用 IK Retargeter 重定向到 UE5 骨架。
做第一段混合空间
用 Idle/Walk/Run 三个样本建 1D 混合空间,在动画蓝图里接上速度,让角色跑起来自然过渡。
加一个动作蒙太奇
做一个“挥手/攻击”,在动画蓝图里加 DefaultSlot 节点,蓝图里用 Play Anim Montage 触发。
加上通知与表现
在蒙太奇的出手帧加 Notify,触发 Niagara 特效与音效——动画、特效、音效三者第一次合体。
✅ 检查清单
官方原文:Skeletal Mesh Animation System · Animation Sequences · Animation Blueprints · State Machines · Blend Spaces · Animation Montage
材质系统:材质编辑器、节点与地形材质
材质决定“东西看起来是什么做的”。这一节从编辑器界面讲到节点用法,再给你五套可以直接照抄思路的材质,最后讲地形分层材质。
👇 本节内置节点速查库:在下面输入框里敲英文节点名或中文(多关键词用空格分隔,例如 cast to、延迟、trace),立刻看到该节点的作用、输入输出与常见坑。可检索引擎全部材质表达式(393 条),其中 149 条附中文讲解。
9.1 先建立材质的概念地图
UE 的材质是实时计算的程序,不是一张贴图。你连的节点最终会被编译成着色器(Shader),在 GPU 上跑。
| 概念 | 说明 |
|---|---|
| Material 材质 | 一套节点逻辑,最终编译成着色器。改一次影响所有使用它的对象。 |
| Material Instance 材质实例 | 继承某个材质(父材质),只允许改被暴露出来的参数,不用重新编译。做变体的标准方式。 |
| Dynamic Material Instance 动态实例 | 运行时用蓝图创建并修改参数的实例,用于“受击变红”“血量越低越暗”等玩法驱动效果。 |
| Material Function 材质函数 | 把一串节点封装成可复用的“函数”,团队协作与复用的关键。 |
| Material Parameter Collection | 全局参数集合:一次修改,全场景材质同步(例如全局风力、受击强度、时间)。 |
| Shading Model 着色模型 | Default Lit(默认)、Unlit(无光照)、Subsurface(次表面)、Two Sided Foliage(双面植被)、Single Layer Water 等。 |
| Blend Mode 混合模式 | Opaque(不透明)、Masked(遮罩,有硬边)、Translucent(半透明)、Additive(叠加发光)、Modulate。 |
9.2 材质编辑器的各个组成部分
| 区域 | 作用 | 关键点 |
|---|---|---|
| 菜单栏 / 工具栏 | Apply(应用)、Save、Live Update(改节点即时预览)、Clean Graph(自动整理连线)、Hide Unrelated(隐藏无关节点)、Preview State、Stats、Platform Stats、HLSL Code | Live Update 打开后改参数能立刻在预览里看到效果,调试神器 |
| 预览视口(Viewport) | 实时预览材质:可换预览网格体(球/立方/平面/圆柱/自定义静态网格体)、切换视角、光照与显示模式 | 做金属、布料、植被时换成对应形状看效果更准 |
| 图表面板(Graph) | 连节点的地方:右键搜索、拖拽连线、框选对齐、注释框分组 | 图越乱越要早分组;Clean Graph 可以自动排版 |
| Palette 节点面板 | 按分类浏览所有可用的材质表达式与材质函数,支持搜索与过滤 | 找不到节点时先搜 Palette,再考虑自定义 HLSL |
| Details 细节面板 | 两套内容:选中节点时改节点属性(数值、参数名、分组);未选节点时改材质本身的属性(Blend Mode、Shading Model、Two Sided、Usage 等) | 参数命名与分组都在这里做 |
| Stats / Platform Stats | 显示该材质的指令数、纹理采样数、着色器复杂度,可按平台查看 | 看着 Stats 做材质,是“能优化的材质”和“会拖垮项目的材质”的分水岭 |
| HLSL Code | 查看该材质编译出的 HLSL 代码 | 排查“为什么这个节点这么贵”时的终极手段 |
9.3 主材质节点的输入引脚(背下来这一张表)
| 引脚 | 含义 | 怎么调 |
|---|---|---|
| Base Color | 基础颜色(不含光照的固有色) | 贴图或 Constant3Vector;注意贴图需为 sRGB |
| Metallic | 金属度(0=非金属,1=金属) | 标量或灰度贴图;非金属不要让中间值乱跑 |
| Specular | 高光强度(仅非金属有效) | 默认 0.5;湿滑可到 0.6–0.8 |
| Roughness | 粗糙度(0=镜面,1=全漫反射) | 最影响质感的一个参数,先调它再调颜色 |
| Emissive Color | 自发光(不受光照影响) | 做发光条、屏幕、熔岩、能量效果 |
| Normal | 法线(表面凹凸细节) | 法线贴图的 TextureSample 要设为 Normal 类型(否则必须取消 sRGB) |
| Ambient Occlusion | 环境光遮蔽(仅对屏幕空间 AO 生效) | 多数情况可留空,由 Lumen/AO 计算 |
| Opacity / Opacity Mask | 不透明度 / 遮罩 | Translucent 用 Opacity,Masked 用 Opacity Mask |
| World Position Offset | 顶点位置偏移(顶点动画) | 做风吹草动、水面起伏、飘动布料 |
| Pixel Depth Offset | 像素深度偏移 | 做贴合地形的贴花、软边缘过渡 |
| Displacement | 置换(需要开启 Tessellation 支持时使用) | 地形/岩石的大起伏,成本高 |
9.4 节点(Material Expressions)速查
| 分组 | 常用节点 | 用途 |
|---|---|---|
| 常量 / 参数 | Constant、Constant2/3/4Vector、ScalarParameter、VectorParameter、TextureSampleParameter2D、StaticSwitchParameter | 固定的颜色/数值;带 Parameter 前缀的可以被材质实例覆盖 |
| 纹理采样 | TextureSample、TextureObject、TextureCoordinate、Panner、Rotator、TextureSampleParameterSubUV | 贴图与 UV 动画(水流、传送带、序列帧) |
| 坐标 / 几何 | TexCoord、WorldPosition、ObjectPosition、ActorPosition、VertexNormalWS、PixelNormalWS、VertexColor、ScreenPosition、LightmapUV、ObjectRadius | 基于位置做渐变、三平面投影、顶点色的遮罩 |
| 数学运算 | Add、Subtract、Multiply、Divide、Lerp、Clamp、Saturate、OneMinus、Power、Abs、Floor、Ceil、Frac、Fmod、Min、Max、Round、Truncate、Dot、Cross、Normalize、Step、SmoothStep、If | 所有“按条件改变外观”的逻辑都在这里 |
| 颜色 / 混合 | Desaturation、HueShift、Contrast、Blend_Overlay、Blend_SoftLight、MakeFloat3、BreakOutFloat3Components | 调色、贴图混合、通道拆分 |
| 效果 / 氛围 | Fresnel、Noise、Voronoi、Sine/Cosine、Time、BumpOffset、ParallaxOcclusionMapping、DepthFade、CameraDepthFade、SceneDepth、SceneColor、Refraction | 边缘光、水面、烟雾、软相交、折射 |
| 工具 / 高级 | MaterialFunctionCall、Custom(写 HLSL)、MakeMaterialAttributes、BreakMaterialAttributes、QualitySwitch、FeatureLevelSwitch、VertexInterpolator | 封装复用、按平台降级、把数据从顶点传到像素 |
| 地形专用 | LandscapeLayerBlend、LandscapeLayerSample、LandscapeLayerCoords、LandscapeLayerWeight、LandscapeVisibilityMask | 见 9.8 地形材质 |
9.5 五套可以直接照做的材质(连法 + 为什么)
① 磨砂金属(最基础的 PBR 练习)
Constant3Vector(基色, 深灰) ──► Base Color
ScalarParameter("Roughness"=0.35) ──► Roughness
ScalarParameter("Metallic"=1.0) ──► Metallic
Noise(缩放 2,级别 2) ──► Multiply(× 0.3) ──► Add(+0.2) ──► Roughness ← 用噪波打断"完美反射"
为什么:真实金属表面永远不是均匀的。用噪波轻微扰动粗糙度,立刻从“塑料感”变成“有使用痕迹的金属”。把 Roughness / Metallic 做成 ScalarParameter,后面就能用材质实例批量出“不锈钢 / 锈铁 / 拉丝铝”三个变体。
② 发光脉冲能量条
Time ──► Multiply(× Speed 参数) ──► Sine ──► Multiply(× 0.5) ──► Add(+0.5) // 得到 0~1 的呼吸值
上面结果 ──► Multiply(× 强度参数) ──► Multiply(× VectorParameter(颜色)) ──► Emissive Color
为什么:Sine 输出 -1~1,先乘 0.5 再加 0.5 变成 0~1,才能安全地当倍率用——这是 UE 里最好用的一条“归一化”套路。做霓虹灯、护盾、血量条发光都是这一套。
③ 水面 / 冰面(半透明 + 法线动画)
TextureSample(法线贴图, 设为 Normal) ──► Panner(SpeedX=0.02, SpeedY=0.01) ──► Normal
Fresnel(Exponent=5) ──► Lerp(A=浅色, B=深色) ──► Base Color // 边缘更亮,像真实水面
ScalarParameter("Roughness"=0.05) ──► Roughness
<材质设置: Blend Mode = Translucent, Shading Model = Default Lit>
Opacity: DepthFade(FadeDistance=20) ← 让水与岸线接触处柔和淡出,避免硬边
为什么:Fresnel 在“正对镜头处为 0、掠射角处为 1”,正好对应水面越斜越亮的物理现象;Panner 让法线缓慢流动产生波光;DepthFade 解决半透明与实体相交的“硬切边”。
④ 风吹草动(顶点动画,World Position Offset)
WorldPosition ──► ComponentMask(B) ──► Multiply(× 0.5) // 用高度做相位,越高摆动越大
Time ──► Multiply(× WindSpeed) ──► Add(上面结果) ──► Sine
上面结果 ──► Multiply(× VertexNormalWS) ──► Multiply(× WindStrength) ──► World Position Offset
<若模型带顶点色: VertexColor(R) ──► Multiply 到最终强度上,用来标记"只让叶片动、根不动">
为什么:顶点动画全部发生在 World Position Offset 引脚上,不消耗 CPU(相比骨骼动画便宜得多),是做植被、旗帜、水草的标准手段。用高度或顶点色做遮罩,才能“根部不动、梢部摆得厉害”。
⑤ 边缘柔化 / 距离淡出(雾、软相交、受击反馈)
CameraDepthFade(FadeLength=200) ──► Multiply(× VectorParameter(雾色)) ──► Emissive / Base Color
DepthFade(FadeDistance=50) ──► Opacity // 半透明物体与其它物体相交处淡出
为什么:DepthFade / CameraDepthFade 读的是深度缓冲,能让“硬穿过”的体积效果(雾、烟、光柱、水)看起来有厚薄层次。这是从“贴图感”进入“电影感”的分界线。
9.6 参数化与实例:让美术不用碰节点图
| 做法 | 步骤 | 用在哪 |
|---|---|---|
| ScalarParameter / VectorParameter | 选中节点 → 细节面板勾选 Use Parameter(或右键 Convert to Parameter)→ 命名 | 粗糙度、金属度、颜色、强度 |
| TextureSampleParameter2D | 把 TextureSample 转成参数化,可在实例里一键换贴图 | 同一材质多套贴图(不同墙面、不同衣着) |
| StaticSwitchParameter | 布尔参数,切换分支;会重新编译着色器,实例间不能随意切换 | 开关某个效果(是否显示细节法线) |
| Material Instance | 内容浏览器右键材质 → Create Material Instance;勾选要覆盖的参数 | 项目里所有材质变体的标准做法 |
| Dynamic Material Instance | 蓝图:Create Dynamic Material Instance → 用 Set Scalar/Vector/Texture Parameter Value 改值 | 受击变红、开门变色、血量驱动外观 |
| Material Parameter Collection | 新建资产定义全局参数,材质里用 CollectionParameter 读取 | 全局风力、昼夜时间、受击强度等跨材质共享参数 |
9.7 材质函数与分层材质
Engine/Content/Functions 已经带了大量现成函数(Blend_Overlay、CheapContrast、BreakOutFloat2Components 等),先学会用官方函数,再学造函数。9.8 地形材质(Landscape Material):多层权重混合
地形材质和普通材质的最大区别是:它要在一整片地形上按绘制权重混合多层材质(草地、泥土、岩石、雪……)。核心节点只有几个:
地形材质的标准搭法(五步)
创建材质并勾选 Use Material Attributes
在材质细节面板里勾选 Use Material Attributes,主节点会变成一个 Material Attributes 引脚——这是分层材质的前提。
为每层做一个材质函数
官方推荐把“草地层”“岩石层”各自封装成一个材质函数(输出 Make Material Attributes:BaseColor / Roughness / Normal 等),这样主图才不至于爆炸。
在地形材质里添加 LandscapeLayerBlend
添加图层元素,名字要与后面在地形里创建的 Layer Info 完全一致(例如
Grass、Rock、Snow)。混合类型选 LB Alpha Blend 最常用;需要按高度自然过渡时用 LB Height Blend,并给每层设置 Height 输入。把结果接到 Material Attributes
LayerBlend 的输出 → Make/Break Material Attributes → 主节点。若需要“挖洞”(洞穴、地道),用 LandscapeVisibilityMask 接到 Opacity Mask,并把材质 Blend Mode 设为 Masked。
在地形模式里创建 Layer Info 并绘制
Landscape 模式 → Paint → 在 Layers 里 + 新建 Layer Info(选择 Weight-Blended Layer (normal),非权重混合层会与其它层互斥,新手容易踩坑)→ 选笔刷与权重开始刷。
9.9 后处理材质(Post Process Material)
- 创建方式:新建材质 → 细节面板把 Material Domain 改为 Post Process → 用 SceneTexture 节点读取已渲染画面 → 处理后接到 Emissive Color。
- Blendable Location:After Tonemapping(调色/暗角)、Before Tonemapping(需要 HDR 数据时)、Before Translucency(影响半透明之前)、SSR Input。选错位置会导致颜色“看起来不对”。
- 怎么生效:把后处理材质作为元素加到 Post Process Volume 的 Post Process Materials 数组里,或用蓝图/Sequencer 动态加载(受击红屏、中毒滤镜、慢动作色调)。
- 常见效果:暗角、胶片颗粒、色差、描边、像素化、黑白化、扫描线、水波扭曲。
- 性能:全屏后处理对每个像素都要跑一遍,采样次数要克制;移动端慎用全屏后处理。
✅ 检查清单
官方原文:Material Editor User Guide · Material Editor UI · Material Instances · Landscape Materials · Post Process Materials
地形与大世界:Landscape、地形材质与植被
开放世界的第一步是把“地”做出来。这一节讲 Landscape 工具、地形材质(上一节讲了节点,这里讲完整流程)与植被系统。
10.1 什么时候用地形,什么时候用网格体
用地形(Landscape)
大范围起伏地面、需要雕刻与刷多层材质、需要自动 LOD 与高效绘制。适合户外场景、开放世界、山区。
用静态网格体
室内、精确造型、需要硬边结构(走廊、房间、楼梯)。也可以用“网格体 + 建模模式”拼出地形感。
10.2 创建地形:先想清楚分辨率
| 参数 | 含义 | 新手建议 |
|---|---|---|
| Section Size | 每个地形小节的四边形数量(分辨率的基本单位) | 先用默认(63×63) |
| Sections Per Component | 每个组件包含多少小节 | 默认 1×1 或 2×2 |
| Number of Components | 组件数量(决定整体规模) | 练习用 8×8 就足够大,别一上来开 32×32 |
| Overall Resolution | 最终分辨率(上面几项相乘的结果) | 数值越大细节越多、显存与构建时间越夸张 |
| Material | 创建时就要指定地形材质 | 先做一个只有一层的基础材质,之后随时能换 |
| Location / Scale | 地形的位置与缩放 | 建议保持 Scale = 1,非均匀缩放会让绘制与碰撞出现奇怪问题 |
10.3 雕刻与绘制:Sculpt / Paint / Manage
10.4 地形材质完整流程(复习 + 落地)
准备贴图
每层至少需要:BaseColor(sRGB)、Normal(非 sRGB)、Roughness(线性灰度)。命名规范
T_Rock_BaseColor这样一眼能看出用途。做材质函数
把“一层材质”的逻辑(贴图采样 + UV 缩放参数 + 法线强度)封装成材质函数,输出 Material Attributes。
搭主地形材质
勾选 Use Material Attributes → 加 LandscapeLayerBlend → 添加层(Grass / Rock / Dirt / Snow)→ 每层接一个材质函数 → 输出到主节点。
创建 Layer Info
把材质赋给地形 → 进入 Paint 模式 → 在 Layers 里新建 Weight-Blended Layer (normal) 的 Layer Info(保存在内容浏览器里,命名与材质层名一致)。
绘制与检查
用笔刷与权重绘制多层;打开 Stats 看材质复杂度,必要时减少层数或降低贴图尺寸。
10.5 植被系统(Foliage)
| 要点 | 说明 |
|---|---|
| Foliage Type | 每种植被一个资产(静态网格体 + 密度/缩放/随机旋转/对齐法线等规则) |
| Density / Radius | 密度与半径决定“一刷一大片”的效果;配合 Reapply 可以改完参数重刷 |
| Cull Distance | 超出距离不渲染,是植被性能的第一道闸门 |
| Align to Normal | 让草顺着坡面生长(配合绘制到地形上) |
| Nanite Foliage | UE5 支持把植被也用 Nanite 渲染,从而大幅提升可承载的植被密度(需要项目开启 Nanite 并注意材质与 WPO 的兼容) |
| Foliage vs PCG | Foliage 适合“手刷一片”;需要按规则大规模生成(森林、城市)时用 PCG(见第 12 章),两者可以并存 |
| 性能开关 | 可扩展性设置里的 foliage.DensityScale 能让玩家一键降低植被密度 |
✅ 检查清单
官方原文:Landscape Overview · Editing Landscapes · Landscape Material Expressions · Foliage Mode
Niagara 特效:从系统、发射器到渲染器
Niagara 是 UE5 的视觉特效系统。它不是“播放一段动画”,而是用规则实时模拟粒子——所以风、火、烟、水花才能对场景做出反应。
👇 本节内置节点速查库:在下面输入框里敲英文节点名或中文(多关键词用空格分隔,例如 cast to、延迟、trace),立刻看到该节点的作用、输入输出与常见坑。可检索引擎全部 Niagara 模块(359 条),其中 101 条附中文讲解。
11.1 四个核心概念
| 概念 | 含义 | 类比 |
|---|---|---|
| System 系统 | 最终放进关卡的东西(NS_ 前缀资产),由一个或多个发射器组成 | 整场烟花表演 |
| Emitter 发射器 | 负责生成与更新一类粒子,自带完整堆栈与参数 | 其中一支烟花 |
| Module 模块 | 堆栈里的一段行为(重力、速度、颜色随生命周期变化…) | “向上飞”“炸开”“下落” |
| Parameter 参数 | 可被外部覆盖的数值/颜色/向量;有 System、Emitter、Particle、User 等命名空间 | 调节开关与强度 |
| Renderer 渲染器 | 决定粒子长什么样:Sprite(面片)、Mesh(网格体)、Ribbon(拖尾)、Light(发光)、Decal、Component | 火星用 Sprite、碎片用 Mesh |
| CPU / GPU 模拟 | CPU 模拟支持更多逻辑(如碰撞回调、事件),GPU 能跑几十万粒子但功能受限 | 少量精细用 CPU,海量用 GPU |
11.2 执行堆栈:特效的“时间线”
Niagara 的发射器是一摞分组(Group),每个分组里有若干模块。理解这个顺序,就理解了特效是怎么被算出来的:
| 分组 | 何时执行 | 典型模块 |
|---|---|---|
| System Spawn | 系统创建时一次 | 系统级初始化、设置 System 参数 |
| System Update | 系统每帧 | 系统级计时、按条件停止整个系统 |
| Emitter Spawn | 发射器创建时一次 | Emitter State(生命周期:Once / Infinite / Multiple)、发射器初始化 |
| Emitter Update | 发射器每帧 | Spawn Rate(持续发射速率)、Spawn Burst Instantaneous(瞬间爆发)、Emitter State 控制 |
| Particle Spawn | 每个粒子诞生时一次 | Initialize Particle(生命周期、颜色、大小)、Shape Location(从什么形状生成)、Initial Velocity、Add Velocity |
| Particle Update | 每个粒子每帧 | Gravity Force、Drag、Scale Color、Color over Life、Solve Forces and Velocity、Collision、Sub UV Animation |
| Render | 绘制阶段 | Sprite / Mesh / Ribbon / Light Renderer 及其材质 |
| Event Handler | 收到事件时 | 碰撞事件、死亡事件、生成子发射器 |
11.3 事件与事件处理器
- 事件类型:Collision(碰撞)、Death(死亡)、Location(位置事件)、Custom(自定义)。
- 事件处理器:挂在另一个发射器上,收到事件后执行模块(例如“撞击地面 → 生成一圈涟漪”)。
- 限制:GPU 模拟对事件支持有限,需要事件时往往要用 CPU 模拟或 GPU 事件支持方案。
11.4 实战:从零做一个火花特效(官方示例思路)
重命名发射器并命名系统
把默认发射器改成有意义的名字(如
Sparks),System 命名成NS_Sparks并保存到项目目录。规范命名是特效能被复用的前提。配置发射节奏
Emitter Update → Spawn Rate 设为 50(每秒 50 个);需要“一次性爆发”时改用 Spawn Burst Instantaneous。
设置生成形状与初速度
Particle Spawn → Shape Location 选 Sphere(半径 5),Initial Velocity 给一个向外的速度范围,让火花从一点炸开。
加物理感
Particle Update → Gravity Force(Z = -980 的下落)、Drag(空气阻力 0.5),让火花飞出后减速并下坠。
加视觉变化
Scale Color / Color over Life 让粒子从亮橙渐变到暗红并淡出;Scale over Life 让粒子越来越小;需要闪烁就用 Sprite Facing + 材质里的发光颜色曲线。
渲染器与材质
Sprite Renderer 指定一个 Unlit + Additive 的材质(发光效果必须用叠加混合,否则会变成白色方块)。
收尾与验证
给粒子设置合理生命周期(0.5–1.5 秒),把系统拖进关卡看实际效果,再用 Debug HUD 检查粒子数量。
11.5 在关卡与蓝图里使用特效
| 方式 | 做法 | 适用场景 |
|---|---|---|
| Niagara Component | 给 Actor 加 Niagara 组件,指定 System;可勾选 Auto Activate | 常驻特效:火炬、熔炉、角色特效挂点 |
| Spawn System at Location | 蓝图节点:在指定位置生成特效,可传参(颜色、大小、速度) | 一次性特效:命中、爆炸、拾取反馈 |
| Spawn System Attached | 把特效挂到某个组件/骨骼插槽上并跟随 | 武器拖尾、角色身上的持续特效 |
| Set Niagara Variable | 在生成前/后覆盖 User 参数,实现“同一个特效不同颜色” | 元素伤害颜色、难度系数、随机变化 |
| Deactivate / Destroy | 停止发射或立即销毁,避免特效残留 | 技能取消、角色死亡时的收尾 |
11.6 性能与调试
四条性能要点
① 给系统设置 Fixed Bounds(固定边界),否则引擎无法正确剔除; ② 能 GPU 就 GPU(海量粒子),需要逻辑/事件才用 CPU; ③ 用 Significance / Scalability 让远处或低画质下的特效自动降级; ④ 控制 Overdraw(半透明叠加层数)——大片半透明火焰比几十万粒子更致命。
调试手段
Niagara 编辑器里的 Debug HUD、Debug Draw(显示粒子边界/速度矢量)、Simulation Target(CPU/GPU 切换验证)、System Simulation Stats(粒子数量与耗时)。
在关卡里按 ` 也能用 stat Niagara 之类命令查看开销。
✅ 检查清单
官方原文:Creating Visual Effects in Niagara · Niagara Editor UI · Debugging and Optimization · Sparks Effect
PCG、MetaHuman 与常用插件
引擎的“生产力外挂”:用规则生成整个世界(PCG)、用数字人快速做出角色(MetaHuman),以及一堆值得知道的内置工具。
12.1 先学会管理插件
启用步骤:菜单 Edit → Plugins 打开插件窗口 → 在搜索框输入插件名(例如 PCG、Water、Modeling Tools)→ 勾选右侧的 Enabled → 按提示重启编辑器。很多功能“找不到”,只是插件没启用。
12.2 PCG:用规则生成世界
PCG(Procedural Content Generation Framework)是 UE5 的程序化内容生成框架。它的价值在于把“手摆一千棵树”变成“写一条规则,让引擎自己摆一千棵”。
| 节点类别 | 代表节点 | 作用 |
|---|---|---|
| 采样 / 输入 | Surface Sampler、Spline Sampler、Volume Sampler、Get Landscape、Points from Mesh | 决定“在哪里生成点” |
| 过滤 | Density Filter、Attribute Filter、Difference、Intersection、Point Filter | 决定“哪些点留下”(坡度、高度、密度、属性) |
| 变换 | Transform Points、Rotate Points、Projection、Offset | 决定“点上的对象怎么摆”(贴地、随机旋转、对齐法线) |
| 生成 | Static Mesh Spawner、Spawn Actor、Create Target Actor、Copy Points | 把点变成看得见的对象 |
| 属性 / 数学 | Attribute Selector、Attribute Math、Attribute Noise、Point Neighborhood | 用属性做逻辑(按高度变色、按密度排除) |
| 组织 | Subgraph、Graph Parameters、Loop、Branch | 把大图拆成可复用的小图 |
PCG 上手流程(官方式步骤)
新建 PCG Graph
内容浏览器右键 → PCG → PCG Graph,双击打开图表编辑器。
添加采样与生成节点
典型链路:Get Landscape / Surface Sampler → Density Filter → Transform Points → Static Mesh Spawner(在 Spawner 的 Mesh Entries 里指定要生成的树/石头)。
放进关卡
方式一:新建 PCG Volume(体积框定生成范围);方式二:给任意 Actor 添加 PCG Component,把 Graph 指过去。
点 Generate 并调参
在 PCG 组件的细节面板点 Generate;调整密度、缩放范围、随机种子,观察视口里的变化(可勾选 Debug 显示点云与边界)。
整理与复用
把“生成森林”的图做成 Subgraph 或带 Graph Parameters 的模板,之后换一张地形也能直接复用。
12.3 MetaHuman:快速获得高质量数字人
| 环节 | 做法 | 说明 |
|---|---|---|
| 获取 | 在 MetaHuman / Fab 上创建或下载 MetaHuman 资产,加入项目 | 官方提供 Creator 与示例资产,可免费用于项目 |
| 在项目里使用 | 把 MetaHuman 蓝图拖进关卡,或让它替换现有角色的骨骼网格体 | 它本质是带骨骼网格体 + 组件的高级蓝图 |
| 动画 | 用 UE5 自带动画(重定向到 MetaHuman 骨架)、或从外部库导入后重定向 | 用 IK Retargeter 把通用动画定向到 MetaHuman |
| 面部动画 | 用 MetaHuman Animator(配合 Live Link Face 等设备)从视频生成面部动画 | 做对话、影视级表情的高效方案 |
| 毛发(Groom) | MetaHuman 的头发是 Groom 资产,可做艺术化调整 | 毛发开销不小,注意 LOD 与剔除 |
| 性能 | 用 LODSync 与项目设置里的 MetaHuman 质量档控制开销 | 一个 MetaHuman 的成本明显高于普通角色,多人在场要谨慎 |
12.4 常用工具与插件一览
| 名称 | 用来做什么 | 启用情况 | 学习建议 |
|---|---|---|---|
| Modeling Mode 建模模式 | 在引擎内直接建模/改模:布尔运算、挤出、三角化、LOD、UV | 需启用 Modeling Tools | 做原型与灰盒的利器,值得早学 |
| Foliage | 手刷植被 | 内置 | 做场景必学 |
| PCG | 程序化生成植被、建筑、道具布置 | 需启用 PCG 插件 | 开放世界/大地图必学 |
| Niagara | 粒子特效 | 内置(部分模块需插件) | 游戏表现必备 |
| Chaos Destruction 破碎系统 | 可破坏物体、碎裂、场(Field)驱动 | 内置 | 做“打坏东西”的手感时再深入 |
| Water 水体系统 | 河流、湖泊、海洋、浮力与水面渲染 | 需启用 Water 插件 | 做大世界水域时启用 |
| Movie Render Queue | 离线高质量渲染(序列帧/视频),支持多通道输出 | 需启用 Movie Render Pipeline | 做宣传片、影视化输出必学 |
| Sequencer | 关卡动画与过场编排 | 内置 | 第 08 章已介绍 |
| Live Link | 把外部设备(动捕、面捕、摄像机)实时接进引擎 | 需启用 Live Link | 虚拟制片/直播方向 |
| Datasmith | 导入 CAD / DCC 工程(建筑、工业可视化) | 需启用 Datasmith 导入器 | 非游戏行业(建筑/制造)常用 |
| Common UI | 跨平台的复杂 UI 框架(手柄/键鼠/触摸导航) | 需启用 Common UI | 做主机/多平台 UI 时考虑 |
| Enhanced Input | 现代输入系统(第 07 章提到的 Input Action) | 默认启用 | 新项目都用它 |
| Gameplay Ability System(GAS) | 技能、Buff、冷却、属性数值框架 | 需启用插件 | 做 RPG/MOBA 类项目再学,门槛较高 |
| Lumen / Nanite | 全局光照与虚拟几何体(不是插件,是渲染特性) | 项目设置里开关 | 先理解代价,再决定是否开启 |
12.5 什么时候学什么(避免贪多)
| 你的目标 | 优先掌握 | 可以晚点再碰 |
|---|---|---|
| 做一个小体量玩法游戏 | 蓝图、动画蓝图与蒙太奇、材质基础、Niagara 基础、打包 | PCG、MetaHuman、GAS、水体 |
| 做开放世界/大地图 | 地形与地形材质、Foliage、PCG、LOD 与性能、Nanite/Lumen 取舍 | MetaHuman、GAS |
| 做影视/广告/虚拟制片 | Sequencer、Movie Render Queue、灯光与后处理、MetaHuman、Live Link | GAS、PCG(除非做大场景) |
| 做对话/数字人 | MetaHuman、面部动画(MetaHuman Animator)、动画重定向、音频 | PCG、Chaos |
✅ 检查清单
官方原文:Procedural Content Generation Overview · PCG Node Reference · MetaHumans in Unreal Engine · Modeling Mode · Water System · Chaos Destruction
性能优化:原理、剖析方法与实战技巧
优化不是“把画质调低”,而是先测量、再定位、后修改、必复测。这一章从帧预算原理讲到 CPU / GPU / 内存 / 加载四条战线的具体手段。
13.1 第一原则:优化 = 测量驱动的循环
新手最常见的错误是“凭感觉优化”——关掉阴影、砍掉植被、把画质调低,结果既没解决卡顿,画面还毁了。真正的流程只有四步:
13.2 原理:帧预算(Frame Budget)
所谓“流畅”,本质是每帧必须在规定时间内做完所有工作。60 FPS = 每帧 16.67 ms;30 FPS = 33.3 ms。这一帧里 CPU 与 GPU 各自有活干,谁先超支谁就是瓶颈。
stat unit 判断谁最长——这一步能省掉 80% 的无效尝试。13.3 工具全景:什么时候用哪个
| 工具 | 怎么看 | 用来回答什么问题 |
|---|---|---|
| stat fps / stat unit | 游戏内控制台命令 | 现在多少帧?瓶颈在 Game、Draw 还是 GPU? |
| stat game / stat scenerendering / stat physics / stat anim / stat particles / stat Niagara / stat AI | 控制台分类统计 | 是哪一类系统吃掉了时间 |
| Unreal Insights | 启动时加 -trace=cpu,frame,bookmark,再用 Insights 打开 .utrace | 逐帧、逐线程、逐调用栈地看时间去哪了(最强大的 CPU 分析工具) |
| Session Frontend → Profiler | 编辑器内 Window → Developer Tools → Session Frontend | 抓一段区间做统计排名(按函数、按资产) |
| GPU Visualizer | 控制台 ProfileGPU 或 Ctrl+Shift+, | GPU 各阶段耗时:Base Pass、阴影、半透明、后处理 |
| Shader Complexity / Quad Overdraw | 视口 View Mode | 材质逐像素开销与过度绘制(移动端最重要) |
| RenderDoc | 抓帧工具(独立软件) | 逐个 Draw Call 级别排查渲染问题 |
Memory Insights / LLM / stat memory | 控制台与 Insights 的 Memory 轨道 | 内存去哪了?纹理/网格体/蓝图各占多少 |
| Asset Audit / Size Map | 右键文件夹 → Asset Audit;或 Size Map 视图 | 哪些资产最占包体与内存(优化包体第一步) |
| Unreal Insights → Loading | Insights 的 Loading 轨道 | 加载慢在哪:哪个包、哪个资源、多久 |
| stat startfile / stopfile | 控制台 + Session Frontend 打开 | 录制性能数据供离线分析 |
stat unit 定位瓶颈类型 → Unreal Insights 定位到具体系统与函数 → 改完再用同一段录制的 trace 对比。没有前后对比数据的“优化”都是猜测。13.4 CPU 优化技巧
| 方向 | 具体做法 | 收益 |
|---|---|---|
| 减少每帧工作 | 关掉用不到的 Tick(Set Actor Tick Enabled / Tick Interval / bCanEverTick=false);用定时器或事件替代轮询;用 Tick Group 分散到不同帧 | ★★★★★ 最常见也最有效 |
| 蓝图 → C++ | 把每帧执行、被大量实例调用的逻辑下沉到 C++;蓝图只做内容与调参 | ★★★★ |
| 缓存引用 | 不要在 Tick 里 Cast、Get All Actors Of Class、Get Player Character——在 BeginPlay 里存成变量并判 Is Valid | ★★★★ |
| 对象数量 | 用 Instanced Static Mesh / HISM 合并同类静态物体;避免上万个独立 Actor | ★★★★ 同时救 CPU 与 Draw Call |
| 生成与销毁 | 高频生成的物体(子弹、特效、掉落物)用对象池复用,避免反复 Spawn/Destroy | ★★★ |
| 动画 | 开启 URO(Update Rate Optimization)、动画 LOD、压缩设置、减少每帧 Notify;远处角色降更新率 | ★★★★ |
| AI | Behavior Tree 的服务/任务间隔放大;降低 NavMesh 重建频率;用 Significance Manager 管理远处 AI 的更新频率 | ★★★ |
| 物理 | 关掉不必要的 Simulate Physics;用简单碰撞体(球/盒)替代复杂凸包;碰撞复杂度设 Project Default;减少子步进与破坏碎块数 | ★★★ |
| 多线程 | 异步加载(Async Load Asset)、异步射线(Async Line Trace)、Anim 多线程、Task Graph 并行 | ★★★ |
| GC 与分配 | 避免每帧创建大量 UObject;减少临时 TArray 拷贝;注意 NewObject 的频率 | ★★ |
// 典型反面例子:每帧查所有敌人
void AMyActor::Tick(float DeltaTime)
{
for (AActor* A : GetAllActorsOfClass(AEnemy::StaticClass())) // 每帧遍历全场景!
if (A->GetDistanceTo(this) < 500.f) DoSomething(A);
}
// 改进:缓存 + 定时器 + 事件驱动
void AMyActor::BeginPlay()
{
Super::BeginPlay();
CachedEnemies = /* 生成时登记 / 或用碰撞体触发收集 */;
GetWorldTimerManager().SetTimer(CheckTimer, this, &AMyActor::CheckEnemies, 0.25f, true); // 4 次/秒
}
void AMyActor::CheckEnemies() // 逻辑不变,但频率从 60 次/秒降到 4 次/秒
{
for (AActor* A : CachedEnemies) { /* ... */ }
}
13.5 GPU 优化技巧
① 降 Draw Call(合批)
合并静态网格体、用 ISM/HISM、减少材质数量与材质槽、把相似物件共用材质(实例化)、合并贴图到图集。
判断:stat scenerendering 看 Draw Calls 数量级。
② 降 Overdraw(半透明)
用视口 Quad Overdraw / Shader Complexity 查看;减少大面积半透明(雾、粒子、玻璃)、缩小粒子尺寸、用 Masked 替代 Translucent、限制粒子层数。
③ 降着色器复杂度
用 Stats 面板看材质指令数与采样数;把逐像素计算搬到顶点(Vertex Interpolator);用 QualitySwitch 做低配简化;减少纹理采样层数。
④ 阴影
限制动态阴影投射者数量、调小级联阴影距离、用虚拟阴影贴图(VSM)统一管理、远处物体关闭动态阴影或改用静态烘焙。
⑤ 光照(Lumen)
Lumen 质量档(Quality/Final Gather 等)、关闭不需要 Lumen 的场景(用静态光照 + 烘焙)、远处用低质量或关闭 GI、降低 Lumen 场景细节与卡距。
⑥ 分辨率与上采样
TSR / FSR / DLSS + Screen Percentage(如 67%)是移动与主机最有效的性能杠杆;Secondary Screen Percentage 影响半分辨率效果。
⑦ 后处理
Bloom、DOF、SSR、SSAO 都有成本;关掉用不到的效果、降低质量档、用 Post Process Volume 分区控制而不是全局全开。
⑧ 纹理与流送
控制最大尺寸(一般 ≤2048)、生成 Mip、选择正确压缩格式(DXT/BC、Alpha 用 BC7)、开启纹理流送并调池大小、能用 Virtual Texture 就用。
⑨ Nanite / 虚拟几何体
Nanite 能极大降低几何绘制成本,但对半透明、WPO 顶点动画、Masked 材质有额外开销;植被开启 Nanite 前先测。
⑩ 剔除与 LOD
距离剔除(Cull Distance Volume)、LOD、Precomputed Visibility、Occlusion Culling;远处物件用 Impostor/低模。
13.6 内存与加载优化
| 问题 | 手段 |
|---|---|
| 内存占用高 | 用 Asset Audit / Size Map 找出大资产;降低贴图尺寸与压缩格式;合并小网格体;清理未使用资产;注意蓝图类数量与重复引用 |
| 显存(VRAM)爆 | 纹理流送池大小(Texture Streaming Pool)、降低最大尺寸、关闭不必要的高分辨率贴图、注意 RVT 与 Lumen 的显存占用 |
| 进场景卡顿 | 用异步加载与软引用替代硬引用;用 Level Streaming / World Partition 分块加载;把大场景拆成子关卡 |
| 首次打开慢 | 这是 DDC(派生数据缓存)在生成,属正常;后续启动会快。发布版用 Pak 打包 + 预烘焙,不受 DDC 影响 |
| 包体过大 | 检查 Saved/Cooked 报告;移除未使用资产;压缩贴图与音频;用 Pak 分块(Chunk)按需下载;Consider 用 IoStore |
| 加载抖动 | 用加载界面、异步流送、预加载关键资源(Async Load Asset + 进度条) |
13.7 可扩展性(Scalability):一次配置,适配所有机器
- Scalability Settings:在 Project Settings → Rendering 里为 Low/Medium/High/Epic 四档配置阴影、GI、反射、后处理、植被密度等参数。
- Device Profiles:按设备(机型/平台)覆盖默认画质档,避免在低端机上跑 Epic 档。
- GameUserSettings:暴露给玩家的画质选项(分辨率、帧率上限、画质档),并用
ApplySettings保存。 - Niagara Scability / Significance:让远处特效自动降粒子数。植被也有
foliage.DensityScale这类全局缩放开关。
13.8 症状 → 排查 → 修复 对照表(实战速查)
| 症状 | 先看什么 | 常见原因 | 修复方向 |
|---|---|---|---|
整体帧率低,stat unit 里 Game 最长 | Unreal Insights 的 GameThread 轨道 | Tick 过多、蓝图每帧 Cast、遍历大数组、AI/物理开销 | 关 Tick、改定时器、缓存引用、下沉 C++(13.4) |
| Draw 最长 | stat scenerendering 看 Draw Call | 物件数量多、材质多、没有合批 | ISM/HISM 合并、共用材质、LOD/剔除(13.5①) |
| GPU 最长 | ProfileGPU / GPU Visualizer | 分辨率高、半透明多、阴影/光照成本高 | 上采样+ScreenPercentage、降 Overdraw、调 Lumen 档(13.5②⑤⑥) |
| 移动端发热掉帧 | Shader Complexity / Quad Overdraw | 材质的 Overdraw 与指令数超标 | 简化材质、Vertex Interpolator、QualitySwitch 降档 |
| 偶发卡顿(一卡一卡) | Insights 找长帧(Hitch) | GC、同步加载、Shader 编译、大对象生成 | 对象池、异步加载、预编译 PSO、分批生成 |
| 进游戏加载很久 | Insights 的 Loading 轨道 | 硬引用太多、资源太大、同步流送关卡 | 软引用+异步、Level Streaming、减小贴图(13.6) |
| 包体过大 | Cook 报告 / Size Map | 未使用资产、贴图/音频未压缩、编辑器内容被打包 | 清理资产、压缩、排除编辑器内容、Pak 分块 |
🧪 动手练习(30 分钟)
先建立基线
打开你的关卡,用
stat unit记录 Frame / Game / Draw / GPU 四个数字,截图保存。抓一份 Insights 数据
用
-trace=cpu,frame启动项目,跑动 15 秒,用 Insights 打开 trace,找出耗时最高的前 5 个函数。只改一处并复测
选一个方向(例如关掉场景里所有装饰物的 Tick),再次记录四个数字,对比差异。
用 ProfileGPU 找 GPU 大头
执行
ProfileGPU,看看是阴影、BasePass 还是半透明最贵,再决定动谁。做一次画质档对比
用
sg.ViewDistanceQuality 1之类的可扩展性命令切档,观察帧率变化——这就是最终要给玩家的选项。
✅ 检查清单
官方原文:Performance and Profiling · Unreal Insights · Scalability and Device Profiles
UE C++:把工程能力补上
蓝图能做出完整游戏,但当逻辑变复杂、性能要求变高、需要被大量复用时,C++ 才是最终答案。这一章讲清 UFUNCTION / UPROPERTY 说明符、生命周期、输入、委托、调试与常见编译坑。
14.1 先明确分工:什么时候写 C++
BlueprintReadWrite / BlueprintCallable 把能力暴露给蓝图,蓝图继承它来做具体变体。14.2 环境与工程结构
Visual Studio 准备
安装时勾选 “使用 C++ 的游戏开发”工作负载(含桌面向导 C++ 与 Unreal Engine 安装程序组件)。首次生成工程文件:右键 .uproject → Generate Visual Studio project files。
两种迭代方式
关闭编辑器编译(最稳,改头文件必须用它);Live Coding(Ctrl+Alt+F11,改 .cpp 快速热加载,改结构/头文件时可靠性下降)。
目录结构
Source/<项目名>/Public 与 Private 分开放头文件与实现;<项目名>.Build.cs 声明依赖模块;<项目名>.Target.cs 声明构建目标。
模块与 API 宏
每个模块导出符号要带 PROJECTNAME_API(引擎模块是 ENGINE_API),否则跨模块链接会报 unresolved external。
// MyGame.Build.cs —— 需要用到的模块写进依赖列表,否则 include 会报找不到
PublicDependencyModuleNames.AddRange(new string[] {
"Core", "CoreUObject", "Engine", "InputCore",
"EnhancedInput", // 增强输入
"UMG", // UI
"Niagara", // 特效
"AIModule", "GameplayTasks", "NavigationSystem" // AI
});
14.3 反射与命名:UE C++ 的“潜规则”
UE C++ 不是标准 C++:它有一套反射系统(Unreal Header Tool,UHT)在编译前扫描头文件里的宏,生成额外的胶水代码。这决定了三件事:
- 类、结构体、枚举、函数、属性要加宏(
UCLASS/USTRUCT/UENUM/UFUNCTION/UPROPERTY)才能被引擎、编辑器与蓝图识别; - 带
U前缀的对象由垃圾回收管理,用UPROPERTY()持有的引用会被 GC 视为“仍在使用”; - 命名前缀是硬约定:U=UObject 子类、A=Actor 子类、F=普通结构体、E=枚举、I=接口、T=模板。
UPROPERTY() 保存引用,否则随时可能被 GC 回收导致崩溃。14.4 UPROPERTY 说明符速查(属性暴露给编辑器与蓝图)
| 说明符 | 作用 | 典型写法 |
|---|---|---|
| EditAnywhere | 可在编辑器与实例上编辑 | UPROPERTY(EditAnywhere) |
| VisibleAnywhere | 只读显示(不能改) | 用在组件指针上最安全 |
| EditDefaultsOnly | 只能改类默认值,实例不可改 | 配置类参数 |
| EditInstanceOnly | 只能改实例,不能改默认值 | 关卡专属设置 |
| BlueprintReadWrite | 蓝图可读可写 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Stats") |
| BlueprintReadOnly | 蓝图只读(保护数据) | 血量、状态等不希望被随意改的值 |
| Category | 在细节面板里的分组名 | Category="Combat|Damage" |
| meta=(ClampMin/ClampMax/UIMin/UIMax) | 数值范围限制(编辑器侧) | meta=(ClampMin="0", ClampMax="100") |
| meta=(AllowPrivateAccess="true") | 允许私有属性在蓝图访问 | 配合 private: 使用 |
| Transient | 不序列化(运行时临时数据) | 缓存引用 |
| SaveGame | 纳入存档序列化 | 进度相关数据 |
| Replicated / ReplicatedUsing | 网络复制(可绑定回调) | 多人游戏必备 |
| Config | 从 ini 读取(可写回) | UPROPERTY(Config) 全局设置 |
14.5 UFUNCTION 说明符速查(函数暴露给蓝图与网络)
| 说明符 | 作用 | 备注 |
|---|---|---|
| BlueprintCallable | 蓝图里可调用(有执行引脚) | 最常用 |
| BlueprintPure | 纯函数(无执行引脚,可有返回值) | 取值类函数用它,蓝图会自动连线 |
| BlueprintImplementableEvent | 在 C++ 声明、由蓝图实现 | 只声明不实现(C++ 不能有函数体) |
| BlueprintNativeEvent | C++ 提供默认实现,蓝图可覆盖 | 实现函数名要加 _Implementation |
| Category | 蓝图右键菜单里的分类 | 写清分类,别人才能找到 |
| meta=(DisplayName) | 节点显示名(可与函数名不同) | 让节点更易读 |
| meta=(CompactNodeTitle) | 紧凑标题(常用于运算符类节点) | 例如 "+" |
| meta=(Keywords) | 搜索关键词 | 提高在节点搜索里的命中率 |
| meta=(WorldContext) | 指定世界上下文参数 | 库函数里常用 |
| Server / Client / NetMulticast | 网络执行位置 | 配合 Reliable / Unreliable |
| Exec | 可在控制台直接调用 | 调试命令 |
// 头文件:MyHealthComponent.h
UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class MYGAME_API UMyHealthComponent : public UActorComponent
{
GENERATED_BODY()
public:
UMyHealthComponent();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Health", meta=(ClampMin="0", ClampMax="1000"))
float MaxHealth = 100.f;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Health")
float CurrentHealth = 100.f;
UFUNCTION(BlueprintCallable, Category="Health")
void ApplyDamage(float Amount);
// C++ 想读、蓝图想响应:用 BlueprintNativeEvent 给蓝图留钩子
UFUNCTION(BlueprintNativeEvent, Category="Health")
void OnDeath();
virtual void OnDeath_Implementation();
// 委托:血量变化通知(蓝图可 Bind)
UPROPERTY(BlueprintAssignable, Category="Health")
FOnHealthChanged OnHealthChanged;
};
14.6 生命周期与常用可重写函数
| 函数 | 时机 | 用来做什么 |
|---|---|---|
| 构造函数 | 对象构建时(编辑器里也会跑) | 创建组件、设默认值;不要在这里访问世界或做游戏逻辑 |
| PostInitializeComponents() | 组件初始化完成后 | 需要访问其它组件的初始化 |
| BeginPlay() | 游戏开始/生成时一次 | 绑定事件、初始化运行时数据、添加输入映射 |
| Tick(float DeltaSeconds) | 每帧 | 高频逻辑;记得在构造函数里控制是否开启 Tick |
| EndPlay() | 销毁或结束播放 | 解绑、清理定时器、存档 |
| Destroyed() | 被销毁时 | 通知系统、掉落物品 |
| SetupPlayerInputComponent() | Pawn 被控制时 | 绑定增强输入(见 14.7) |
| GetLifetimeReplicatedProps() | 复制系统注册时 | 声明哪些属性参与网络复制 |
| OnConstruction() | 构造脚本等价物 | 在编辑器里摆放时就执行的逻辑 |
14.7 增强输入(Enhanced Input)的 C++ 写法
// MyCharacter.h
UCLASS()
class MYGAME_API AMyCharacter : public ACharacter
{
GENERATED_BODY()
public:
AMyCharacter();
protected:
virtual void BeginPlay() override;
virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
UPROPERTY(EditAnywhere, Category="Input") TObjectPtr<UInputMappingContext> DefaultContext;
UPROPERTY(EditAnywhere, Category="Input") TObjectPtr<UInputAction> MoveAction;
UPROPERTY(EditAnywhere, Category="Input") TObjectPtr<UInputAction> LookAction;
UPROPERTY(EditAnywhere, Category="Input") TObjectPtr<UInputAction> JumpAction;
void Move(const FInputActionValue& Value);
void Look(const FInputActionValue& Value);
};
// MyCharacter.cpp
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
if (APlayerController* PC = Cast<APlayerController>(GetController()))
if (auto* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer()))
Subsystem->AddMappingContext(DefaultContext, 0); // 优先级 0
}
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent* EIC = Cast<UEnhancedInputComponent>(PlayerInputComponent))
{
EIC->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
EIC->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
EIC->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
EIC->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);
}
}
14.8 委托(Delegates):C++ 侧的事件分发器
| 宏 | 可用于 | 说明 |
|---|---|---|
| DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam | 蓝图可绑定的多播委托 | 配合 UPROPERTY(BlueprintAssignable),蓝图里能 Bind Event |
| DECLARE_MULTICAST_DELEGATE | 仅 C++ 的多播委托 | 性能更好,不能暴露给蓝图 |
| DECLARE_DELEGATE_OneParam | 单播委托 | 一对一回调 |
| DECLARE_DYNAMIC_DELEGATE | 蓝图可绑定的单播委托 | 常用于异步加载回调 |
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnHealthChanged, float, NewHealth, float, Delta);
// 触发
OnHealthChanged.Broadcast(CurrentHealth, -Amount);
// C++ 侧监听
OnHealthChanged.AddDynamic(this, &AMyHUD::HandleHealthChanged);
// 蓝图侧:拖出组件 → Bind Event to OnHealthChanged
14.9 日志、断言与调试
// 1) 声明自定义日志分类(放在 .cpp 顶部或专用头文件)
DEFINE_LOG_CATEGORY_STATIC(LogMyGame, Log, All);
// 2) 三种常见用法
UE_LOG(LogMyGame, Log, TEXT("Player %s spawned at %s"), *GetName(), *GetActorLocation().ToString());
UE_LOG(LogMyGame, Warning, TEXT("Health below zero: %f"), CurrentHealth);
UE_LOG(LogMyGame, Error, TEXT("Missing component on %s"), *GetName());
// 3) 断言:check 会崩溃(用于“绝不该发生”),ensure 只报错并继续(可恢复)
check(MyComponent != nullptr);
if (!ensure(MaxHealth > 0.f)) { MaxHealth = 1.f; }
// 4) 屏幕调试(发布版自动消失)
if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Green, TEXT("Debug"));
// 5) 画线/画球(需包含 DrawDebugHelpers.h)
DrawDebugSphere(GetWorld(), GetActorLocation(), 300.f, 16, FColor::Red, false, 2.f);
Saved/Crashes 里的调用栈,配合引擎调试符号更准。14.10 网络复制要点(多人游戏,了解即可)
| 概念 | 要点 |
|---|---|
| Authority(权威) | 游戏逻辑判定放在服务端;客户端只做表现 |
| Replicated 属性 | 在 GetLifetimeReplicatedProps 里 DOREPLIFETIME 注册 |
| RPC | Server(客户端调用→服务端执行)、Client、NetMulticast;分 Reliable / Unreliable |
| 角色判断 | HasAuthority() / IsLocallyControlled() / GetLocalRole() |
| 移动同步 | CharacterMovement 自带复制;自定义移动需要自己处理预测与纠正 |
14.11 C++ 侧性能注意事项
- 不要每帧调用
GetAllActorsOfClass、GetWorld()->LineTraceMulti等重量级 API;缓存结果或用事件驱动。 - 传引用而不是值:
const FVector&、const TArray<T>&避免拷贝;返回大对象用引用或移动语义。 - FName 比较很快,但字符串转换(
FString、ToString)很慢,别放进循环。 - UPROPERTY 的指针是 GC 追踪点,也是访问间接层;高频访问的组件指针缓存成裸指针前先确认生命周期。
- 虚函数与蓝图调用(
UFunction调用)比直接 C++ 调用慢一个量级,热路径上避免每帧大量蓝图互调。 - 用
constexpr/static const替代重复计算;用Reserve()预分配数组。
14.12 常见编译错误对照表
| 报错 | 原因 | 解决 |
|---|---|---|
| Unresolved external symbol | 模块没加进 Build.cs 依赖,或缺少 API 宏 | 补 PublicDependencyModuleNames;类上加 PROJECTNAME_API |
| Cannot open include file 'xxx.h' | 模块未依赖或路径不对 | Build.cs 加模块;用公共头路径 |
| Generating code... / UHT 报错 | 宏用法不对(如 UPROPERTY 用在非 UCLASS 里) | 检查宏位置、GENERATED_BODY()、结尾分号 |
| Blueprint 里看不到新变量/函数 | 没重新编译,或缺少 BlueprintReadWrite/BlueprintCallable | 完整编译一次;补说明符 |
| Live Coding 失败 / 编辑器崩溃 | 改了头文件或类结构 | 关掉编辑器用 VS 完整编译 |
| IntelliSense 报红但能编译 | VS 索引过期 | 先编译一次,或重建数据库 |
| 链接错误刷屏 | 中间文件损坏 | 删掉 Binaries 与 Intermediate,重新生成工程文件 |
🧪 动手练习(60 分钟)
写一个自定义 ActorComponent
做
UMyHealthComponent:含MaxHealth、CurrentHealth、ApplyDamage与一个OnHealthChanged委托,并在蓝图中挂到角色上、Bind 事件显示血量。用 C++ 继承一个已有类
新建
AMyPickup继承AActor,在构造函数里创建UStaticMeshComponent与USphereComponent,重写NotifyActorBeginOverlap做拾取。把蓝图逻辑下沉
从第 07 章的“会亮的灯”里挑一段每帧逻辑,用 C++ 重写并暴露
BlueprintCallable,对比stat game的变化。做一次真实调试
在
ApplyDamage里打断点,Attach 到编辑器进程,触发伤害并单步查看变量。制造并修复一个编译错误
故意删掉 Build.cs 里的模块依赖,观察报错,再补回来——这是最常遇到的问题。
✅ 检查清单
官方原文:Programming with C++ · UPROPERTY Specifiers · UFunctions · Gameplay Architecture
附录 A5 · 节点速查库(引擎全量 17,000+ 条)
按“我想做什么”反查节点——比按字母顺序背节点表有用得多。
🔎 可搜索的完整节点库:共 17,000+ 条,覆盖蓝图节点、材质表达式与 Niagara 模块,数据来自 UE 5.8.1 引擎。支持中英文关键词、多关键词(空格分隔)、层级筛选(中文精选 / 核心 / 进阶)、类别与模块筛选;其中 554 条高频节点附中文名与常见用法讲解。进页面后自动加载,加载完成前可先用中文精选条目搜索。
蓝图:按意图查节点
| 我想…… | 用这些节点 |
|---|---|
| 对象出现时做初始化 | Event BeginPlay → Set 变量 / Spawn Actor / Play Sound |
| 每帧做点事(谨慎) | Event Tick(配合 Delta Seconds 做与帧率无关的计算) |
| 让东西慢慢变化 | Timeline、Lerp、Interp To、Set Timer by Event |
| 判断条件 | Branch、Select、Switch on Enum / Int / String |
| 遍历一堆东西 | ForEachLoop、ForEachLoopWithBreak、Array Length + Get |
| 只执行一次 / 交替执行 | Do Once、FlipFlop、Gate、MultiGate |
| 生成/销毁对象 | Spawn Actor from Class、Spawn Actor Deferred、Destroy Actor |
| 检测前方有没有东西 | Line Trace By Channel、Sphere Trace、Multi Trace(画 Debug 线确认) |
| 碰到东西时触发 | OnComponentBeginOverlap、OnHit、OnActorBeginOverlap |
| 改材质外观 | Create Dynamic Material Instance → Set Scalar/Vector/Texture Parameter Value |
| 播音效 / 特效 | Play Sound at Location、Spawn System at Location、Spawn System Attached |
| 延时 / 定时 | Delay、Retriggerable Delay、Set Timer by Function Name、Clear and Invalidate Timer |
| 跨对象通信 | Blueprint Interface 消息、Event Dispatcher(Call / Bind Event)、Cast To(谨慎) |
| 读写数据 | Get/Set 变量、Map Find/Add、Data Table 的 Get Data Table Row |
| 调试 | Print String、Draw Debug Line/Sphere、Breakpoint + Watch Value |
材质:按效果查节点
| 想要的效果 | 节点组合 |
|---|---|
| 贴图平铺多次 | TextureCoordinate × Multiply → TextureSample 的 UVs |
| 贴图流动(水/传送带) | Panner(或 Time × Add → TexCoord) |
| 两张贴图混合 | Lerp(A/B 贴图,Alpha 用遮罩或高度) |
| 颜色渐变/染色 | VectorParameter × TextureSample → Base Color |
| 边缘发光(轮廓光) | Fresnel → Multiply 发光色 → Emissive |
| 闪烁 / 呼吸 | Time → Sine →(× 0.5 + 0.5)→ Multiply 强度 |
| 磨损 / 脏旧 | Noise(或贴图)→ Multiply/Add 扰动 Roughness、Lerp 换颜色 |
| 顶点摆动(草、旗) | Time + WorldPosition → Sine → × VertexNormalWS → World Position Offset |
| 软相交 / 边缘淡出 | DepthFade(半透明)或 CameraDepthFade(距离雾) |
| 地形多层混合 | LandscapeLayerBlend + LandscapeLayerCoords + 每层材质函数 |
| 挖洞 / 消失 | LandscapeVisibilityMask 或参数 → Opacity Mask(Blend Mode 设 Masked) |
| 全屏特效(受击红屏) | Material Domain = Post Process + SceneTexture + Lerp → Emissive |
| 三平面投影(免 UV) | WorldPosition → 三个方向的 TextureSample → 用 VertexNormalWS 加权混合 |
| 调试可视化 | 把要看的量直接接到 Emissive Color(例如 UV、法线、遮罩) |
Niagara:按需求查模块
| 需求 | 模块 / 设置 |
|---|---|
| 控制发射数量 | Emitter Update → Spawn Rate(持续)/ Spawn Burst Instantaneous(爆发) |
| 控制发射器寿命 | Emitter Update → Emitter State(Once / Infinite / Multiple) |
| 从某个形状生成 | Particle Spawn → Shape Location(Sphere / Box / Cylinder / Cone / Ring) |
| 给初速度 | Particle Spawn → Add Velocity / Initial Velocity(可加 Cone 分布) |
| 重力与阻力 | Particle Update → Gravity Force、Drag、Solve Forces and Velocity |
| 颜色/大小随时间变化 | Particle Update → Color over Life、Scale Color、Scale over Life(曲线编辑) |
| 让粒子乱一点 | Curl Noise Force、Vortex Force、Random Range(在参数里用随机) |
| 碰撞 | Particle Update → Collision(CPU 精度更高;GPU 可用深度碰撞) |
| 序列帧动画 | Renderer → Sub UV Animation + 序列图材质 |
| 拖尾 / 光束 | Ribbon Renderer + Ribbon Width / 材质 |
| 发光与照明 | Light Renderer / 材质用 Unlit + Additive |
| 多个发射器联动 | Events(Death / Collision)+ Event Handler |
| 外部控制参数 | 把参数设为 User 参数 → 蓝图 Set Niagara Variable |
| 性能控制 | Fixed Bounds、Significance / Scalability、CPU↔GPU 模拟切换 |
组件速查库(引擎共 511 个)
节点是蓝图里能连的引脚,组件是挂到 Actor 上的功能模块——「让它动起来」「让它发光」都是加组件。
🧱 组件速查库:从 UE 5.8 引擎源码提取的 511 个组件,覆盖渲染、动画、物理、AI、音频、UI、XR 等;其中 50 个常用组件附中文讲解。支持按名称 / 分类 / 说明检索,可筛选分类与「是否可蓝图添加」。
最常用的 12 个组件:什么时候该加它
| 我想要…… | 加这个组件 |
|---|---|
| 让物体出现在场景里 | Static Mesh(静态网格体)/ Skeletal Mesh(会动的角色) |
| 让角色能被控制、走路跳跃 | Character Movement + Capsule(Character 类自带) |
| 做第三人称相机 | Spring Arm → 挂 Camera(弹簧臂自动避障) |
| 判定"玩家走进来了" | Box / Sphere Collision,勾选 Generate Overlap Events |
| 角色身上冒火/冒烟 | Niagara 组件,指定一个 Niagara 系统 |
| 血条 / 名字牌跟着角色 | Widget 组件(可设始终面向相机) |
| 放背景音乐 / 脚步音效 | Audio 组件(3D 空间化)/ Ambient Sound(环境音) |
| 子弹按抛物线飞 | Projectile Movement(速度 + 重力 + 反弹) |
| 风扇 / 金币一直转 | Rotating Movement(不用写 Tick) |
| 平台在两点间来回移动 | Interp To Movement,设好路点 |
| 弹孔 / 血迹 / 涂鸦 | Decal 组件(投影到表面,不改模型) |
| 敌人会看见玩家、会追 | AIPerception + Behavior Tree + Blackboard |
附录 A6 · 中英术语对照表
看英文教程、查官方文档、逛论坛,都会用到这张表。界面上的名词基本都是英文,记住它们比翻译更实用。
| 英文 | 中文 | 说明 |
|---|---|---|
| Actor | Actor / 可放置对象 | 能被放进关卡的对象的统称 |
| Component | 组件 | 挂在 Actor 上的功能模块 |
| Pawn / Character | 卒 / 角色 | 可被控制的 Actor;Character 是带移动组件的 Pawn |
| Level / Map | 关卡 / 地图 | 同一件事的两种叫法 |
| Blueprint | 蓝图 | 可视化脚本 |
| Event Graph | 事件图表 | 写逻辑的地方 |
| Construction Script | 构造脚本 | 构建时执行的图表 |
| Variable / Function / Macro | 变量 / 函数 / 宏 | 蓝图的三种基本构件 |
| Event Dispatcher | 事件分发器 | 一对多通知机制 |
| Interface | 接口 | 函数契约,用于解耦通信 |
| Cast / Casting | 类型转换 | 把对象当成具体类型来访问 |
| Skeletal Mesh | 骨骼网格体 | 可变形模型 |
| Skeleton | 骨架 | 骨骼层级资产 |
| Socket | 插槽 | 骨骼上的挂点(挂武器用) |
| Animation Sequence | 动画序列 | 一段关键帧动画 |
| Animation Blueprint (ABP) | 动画蓝图 | 驱动动画的逻辑蓝图 |
| State Machine | 状态机 | 状态与转换规则 |
| Blend Space | 混合空间 | 按轴混合多个动画 |
| Montage / Section / Slot | 蒙太奇 / 分段 / 插槽 | 一次性动作的组织方式 |
| Notify / Notify State | 通知 / 通知状态 | 动画上的触发点与区间 |
| Retargeting | 重定向 | 把动画从一个骨架搬到另一个骨架 |
| Control Rig | 控制绑定 | 程序化骨骼控制 |
| Sequencer | 关卡序列编辑器 | 过场动画与关卡动画 |
| Material / Instance / Function | 材质 / 实例 / 函数 | 材质系统三件套 |
| Material Expression | 材质表达式 | 材质图表里的“节点” |
| Shading Model | 着色模型 | Default Lit / Unlit / Subsurface… |
| Blend Mode | 混合模式 | Opaque / Masked / Translucent… |
| Base Color / Roughness / Metallic | 基础色 / 粗糙度 / 金属度 | PBR 三大输入 |
| World Position Offset | 顶点位置偏移 | 顶点动画的入口 |
| Landscape / Layer Info | 地形 / 图层信息 | 地形的多层绘制 |
| Foliage | 植被 | 手刷植被系统 |
| Niagara / Emitter / Module | 特效系统 / 发射器 / 模块 | 粒子特效三件套 |
| Renderer / Sprite / Ribbon | 渲染器 / 面片 / 拖尾 | 决定粒子外观 |
| PCG / Graph / Point | 程序化生成 / 图表 / 点 | 规则化生成世界 |
| MetaHuman / Groom | 数字人 / 毛发资产 | Epic 的数字人方案 |
| Cook / Stage / Package | 烘焙 / 整理 / 打包 | 打包流程的三个阶段 |
| Lumen / Nanite | 全局光照 / 虚拟几何体 | UE5 的两大渲染特性 |
附录 A1 · 快捷键速查表
建议收藏这一节。前两周把这张表贴在屏幕边上,第三周开始你会发现自己已经不用看了。
视口导航(最常用)
| 操作 | 效果 |
|---|---|
| 按住 RMB 拖拽 | 环视场景(第一高频操作) |
| 按住 RMB + W/A/S/D | 前后左右飞行 |
| 按住 RMB + E/Q | 世界坐标上下移动 |
| 按住 RMB + R/F | 局部坐标上 / 下(贴地飞行) |
| 按住 RMB + 滚轮 | 调整相机移动速度 |
| 按住 RMB + Z/C | 拉大 / 缩小视野 FOV |
| MMB 拖拽 或 LMB+RMB 拖拽 | 平移相机 |
| F | 聚焦到选中的物体 |
| Alt + LMB / RMB / MMB 拖拽 | 环绕 / 推拉 / 平移轨道 |
选择与变换
| 操作 | 效果 |
|---|---|
| Q / W / E / R | 选择 / 移动 / 旋转 / 缩放工具 |
| Space | 在移动 → 旋转 → 缩放间循环 |
| Ctrl 或 Shift + 点击 | 加选物体 |
| LMB 拖拽(正交视口) | 框选 |
| 按住 V 拖动 | 顶点吸附 |
| 按住 MMB 拖轴心 | 临时移动物体轴心 |
| End | 把物体吸附到下方表面(落地) |
| Delete | 删除选中物体 |
显示与编辑器
| 快捷键 | 作用 |
|---|---|
| G | 游戏模式(隐藏编辑器辅助显示) |
| Ctrl+R | 实时渲染开关 |
| F11 | 沉浸模式(视口全屏) |
| Ctrl+Space | 内容抽屉 |
| Ctrl+S / Ctrl+Shift+S | 保存 / 全部保存 |
| Ctrl+Z / Ctrl+Y | 撤销 / 重做 |
| Ctrl+C / Ctrl+V / Ctrl+D | 复制 / 粘贴 / 复制副本 |
| Alt+P / Esc | 开始试玩 / 退出试玩 |
| Ctrl+Alt+F11 | Live Coding 编译 C++ |
| Ctrl+Tab | 在打开的编辑器窗口(蓝图 / 材质 / 关卡)之间切换 |
常用控制台命令(试玩时按 ` 呼出命令行)
| 命令 | 作用 |
|---|---|
| stat fps | 在屏幕角落显示帧率 |
| stat unit | 显示帧时间,并拆分为 Game / Draw / GPU,用来判断瓶颈在 CPU 还是 GPU |
| stat game | 显示游戏逻辑耗时 |
| t.MaxFPS 60 | 把帧率限制在 60(笔记本降功耗、降风扇噪音很有用) |
| r.ScreenPercentage 70 | 以 70% 分辨率渲染再拉伸输出,用画质换性能 |
| ShowFlag.Collision 1 | 显示碰撞体(排查“为什么走过去被挡住”必备) |
附录 A2 · 四周学习计划
把这条路线拆成 4 周、每周 6–8 小时的节奏。时间可以压缩,但顺序不要跳。
| 周 | 目标 | 具体任务 | 周末产出 |
|---|---|---|---|
| 第 1 周 | 入门四步 | 装引擎(含组件选择)→ 用 First Person 建项目 → 熟悉八个面板 → 练完视口操作与全部动手练习 | 能不看教程自由飞场景、选中并修改任意物体 |
| 第 2 周 | 启动设计师路线 | 完成第 1–5 课(项目设置 / 灰盒 / 钥匙 / 开门 / HUD) | 一张能走通的灰盒关卡 + 会开门的钥匙 |
| 第 3 周 | 完成设计师路线 | 完成第 6–11 课(平台 / 陷阱 / 敌人 / 冲刺 / 结束状态 / Bonus) | 一局完整可玩的解谜冒险游戏 |
| 第 4 周 | 美术打磨 + 打包 | 做美术路线的第 1–5 课(导入 / 打光 / 材质 / 后处理),然后走一遍打包流程 | 一个能发给朋友、双击就能玩的游戏 |
| 第 5–6 周 (进阶) | 系统深挖 | 进阶篇 07 蓝图全解 → 08 动画(动画蓝图/状态机/蒙太奇)→ 按目标选学 09 材质 / 10 地形 / 11 Niagara / 12 PCG·MetaHuman | 一个自己设计的角色 + 一套自制的材质 + 一个自制的特效 |
| 之后 | 补第二条路线 | 按兴趣选程序员路线(C++)或美术路线剩余课程 | 在没有教程的情况下,独立做出一个小玩法原型 |
附录 A3 · 新手最常见的问题
这些问题在官方论坛里被问了无数遍,先看这里可以省下你几个小时。
虚幻引擎是免费的吗?用它能商用吗?
引擎本身可以免费下载使用。Epic 的授权模式是:游戏产品在达到一定营收门槛之前不收取分成,超过门槛后按比例分成;具体条款请以官方最新的授权协议为准。学习、做 Demo、发布免费作品完全没有成本。
必须学 C++ 吗?只学蓝图能不能做出游戏?
不必。官方的设计师路线全程使用蓝图,可以做出完整的、可玩的游戏。蓝图的门槛低、迭代快,非常适合做玩法原型与中小型项目。C++ 的优势在大型项目里才明显:更简洁、性能更好、更容易管理复杂逻辑。稳妥的路径是:先用蓝图建立对引擎的理解,再按需要补 C++——而且两者可以混用(C++ 基类 + 蓝图子类)。
我的电脑配置不高,能学吗?
可以,但要降低预期与画质设置:项目画质预设选 Scalable,在项目设置里关闭 Lumen / Nanite(改用传统光照),视口里用 Unlit / Wireframe 视图减轻负担,学习阶段避免打开体积云、高密度植被等吃性能的内容。流程与知识点完全一样,只是画面朴素一点。
项目路径能用中文吗?
强烈建议不要。引擎、编译工具链、部分插件与打包流程对非 ASCII 路径的支持并不完美,最容易出问题的地方就是打包和 C++ 编译。请把引擎安装目录、项目目录、打包输出目录都设成纯英文路径,避免空格更保险。
该装哪个版本?新版一定更好吗?
学习阶段选最新的正式版即可(例如 5.6 / 5.8),教程适配最好。避免 Preview 预览版:插件与第三方教程往往跟不上。另外注意:项目一旦用新版本打开并保存,就无法再用旧版本打开——重要项目升级前先整体复制一份备份。
需要先学建模 / 美术吗?
不需要。引擎自带 Starter Content,官方路线也提供示例素材,美术路线会教你“素材进引擎之后怎么用”。至于用 Blender / Maya 建模,属于另一条技能线,可以在掌握引擎基本流程之后再补。反过来,会一点贴图与材质概念确实能让美术路线学得更顺。
蓝图越做越乱,节点连成蜘蛛网怎么办?
这是必经阶段,几个立刻能用的办法:① 用函数(Function)与宏把一段逻辑封装成一个节点;② 用注释框给节点分组并命名;③ 把相关变量放在同一类里,用结构体组织;④ 定期对齐与整理连线(选中节点按 Q 对齐);⑤ 逻辑复杂到一定程度时,考虑把它挪到 C++ 或拆成组件。
编辑器和打包都好慢,有什么提速办法?
把项目与引擎放到 SSD;给杀毒软件添加项目目录与 DDC 目录的排除项;把项目加入版本控制时排除 Binaries、Intermediate、Saved;不要滥用 Event Tick(每帧执行);定期清理与重建 DDC;打 Development 包而不是 Debug 包。首次打包慢是正常的,第二次会快很多(增量烘焙)。
遇到报错完全看不懂,怎么办?
按这个顺序排查:① 打开底部 Output Log,找第一条 Error(后面的往往是连锁反应);② 复制错误信息到官方论坛 / 搜索引擎搜;③ 用二分法:撤销最近一次改动,看是否恢复;④ 检查资源是否有丢失引用(内容浏览器里的“!”标记);⑤ 实在不行新建项目,把内容一点点迁移过去——比死磕一个损坏的项目快得多。
学完之后该做什么?
做一个小而完整的项目:一个房间、一个机制、一个明确的目标、一个结束画面。完成度比规模重要。然后把它打包发给别人玩,收集反馈再迭代。这一步跨过去,你就从“学引擎的人”变成了“做游戏的人”。
蓝图和 C++ 到底该怎么分工?
主流做法是“C++ 定框架,蓝图做内容”:把性能敏感、逻辑复杂、要被大量复用的系统(属性、技能、伤害、存档、AI 决策)写成 C++ 基类并暴露(UPROPERTY(EditAnywhere) / BlueprintCallable),再用蓝图子类做具体内容与调参。纯蓝图项目也完全可行,但要有“用函数/组件/注释把逻辑封装起来”的纪律。
角色怎么才能动起来?最小步骤是什么?
四步:① 导入带骨骼的角色与动画;② 用 Idle/Walk/Run 建一个 1D 混合空间;③ 新建 动画蓝图,在 Event Graph 里把角色速度写进变量,在 Anim Graph 里把变量接到混合空间,输出到 Output Pose;④ 在角色 SkeletalMeshComponent 的 Anim Class 里指定该动画蓝图。跑起来后,再用状态机加跳跃、用蒙太奇加攻击。
材质节点太多学不完,怎么办?
不要背节点表。只先掌握 8 个:Constant3Vector、ScalarParameter、VectorParameter、TextureSample、Multiply、Lerp、Fresnel、Time。用它们就能做出 80% 的常见材质。等遇到“需要按位置变化”“需要流动”“需要边缘亮”这类需求时,再按第 09 章的“按效果查节点”表反查。看 Stats 面板和控制节点数量,比多学节点更重要。
PCG、MetaHuman 需要什么版本?免费吗?
PCG 在 UE 5.2 及以后作为实验/正式功能提供,5.4+ 的成熟度明显提高(PCG Biome Core 等插件也在后续版本加入);MetaHuman 资产与 Creator 面向项目免费提供,具体条款以官方页面为准。两者都需要在 Edit → Plugins 里启用相应插件,并在项目设置中确认目标平台兼容性。
学了这么多系统,怎么避免“什么都懂一点,什么都做不出来”?
用一个小项目把它们串起来:一个房间 + 一个角色 + 一个机制 + 一个特效 + 一个 UI。每加一个系统就问自己:“它服务于这个玩法吗?”如果答案是否定的,就先不学。引擎的能力是工具库,不是待办清单。
附录 A4 · 官方资源导航
全部链接指向 Epic 官方站点,建议加入浏览器书签,遇到问题先来这里找答案。
| 资源 | 说明 | 链接 |
|---|---|---|
| Unreal Engine for New Users | 本教程的官方母页面,完整路线与三条学习路线入口 | 打开 |
| Install Unreal Engine | 安装、组件、校验、插件、卸载 | 打开 |
| Create your First Project | 项目浏览器与模板详解 | 打开 |
| Unreal Editor Interface | 编辑器界面八个区域 | 打开 |
| Viewport Controls | 视口操作与全部快捷键表 | 打开 |
| Code a First-Person Adventure Game | 程序员路线(C++,8 节) | 打开 |
| Design a Puzzle Adventure Game | 设计师路线(蓝图,11 节) | 打开 |
| Art Pass for a Puzzle Adventure Game | 美术路线(11 节) | 打开 |
| Packaging Unreal Engine Projects | 打包、烘焙、构建配置、分发 | 打开 |
| Hardware and Software Specifications | 硬件与软件要求(配置升级前先看) | 打开 |
| Set Up Visual Studio | C++ 开发环境配置 | 打开 |
| Learning Library(学习库) | 官方教程、课程、直播回放,可按难度筛选 | 打开 |
| Developer Forums(开发者论坛) | 提问、看别人踩过的坑 | 打开 |
| Fab | 官方资源市场:模型、材质、音效、插件 | 打开 |
| Your First Hour in Unreal Engine | 官方入门视频课程,适合作为本教程的补充 | 在学习库中搜索 |
📌 最后一句
这条官方路线的价值不在于“看完”,而在于每学完一节就动手做一遍。当你把打包好的游戏发给第一个朋友、看他在你做的关卡里摸索时,这份学习地图就真正走完了。接下来,做你自己的东西。