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

38 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 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()` 中初始化所有动画哈希值的习惯,能显著提升程序运行效率,减少性能毛刺,并让代码更健壮、更易于维护。