这套文章按“我现在想查什么”来整理。少讲概念,多放速查表、常用写法、检查清单和容易忘的坑。
快速索引
按任务查文章
分类目录
0. 使用约定
Inspector 表示 Unity 面板里拖引用或调参数。
Prefab 表示预制体,注意它不能可靠引用场景对象。
热路径 表示每帧、频繁回调、循环、大量对象执行的位置。
低频 表示初始化、打开界面、加载阶段、编辑器工具等位置。
- 代码块里的注释写用途,复制时按项目命名改掉变量名。
1. Unity 开发总速查
| 场景 |
优先方法 |
少用或慎用 |
| 固定对象引用 |
[SerializeField] private 拖 Inspector |
每次运行 GameObject.Find |
| 本对象组件 |
Awake 里 GetComponent 后缓存 |
Update 里反复 GetComponent |
| 跨对象初始化 |
Bootstrap / Manager 显式初始化 |
赌 Awake 执行顺序 |
| UI 按钮事件 |
OnEnable 绑定,OnDisable 解绑 |
每次打开都 AddListener 不清理 |
| 延迟执行 |
Coroutine / Timer / async 按场景选 |
多个协程重复启动不保存句柄 |
| 大量子弹/特效/UI Item |
对象池 |
高频 Instantiate / Destroy |
| 可配置数据 |
ScriptableObject / 表格 / Inspector |
写死在多个脚本里 |
| 性能问题 |
Profiler 先定位 |
凭感觉重构 |
| 构建后问题 |
Player.log + 目标平台复现 |
只看 Editor |
2. 写功能前先查
1 2 3 4 5 6 7
| 功能属于哪个模块? # Gameplay / UI / Resource / Audio / Tool 对象从哪里来? # 场景已有 / Prefab 生成 / 对象池 / 动态加载 引用由谁维护? # Inspector / Manager / 事件 / 父节点 / 查找 是否跨场景? # 需要 DontDestroyOnLoad 或重新初始化 是否会被禁用、销毁、回收? # 需要 OnDisable / OnDestroy 清理 配置放哪里? # Inspector / ScriptableObject / 表格 / Addressables 会不会高频执行? # 高频逻辑先考虑性能和 GC
|
3. 写代码时常查
1 2 3 4 5 6 7 8 9 10 11
| [SerializeField] private xxx # Inspector 可调,但不随便 public Awake # 缓存自己身上的组件 OnEnable / OnDisable # 事件订阅和取消订阅 Start # 依赖其它对象准备后的初始化 Update # 每帧逻辑,避免查找和分配 FixedUpdate # Rigidbody 相关物理逻辑 LateUpdate # 摄像机跟随、收尾同步 OnDestroy # 最终释放,注意其它单例可能已销毁 TryGetComponent # 获取组件时避免直接空引用 Dictionary.TryGetValue # 查 key 时避免 KeyNotFoundException CancellationToken # async 任务取消
|
4. 提交前快速检查
1 2 3 4 5 6 7 8 9
| 重新打开场景 # 看 Inspector 引用是否丢 进入 Play Mode # 看 Console 第一条错误 快速重复点击 # 看按钮、弹窗、冷却是否重复触发 快速切场景 # 看协程、async、事件是否残留 禁用再启用对象 # 看 OnEnable / OnDisable 是否成对 销毁对象 # 看旧回调是否访问 MissingReference 目标平台运行 # 移动端、WebGL、PC 表现可能不同 Profiler 简查 # GC Alloc、CPU、UI、Rendering 检查临时日志 # 清掉无用 Debug.Log
|
5. 常见问题优先定位
| 现象 |
先查 |
对应文章 |
NullReferenceException |
Inspector 引用、GetComponent 结果、初始化顺序 |
01、02、03、09 |
MissingReferenceException |
对象 Destroy 后仍被协程、事件、async 访问 |
02、06、09 |
| 按钮点一次触发多次 |
AddListener 重复绑定,关闭时没解绑 |
05、08 |
| UI 显示正常但点不到 |
EventSystem、Raycast Target、遮挡层 |
05、09 |
| 切场景后旧逻辑还在跑 |
事件未解绑、协程未停、async 未取消 |
02、06、08 |
| Editor 正常,打包异常 |
平台宏、资源路径大小写、IL2CPP 裁剪、插件平台 |
04、08、09 |
| 越运行越卡 |
对象未释放、列表增长、日志刷屏、资源未卸载 |
07、08 |
| Prefab 引用丢 |
引用了场景对象、移动资源丢 .meta |
03、04、09 |
6. 高危操作先确认
1 2 3 4 5 6 7 8
| 删除资源文件 # 确认 .meta 一起移动,不要随手删 移动脚本文件 # 类名、文件名、namespace、asmdef 都检查 改 Prefab 结构 # 确认变体和场景实例不会丢引用 改 Resources 路径 # 全局搜索字符串路径 改 Addressables Group # 检查重复打包和 release handle 改 Layer / Tag # 检查碰撞矩阵、Raycast、查找逻辑 改 Input / TimeScale # 检查 UI、暂停、倒计时、动画 改 Player Settings # 检查目标平台和插件兼容
|
7. PR / Commit 自查模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 功能: 影响场景: 新增脚本: 新增资源: 主要 Prefab: 测试平台:
已检查: - [ ] Inspector 引用不为空 - [ ] OnEnable / OnDisable 成对 - [ ] 协程、async、Timer 可停止 - [ ] 快速点击不会重复触发 - [ ] 切场景不会访问旧对象 - [ ] Profiler 无明显 GC / 卡顿 - [ ] 目标平台可运行
风险: 后续:
|
8. 相关 Unity 文章
查不确定的问题时,先用这篇定位专题,再去对应文章复制速查代码。