2D-экземпляр объекта перестает двигаться при использовании с таймером

#unity3d #timer #instantiation

Вопрос:

Здравствуйте, я пытаюсь создать систему, которая создает экземпляры и объекты, и перемещает ее в набор путевых точек. Когда я использую intantiate в функции Start (), она перемещается, как и предполагалось, через путевые точки, но когда я добавляю строку создания экземпляра в свою функцию update (), она перемещается только некоторое время, а затем останавливается, то же самое касается остальных созданных объектов. Я думаю, это как-то связано с таймером, но я пробовал несколько подходов, но все они приводят к одному и тому же. Надеюсь, кто-нибудь сможет помочь.

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public class waypointTest : MonoBehaviour { [SerializeField] private Transform[] waypoints;  public GameObject waypointInvader; GameObject go;  private int nextUpdate = 1; public float speed = 5f; private int waypointIndex;     void Start() {    } void Update() {  if (Time.time gt;= nextUpdate)  {  nextUpdate = Mathf.FloorToInt(Time.time)   1;  go = Instantiate(waypointInvader, transform.position, transform.rotation) as GameObject;   }      if (go.transform.position != waypoints[waypointIndex].transform.position)  {  Vector3 newPos = Vector3.MoveTowards(go.transform.position, waypoints[waypointIndex].transform.position, speed * Time.deltaTime);  go.transform.position = newPos;  if (newPos == waypoints[waypointIndex].transform.position)  {  waypointIndex  = 1;  }  if (waypointIndex == waypoints.Length)  {  waypointIndex = 0;  }  }   } }  

Ответ №1:

Проблема в том, что вы теряете ссылку на объект, который хотите переместить.

Если экземпляр находится внутри Start() :

  1. go устанавливается в качестве экземпляра объекта
  2. go перемещается в каждую точку маршрута
  3. go перемещается в самую первую путевую точку
  4. go снова движется по путевым точкам

Если экземпляр находится внутри Update() :

  1. go устанавливается в качестве первого экземпляра объекта
  2. go перемещается в несколько путевых точек, пока Time.time gt;= nextUpdate не вернет значение true
  3. go устанавливается как второй экземпляр объекта и потеряет ссылку на первый go
  4. Первый go перестает двигаться
  5. Вторая go начинает двигаться
  6. Повторять

Один из способов решить эту проблему-предоставить движущемуся объекту go собственный сценарий движения. Таким образом, вам просто нужно создать экземпляр go , и он сам справится со своим движением. Если go вы не знаете, где находятся путевые точки, вы можете указать их после создания экземпляра (например waypointInvader , это сборный модуль). Например.:

 if (Time.time gt;= nextUpdate) {  nextUpdate = Mathf.FloorToInt(Time.time)   1;  go = Instantiate(waypointInvader, transform.position, transform.rotation) as GameObject;  go.GetComponentlt;GoMovementgt;().ListOfWaypoints = waypoints; }