### 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)` - `shortNameHash` 是 `AnimatorStateInfo` 自带的、代表当前状态名的整数哈希值。 - **设置参数:** 1. 预先计算哈希值:`int speedHash = Animator.StringToHash("Speed");` 2. 在 `Update` 中设置:`animator.SetFloat(speedHash, moveSpeed);` - 此方法适用于所有参数类型:`SetFloat`, `SetBool`, `SetInteger`, `SetTrigger`。 #### **四、最终结论与最佳实践** 将所有在**高频函数**中使用的 Animator 字符串,预先转换为哈希值,这不是一个可选的“微优化”,而是编写高性能、专业级代码的**标准规范**。养成在 `Awake()` 中初始化所有动画哈希值的习惯,能显著提升程序运行效率,减少性能毛刺,并让代码更健壮、更易于维护。