按ID寻址属性
Unity不使用字符串名称对Animator、Material和Shader属性进行内部寻址。为了加快速度,所有属性名称都经过哈希处理为属性ID。
因此,每当在Animator、Material或Shader上使用Set或Get方法时,请使用整数值方法而非字符串值方法。字符串方法只执行字符串哈希处理,然后将经过哈希处理的ID转发给整数值方法。
从字符串哈希创建的属性ID在单次运行过程中是不变的。它们最简单的用法是为每个属性名称声明一个静态只读整数变量,然后使用整数变量代替字符串。启动期间将自动进行初始化,无需其他初始化代码。
Animator.StringToHash是用于Animator属性名称的对应API,Shader.PropertyToID是用于Material和Shader属性名称的对应API。
使用非分配物理API
在Unity 5.3及更高版本中,引入了所有物理查询API的非分配版本。将RaycastAll调用替换为RaycastNonAlloc,将SphereCastAll调用替换为SphereCastNonAlloc,以此类推。对于2D应用程序,也存在所有Physics2D查询API的非分配版本。
与UnityEngine.Object子类进行Null比较
Mono和IL2CPP运行时以特定方式处理从UnityEngine.Object派生的类的实例。在实例上调用方法实际上是调用引擎代码,此过程必须执行查找和验证以便将脚本引用转换为对原生代码的引用。将此类型变量与Null进行比较的成本虽然低,但远高于与纯C#类进行比较的成本。因此,请避免在紧凑循环中或每帧运行的代码中进行此类Null比较。
矢量和四元数数学以及运算顺序
对于位于紧凑循环中的矢量和四元数运算,请记住整数数学比浮点数学更快,而浮点数学比矢量、矩阵或四元数运算更快。
内置ColorUtility
对于必须在HTML格式的颜色字符串(#RRGGBBAA)与Unity的原生Color及Color32格式之间进行转换的应用程序来说,使用来自Unify Community的脚本是很常见的做法。由于需要进行字符串操作,此脚本不但速度很慢,而且会导致大量内存分配。
从Unity 5开始,有一个内置ColorUtility API可以有效执行此类转换。应优先使用内置API。
Find和FindObjectOfType
消除所有使用GameObject.Find和Object.FindObjectOfType在生产代码中的一般最佳实践。由于这些API需要Unity迭代内存中的所有游戏对象和组件,因此随着项目规模变大,会导致性能不佳。
调试代码和[conditional]属性
UnityEngine.Debug日志API不会从非开发版本中剥离,并且如果被调用,会写入日志文件。由于大多数开发人员不打算在非开发版本中编写调试信息,因此建议将仅开发日志调用包装在自定义方法中。
通过使用[Conditional]属性来修饰这些方法,Conditional属性所使用的一个或多个定义将决定被修饰的方法是否包含在已编译的源代码中。
如果传递给Conditional属性的任何定义均未被定义,则会被修饰的方法以及对被修饰方法的所有调用都会在编译中剔除。实际效果与包裹在#if…#endif预处理器代码块中的方法以及对该方法的所有调用的处理情况相同。