using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.AI; [RequireComponent(typeof(NavMeshAgent))] public class MovementController : MonoBehaviour { public int PointStartID { get; set; } public int PointEndID { get; private set; } public float FlagDistance { get; private set; } private const float updateFlagPositionDelay = 5; private const float updateReachedDestinationDelay = 5; [SerializeField] private NavMeshAgent navMeshAgent; [SerializeField] private GameObject flag; public float DistanceToGo { get; private set; } public float RemainingDistance => navMeshAgent.remainingDistance; private Dictionary idNavPointDict; private void Awake() { navMeshAgent.speed = SettingsReader.Instance.GetSettings.MovementSpeed; idNavPointDict = MapManager.IDToNavPoint; InvokeRepeating(nameof(UpdateFlagPosition), 0, updateFlagPositionDelay); InvokeRepeating(nameof(ReachedDestination), 0, updateReachedDestinationDelay); } private void OnDestroy() { CancelInvoke(nameof(UpdateFlagPosition)); } private void UpdateFlagPosition() { FlagDistance = (flag.transform.position - gameObject.transform.position).magnitude; } public void MoveToPointById(int id) { if (!navPoints.ContainsKey(id)) { Debug.LogWarning("PIDOR"); return; } goToNextNavPoint(navPoints[id]); } public void MoveToRandomPoint() { GoToNextNavPoint(MapManager.NavPoints[Random.Range(0, MapManager.NavPoints.Count)]); } public List GetPointsCandidate() { return MapManager.NavPoints .Where(point => (idNavPointDict[PointStartID].Position - point.Position).magnitude < SettingsReader.Instance.GetSettings.MovementDistance) .ToList(); } public void GoToNextNavPoint(NavPoint destination) { if (navMeshAgent.isStopped == true) navMeshAgent.isStopped = false; PointStartID = PointEndID; PointEndID = destination.PointId; navMeshAgent.SetDestination(destination.Position); DistanceToGo = navMeshAgent.remainingDistance; } public void ReturnToStartPoint() { if (navMeshAgent.isStopped == true) navMeshAgent.isStopped = false; navMeshAgent.SetDestination(idNavPointDict[PointStartID].Position); PointEndID = PointStartID; PointStartID = -1; } public void StopOnPath() { navMeshAgent.isStopped = true; PointStartID = -1; PointEndID = -1; } public void ReachedDestination() { if ((navMeshAgent.isStopped == false) && (navMeshAgent.velocity.magnitude < 0.1)) PointStartID = PointEndID; } }