战术技巧

收集 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 ModeCtrl+P⌘P不用鼠标点 Play 按钮
暂停/恢复Ctrl+Shift+P⌘⇧P暂停后用 Frame Debugger 逐帧分析
逐帧步进Ctrl+Alt+P⌘⌥P暂停后步进——看每帧发生了什么

场景与视图

操作快捷键为什么省时间
聚焦选中物体FScene 视图瞬间飞到目标
切换 Perspective / Iso按住右键 + 滚轮快速切观察角度
切换 Scene / Game 视图Ctrl+Tab 内切换不松开键盘切换视图
关闭所有 GizmosGame 视图顶部 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

AI.PathfindingAI.DecisionMakingBeginSampleEndSampleProfilerMarker (零 GC)

ProfilerMarker 静态实例免字符串分配 · 热路径首选

Profiler 采样频率决定数据精度;自定义标记把「一大坨 Update」变成「具体子系统色条」。

采样频率:拍多快才够

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.PathfindingAI.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

1打开 Build ReportEditor LogConsole → Open Editor Log搜索 Build Report2按类别定位排序找大户纹理 · 网格 · 音频 · 代码Shaders · Assembly3逐平台压缩Platform OverridesASTC/ETC2 纹理Vorbis 音频 · Strip 代码4验证包体Build & Run同一配置 Build 对比记录每类资源前后大小

减包速查:Texture 压缩 40-70% · Mesh 30-50% · Audio 60-80% · Strip Code 5-20MB

Build Report 是减包的起点——先看谁占空间最大,再逐类设 Platform Overrides。

减包速查表

类别操作位置预估节省
纹理设压缩格式 ASTC(iOS)/ ETC2(Android);关闭 Read/WriteTexture Import → Platform Overrides40-70%
网格关闭 Read/Write;压缩 Mesh;合并通道Model Import → Mesh30-50%
音频设压缩格式 Vorbis;Quality 降至 70-80%Audio Import60-80%
代码Managed Stripping Level → High;启用 Strip Engine CodePlayer Settings5-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:默认关。除非做像素风游戏——开启后每帧会额外做像素对齐检查
  • GraphicRaycasterBlocking Objects:默认 None。设为 Two DThree 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。

资料与写作方式声明

本章以Packt《Unity Game Optimization》第3版 Chapter 10权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…