/// <summary> /// Evaluates possible state transitions, and updates <see cref="CurrentState"/> approriately. /// </summary> /// <param name="context">the context object for evaluating the chnage against</param> /// <returns>the new current state</returns> public State UpdateState(State src, CharacterContext context) { State dst; src?.OnStateUpdate(context); dst = src.EvaluateTransitions(context); if (dst == null) { return(src); } else { switch (dst.GetEntryPolicy(context)) { case StateEntryPolicy.Normal: case StateEntryPolicy.Passthrough: ChangeState(src, dst, context); break; case StateEntryPolicy.Blocked: break; } return(dst); } }
public override void OnStateEnter(CharacterContext context) { base.OnStateEnter(context); if (component != null) { component.Jump(ref context.State); Debug.Log(context.State.JumpCount); } }
public override void OnStateUpdate(CharacterContext context) { var charge = context.State.Charge; if (charge == byte.MaxValue) { return; } context.State.Charge++; }
public State EvaluateTransitions(CharacterContext context) { foreach (var transition in _transitions) { var newState = transition(context); if (newState != null && newState?.Data?.EntryPolicy != StateEntryPolicy.Blocked) { return(newState); } } return(null); }
void ChangeState(State src, State dst, CharacterContext context) { if (src == dst) { return; } if (context != null) { src?.OnStateExit(context); dst?.OnStateEnter(context); } OnStateChange?.Invoke(src, dst); }
public override void OnStateExit(CharacterContext context) { context.State.Charge = 0; }
public virtual void OnStateExit(CharacterContext context) { }
public virtual void OnStateUpdate(CharacterContext context) { }
public virtual void OnStateEnter(CharacterContext context) { context.State.StateTick = 0; context.State.ResetPlayersHit(); }
public virtual StateEntryPolicy GetEntryPolicy(CharacterContext context) => StateEntryPolicy.Normal;
public virtual State Passthrough(CharacterContext context) => EvaluateTransitions(context);