Я реализую передвижение объекта из массива при помощи функции MoveTowards и заметил, что объект не двигается, а все его параметры position равны нулю.
Это меня удивило, потому что я подобный скрипт с перемещением только одного объекта уже писал, и он работал корректно.
Теперь подробнее. Есть массив врагов из класса Enemy:
Синтаксис:
Используется csharp
public class Enemy
{
public GameObject EnemyObject;
public int СoordX; // Координата X в двумером массиве векторов gridPosition (сетка игрового поля с шаговыми интервалами)
public int СoordY; // Координата Y в двумером массиве векторов gridPosition
public BoxCollider2D boxCollider; //Компонент BoxCollider2D, прикрепленный к этому объекту.
public Rigidbody2D rb2D;
}
{
public GameObject EnemyObject;
public int СoordX; // Координата X в двумером массиве векторов gridPosition (сетка игрового поля с шаговыми интервалами)
public int СoordY; // Координата Y в двумером массиве векторов gridPosition
public BoxCollider2D boxCollider; //Компонент BoxCollider2D, прикрепленный к этому объекту.
public Rigidbody2D rb2D;
}
Инициализация объекта происходит при циклическом обходе заготовленно двоичного массива по x и y, где при каждом найденном обозначении врага выполняется следующее:
Синтаксис:
Используется csharp
EnemyArray[enemyIndex] = new Enemy(); // создаем элемент класса
EnemyArray[enemyIndex].EnemyObject = EnemyFace; // префаб объекта врага, который задаётся в движке
EnemyArray[enemyIndex].СoordX = x;
EnemyArray[enemyIndex].СoordY = y;
Instantiate(EnemyArray[enemyIndex].EnemyObject, gridPosition[x, y], Quaternion.identity);
EnemyArray[enemyIndex].rb2D = EnemyArray[enemyIndex].EnemyObject.GetComponent<Rigidbody2D>(); // Получает ссылку на ригидбоди объекта
EnemyArray[enemyIndex].boxCollider = EnemyArray[enemyIndex].EnemyObject.GetComponent<BoxCollider2D>(); // Получает ссылку на БоксКоллайдер2д объекта
enemyIndex++;
EnemyArray[enemyIndex].EnemyObject = EnemyFace; // префаб объекта врага, который задаётся в движке
EnemyArray[enemyIndex].СoordX = x;
EnemyArray[enemyIndex].СoordY = y;
Instantiate(EnemyArray[enemyIndex].EnemyObject, gridPosition[x, y], Quaternion.identity);
EnemyArray[enemyIndex].rb2D = EnemyArray[enemyIndex].EnemyObject.GetComponent<Rigidbody2D>(); // Получает ссылку на ригидбоди объекта
EnemyArray[enemyIndex].boxCollider = EnemyArray[enemyIndex].EnemyObject.GetComponent<BoxCollider2D>(); // Получает ссылку на БоксКоллайдер2д объекта
enemyIndex++;
А само движение происходит в корутине, которую запускает функция, работающая по таймеру:
Синтаксис:
Используется csharp
protected IEnumerator EnemyMoving(Enemy oneEnemy, Vector3 end)
{
float sqrRemainingDistance = (oneEnemy.EnemyObject.transform.position - end).sqrMagnitude; // Оставшееся расстояние до цели передвижения в квадрате (так удобнее вычислять, говорят)
while (sqrRemainingDistance > float.Epsilon) // Двигается пока квадрат разницы больше эпсилон
{
Vector3 newPostion = Vector3.MoveTowards(oneEnemy.EnemyObject.rb2D.position, end, inverseMoveTime * Time.deltaTime); // вот здесь главный затык
oneEnemy.rb2D.MovePosition(newPostion); // Движение!
sqrRemainingDistance = (oneEnemy.EnemyObject.transform.position - end).sqrMagnitude;
yield return null;
}
}
{
float sqrRemainingDistance = (oneEnemy.EnemyObject.transform.position - end).sqrMagnitude; // Оставшееся расстояние до цели передвижения в квадрате (так удобнее вычислять, говорят)
while (sqrRemainingDistance > float.Epsilon) // Двигается пока квадрат разницы больше эпсилон
{
Vector3 newPostion = Vector3.MoveTowards(oneEnemy.EnemyObject.rb2D.position, end, inverseMoveTime * Time.deltaTime); // вот здесь главный затык
oneEnemy.rb2D.MovePosition(newPostion); // Движение!
sqrRemainingDistance = (oneEnemy.EnemyObject.transform.position - end).sqrMagnitude;
yield return null;
}
}
Проблема заключается в том, что объект устанавливается в нужное положение, но не двигается.
И во всех моментах дебаггер выдаёт показатели transform.position и rb2D.position равными нулю.
Ошибок не выдаёт.
Я чувствую, что явно намудрил что-то с инициализацией объекта, но не могу понять где.