Unity中如何正确切换动画?规范的动画控制类实现方法问询
专业动画控制类的规范实现方案
1. 用枚举替代硬编码字符串
先定义动画状态枚举,确保类型安全,彻底避免字符串拼写错误和运行时意外:
public enum AnimationState { Calm, Running, Jumping }
2. 封装统一的状态切换方法
在AnimClass内部维护当前状态,对外只暴露一个状态切换方法,内部自行处理不同状态对应的动画参数(bool/trigger):
public class AnimClass { private Animator _animator; private AnimationState _currentState; // 提前将动画参数名定义为常量,避免硬编码 private const string ParamIsRunning = "IsRunning"; private const string ParamIsJumping = "IsJumping"; private const string ParamCalmTrigger = "Calm"; public AnimClass(Animator animator) { _animator = animator; _currentState = AnimationState.Calm; } public void SwitchAnimationState(AnimationState newState) { if (_currentState == newState) return; // 避免重复切换无效状态 // 重置上一个状态的动画参数 ResetStateParameters(_currentState); // 应用新状态的动画参数 ApplyStateParameters(newState); _currentState = newState; } private void ResetStateParameters(AnimationState state) { switch (state) { case AnimationState.Running: _animator.SetBool(ParamIsRunning, false); break; case AnimationState.Jumping: _animator.SetBool(ParamIsJumping, false); break; // Trigger类型参数无需重置,根据动画控制器逻辑自行调整 } } private void ApplyStateParameters(AnimationState state) { switch (state) { case AnimationState.Calm: _animator.SetTrigger(ParamCalmTrigger); break; case AnimationState.Running: _animator.SetBool(ParamIsRunning, true); break; case AnimationState.Jumping: _animator.SetBool(ParamIsJumping, true); break; } } }
3. 外部调用方式
其他脚本只需传入枚举值即可完成动画切换,代码简洁且类型安全:
// 假设已获取AnimClass实例 _animClass.SwitchAnimationState(AnimationState.Running);
4. 进阶:状态模式(复杂场景)
如果每个动画状态需要绑定额外逻辑(比如播放音效、调整物理参数),可以用状态模式拆分职责:
- 定义
IAnimationState接口,包含Enter()、Exit()方法 - 为每个状态实现接口:
CalmState、RunningState、JumpingState AnimClass维护当前状态实例,调用对应方法完成状态切换
示例接口:
public interface IAnimationState { void Enter(AnimClass animator); void Exit(AnimClass animator); }
这种方式将每个状态的逻辑隔离,符合单一职责原则,后续新增动画状态只需新增类,无需修改原有AnimClass代码。
方案符合的规范原则
- 类型安全:枚举替代字符串,消除拼写错误和运行时异常
- 单一职责:
AnimClass仅负责动画状态管理,外部无需关心内部参数细节 - 开闭原则:新增状态时只需扩展枚举或状态类,无需修改原有切换逻辑
- 代码可读性:外部调用无需记忆多个方法名或字符串参数,语义清晰
内容的提问来源于stack exchange,提问作者Yraiv
相关产品推荐
相关产品推荐

