战术技巧
收集 Editor 快捷键、Profiler 采样技巧、工作流效率等 Unity 专业人士的生产力心得。
学习目标
- 能说出 3 个以上能显著加速日常工作的 Unity Editor 快捷键,并解释 Playmode Tint 与 Maximize on Play 的实际作用
- 能使用 Profiler.BeginSample / EndSample 给代码打自定义标记,并在 Profiler Window 中定位它们
- 能回答:你的包体比竞品大一倍——你会先查 Texture 压缩格式、Strip Engine Code、还是 Managed Stripping Level?
原书边界:Chapter 10
Packt 第三版把本章命名为 Tactical Tips and Tricks。官方目录列出的核心范围如下;这些条目共同构成本章的一对一边界:
- Editor hotkey tips:纳入本章实验与验收,不拆到别章重复计数。
- Editor UI tips:纳入本章实验与验收,不拆到别章重复计数。
- Scripting tips:纳入本章实验与验收,不拆到别章重复计数。
- Custom Editor scripts and menu tips:纳入本章实验与验收,不拆到别章重复计数。
- External tips:纳入本章实验与验收,不拆到别章重复计数。
- Other tips:纳入本章实验与验收,不拆到别章重复计数。
把编辑器、脚本模板、自定义菜单、外部工具和团队约定变成可重复流程,减少等待、误操作与性能回退。部分快捷键和菜单已变化,但自动化、模板、验证器、版本控制和测量型工作流仍能直接迁移。 因此,本章既保留 2019/2020 语境,也明确标出迁移到现代 Unity 时哪些是稳定原理、哪些只是版本相关接口。
你的手指知道所有快捷键,就不需要菜单了
前面九章你学了诊断瓶颈、修脚本、合批、压资源、加速物理、降动态开销、优化 XR、管内存、拥抱 DOTS——每项都是扎实的性能武功。可还有一个因素贯穿所有武功的效率:你本人操作 Unity 的速度。
你有没有过这种感觉:想打开 Profiler Window 找了五秒菜单、想关掉 Scene View Gizmos 每次点鼠标慢慢切、改了代码后切回 Unity 等半天聚焦才看到结果?这些摩擦每一秒看起来微不足道,但一天几百次——加起来就是小时级的生产力损失。
这章不教新的大块头技术,而是把这十章的操作经验收个尾:Editor 热键、Profiler 采样妙招、Build 减包速查、物理/音频/UI 的「关了就省」配置。全是立刻能用、用完就快的战术技巧。
像赛车手调座椅:先把自己调顺手,再谈赛道
职业赛车手上赛道前,花半小时调座椅、后视镜、方向盘角度。不顺手就快不了。Unity Editor 也一样:Layout、快捷键、首选项就是你的驾驶舱——花半小时调好,后面几百小时都在受益。
Profiler 的采样率相当于高速摄影机的帧率:太低拍不到瞬间卡顿,太高又吃掉拍摄预算。Build Settings 里的各种勾选是出门前的背包:带多了跑不动,带少了不够用。物理/音频/UI 配置则是空调、音响和天窗——都开着当然爽,但关掉几个能省一大截油耗。
Editor 快捷键:让菜单栏从你的工作流中消失
Unity Editor 有上百个快捷键,但真正每天省力的核心快捷键不超过二十个。把它们变成肌肉记忆,菜单栏就只剩「偶尔查一下」的功能。
播放与暂停
| 操作 | 快捷键(Windows) | 快捷键(macOS) | 为什么省时间 |
|---|---|---|---|
| 进入/退出 Play Mode | Ctrl+P | ⌘P | 不用鼠标点 Play 按钮 |
| 暂停/恢复 | Ctrl+Shift+P | ⌘⇧P | 暂停后用 Frame Debugger 逐帧分析 |
| 逐帧步进 | Ctrl+Alt+P | ⌘⌥P | 暂停后步进——看每帧发生了什么 |
场景与视图
| 操作 | 快捷键 | 为什么省时间 |
|---|---|---|
| 聚焦选中物体 | F | Scene 视图瞬间飞到目标 |
| 切换 Perspective / Iso | 按住右键 + 滚轮 | 快速切观察角度 |
| 切换 Scene / Game 视图 | Ctrl+Tab 内切换 | 不松开键盘切换视图 |
| 关闭所有 Gizmos | Game 视图顶部 Gizmos 开关 | 导出截图前秒关图标 |
搜索即跳转
Ctrl+K 或 ⌘K 打开 Search(Unity 2021+),直接输文件名、菜单项或设置项——比翻层级面板快五倍。Ctrl+T(⌘T)在 Project 窗口中搜索资源;双击 Hierarchy 搜索框(或 Ctrl+6 切到 Project 面板再 Ctrl+F)也能搜。
Layout:保存你的工作区
菜单 Window → Layouts → Save Layout。把 Profiler + Game + Scene 调成你习惯的排版,存成 MyDebug。需要看 Profiler 时一键切换。同理存一套 MyCoding:Hierarchy + Inspector + Project 为主,窗口少不挤。
Profiler 采样:给代码装上「秒表」
Profiler 是诊断瓶颈的眼睛,但采样频率和标记粒度决定了你看到的是「大方向」还是「一个函数花了 0.02ms」。
三种采样模式
标准同步采样
适用:日常诊断
与 Target Frame Rate 同步。看到每帧总体 CPU/GPU 分布。
Deep Profile
适用:定位特定函数
插桩每个 C# 方法——信息爆炸但开销大,只在怀疑特定函数时开。
Better Stream
适用:长时复现
记录数十分钟数据到文件,不占 Editor 内存。抓偶发卡顿。
自定义标记:BeginSample → 代码执行 → EndSample
ProfilerMarker 静态实例免字符串分配 · 热路径首选
采样频率:拍多快才够
Unity Profiler 默认用 Target Frame Rate 的同步采样。要抓 瞬时尖峰(spike),可改用 Frame Count 模式,在 Profiler Window 顶部下拉切换。Deep Profile 模式会插桩每个方法调用——信息量巨大但开销也大,只在怀疑某个特定函数时打开。
Better Stream 模式(Unity 2022+):记录更多帧到文件,不占用 Editor 内存。适合抓「跑几十分钟才出现的奇偶卡顿」。
自定义标记:给自己的代码打标签
Unity 提供了 Profiler.BeginSample / EndSample 让你在 Profiler 里看到自己命名的分段:
// ✅ 给关键路径打自定义标记
void Update() {
Profiler.BeginSample("AI.Pathfinding");
aiSystem.FindPaths();
Profiler.EndSample();
Profiler.BeginSample("AI.DecisionMaking");
aiSystem.MakeDecisions();
Profiler.EndSample();
}这样 Profiler CPU 模块里会显示 AI.Pathfinding 和 AI.DecisionMaking 两条清晰的色条——不再是一大坨 Update 看不清谁在耗时。
// ✅ 用 ProfilerMarker 替代字符串拼接(比 BeginSample 更快)
static readonly ProfilerMarker s_AnimMarker =
new ProfilerMarker("Animation.Blending");
void LateUpdate() {
using (s_AnimMarker.Auto()) {
animationSystem.BlendPoses();
}
}Frame Debugger:逐 Draw Call 翻帧
Window → Analysis → Frame Debugger,点 Enable 后能看到当前帧的每一个 Draw Call 发生了什么:用的什么 Shader、RenderTexture 长什么样、为什么没合批。定位 SetPass 断裂和 SRP Batcher 不生效时——这是最直接的工具。
Build Settings:包体里都是谁在占空间
包体大小直接影响下载转化率和 iOS cellular 下载限制(200MB)。打开 Editor Log(Console 右上角 → Open Editor Log),搜索 Build Report 能看到每个资源类别占多少 MB。
减包速查:Texture 压缩 40-70% · Mesh 30-50% · Audio 60-80% · Strip Code 5-20MB
减包速查表
| 类别 | 操作 | 位置 | 预估节省 |
|---|---|---|---|
| 纹理 | 设压缩格式 ASTC(iOS)/ ETC2(Android);关闭 Read/Write | Texture Import → Platform Overrides | 40-70% |
| 网格 | 关闭 Read/Write;压缩 Mesh;合并通道 | Model Import → Mesh | 30-50% |
| 音频 | 设压缩格式 Vorbis;Quality 降至 70-80% | Audio Import | 60-80% |
| 代码 | Managed Stripping Level → High;启用 Strip Engine Code | Player Settings | 5-20 MB |
| 未引用资源 | 搜索 Editor Log 看哪些资源被打进包却未使用 | Editor Log | 变化大 |
低开销配置:关了就不花性能的选项
很多性能开销来自你可能没打开过的默认设置。下面逐项检查——每项都是「关掉就省,除非你明确需要」。
Physics(Physics Settings)
Project Settings → Physics:
- Auto Sync Transforms:默认关。开了会让物理系统每帧同步 Transform → 多一次全量遍历
- Reuse Collision Callbacks:默认开。关掉会导致每次碰撞都 new 回调对象,产生 GC.Alloc
- Contacts Generation:对不需要精确碰撞检测的 Trigger 设 Legacy Contacts Generation
- Default Max Angular Velocity:默认 7。不需要高速旋转的物体可降到 3-5
Audio(Audio Settings)
Project Settings → Audio:
- Disable Unity Audio:如果项目完全不用 Unity 内置音频系统(用 FMOD / Wwise 等中间件),直接关掉——省掉整个音频线程
- DSP Buffer Size:默认
Best Performance(buffer 大、延迟高)。手机和 WebGL 可保持;桌面游戏可调小 - Virtualize Effects:开启时超出 Max Real Voices 的音源用虚拟化而非硬停——避免「砰砰」爆音但不省 CPU
UI(Canvas / EventSystem)
- Raycast Target:每个 Image / Text 默认开启
RaycastTarget。非交互 UI(如纯装饰文字、背景图)全部关掉——减少 EventSystem 遍历 - Canvas Pixel Perfect:默认关。除非做像素风游戏——开启后每帧会额外做像素对齐检查
- GraphicRaycaster 的 Blocking Objects:默认
None。设为Two D或Three D后每帧会检测 2D/3D 阻挡——不挡 UI 就别设
常见误区
小结
- Editor 快捷键(Play/Pause/聚焦/搜索/Layout)让日常操作省掉 30% 鼠标时间
Profiler.BeginSample/ProfilerMarker在 CPU 模块中建立自定义分段,定位热点精度从「Update 大块」变为「具体子系统」- Build Report(Editor Log)按资源类别列出大小——Texture 压缩、Strip 引擎代码、清理 Resources 引用是减包三件套
- Physics / Audio / UI 各有一批「关了就省、不用就别开」的默认设置——RaycastTarget 是最高频的隐性浪费
练习
问题 1(实战型) 打开你的项目,用 Window → Layouts → Save Layout 存一个调试布局(Profiler + Game + Console),再存一个编码布局(Scene + Game + Project)。各用一个快捷键切换(Layout 名在 Window → Layouts 菜单里,或自定义快捷键)。
问题 2(改代码型) 在你的项目最重的 Update 方法里,用 ProfilerMarker 给三个主要子系统各打一个标记。打开 Deep Profile 跑一帧,在 Profiler CPU 模块中找到你的三个标记,截图对比它们的耗时比例。
问题 3(诊断型) 打开你的项目 Build Report(Console → 右上角菜单 → Open Editor Log,搜索 Build Report),按大小列出前 5 类资源。这 5 类里哪些能通过压缩格式或关闭 Read/Write 进一步缩小?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- Playmode Tint
Unity 首选项中可设置的颜色覆盖。Play Mode 运行期间 Editor 窗口会染上此色,用颜色警示"你正在运行时模式"——避免误改 Prefab 等运行时数据。
- Deep Profile
Profiler 的一种高精度模式,会插桩每一个 C# 方法调用(而非仅标记点)。信息极其详尽但开销巨大——仅在定位特定可疑函数时短期打开。详见 §4。
- ProfilerMarker
Profiler.BeginSample 的高性能替代。静态实例免去每帧字符串分配和拼接,适合热路径(每帧高频调用)。用
using (marker.Auto())包裹代码块自动配对。- Frame Debugger
Unity 内置逐 Draw Call 分析工具。每一帧暂停后可逐 Draw Call 步行,查看当前 RenderTexture 状态、Shader 与合批原因。定位 SRP Batcher 断裂和 SetPass 异常的首选。详见 §4。
- Build Report
Unity 构建后输出在 Editor Log 中的详细清单。逐文件列出大小与 AssetBundle 归属,帮助识别打包膨胀的元凶。Console → Open Editor Log 中搜索 "Build Report" 即可定位。
- Managed Stripping Level
Player Settings 中控制 IL2CPP/Mono 对未使用托管代码的裁剪程度。Low/Medium/High 逐级激进——High 可省数 MB 但可能误删反射用到的类(需 link.xml 白名单)。详见 §3 减包速查表。
- RaycastTarget(UI)
Canvas 下每个 Image/Text 的默认开启属性,决定该 UI 元素是否参与 EventSystem 的射线检测。非交互 UI 元素应关闭——减少 EventSystem 遍历开销。详见 §4 UI 段。
- ASTC / ETC2
移动端 GPU 硬件支持的纹理压缩格式。ASTC 是 iOS/Apple GPU 标准,ETC2 是 Android 通用兼容格式。设错压缩格式 = 纹理退化为 RGBA32,占用为正确格式的 4-8 倍。
- Platform Overrides(Texture/Mesh/Audio Import)
资源 Import Settings 中按目标平台覆盖默认值的标签页。同一纹理在 PC 上设 DXT5、Android 上设 ETC2、iOS 上设 ASTC——必须逐平台设置,只改 Default 不会生效于移动端 Build。