什么!?Unity的SetTrigger(string name)不能用了?

发布时间:2026/6/6 12:57:16

什么!?Unity的SetTrigger(string name)不能用了? 结论先说结论Unity 尽量避免SetTrigger(string name)而是用SetTrigger(int id)代替。// 坏代码privatestaticstringAnimatorTrggerFire_animator.SetTrigger(AnimatorTrgger);// 推荐代码privatestaticreadonlyintAnimatorTrggerAnimator.StringToHash(Fire);_animator.SetTrigger(AnimatorTrgger);原因是SetTrigger(string name)内部还会计算一次Animator.StringToHash()测试代码publicclassAnimatorTriggerPerformanceTests{privateIAssetLoader_assetLoader;// 预计算的 Hash ID对应 AnimatorController 中的 Trigger 参数名privatestaticreadonlyintAttackHashAnimator.StringToHash(Fire);privateconststringAttackStringFire;privateGameObject_testObject;privateAnimator_animator;[SetUp]publicvoidSetup(){varcontainerFakeContainerBuilderFactory.Create();_assetLoadercontainer.ResolveIAssetLoader();varprefab_assetLoader.LoadGameObject(GameUnit);_testObjectObject.Instantiate(prefab);if(!_testObject.TryGetComponentGameUnit(outvargameUnit)){Debug.LogError($[UnitSpawnManager] Prefab {prefab.name} 上未找到 GameUnit 组件);UnityEngine.Object.Destroy(_testObject);}varsprite_assetLoader.LoadSprite(KnightSprite);varanimatorController_assetLoader.LoadRuntimeAnimatorController($KnightAniCon);gameUnit.Init(animatorController,sprite);_animatorgameUnit.GetComponentAnimator();// 验证参数存在ValidateParameters();}/// summary/// 验证 AnimatorController 包含测试所需的参数/// /summaryprivatevoidValidateParameters(){if(_animatornull||_animator.runtimeAnimatorControllernull)return;varparameters_animator.parameters;boolhasAttackfalse,hasDiefalse,hasJumpfalse;foreach(varparaminparameters){if(param.nameAttackStringparam.typeAnimatorControllerParameterType.Trigger)hasAttacktrue;}if(!hasAttack)UnityEngine.Debug.LogWarning($AnimatorController 缺少 Trigger 参数:{AttackString});}[TearDown]publicvoidTearDown(){if(_testObject!null){Object.DestroyImmediate(_testObject);}}// 验证 Animator 有效性[Test]publicvoidValidate(){Assert.IsNotNull(_animator,Animator 组件不能为空);Assert.IsNotNull(_animator.runtimeAnimatorController,AnimatorController 不能为空);}[Test][Performance]publicvoidAnimator_SetTrigger_String(){// 预热_animator.SetTrigger(AttackString);_animator.ResetTrigger(AttackString);Measure.Method((){_animator.SetTrigger(AttackString);}).WarmupCount(10).MeasurementCount(1000).IterationsPerMeasurement(10).Run();}[Test][Performance]publicvoidAnimator_SetTrigger_Hash(){// 预热_animator.SetTrigger(AttackHash);_animator.ResetTrigger(AttackHash);Measure.Method((){_animator.SetTrigger(AttackHash);}).WarmupCount(10).MeasurementCount(1000).IterationsPerMeasurement(10).Run();}}测试结果Animator_SetTrigger_HashSampleCount: 1000Sum: 0.81 msAnimator_SetTrigger_StringSampleCount: 1000Sum: 1.12 ms

相关新闻