Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- public class Boat : MonoBehaviour
- {
- [SerializeField] private float speed = 3f;
- public Queue<GraphObject> _currentWay = new Queue<GraphObject>();
- [HideInInspector] public List<GraphObject> VisitedPoints = new List<GraphObject>();
- public List<WayInfo> AllShortestWays => GraphMatrix.AllShortestWays;
- // Метод для планирования и инициализации маршрута
- public void SetWayAndGo(string path)
- {
- _currentWay = new Queue<GraphObject>();
- for (int i = 0; i < path.Length; i++)
- {
- GraphObject node = GraphObject.AllGraphObjects.FirstOrDefault(o => o.Letter == path[i]);
- if (node == null)
- {
- Debug.LogError($"No GraphObject found for letter: {path[i]}");
- return; // Выход, если узел не найден
- }
- if (i == 0)
- {
- transform.position = node.transform.position;
- }
- if (i < path.Length - 1)
- {
- var nextNode = GraphObject.AllGraphObjects.FirstOrDefault(o => o.Letter == path[i + 1]);
- var way = AllShortestWays.FirstOrDefault(info => info.A == node && info.B == nextNode);
- if (!way.Equals(default(WayInfo))) // Проверяем, что way не является значением по умолчанию
- {
- for (int j = 1; j < way.Way.Count; j++) // Пропускаем первую точку в каждом пути
- {
- _currentWay.Enqueue(way.Way[j]);
- }
- }
- }
- else
- {
- _currentWay.Enqueue(node);
- }
- }
- StartCoroutine(Go()); // Запускаем корутину для движения лодки
- }
- // Метод вызывается при посещении точки
- public void OnPointWent(GraphObject point)
- {
- if (_currentWay.Count > 0 && _currentWay.Peek() == point)
- {
- VisitedPoints.Add(_currentWay.Dequeue());
- }
- }
- // Корутина для движения лодки
- private IEnumerator Go()
- {
- while (_currentWay.Count > 0)
- {
- var currentNode = _currentWay.Peek();
- transform.position = Vector3.MoveTowards(transform.position, currentNode.transform.position, speed * Time.deltaTime);
- if (Vector3.Distance(transform.position, currentNode.transform.position) < 0.1f)
- {
- OnPointWent(currentNode);
- }
- yield return null;
- }
- Debug.Log("Route completed"); // Маршрут завершен
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement