You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:53:30