MoveTowards и position

Программирование на Юнити.

MoveTowards и position

Сообщение kotovasia 22 июн 2018, 17:44

Добрый день!
Я реализую передвижение объекта из массива при помощи функции 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;
}
 


Инициализация объекта происходит при циклическом обходе заготовленно двоичного массива по 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++;
 


А само движение происходит в корутине, которую запускает функция, работающая по таймеру:
Синтаксис:
Используется 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;
        }
    }
 


Проблема заключается в том, что объект устанавливается в нужное положение, но не двигается.
И во всех моментах дебаггер выдаёт показатели transform.position и rb2D.position равными нулю.
Ошибок не выдаёт.
Я чувствую, что явно намудрил что-то с инициализацией объекта, но не могу понять где.
kotovasia
UNец
 
Сообщения: 7
Зарегистрирован: 13 мар 2018, 18:02

Re: MoveTowards и position

Сообщение 1max1 22 июн 2018, 18:02

Ну так...
Синтаксис:
Используется csharp
EnemyArray[enemyIndex].EnemyObject = EnemyFace;         // префаб объекта врага, который задаётся в движке

Зачем присваивать префаб?
Сделай вот так:
Синтаксис:
Используется csharp
EnemyArray[enemyIndex].EnemyObject = Instantiate(EnemyFace, gridPosition[x, y], Quaternion.identity);
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: MoveTowards и position

Сообщение kotovasia 02 июл 2018, 09:20

1max1 писал(а):Ну так...
Синтаксис:
Используется csharp
EnemyArray[enemyIndex].EnemyObject = EnemyFace;         // префаб объекта врага, который задаётся в движке

Зачем присваивать префаб?
Сделай вот так:
Синтаксис:
Используется csharp
EnemyArray[enemyIndex].EnemyObject = Instantiate(EnemyFace, gridPosition[x, y], Quaternion.identity);


Большое спасибо! Действительно в этом была ошибка)
kotovasia
UNец
 
Сообщения: 7
Зарегистрирован: 13 мар 2018, 18:02


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10