---
# System prepended metadata

title: Unity Platform 15
tags: [platform]

---

Unity Platform 15
===
2020.08.25

###### tags: `platform`

## List
1. [How to make new State](#HS)
2. [Player Detected](#PD)
3. [Update entity and other state](#US)

## Content
### How to make new State<a id="HS"/>
[Enermy State logic diagram](https://www.youtube.com/watch?v=GB1Ri_SRtZY&list=PLy78FINcVmjA0zDBhLuLNL1Jo6xNMMq-W&index=15) : 00:25 ~
1. Create new State class
2. Create State data class
3. Create enermy specific state
4. Declare state on enermy class
5. Set up animatior

### Player Detected<a id="PD"/>
Player detects in some range.<br>This project show just liner detect, but use box overlap is better.<br>Use same Logic.

**State**
```csharp=
public class PlayerDetectedState : State
{
    protected D_PlayerDetectedState stateData;

    protected bool isPlayerMinAgroRange;
    protected bool isPlayerMaxAgroRange;

	public PlayerDetectedState(Entity entity, FiniteStateMachine stateMachine, string animBoolName, D_PlayerDetectedState stateData) : base(entity, stateMachine, animBoolName)
	{
        this.stateData = stateData;
	}

	public override void Enter()
	{
		base.Enter();

		entity.SetVelocity(0f);

        isPlayerMinAgroRange = entity.CheckPlayerInMinAgroRange();
        isPlayerMaxAgroRange = entity.CheckPlayerInMaxAgroRange();
	}

	public override void Exit()
	{
		base.Exit();
	}

	public override void LogicUpdate()
	{
		base.LogicUpdate();
	}

	public override void PhysicsUpdate()
	{
		base.PhysicsUpdate();
	}
}
```

**E1 State**
```csharp=
public class E1_PlayerDetectedState : PlayerDetectedState
{
    private E1 enermy;

	public E1_PlayerDetectedState(Entity entity, FiniteStateMachine stateMachine, string animBoolName, D_PlayerDetectedState stateData, E1 enermy) : base(entity, stateMachine, animBoolName, stateData)
	{
        this.enermy = enermy;
	}

	public override void Enter()
	{
		base.Enter();
	}

	public override void Exit()
	{
		base.Exit();
	}

	public override void LogicUpdate()
	{
		base.LogicUpdate();

        if (!isPlayerMaxAgroRange)
        {
            enermy.idleState.SetFlipAfterIdle(false);
            stateMachine.ChangeState(enermy.idleState);
        }
	}

	public override void PhysicsUpdate()
	{
		base.PhysicsUpdate();
	}
}
```

### Update entity and other state<a id="US"/>
**Entity**
```csharp=
public virtual bool CheckPlayerInMinAgroRange()
{
    return Physics2D.Raycast(playerCheck.position, aliveGameObject.transform.right, entityData.minAgroDistance, entityData.whatIsPlayer);
}

public virtual bool CheckPlayerInMaxAgroRange()
{
    return Physics2D.Raycast(playerCheck.position, aliveGameObject.transform.right, entityData.maxAgroDistance, entityData.whatIsPlayer);
}
```

**MoveState(other state)**
```csharp=
//MoveState
public class MoveState : State
{
    ~~~
	protected bool isPlayerMinAgroRange;

    public override void Enter()
    {
         ~~~
		isPlayerMinAgroRange = entity.CheckPlayerInMinAgroRange();
    }

	public override void PhysicsUpdate()
	{
        ~~~
		isPlayerMinAgroRange = entity.CheckPlayerInMinAgroRange();
	}
}

//E1_MoveState
public class E1_MoveState : MoveState
{
	~~~
	public override void LogicUpdate()
	{
	    ~~~
		if (isPlayerMinAgroRange)
		{
			stateMachine.ChangeState(enermy.playerDetectedState);
		}
	}
}

```