Unity 项目注意点总结 (持续更新)
Unity 中的乱码问题
Unity 项目所在电脑必须设置开启 Unicode UTF-8 提供全球语言支持
或者不要使用任何非 ASCII 字符
另外当路径过长时, 就不要使用中文了, 或者使用中文时要保证路径长度较短, 因为 Unity 的进度条在显示时, 当检测到长路径会自动切割, 中间使用 ... 代替显示, 此时可能会出现乱码, Unity 在切割时可能把中文字符切割为乱码, 为了保证项目中哪里都不会出现乱码, 尽量还是全部文件名称和路径名称都使用英文
路径和文件名中的中文编码是不可控的, 这个是操作系统决定的, 我们用户能决定的只有文件内容的编码, 因此强烈建议目录和文件名全部使用英文
编程中关于 Null 值的处理
返回值中的 null 值
返回值的最终结论为: 项目中不存在任何的 return null 语句, 同时 不允许返回引用类型, 任何方法只能返回 Task
void
bool
这几种类型, 其中 bool
是成功标志
优化措施:
- 对于值类型的返回值, 将合法的 return null 全部改为有效空白值, 比如 string.Empty, 0, -1 等
- 对于引用类型的返回值, 将合法的 return null 全部改为 out 类型参数返回, 本来的返回值改为 bool
- 任意类型的非法的 return null 全部删除, 改为输出错误日志并抛出异常
参数中的 null 值
参数的最终结论为: 使用断言进行判断, 断言的好处是正式版本中断言是不执行的, 因此只要在开发版本中进行全覆盖测试, 就可以在正式版本中杜绝参数为 null 的情况
编程中关于结构体的使用
编程时结构体内的字段必须全部都是纯粹的值类型, 如果含有引用类型, 请使用 class
- struct 中的字段禁止使用引用类型
- 当一个数据体内部的全部字段是一个不可变化的整体时, 才能使用 struct, 并且每一个 struct 都是一个独立的数据副本
编程中关于继承和接口的选择
- 当单纯需要代码复用时可使用继承, 但不允许使用 override
- 当明确存在默认行为时可使用继承以及 override
- 多态一律使用接口实现: interface
Unity 项目的中前期使用 Mono 打包, 后期使用 IL2CPP 打包
IL2CPP 打包需要安装的环境
- Visual Studio 核心编辑器
- C++ 桌面开发环境
- MSVC C++ 编译器
- Windows 10 SDK / Windows 11 SDK
Unity 中使用 foreach 遍历不会有 GC
将函数作为参数时必须使用匿名方式且必须不发生闭包
直接传递函数的情况必然会有 GC, 无论传递的函数是否为静态函数
1 | // 传递普通方法 Sum, 会有 GC |
使用匿名方式传递函数, 则根据是否闭包决定有无 GC
1 | // Sum 是闭包, 会有 GC |
Unity 的 Git 仓库必须添加 RenameLimit 限制
1 | [user] |
性能优化时, 顶点数小于 300 的网格禁止参与静态批处理
当小于 300 顶点数的网格参与静态批处理时, 即使它最终只会作为静态网格的一个 submesh 存在, 但也会导致整个静态网格的 KeepVertices 被开启, 一旦这个选项被开启, 网格的顶点信息将会被保留在 CPU 内存中, 同时因为 GPU 那边还有一份内存占用, 从而导致静态网格的内存占用翻倍。因此顶点数小于 300 的网格禁止参与静态批处理。