2.4 KiB
TryGetValue方法
“当 TryGetValue 方法因为未找到指定的 key 而返回 false 时,作为 out 参数的 value 变量,会被强制赋予其类型的默认值(default value),然后这个默认值被‘传出’到调用处的代码。”
Animator和哈希值
一、问题的根源:为什么字符串比较是坏习惯?
在 Update() 或其他每帧调用的函数中,使用 animator.GetCurrentAnimatorStateInfo(0).IsName("状态名") 或 animator.SetFloat("参数名", value) 这样的字符串方法,会带来持续的性能开销。因为字符串比较需要在内存中逐个字符进行匹配,远比整数比较慢。在高频率执行下,这些微小的消耗会累积成可观的性能瓶颈,甚至引发不必要的垃圾回收(GC)。
二、解决方案:Animator.StringToHash()
Unity 的标准解决方案是预先将字符串(状态名或参数名)转换成一个唯一的整数ID(哈希值)。这个转换操作 Animator.StringToHash("你的名字") 本身有一定开销,所以我们应该在 Awake() 或 Start() 中只执行一次,然后将得到的整数ID存储在一个 int 变量中。之后在 Update() 里,所有操作都使用这个整数ID,将昂贵的字符串比较替换为速度极快的整数比较。
三、实践方法:状态(State)与参数(Parameter)
-
比较状态:
-
预先计算哈希值:
int attackStateHash = Animator.StringToHash("Attack"); -
在
Update中比较:if (animator.GetCurrentAnimatorStateInfo(0).shortNameHash == attackStateHash)
shortNameHash是AnimatorStateInfo自带的、代表当前状态名的整数哈希值。
-
-
设置参数:
-
预先计算哈希值:
int speedHash = Animator.StringToHash("Speed"); -
在
Update中设置:animator.SetFloat(speedHash, moveSpeed);
- 此方法适用于所有参数类型:
SetFloat,SetBool,SetInteger,SetTrigger。
-
四、最终结论与最佳实践
将所有在高频函数中使用的 Animator 字符串,预先转换为哈希值,这不是一个可选的“微优化”,而是编写高性能、专业级代码的标准规范。养成在 Awake() 中初始化所有动画哈希值的习惯,能显著提升程序运行效率,减少性能毛刺,并让代码更健壮、更易于维护。