using Koptilnya.StateMachine; using Mirror; using UnityEngine; using UnityEngine.AI; namespace Characters.Enemy.States { public class PatrolState : State { 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(); } 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; return; } 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)]]; } } }