Unity Platform 13 State Machine Update === 2020.08.25 ###### tags: `platform` ## List 1. [Data](#D) 2. [Check Surroundings](#CS) 3. [State Inheritance](#SI) ## Content ### Data<a id="D"/> Wall and ledge check are also needed in any objs.<br>It use some attributes.<br>They are saved in Data Struture.<br>`CreateAssetMenu` makes asset in asset menu. ```csharp= using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "newEntityData", menuName = "Data/Entity Data/Base Data")] public class D_Entity : ScriptableObject { public float wallCheckDistance = 0.2f; public float ledgeCheckDistance = 0.4f; public LayerMask whatIsGround; } ``` ### Check Surroundings<a id="CS"/> Wall Check & Ledge Check are same in player.<br>These functions are used in State. ```csharp= public class Entity : MonoBehaviour { ~~~ public int facingDirection { get; private set; } public D_Entity entityData; // For Checking [SerializeField] private Transform wallCheck; [SerializeField] private Transform ledgeCheck; //Check Wall and Ledge function public virtual bool CheckWall() { return Physics2D.Raycast(wallCheck.position, aliveGameObject.transform.right, entityData.wallCheckDistance, entityData.whatIsGround); } public virtual bool CheckLedge() { return Physics2D.Raycast(ledgeCheck.position, Vector2.down, entityData.ledgeCheckDistance, entityData.whatIsGround); } public virtual void Flip() { facingDirection *= -1; aliveGameObject.transform.Rotate(0f, 180f, 0f); } } ``` ### State Inheritace<a id="SI"/> State is various, moveState, IdleState, etc...<br>These are inheritatied of State class.<br>Look below, any logic during moving<br> **MoveState** ```csharp= public class MoveState : State { protected D_MoveState stateData; protected bool isDetectingWall; protected bool isDetectingLedge; public MoveState(Entity entity, FiniteStateMachine stateMachine, string animBoolName, D_MoveState stateData) : base(entity, stateMachine, animBoolName) { this.stateData = stateData; } public override void Enter() { base.Enter(); entity.SetVelocity(stateData.movementSpeed); isDetectingWall = entity.CheckWall(); isDetectingLedge = entity.CheckLedge(); } public override void Exit() { base.Exit(); } public override void LogicUpdate() { base.LogicUpdate(); } public override void PhysicsUpdate() { base.PhysicsUpdate(); isDetectingWall = entity.CheckWall(); isDetectingLedge = entity.CheckLedge(); } } ``` **Idle State** ```csharp= public class IdleState : State { protected D_IdleState stateData; protected bool flipAfterIdle; protected bool isIdleTimeOver; protected float idleTime; public IdleState(Entity entity, FiniteStateMachine stateMachine, string animBoolName, D_IdleState stateData) : base(entity, stateMachine, animBoolName) { this.stateData = stateData; } public override void Enter() { base.Enter(); entity.SetVelocity(0f); isIdleTimeOver = false; SetRandomIdleTime(); } public override void Exit() { base.Exit(); if (flipAfterIdle) { entity.Flip(); } } public override void LogicUpdate() { base.LogicUpdate(); if (Time.time >= startTime + idleTime) { isIdleTimeOver = true; } } public override void PhysicsUpdate() { base.PhysicsUpdate(); } public void SetFlipAfterIdle(bool flip) { flipAfterIdle = flip; } private void SetRandomIdleTime() { idleTime = Random.Range(stateData.minIdleTime, stateData.maxIdleTime); } } ```