#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()
:
go
устанавливается в качестве экземпляра объектаgo
перемещается в каждую точку маршрутаgo
перемещается в самую первую путевую точкуgo
снова движется по путевым точкам
Если экземпляр находится внутри Update()
:
go
устанавливается в качестве первого экземпляра объектаgo
перемещается в несколько путевых точек, покаTime.time gt;= nextUpdate
не вернет значение truego
устанавливается как второй экземпляр объекта и потеряет ссылку на первыйgo
- Первый
go
перестает двигаться - Вторая
go
начинает двигаться - Повторять
Один из способов решить эту проблему-предоставить движущемуся объекту 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; }