using Koptilnya.StateMachine; using Mirror; using UnityEngine; using UnityEngine.AI; namespace Characters.Enemy.States { public class PatrolState : State { private readonly Enemy _enemy; private NavMeshTriangulation _navMeshData; public PatrolState(Enemy enemy) : base(EnemyState.Patrol) { _enemy = enemy; _navMeshData = NavMeshTriangulator.Data; } [ServerCallback] public override void Enter() { _enemy.SetSpeedMul(1f); } [ServerCallback] public override void Update() { _enemy.targetTransform = _enemy.GetClosestTarget(); if (_enemy.HasTarget) { _enemy.ChangeState(EnemyState.Chase); return; } var remainingDistance = _enemy.agent.GetPathRemainingDistance(); var invalidPath = _enemy.agent.pathStatus != NavMeshPathStatus.PathComplete; if (remainingDistance <= 1.5f || invalidPath) { SetRandomDestination(); } } [Server] void SetRandomDestination() { if (!_enemy.agent.isOnNavMesh) return; _enemy.agent.destination = GetRandomLocation(); } [Server] Vector3 GetRandomLocation() { NavMeshTriangulation navMeshData = NavMesh.CalculateTriangulation(); return navMeshData.vertices[navMeshData.indices[Random.Range(0, navMeshData.indices.Length - 3)]]; } } }