Unity 项目注意点总结 (持续更新)

Unity 中的乱码问题

Unity 项目所在电脑必须设置开启 Unicode UTF-8 提供全球语言支持 或者不要使用任何非 ASCII 字符

Unicode UTF8 提供全球语言支持

另外当路径过长时, 就不要使用中文了, 或者使用中文时要保证路径长度较短, 因为 Unity 的进度条在显示时, 当检测到长路径会自动切割, 中间使用 ... 代替显示, 此时可能会出现乱码, Unity 在切割时可能把中文字符切割为乱码, 为了保证项目中哪里都不会出现乱码, 尽量还是全部文件名称和路径名称都使用英文

路径和文件名中的中文编码是不可控的, 这个是操作系统决定的, 我们用户能决定的只有文件内容的编码, 因此强烈建议目录和文件名全部使用英文

编程中关于 Null 值的处理

返回值中的 null 值

返回值的最终结论为: 项目中不存在任何的 return null 语句, 同时 不允许返回引用类型, 任何方法只能返回 Task void bool 这几种类型, 其中 bool 是成功标志

优化措施:

  1. 对于值类型的返回值, 将合法的 return null 全部改为有效空白值, 比如 string.Empty, 0, -1 等
  2. 对于引用类型的返回值, 将合法的 return null 全部改为 out 类型参数返回, 本来的返回值改为 bool
  3. 任意类型的非法的 return null 全部删除, 改为输出错误日志并抛出异常

参数中的 null 值

参数的最终结论为: 使用断言进行判断, 断言的好处是正式版本中断言是不执行的, 因此只要在开发版本中进行全覆盖测试, 就可以在正式版本中杜绝参数为 null 的情况

编程中关于结构体的使用

编程时结构体内的字段必须全部都是纯粹的值类型, 如果含有引用类型, 请使用 class

  1. struct 中的字段禁止使用引用类型
  2. 当一个数据体内部的全部字段是一个不可变化的整体时, 才能使用 struct, 并且每一个 struct 都是一个独立的数据副本

编程中关于继承和接口的选择

  1. 当单纯需要代码复用时可使用继承, 但不允许使用 override
  2. 当明确存在默认行为时可使用继承以及 override
  3. 多态一律使用接口实现: interface

Unity 项目的中前期使用 Mono 打包, 后期使用 IL2CPP 打包

IL2CPP 打包需要安装的环境

IL2CPP打包环境

  1. Visual Studio 核心编辑器
  2. C++ 桌面开发环境
  3. MSVC C++ 编译器
  4. Windows 10 SDK / Windows 11 SDK

Unity 中使用 foreach 遍历不会有 GC

将函数作为参数时必须使用匿名方式且必须不发生闭包

直接传递函数的情况必然会有 GC, 无论传递的函数是否为静态函数

1
2
3
4
5
6
7
// 传递普通方法 Sum, 会有 GC
Launch(Sum);
private void Sum() { }

// 传递静态方法 Sum, 同样有 GC
Launch(Sum);
private static void Sum() { }

使用匿名方式传递函数, 则根据是否闭包决定有无 GC

1
2
3
4
5
6
7
8
9
10
11
12
13
// Sum 是闭包, 会有 GC
Launch(() => Sum());
private void Sum()
{
sum++;
}

// Sum 不是闭包, 无 GC
Launch(() => Sum());
private static void Sum()
{
sum++;
}

Unity 的 Git 仓库必须添加 RenameLimit 限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[user]
name = Kuroha
email = KurohaKirito@gmail.com
[diff]
renameLimit=1
renames=false
[merge]
renameLimit=1
renames=false
directoryRenames=conflict
[status]
renameLimit=1
renames=false
[http]
proxy = http://127.0.0.1:20122
[https]
proxy = https://127.0.0.1:20122

性能优化时, 顶点数小于 300 的网格禁止参与静态批处理

当小于 300 顶点数的网格参与静态批处理时, 即使它最终只会作为静态网格的一个 submesh 存在, 但也会导致整个静态网格的 KeepVertices 被开启, 一旦这个选项被开启, 网格的顶点信息将会被保留在 CPU 内存中, 同时因为 GPU 那边还有一份内存占用, 从而导致静态网格的内存占用翻倍。因此顶点数小于 300 的网格禁止参与静态批处理。