状态基类:所有状态继承自它
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); } } }