70 lines
2.1 KiB
C#

using Koptilnya.StateMachine;
using Mirror;
using UnityEngine;
using UnityEngine.AI;
namespace Characters.Enemy.States
{
public class PatrolState : State<EnemyState>
{
private readonly Enemy _enemy;
private readonly NavMeshTriangulation _navMeshData;
private CustomNetworkManager _networkManager;
public PatrolState(Enemy enemy) : base(EnemyState.Patrol)
{
_enemy = enemy;
_navMeshData = NavMeshTriangulator.Data;
_networkManager = NetworkManager.singleton.GetComponent<CustomNetworkManager>();
}
public override void Enter()
{
if (!_enemy.isServer) return;
_enemy.SetSpeedMul(1f);
_enemy.SetAimRigWeight(0f);
}
public override void Update()
{
if (!_enemy.isServer) return;
float sortDistance = float.MaxValue;
foreach (var player in _networkManager.alive)
{
float distance = Vector3.Distance(player.transform.position, _enemy.transform.position);
if (distance <= _enemy.aggressionDistance && distance < sortDistance && _enemy.agent.SetDestination(player.transform.position))
{
sortDistance = distance;
_enemy.target = player.transform;
}
}
if (_enemy.target != null)
{
_enemy.state = EnemyState.Chase;
}
var remainingDistance = _enemy.agent.GetPathRemainingDistance();
var invalidPath = _enemy.agent.pathStatus != NavMeshPathStatus.PathComplete;
if (remainingDistance <= 1.5f || invalidPath)
{
SetRandomDestination();
}
}
void SetRandomDestination()
{
_enemy.agent.destination = GetRandomLocation();
}
Vector3 GetRandomLocation()
{
return _navMeshData.vertices[_navMeshData.indices[Random.Range(0, _navMeshData.indices.Length - 3)]];
}
}
}