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(); } [ServerCallback] public override void Enter() { _enemy.SetSpeedMul(1f); } [ServerCallback] public override void Update() { _enemy.targetTransform = _enemy.GetClosestTarget(); if (_enemy.targetTransform != null) { _enemy.ChangeState(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)]]; } } }