Files
2026-05-03 14:06:26 +08:00

2.4 KiB
Raw Permalink Blame History

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

  • 比较状态:

    1. 预先计算哈希值:int attackStateHash = Animator.StringToHash("Attack");

    2. Update 中比较:if (animator.GetCurrentAnimatorStateInfo(0).shortNameHash == attackStateHash)

    • shortNameHashAnimatorStateInfo 自带的、代表当前状态名的整数哈希值。
  • 设置参数:

    1. 预先计算哈希值:int speedHash = Animator.StringToHash("Speed");

    2. Update 中设置:animator.SetFloat(speedHash, moveSpeed);

    • 此方法适用于所有参数类型:SetFloat, SetBool, SetInteger, SetTrigger

四、最终结论与最佳实践

将所有在高频函数中使用的 Animator 字符串,预先转换为哈希值,这不是一个可选的“微优化”,而是编写高性能、专业级代码的标准规范。养成在 Awake() 中初始化所有动画哈希值的习惯,能显著提升程序运行效率,减少性能毛刺,并让代码更健壮、更易于维护。