Files
MobileShooter/Assets/Darkmatter/Code/Domain/Enemy/PatrolState.cs
2025-12-31 17:14:20 -08:00

76 lines
2.1 KiB
C#

using Codice.Client.Common;
using Darkmatter.Core;
using System;
using UnityEngine;
namespace Darkmatter.Domain
{
public class PatrolState : State<EnemyStateMachine>
{
public PatrolState(EnemyStateMachine runner) : base(runner) { }
private EnemyConfigSO enemyConfig => runner.enemyConfig;
private IEnemyAnimController enemyAnimController => runner.enemyAnimController;
private IEnemyPawn enemyPawn => runner.enemyPawn;
private int currentPatrolPointIndex = 0;
public override void Enter()
{
base.Enter();
Debug.Log("Entered Patrol State");
enemyPawn.OnHealthDecreased += HandleHealth;
runner.SetSpeed(enemyConfig.walkSpeed);
enemyAnimController.PlayWalkAnim(true);
}
private void HandleHealth(float health)
{
if(health<=0)
{
runner.Die();
}
}
public override void Update()
{
if (enemyPawn.isDead) return;
base.Update();
Debug.Log("Update in Patrol State");
HandlePatrol();
CheckForStateBreak();
}
private void CheckForStateBreak()
{
if(runner.PlayerInChasingRange())
{
runner.ChangeState(new ChaseState(runner));
}
}
private void HandlePatrol()
{
if (enemyPawn.PatrolPoints.Count == 0) return;
Transform target = enemyPawn.PatrolPoints[currentPatrolPointIndex];
enemyPawn.SetDestination(target.position);
if(Vector3.Distance(target.position,enemyPawn.ReturnMyPos()) < 0.5f) //close enought to targetPatrolPoint
{
Debug.Log("Reached Point");
currentPatrolPointIndex = (currentPatrolPointIndex+1)%enemyPawn.PatrolPoints.Count;
}
}
public override void Exit()
{
base.Exit();
enemyAnimController.PlayWalkAnim(false);
Debug.Log("Exiting Patrol State");
enemyPawn.OnHealthDecreased -= HandleHealth;
}
}
}