Unity Platform 12 State Machine === 2020.08.24 ###### tags: `platform` ## List 1. [Module Split](#MS) 2. [State](#S) 3. [State Machine](#SM) 4. [Entity](#E) ## Content ### Module Split<a id="MS"/> State is Obj's state.<br>Like react state, each state has their logic<br>State Machine controls states. ```= Entity : Work Main Logic(Monobehavior) FiniteStateMachine : control State State : State Enter & Update(logic, physics) & Exit action -> inherit |---IdleState |---MoveState Data : ScriptingObject, State attribute Data -> inherit |---D_Entity |---D_IdleState |---D_MoveState ``` ### State<a id="S"/> State is objs state logic.<br>Normally, set animation and physics & logic<br>All states have enter and exit. ```csharp= public class State { protected FiniteStateMachine stateMachine; protected Entity entity; protected float startTime; protected string animBoolName; public State(Entity entity, FiniteStateMachine stateMachine, string animBoolName) { this.entity = entity; this.stateMachine = stateMachine; this.animBoolName = animBoolName; } public virtual void Enter() { startTime = Time.time; entity.anim.SetBool(animBoolName, true); } public virtual void Exit() { entity.anim.SetBool(animBoolName, false); } public virtual void LogicUpdate() { } public virtual void PhysicsUpdate() { } } ``` ### State Machine<a id="SM"/> State Machine controls state changing. ```csharp= public class FiniteStateMachine { public State currentState { get; private set; } public void initialize(State startingState) { currentState = startingState; currentState.Enter(); //initialize } public void ChangeState(State newState) { currentState.Exit(); currentState = newState; currentState.Enter(); } } ``` ### Entity<a id="E"/> Entity is main script<br>Set real movement and action in game. ```csharp= public class Entity : MonoBehaviour { public FiniteStateMachine stateMachine; public D_Entity entityData; public Rigidbody2D rb { get; private set; } public Animator anim { get; private set; } public GameObject aliveGameObject { get; private set; } public virtual void Start() { aliveGameObject = transform.Find("Alive").gameObject; rb = aliveGameObject.GetComponent<Rigidbody2D>(); anim = aliveGameObject.GetComponent<Animator>(); stateMachine = new FiniteStateMachine(); } public virtual void Update() { stateMachine.currentState.LogicUpdate(); } public virtual void FixedUpdate() { stateMachine.currentState.PhysicsUpdate(); } public virtual void OnDrawGizmos() { } } ```