第一次打开 Unreal 编辑器的人,表情都差不多:视口、内容浏览器、细节、世界大纲、输出日志……二十来个面板同时亮着,每个都像在说"我很重要"。有人当场关掉软件,有人乱点三天依然心虚。这套界面没有一寸摆设——每个面板都在给引擎的某个子系统打工。本章发你一张工位分布图:装好引擎、建对工程、看懂目录、跑起第一帧。读完这章,十秒钟就能说出每个面板在为什么打工;再看这个界面,你看到的是一台机器的器官。面板只是表象。
本章地图
mindmap
root((第1章 开局))
UE凭什么统治3A
渲染上限有人扛
工具链全家桶
源码全量可读
安装决策
启动器版: 快
源码版: 打服务器才需要
磁盘与编译的账
uproject解剖
七个目录的脾气
版本库边界
编辑器五视图
补课: 客户端三层
面板为谁打工
第一帧
启动序列七棒接力
16.6ms帧预算
两条示例线
回响峡谷: 单机竖切
远港Online: MMO原型UE 统治 3A,靠的是替你扛下三件事。画质是这三件事的结果
先把结论放这:本书的目标——画面对标《最后生还者》、在线对标《魔兽世界》——只有一个不费劲的选项,Unreal。只有它把三件最贵的事打包扛走了——每个维度都最好从来不是入选理由。
行业现状一句话:主机与 PC 的高预算项目里,UE 是商用引擎里的绝对多数派。Epic 自家的 Fortnite 之外,《黑神话:悟空》《最终幻想 VII 重制》系列(UE4)、《地狱之刃 II》《铁拳 8》都在这份名单上;国内转型单机大作的工作室,近几年也几乎清一色押注 UE5。高画质管线自研的成本摆在那里,跟风这个标签贴错了——这笔账下面就算。
扛走的第一件事是渲染上限。Nanite 让你直接往场景里扔扫描级模型,Lumen 给你实时全局光照,Virtual Shadow Map 管阴影。这套管线开箱即用,《黑神话:悟空》和《地狱之刃 II》的画面就是拿它推出来的——你不用先养一个十人的图形组。
第二件事是工业化工具链。过场(Sequencer)、动画(状态机到 Motion Matching)、特效(Niagara)、声音(MetaSounds)、大世界(World Partition)全部内置,而且彼此咬合:Sequencer 里能直接调 Niagara,动画系统能读 Niagara 的节拍。本书卷二几乎每章对应其中一件。自己攒这套东西,以年计。
第三件事是源码全量可读。引擎层出致命 bug 时,你能直接进 Engine/Source 查真凶,而不是在论坛里等官方回复。项目做到后期,这一条值多少钱,踩过坑的人都懂。
还有一个容易被低估的理由:蓝图 + C++ 的双层语言。策划在蓝图里调手感、拼逻辑,程序在 C++ 里定骨骼、守性能,两种角色踩着同一份资产协议协作。这套分工不是银弹——第 4 章会专门谈它的边界和失控现场——但它让"非程序也能做游戏"从口号变成了流水线。而且 Epic 一直拿 Fortnite 当试验场,引擎的新功能先在自家产品里跑上一年半载再放出,你踩的是被踩过一遍的路。
代价也摆上台面:C++ 门槛、编译等待、包体体重(最小 Windows 打包也在数百 MB 量级)、编辑器在大工程里吃掉十几 GB 内存不眨眼。选 UE 就是选一个重型伙伴,它替你扛事,也要求你按它的规矩生活。
横向看另外两条路:
| 维度 | Unreal Engine 5.8 | Unity 6 | 自研引擎 |
|---|---|---|---|
| 画质上限 | Nanite/Lumen 开箱即用 | HDRP 需大量定制,仍差半代 | 取决于图形组规模 |
| 源码 | 全量可读可改 | 付费可读、不可改 | 你的 |
| 主力语言 | C++ + 蓝图 | C# | 不定 |
| 典型项目 | 黑神话、Hellblade II、Fortnite | 手游与独立游戏为主 | RE Engine、Decima、RAGE |
| 授权 | 总收入超 100 万美元部分收 5% 版税 | 订阅席位制 | 无(人力是天价) |
| 代价 | 编译慢、包体大、C++ 门槛 | 高画质管线要自己造 | 千万美元级工具链投入 |
quadrantChart
title "引擎取舍地图:横轴上手成本,纵轴画质上限"
x-axis "上手成本低" --> "上手成本高"
y-axis "画质上限低" --> "画质上限高"
quadrant-1 "重型但上限高"
quadrant-2 "大厂特权区"
quadrant-3 "轻量工具区"
quadrant-4 "费力不讨好"
"Godot 4": [0.18, 0.30]
"Cocos": [0.15, 0.18]
"Unity 6": [0.32, 0.48]
"Unreal 5.8": [0.62, 0.85]
"自研引擎": [0.92, 0.90]两个补充判断。Unity 在移动端和独立游戏依然顺手,但 2023 年那场按安装量收费的风波(随后撤回)让很多团队重新掂量了"引擎公司的信任成本"——这笔账不在技术里,在合同里。自研引擎能出顶级画面,卡普空和游骑兵已经证明了,但那是拿十几年、几百人的工具链团队换的。一个五十人的项目组,养不起一个编辑器组。
对本书卷三还有一条专属理由:UE 的网络复制系统(Replication)是引擎原生内置的,属性同步、RPC、相关性裁剪开箱即用。Unity 要靠 Mirror、Netcode for GameObjects 这类方案补齐,自研引擎则从 socket 写起。"从单机手感练到 MMO 架构"的同构路径,目前只有 UE 给得出来。
诚实的反面清单也给一份,免得选错战场:纯 2D 像素独立游戏,Godot 或 Unity 更轻快;微信小游戏与 H5 场景,UE 的包体和 WebGL 支持都不合适;十人以下、美术要求不高的手游,UE 的编译成本和包体是实打实的负担。引擎没有高下,只有匹配——这本书的目标是 3A 质感加 MMO 架构,所以是 UE。
所以这本书的路很窄也很清楚:卷一卷二用 UE 的渲染与工具链追《最后生还者》的质感,卷三用它的网络层与源码可达性搭《魔兽世界》的骨架。现在去把它装上。
启动器版还是源码版:先想清楚要不要打服务器
安装只有两条路,选错的代价要到几百小时后才显形。先给账,再给决策。
| 启动器版 | 源码版 | |
|---|---|---|
| 获取方式 | Epic Games Launcher 一键安装 | GitHub 关联 Epic 账号后 clone |
| 磁盘占用 | 本体约 60 GB;加平台支持与调试符号破 100 GB | 工作区 200 GB 起(含编译中间物) |
| 编译 | 零编译,装完即用 | 首次全量编译:16 核约 40 分钟到 1 小时,8 核一个半小时起步 |
| 能干什么 | 开发游戏、打包客户端 | 改引擎、读实现、构建 Dedicated Server |
| 维护成本 | 跟着启动器升级 | 升级要自己合并,插件可能要重编 |
flowchart TD
A[今天要开始学 UE] --> B{需要改引擎源码吗?
平台适配/引擎组/查底层bug}
B -->|是, 少数团队| D[源码版]
B -->|否, 绝大多数读者| C{近期要构建
Dedicated Server 吗?}
C -->|不做| E[启动器版 5.8
勾选调试符号]
C -->|卷三第24章要做| F{磁盘≥300GB
且愿意等编译?}
F -->|是| G[现在拉源码版
一劳永逸]
F -->|否| H[先用启动器版
第24章前再拉源码]
D --> I[GenerateProjectFiles
编译 Development Editor]
G --> I
E --> J[继续本章]
H --> J
I --> J分水岭其实只有一个功能:Dedicated Server 的构建 target 只随源码构建的引擎提供,启动器版不带这套编译环境(官方文档:Unreal Engine → Networking → Setting Up Dedicated Servers,细节以该词条为准)。本书第 24 章要部署真正的服务器进程,到那时源码版是硬门槛。
所以我的建议很直接:今天装启动器版 5.8,勾上 Editor symbols for debugging。 调试符号不勾,崩溃调用栈里全是内存地址,排查全靠猜;磁盘实在紧张可以不勾,代价记在心里。磁盘分区留 200 GB 富余——引擎本身要这么多?不,是 DerivedDataCache(派生数据缓存)会随项目悄悄长大,一个中型项目吃掉三五十 GB 是常态。
源码版现在拉还是以后拉?机器有 32 GB 内存、16 核 CPU、300 GB 空闲,可以现在拉,一劳永逸,而且读源码本身就是本书推荐的进阶动作。配置不够就安心等,第 24 章之前拉都来得及——那时你对引擎目录已经熟了,编译报错也不慌。
IDE 顺带定掉:Windows 用 Visual Studio 2022,工作负荷选"使用 C++ 的游戏开发";Rider for Unreal Engine 是付费但顺手的备选。两者在 5.8 的官方文档 IDE 配置词条里都有对应步骤,以文档为准。
启动器安装时还有几个选项值得当场决定。目标平台按需要勾:只做 Windows 端就一个都不勾,最省空间;要出 iOS 包,Xcode 生态的账以后另算。模板与学习内容包占十几个 GB,初学建议勾上,本书的部分示例会从里面拆零件。引擎支持多版本共存,一台机器装 5.6、5.7、5.8 互不干扰,.uproject 靠 EngineAssociation 各找各的引擎——所以磁盘规划要按"未来同时存在两三个版本"来估。
源码版的完整流程也先记在这,第 24 章前用不上:GitHub 账号与 Epic 账号关联拿到仓库权限,clone 后依次跑 Setup 脚本(拉取几十 GB 的依赖二进制)、GenerateProjectFiles 脚本(生成 UE5.sln),再以 Development Editor 配置编译,产物就是你自己编出来的 UnrealEditor。全程不用记命令,脚本把活干完了,你付出的是磁盘与时间。
版本纪律提前立好:项目一旦开工,引擎版本就冻结。 追着新版本升级是项目后期的奢侈品,每次升级都意味着插件兼容、渲染差异、资产重存的全面回归。本书以 5.8 为准写作;你在更新的版本上读到出入时,以官方文档对应词条为准。
两个边角问题一次答掉:本书全程以 Windows 为主力平台,Mac 与 Linux 的路径与工具链差异以官方文档对应词条为准;启动器里每个引擎版本的下拉菜单都有 Verify 选项,引擎文件莫名损坏时先验证再重装,通常能省半小时下载。
.uproject 里到底有什么:一半是你的,一半是可再生的
双击一个 .uproject,启动的其实是"引擎 + 项目目录"的组合体。先把工程的全貌铺开看,再逐个目录说脾气。
{
"FileVersion": 3,
"EngineAssociation": "5.8",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "EchoCanyon",
"Type": "Runtime",
"LoadingPhase": "Default"
}
]
}这个 JSON 是工程的入口。三个字段值得记住:EngineAssociation 决定用哪个引擎打开它——启动器版是版本号字符串,源码版是一串 GUID,团队协作时这个字段不一致会直接打不开;Modules 声明了 Source/ 下的 C++ 模块,纯蓝图工程可以没有这一段;LoadingPhase 控制模块在启动序列的哪一棒加载,绝大多数情况留在 Default。
项目目录与引擎目录的剖面如下:
逐条给判断。Content/ 是命根子,里面的 .uasset 是二进制资产,Git 必须配 LFS,不然仓库一个月就胖到拉不动。Config/ 是账本,引擎设置、输入映射、默认地图全在这里以 ini 分层覆盖——引擎默认值在最底层,项目 DefaultEngine.ini 盖在上面,打包平台再有平台层。Intermediate/ 里躺着 UHT 生成的反射代码(.generated.h 的真身),删掉等于让引擎重新生成一次,完全可再生。
ini 的分层值得多说两句,后期所有配置冲突都长在这里。引擎的 Base 层(Engine/Config/Base*.ini)给出全局默认值,项目 Config/Default*.ini 覆盖它,具体平台(Windows、Linux)的平台层再压上去,引擎版本更新时底层可能变,你的覆盖不变。在编辑器 Project Settings 里每改一项,写盘的都是项目层。所以排查"设置为什么没生效"时,先问自己看的那个值是不是被更高一层盖掉了——第 7 章调渲染 CVar 时这个思路会反复用到。
"可删"不是免费的:删掉 Intermediate 和 DDC 后首次打开工程,引擎要重建几千个 shader、重新推导全部资产的派生数据,中型项目泡一杯茶到一顿饭不等。所以删之前问自己是在清缓存还是在腾时间。但敢删、知道删了会怎样,才算真正看懂了工程结构——很多"打不开的工程"其实就是缓存坏了,删掉 Intermediate 立刻复活。
Config 里的 ini 长这样,看一眼分层的样子:
[/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Game/Maps/L_EchoCanyon_Intro.L_EchoCanyon_Intro
EditorStartupMap=/Game/Maps/L_EchoCanyon_Intro.L_EchoCanyon_Intro
[/Script/WindowsTargetPlatform.WindowsTargetSettings]
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12Content/ 内部也要立宪法,不然三个月后找资产全凭运气。回响峡谷的约定:Maps/ 放关卡、Characters/ 放角色、Materials/ 放材质与材质函数,VFX/、Audio/、UI/ 各居其位,第三方资产一律进 External/ 隔离。名字即路径,路径即约定——这条规矩到第 23 章组织 500 个 GAS 技能时会救你一命。
另一个新手必踩的坑是重定向器(Redirector)。在文件管理器里直接移动 .uasset,引擎会留下一个同名"指路牌"资产维持旧引用;指路牌攒多了,引用链变成鬼打墙,打包时还会多出幽灵依赖。移动资产永远在内容浏览器里做,做完跑一次 Fix Up Redirectors 收尾。
最后定版本库边界。进库的只有四样:.uproject、Config/、Content/、Source/。其余全部排除,.gitignore 最小集如下:
Binaries/
Intermediate/
Saved/
DerivedDataCache/
*.VC.db
.vs/同事拉到仓库后,右键 .uproject 选 Generate project files,再双击打开,引擎会把排除掉的目录全部重建。迁移、备份、发给别人,都按这个边界走,永远不会把几个 GB 的垃圾推上服务器。
Source/ 里还住着两个容易被忽略的文件:Editor 目标与 Game 目标的 Target.cs,分别决定"编辑器里跑"和"打包给玩家"两套编译产物。第 24 章会在这里添加第三个——Server 目标,那就是"打服务器必须源码版"在工程里的具体落点。先记住这个位置,卷三会回来。
编辑器五视图:每个面板都在给一个子系统打工
补课:本节补"游戏客户端由什么组成"。写过游戏客户端的可以跳过;纯应用开发出身,花两分钟建立这个模型,后面 27 章都靠它。
一个游戏客户端拆到底只有三层。渲染层负责把世界变成像素,是烧钱大户;逻辑层负责规则与状态,每帧问一遍"现在该发生什么";资源层负责资产的存取,管磁盘上的包和内存里的对象。
拿你熟的软件类比:Photoshop 的画布与显示驱动是渲染层,动作脚本与滤镜流水线是逻辑层,图库和文件管理是资源层。UE 里这三层各有正主——渲染层是 Renderer(RHI 之上),逻辑层是 UWorld 与 Actor 的 Tick,资源层是资产注册表(Asset Registry)加包管理。
三层的边界不是铁板一块,几个判例帮你校准:动画的状态切换算逻辑层,最终姿态求值送进渲染层;物理模拟算逻辑层,碎片的可视化表现归渲染层;UI 横跨两边——数据归逻辑,绘制归渲染。遇到新系统先问"它每帧的账记在谁头上",归属自然清楚,性能问题该找谁也就清楚了。
编辑器默认布局的五个面板,就是这三层加一条日志线的五扇窗:
| 面板 | 给谁打工 | 什么时候盯它 |
|---|---|---|
| Level Viewport 关卡视口 | 渲染层:显示 Renderer 眼中的世界 | 摆场景、看光影、跑 PIE |
| Content Browser 内容浏览器 | 资源层:Asset Registry 的前台 | 找资产、迁移、查引用 |
| Details 细节面板 | 逻辑层的公示栏:反射系统自动生成的 UI | 调任何对象的任何参数 |
| World Outliner 世界大纲 | 逻辑层:当前 UWorld 里 Actor 的名册 | 找场景里的东西、打组 |
| Output Log 输出日志 | 全部子系统的喊话记录 | 出错第一时间看它 |
classDiagram
class LevelViewport
note for LevelViewport "渲染层的橱窗"
class WorldOutliner
note for WorldOutliner "Actor 名册"
class DetailsPanel
note for DetailsPanel "反射的自动 UI"
class ContentBrowser
note for ContentBrowser "资产的前台"
class OutputLog
note for OutputLog "日志的尾巴"
class Renderer
note for Renderer "渲染层正主"
class UWorld
note for UWorld "逻辑层正主"
class AssetRegistry
note for AssetRegistry "资源层正主"
class Reflection
note for Reflection "UPROPERTY 元数据"
class LogSystem
LevelViewport --> Renderer : 订阅画面
Renderer --> UWorld : 取场景代理
WorldOutliner --> UWorld : 列出 Actor
DetailsPanel --> Reflection : 读属性元数据
ContentBrowser --> AssetRegistry : 查询与加载
OutputLog --> LogSystem : 订阅视口和细节面板也有肌肉记忆的部分。Viewport 里 Ctrl+数字键存相机书签,之后按对应数字键跳回,检查大场景省一半往返;按住右键飞行时滚轮调速,别用默认速度爬峡谷。细节面板顶部的搜索框按属性名过滤,属性再多也不用滚轮寻宝;常用属性右键收进 Favorites,把每天要调的那几个钉在最上面。布局本身也能折腾:所有面板可拖拽重排,Window 菜单能再开三个视口,四视角校正是摆场景的标配;笔记本上建议在编辑器偏好里关掉"视口实时预览",风扇会感谢你。
四条使用经验,都是踩坑换来的。其一,Output Log 是排查问题的第一现场:资产加载失败、蓝图编译错误、插件没启用,全在里面按类别和级别(Warning/Error)过滤,学会用顶部的过滤器比学会任何功能都优先。其二,场景里找不到的东西问 Outliner 而不是在视口里乱转——大纲支持按名称搜索、按文件夹打组,十万 Actor 的关卡也找得到。其三,Content Browser 里右键资产的 Reference Viewer 能画出引用关系网,删除任何资产前先看谁引用它,能避开八成的"删完场景黑了"事故。其四,跨工程搬资产只用 Migrate:它顺着引用链把依赖一起打包带走;直接拷 .uasset 文件,搬来的只是一堆断引用的尸体。
面板位置记不住没关系,都可以拖拽重排,也能从 Window 菜单找回。记住的是它们背后的主子:渲染器、UWorld、反射、资产注册表、日志。后面每一章深入一个子系统时,你都会回到这五扇窗的某一扇来看它。这套五视图布局从 UE4 沿用到 5.8 几乎没变,肌肉记忆可以放心长期投资——把编辑器当工位,别当迷宫,这是新手期的第一道分水岭。
从模板到第一帧:双击之后,引擎替你跑了七棒接力
建工程别选 Blank。选 Third Person 模板,工程名 EchoCanyon——回响峡谷需要的主角骨骼、跟随相机、输入映射,模板里八成已经就位,剩下两成是第 5 章要重写的东西。Blank 模板的定位是插件和库。
其余模板顺带认个脸:First Person 适合射击原型,Top Down 适合俯视角策略,Vehicle 给载具 demo。它们共享同一副骨架,差别只在默认 Pawn 与相机的预设——"模板即预置 GameMode"这个结构,第 3 章会拆开讲。
点下创建之后,到你看见那个灰色小人站在地板上,引擎替你跑完了一整段接力:
flowchart TD
A[双击 .uproject] --> B{EngineAssociation
对应的引擎在吗?}
B -->|不在| C[弹窗选版本
或提示重新关联]
B -->|在| D[UnrealEditor.exe 启动]
D --> E[加载 Core / CoreUObject
注册反射数据]
E --> F[按依赖顺序加载
引擎插件与项目插件]
F --> G[读 Config 分层 ini
创建 GameEngine]
G --> H[初始化 RHI
创建渲染设备]
H --> I[资产注册表扫描
Content 与插件目录]
I --> J[反序列化 GameDefaultMap]
J --> K[GameInstance 启动
World BeginPlay]
K --> L[第一帧提交 GPU
画面出现]用伪代码把这段接力写成程序,它就是引擎的主循环骨架(真身在 Engine/Source/Runtime/Launch,延伸阅读有路径):
# 引擎引导序列(伪代码,对应 LaunchEngineLoop 的精简版)
def engine_main(uproject_path):
config = load_ini_layers(uproject_path) # 引擎默认 → 项目 → 平台
load_modules(["Core", "CoreUObject"]) # 对象系统的地基
register_reflection_data() # UHT 生成代码在此注册
for plugin in config.enabled_plugins: # 引擎插件先于项目插件
load_plugin(plugin)
rhi = create_render_device(config.rhi) # DX12/Vulkan 创建设备
asset_registry.scan(["Content", "Plugins"]) # 资源层建索引
engine = GameEngine(config.game_instance) # 逻辑层总开关
world = engine.load_map(config.default_map) # 反序列化默认关卡
world.begin_play() # 所有 Actor 开始 Tick
while not quit_requested:
engine.tick() # 逻辑层跑一帧
rhi.render(world.scene) # 渲染层画一帧 → 画面出现看懂这十二行,就看懂了本书后半部的一半名词:反射注册是第 2 章,插件加载是第 4 章,资产注册表贯穿始终,load_map 的反序列化会在第 16 章变成流送,while 循环里的 tick 与 render 就是下一节的帧时间。
这段接力跑多快,取决于 DDC 是否在位:缓存全命中时日常启动以秒计;缓存被清后第一次打开,shader 编译与资产推导会把它拖到几十分钟——启动器的进度条停在"Compiling shaders",原因只有一个:正在重建缓存。进度条没卡死。理解了启动序列,就不会再把重建当成崩溃。
第一帧出来之后,马上面对一个要管 28 章的数字:16.6ms。60fps 意味着每帧预算 1000/60 毫秒,而这笔预算的算法和新手直觉相反:
三条流水线是并行跑的:Game 线程算逻辑时,GPU 在画命令,Draw 线程在翻译提交。帧时间由最慢的一段决定,三段相加是错的。 Game 9ms 加 GPU 13ms 不等于 22ms,正确结果是 13ms。拿加和算预算是新手优化报告里最常见的错。但反过来,任何一段冲过 16.6ms,整条管线按它对齐,掉帧没有商量。
不同帧率目标对应不同预算,账先摆在这:
| 目标帧率 | 帧预算 | 适用场景 |
|---|---|---|
| 30 fps | 33.3 ms | 主机画质档、过场演出 |
| 60 fps | 16.6 ms | 回响峡谷的目标,动作游戏主流 |
| 120 fps | 8.3 ms | 竞技与 VR,MMO 主城不敢想 |
回响峡谷全程按 60 fps 立预算;远港 Online 的主城同屏人数多,Game 线程会被 Actor 数量拖长,到第 24 章你会重新算这笔账。
gantt
title 一帧 16.6ms 的预算分配(60fps,数值为常见量级示例)
dateFormat x
axisFormat %L ms
section Game 线程(CPU)
输入采样与分发 :a1, 0, 1000
游戏逻辑 Tick :a2, after a1, 4000
动画与物理 :a3, after a2, 2000
渲染命令提交 :a4, after a3, 2000
section GPU(与 CPU 并行)
几何与 Nanite :b1, 0, 4000
Lumen 光照与阴影 :b2, after b1, 4000
后处理与合成输出 :b3, after b2, 4000上图 Game 线程花 9ms,GPU 花 12ms,帧时间取 max 得 12ms,留 4.6ms 余量给系统与合成。主机项目的习惯是 GPU 只发到 11-13ms 的"工资",余量防突发——预算制度第 18 章会细讲。
现在验收第一帧:点 PIE(播放),WASD 跑两步,Esc 退出。按 ~ 键打开控制台,输入 stat unit,屏幕上出现四个数字:Frame、Game、Draw、GPU——公式里的三段加总时长都在这。60Hz 屏幕上四个值都该低于 16.6;哪一个红了,就是哪一段超支。这条命令从现在起会出现在你每一次的优化现场。
工程建好后的前三个动作,按顺序做。一,把模板默认关卡另存为 Maps/L_EchoCanyon_Intro——关卡进 Maps/ 目录、L_ 前缀,从第一天就按宪法来。二,进 PIE 跑三十秒,把 WASD、跳跃、鼠标视角全部试一遍,确认模板这具身体是活的。三,把 GameDefaultMap 与 EditorStartupMap 都指向新关卡(编辑器的 Project Settings → Maps & Modes 里改,落盘就是上一节那两行 ini)。做完这三步,你拥有的不再是"模板工程",而是回响峡谷的第一块地。
两个使用姿势同步养成。PIE(Play In Editor)跑在编辑器进程里,改完秒进,调手感用它;Standalone 是独立进程,内存与加载行为接近打包后的真机,测性能与稳定性用它。混用会得出假数据——编辑器进程本身背着十几个 GB 的开销。
启动失败的三类常见死因也备在这:EngineAssociation 指向没安装的版本(右键 .uproject 切换引擎版本可解);引用了未启用或缺失的插件(Output Log 里会点名);缓存损坏(删 Intermediate 重开,上一节的老朋友)。九成的"工程打不开"逃不出这三条,按顺序查。
本书两条示例线怎么用:一条练手感,一条练架构
这本书不是讲一遍引擎功能就完事。28 章里所有技术都落在两个真实项目上,先把它们的终局画面立起来,你才知道每章在往哪儿添砖。
示例 A「回响峡谷」,第三人称单机竖切,对标《最后生还者》的场景氛围。 第 9 章结束时,你能玩到一个灰盒:主角在峡谷小镇的白模街道上跑跳、翻越矮墙,躲开一只循声而动的感染者。第 18 章结束时,它长这样——雨夜的峡谷小镇,Lumen 的软光从破窗斜切进来,手电光柱里飘着体积雾,地面水洼反射着霓虹残骸;主角八向移动加 Motion Matching,脚踩积水溅起分层的音效;开场 90 秒 Sequencer 把世界观交代完;RTX 4080 级显卡上 4K/60 达标。一个能放进作品集的电影感片段。
示例 B「远港 Online」,MMO 原型,对标《魔兽世界》的大地图与多职业成长。 第 28 章结束时,它长这样——海港主城广场上 50 名玩家同图跑动,战士、游侠、祭司三职业的技能栏与 Buff 图标齐备;坐船出海,航程过半无缝换 Zone,地图格子在后台流送;背包、邮件、拍卖行的数据全部落库,玩家间交易有事务保护;服务端是 1 网关 + 3 Zone + 缓存与数据库分层,300 名测试玩家被分线系统摊到 3 条线;CI 流水线把每次提交打成服务器镜像,灰度先放一条线试跑。一个架构上站得住的 MMO 最小可行世界。
timeline
title 两条示例线在 28 章中的行进路线
卷一 地基 : ch01 工程骨架与第一帧
: ch02-ch08 对象系统/框架/输入/渲染/材质
: ch09 回响峡谷竖切可玩
卷二 表现 : ch10-ch15 光照/动画/特效/声音/镜头
: ch16 大世界流送(为远港埋下伏笔)
: ch17-ch18 PCG 与优化,4K60 达标
卷三 联机 : ch19-ch23 UI/网络/复制/GAS
: ch24 专用服务器(源码版引擎登场)
: ch25-ch28 MMO架构/持久化/数值/上线| 回响峡谷(示例 A) | 远港 Online(示例 B) | |
|---|---|---|
| 对标 | 《最后生还者》的场景氛围 | 《魔兽世界》的大世界多职业 |
| 形态 | 第三人称单机竖切 | 第三人称 MMO 原型 |
| 练什么 | 手感、画质、演出 | 网络、架构、数值 |
| 主场章节 | ch01–ch18 | ch16 伏笔,ch19–ch28 主场 |
| 验收画面 | 雨夜小镇 4K/60 | 50 人同图主城与跨区航行 |
两条线的资产策略也先说清:本书不教建模,美术资产来自三个地方——模板与学习内容包自带、Quixel 扫描库与 MetaHuman 这类 Epic 生态资产、Fab 商城(Unreal Marketplace 的后继)。任何第三方资产进工程,一律遵守 External/ 隔离约定,命名与来源可追溯。读者的分工也可以不同:程序读完全书;策划把各章"补课"小节和第 5、9、22、27 章当主线;美术出身从卷二入手,回头再补卷一。
顺带交代全书每章固定构件的用法。本章地图是给跳读者的索引,十秒定位要读的小节;上手任务每个都带验收标准,做完才算读完这章;延伸阅读只列真实存在的文档词条、源码路径与分享,官方文档一律写词条路径而不写 URL——链接会过期,词条不会。遇到本书与编辑器实际行为不一致的地方,以 5.8 官方文档对应词条为准,并欢迎把出入记进你的工程笔记,那是属于你自己的第 29 章。
路线建议:目标只做单机,可以读完卷二就下车;卷三默认你带着卷一卷二的全部地基入场,并且从第 24 章起需要源码版引擎。两条线共享同一套引擎世界观,资产互不依赖,思想处处互通——回响峡谷里练熟的帧预算纪律,到了远港就是服务器 tick 预算纪律。
小结
选引擎选的是谁替你扛渲染与工具链——UE 的代价是体重与 C++ 门槛,不是能力。启动器版与源码版也不是初级高级之分,是要不要打服务器、改引擎之分,卷三之前,启动器版完全够。工程目录一半是可再生缓存:敢删 Intermediate 与 DDC、说得出删了的代价,才算看懂了 .uproject。五个面板背后各有一个正主——渲染器、UWorld、反射系统、资产注册表、日志系统——后面 27 章的操作都发生在这五扇窗里。16.6ms 是三条流水线的 max,不是加和;帧预算从第一天起当工资发,每个系统只能花自己那份。
上手任务
- 装好引擎,建对工程。 安装 UE 5.8 启动器版并勾选调试符号,用 Third Person 模板创建工程 EchoCanyon。验收:PIE 中 WASD 跑动、鼠标转视角;~ 控制台输入 stat unit,60Hz 屏幕上 Frame 值低于 16.6ms。
- 亲手删一次缓存。 关闭编辑器,删除项目的 Intermediate/ 与 DerivedDataCache/,重新打开工程。验收:工程正常打开;记录首次打开耗时,写一句话说明缓存平时替你省掉了什么。
- 把工程关进 Git。 按本章的 .gitignore 完成首次提交。验收:仓库里搜不到 Intermediate/Saved/Binaries 的任何文件;换一个目录 clone 下来,Generate project files 后能正常打开。
- 改一次默认地图。 另存一张测试地图,在 DefaultEngine.ini 中把 GameDefaultMap 指向它。验收:双击 .uproject 直接进入测试地图;改回原值再验证一次,理解 ini 分层覆盖。
下一章
模板里那个会跑会跳的角色,拆到底是几十个 UObject 拼起来的:每个对象都有身份证,都被引擎记账,死了有人收尸。这套对象系统是 UE 一切宏与"魔法"的地基,也是新手崩溃日志里出镜率最高的地方。下一章把它拆到骨头:反射、GC、序列化,以及三兄弟智能指针的边界。
延伸阅读
- 官方文档:Unreal Engine → Get Started → Installing Unreal Engine(含目标平台与调试符号选项)
- 官方文档:Unreal Engine → Get Started → Unreal Engine Directory Structure(目录结构的权威清单,以词条为准)
- 官方文档:Unreal Engine → Unreal Editor Interface(编辑器面板完整名录)
- 源码:Engine/Source/Runtime/Launch/Private/LaunchEngineLoop.cpp(本章引导序列的真身,主循环的 GuardedLoop 值得通读)
- 官方文档:Unreal Engine → Networking → Setting Up Dedicated Servers("打服务器需要源码版"的权威出处,第 24 章前回看)