结论
先说结论,Unity 尽量避免SetTrigger(string name)而是用SetTrigger(int id)代替。
// 坏代码
private static string AnimatorTrgger = "Fire"
_animator.SetTrigger(AnimatorTrgger);
// 推荐代码
private static readonly int AnimatorTrgger
= Animator.StringToHash("Fire");
_animator.SetTrigger(AnimatorTrgger);
原因是,SetTrigger(string name)内部还会计算一次Animator.StringToHash()
测试代码
public class AnimatorTriggerPerformanceTests
{
private IAssetLoader _assetLoader;
// 预计算的 Hash ID(对应 AnimatorController 中的 Trigger 参数名)
private static readonly int AttackHash = Animator.StringToHash("Fire");
private const string AttackString = "Fire";
private GameObject _testObject;
private Animator _animator;
[SetUp]
public void Setup()
{
var container = FakeContainerBuilderFactory.Create();
_assetLoader = container.Resolve<IAssetLoader>();
var prefab = _assetLoader.Load<GameObject>("GameUnit");
_testObject = Object.Instantiate(prefab);
if (!_testObject.TryGetComponent<GameUnit>(out var gameUnit))
{
Debug.LogError($"[UnitSpawnManager] Prefab '{prefab.name}' 上未找到 GameUnit 组件!");
UnityEngine.Object.Destroy(_testObject);
}
var sprite = _assetLoader.Load<Sprite>("KnightSprite");
var animatorController = _assetLoader.Load<RuntimeAnimatorController>($"KnightAniCon");
gameUnit.Init(animatorController, sprite);
_animator = gameUnit.GetComponent<Animator>();
// 验证参数存在
ValidateParameters();
}
/// <summary>
/// 验证 AnimatorController 包含测试所需的参数
/// </summary>
private void ValidateParameters()
{
if (_animator == null || _animator.runtimeAnimatorController == null) return;
var parameters = _animator.parameters;
bool hasAttack = false, hasDie = false, hasJump = false;
foreach (var param in parameters)
{
if (param.name == AttackString && param.type == AnimatorControllerParameterType.Trigger) hasAttack = true;
}
if (!hasAttack) UnityEngine.Debug.LogWarning($"AnimatorController 缺少 Trigger 参数: {AttackString}");
}
[TearDown]
public void TearDown()
{
if (_testObject != null)
{
Object.DestroyImmediate(_testObject);
}
}
// 验证 Animator 有效性
[Test]
public void Validate()
{
Assert.IsNotNull(_animator, "Animator 组件不能为空");
Assert.IsNotNull(_animator.runtimeAnimatorController, "AnimatorController 不能为空");
}
[Test]
[Performance]
public void Animator_SetTrigger_String()
{
// 预热
_animator.SetTrigger(AttackString);
_animator.ResetTrigger(AttackString);
Measure.Method(() =>
{
_animator.SetTrigger(AttackString);
})
.WarmupCount(10)
.MeasurementCount(1000)
.IterationsPerMeasurement(10)
.Run();
}
[Test]
[Performance]
public void Animator_SetTrigger_Hash()
{
// 预热
_animator.SetTrigger(AttackHash);
_animator.ResetTrigger(AttackHash);
Measure.Method(() =>
{
_animator.SetTrigger(AttackHash);
})
.WarmupCount(10)
.MeasurementCount(1000)
.IterationsPerMeasurement(10)
.Run();
}
}
测试结果
Animator_SetTrigger_Hash:
SampleCount: 1000
Sum: 0.81 ms
Animator_SetTrigger_String:
SampleCount: 1000
Sum: 1.12 ms
238

被折叠的 条评论
为什么被折叠?



