Ответ ментора получился очень большой. В основном ошибки из-за того что я не правильно понял логику кода. Я думал что пуля вылетает и рикошетит между мишенями по кругу. А оказалось что это игрок движется по маршруту из точек по кругу и стреляет по мишеням.
Вот сам ответ:
Добрый день. Нет, не самое, дальше интереснее) Но пока надо доработать это:
1) Вы скрестили несовместимое. Первый скрипт не имеет отношения к пуле. Он описывает движение по маршруту, не более. Вам нужно произвести легкий рефакторинг по стилю, а не менять логику скриптов.
2) Тем более, логика апдейта и метода движения будут противоречить друг другу.
3) _targetField - имя не отражает суть. Это путь или контейнер точек пути.
4) targets[i] = targetField.GetChild(i).GetComponent<Transform>(); - Зачем тут GetComponent? Посмотрите, что возвращает GetChild.
5) Помимо упорядочивания методов по доступности, в юнити вводится дополнительное ограничение. Методы событий юнити всегда пишутся выше своих, даже если доступность их ниже. Так же методы событий юнити лучше писать в порядке их вызова основным потоком. Тоесть первым Awake. Исключение, что OnEnable, OnDisable можно рядом писать, то все ровно не раньше чем вызывается в очереди OnEnable. Подробнее
https://docs.unity3d.com/ru/530/Manual/ExecutionOrder.html
6) Логику GetNextTarget можно заменить парой строк, если записывать в переменную индекса остаток от деления (%) ее "текущего значение + 1" (только через инкремент, чтоб избежать магических чисел) на "длину массива". Тогда вы замкнете значение между 0 и максимальным индексом.
7) Текущий индекс лучше в поле хранить, чем постоянно искать. Это затратно по ресурсам, особенно на больших массивах.
8) [RequireComponent(typeof(Rigidbody))] не имеет смысла, тк мы не делаем тут GetComponent. Переписанный вариант: https://gist.github.com/NoNameDeleted/6274460596bf41ae35c0b3a1051390db/d7e27db82f3baa0e8c30b4f7f579114da4ce8056
Каждый пункт прокомментирую в следующем посте, а то тут не поместится.