using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyPatrolling : MonoBehaviour //скрипт для отрисовки и установки точек пути врага { public enum PathTypes //виды путей { linear, //линейный loop //зацикленный } public PathTypes PathType; //тип пути public int MovementDirections = 1; // направление движения public int MoveingTo = 0; //к какой точке двигаться public Transform[] PathElements; //точки движения public void OnDrawGizmos() { if(PathElements == null || PathElements.Length < 2) //проверка на 2 или более элементов { return; } for(var i = 1; i < PathElements.Length; i++) { Gizmos.DrawLine(PathElements [i-1].position, PathElements[i].position); //отрисовка линий между точками } if(PathType == PathTypes.loop) //если выбран зацикленный тип { Gizmos.DrawLine(PathElements[0].position, PathElements[PathElements.Length-1].position); //отрисовка линии от последней точки к первой } } public IEnumerator GetNextPathPoint() //получает положение следующей точки { if(PathElements == null || PathElements.Length < 1) //проверяет есть ли точки которым нужно проверить положение { yield break; } while(true) { yield return PathElements[MoveingTo]; // возвращает текущее положение точки if(PathElements.Length == 1) //если точка всего одна, выйти { continue; } if(PathType == PathTypes.linear) //если линея не зациклена { if(MoveingTo <= 0) //если движемся по нарастающей { MovementDirections = 1; //добавляем 1 к движению } else if(MoveingTo >= PathElements.Length - 1) //если движемся по убывающей { MovementDirections = -1; //убираем 1 из движения } } MoveingTo = MoveingTo + MovementDirections; //диапазон движения от 1 до -1 if(PathType == PathTypes.loop) { if(MoveingTo >= PathElements.Length) //если мы дошли до последней точки { MoveingTo = 0; //то нужно идти не в обратную сторону а к первой точке } if(MoveingTo < 0) //если мы дошли до первой точки двигаясь в обратную сторону { MoveingTo = PathElements.Length - 1; //то нужно двигаться к последней } } } } }