zoukankan      html  css  js  c++  java
  • 状态模式设计动画状态机

    状态基类:所有状态继承自它

    public abstract class IState
    {
        public virtual AnimState selfState { get; }
        public abstract int animHash { get; }
        public virtual void EnterState(Animator animator, PlayerController playerController)
        {
    
        }
        public virtual void ExitState(Animator animator)
        {
    
        }
        public virtual void UpdateState(Animator animator,PlayerController playerController, AnimStateMachine animStateMachine)
        {
    
        }
    }

    状态机:管理所有状态 的切换更新

    public class AnimStateMachine 
    {
        public Dictionary<AnimState, IState> stateDic = new Dictionary<AnimState, IState>();
        Animator _animator;
        IState currState;
        public AnimState GetCurrState
        {
            get { return currState.selfState; }
        }
        PlayerController controller;
        public AnimStateMachine(Animator animator,PlayerController player,AnimState initState)
        {
            _animator = animator;
            controller = player;
            stateDic.Add(AnimState.Idle,new IdleState());
            stateDic.Add(AnimState.Jump,new JumpState());
            stateDic.Add(AnimState.CombatMove,new CombatMoveState());
            stateDic.Add(AnimState.Move,new MoveState());
            currState = stateDic[initState];
        }
        public void Update()
        {
            currState.UpdateState(_animator,controller,this);
        }
        public void ChangeState(AnimState state)
        {
            if (!stateDic.TryGetValue(state,out IState st))
            {
                return;
            }
        currState.ExitState(_animator); 
        currState
    = st;
        currState.EnterState(_animator,controller);
      }
    }

    状态例子:

    /// <summary>
    /// 普通移动
    /// </summary>
    public class MoveState : IState
    {
        public override int animHash => Animator.StringToHash("ToMove");
        public int speedHash => Animator.StringToHash("Speed");
        public override AnimState selfState => AnimState.Move;
    
        public override void EnterState(Animator animator, PlayerController playerController)
        {
            animator.SetTrigger(animHash);
        }
        public override void ExitState(Animator animator)
        {
            animator.ResetTrigger(animHash);
    
        }
        public override void UpdateState(Animator animator, PlayerController playerController, AnimStateMachine animStateMachine)
        {
            if (Input.GetKeyDown(KeyCode.Tab))
            {
                playerController.UpdateCombatState();
            }
    
                playerController.Move();
            
        }
    }
    /// <summary>
    /// IDle
    /// </summary>
    public class IdleState : IState
    {
        public override int animHash => Animator.StringToHash("ToStand");
        public override AnimState selfState => AnimState.Idle;
    
        public override void EnterState(Animator animator, PlayerController playerController)
        {
            animator.SetTrigger(animHash);
        }
        public override void ExitState(Animator animator)
        {
            animator.ResetTrigger(animHash);
        }
        public override void UpdateState(Animator animator,PlayerController playerController, AnimStateMachine animStateMachine)
        {
            if (Input.GetKeyDown(KeyCode.Tab))
            {
                playerController.UpdateCombatState();
            }
            if (playerController.HasMoveAxis)
            {
                animStateMachine.ChangeState(AnimState.Move);
            }
        }
    }
  • 相关阅读:
    AJAX传输图片文件
    和内嵌的iframe进行通讯
    ts的特殊数据类型
    Angular RxJs:针对异步数据流编程工具
    Angular路由使用
    RBAC基于角色的权限管理模型
    Java中的实体类--Serializable接口、transient 关键字
    字符串问题----将整数字符串转换成整数值
    字符串问题----判断两个字符串是否互为旋转词
    字符串问题----去掉字符串中连续出现K个0的子串
  • 原文地址:https://www.cnblogs.com/DazeJiang/p/14341086.html
Copyright © 2011-2022 走看看