59 lines
1.5 KiB
C#
Raw Normal View History

2024-03-19 17:42:38 +03:00
using Koptilnya.StateMachine;
using Mirror;
using UnityEngine;
using UnityEngine.AI;
namespace Characters.Enemy.States
{
public class PatrolState : State<EnemyState>
{
private readonly Enemy _enemy;
2024-03-20 00:58:47 +03:00
private NavMeshTriangulation _navMeshData;
2024-03-19 17:42:38 +03:00
public PatrolState(Enemy enemy) : base(EnemyState.Patrol)
{
_enemy = enemy;
_navMeshData = NavMeshTriangulator.Data;
}
2024-03-19 21:38:59 +03:00
[ServerCallback]
2024-03-19 17:42:38 +03:00
public override void Enter()
{
2024-03-19 20:18:01 +03:00
_enemy.SetSpeedMul(1f);
2024-03-19 17:42:38 +03:00
}
2024-03-19 21:38:59 +03:00
[ServerCallback]
2024-03-19 17:42:38 +03:00
public override void Update()
{
2024-03-19 21:38:59 +03:00
_enemy.targetTransform = _enemy.GetClosestTarget();
2024-03-19 17:42:38 +03:00
2024-03-19 23:37:02 +03:00
if (_enemy.HasTarget)
2024-03-19 17:42:38 +03:00
{
2024-03-19 21:38:59 +03:00
_enemy.ChangeState(EnemyState.Chase);
2024-03-19 20:24:40 +03:00
return;
2024-03-19 17:42:38 +03:00
}
var remainingDistance = _enemy.agent.GetPathRemainingDistance();
var invalidPath = _enemy.agent.pathStatus != NavMeshPathStatus.PathComplete;
if (remainingDistance <= 1.5f || invalidPath)
{
SetRandomDestination();
}
}
2024-03-19 23:37:02 +03:00
[Server]
2024-03-19 17:42:38 +03:00
void SetRandomDestination()
{
_enemy.agent.destination = GetRandomLocation();
}
2024-03-19 23:37:02 +03:00
[Server]
2024-03-19 17:42:38 +03:00
Vector3 GetRandomLocation()
{
2024-03-20 00:58:47 +03:00
NavMeshTriangulation navMeshData = NavMesh.CalculateTriangulation();
return navMeshData.vertices[navMeshData.indices[Random.Range(0, navMeshData.indices.Length - 3)]];
2024-03-19 17:42:38 +03:00
}
}
}