Files
Obsidian_Unity/2025-07-13.md
T

38 lines
2.4 KiB
Markdown
Raw Normal View History

2026-05-03 14:06:26 +08:00
### 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()` 中初始化所有动画哈希值的习惯,能显著提升程序运行效率,减少性能毛刺,并让代码更健壮、更易于维护。