У меня есть код ниже, чтобы создать экземпляр элемента пользовательского интерфейса и переместить его:
void PopDialogBox()
{
Vector3 pos = new Vector3(-horzExtent + .5f, -vertExtent, 0f);
GameObject box = Instantiate(dialogBoxPrefab, pos, Quaternion.identity, canvas.transform);
box.name = "Box_" + Time.time;
liveBoxes.Add(box);
for (int i = 0; i < liveBoxes.Count; ++i)
{
Debug.Log("Move " + liveBoxes[i].name);
StartCoroutine(SmoothMoveDialogBox(liveBoxes[i]));
}
}
Но box
всегда является первым созданным GameObject - они ссылаются на один и тот же объект.Как я вижу в журнале и проверяю, используя точку останова:

Но на самом деле у меня есть 2 или более экземпляров объектов!Поскольку Box_1.005764
и Box_2.025746
оба существуют, в журнале я вижу только ссылки на Box_1.005764
.
Ящики создавались в секунду и назывались соответственно времени.
Я запутался, потому что я использую объект после создания экземпляра, поэтому он не должен бытьprefab / предыдущие, почему это все еще происходит?
Как прокомментировали комментарии, я заменил цикл for, как показано ниже:
for (int i = 0; i < liveBoxes.Count; ++i)
{
Debug.Log("Move " + liveBoxes[i].name + ", all: " + liveBoxes.Count);
StartCoroutine(SmoothMoveDialogBox(liveBoxes[i]));
}
Это очищает, показывает, что у меня есть более одного ящикано они не двигались.Но я обнаружил, что если я изменю размер игрового окна , они иногда двигаются и останавливаются в определенной точке.

Для @derHugo сопрограмма движения перемещает поле цели:
IEnumerator SmoothMoveDialogBox(GameObject box)
{
Vector3 pos = box.transform.position;
Vector3 end = pos;
end.y += boxMoveDistance;
Debug.Log(box.name + " from " + pos + ", to " + end);
while (Vector3.Distance(pos, end) > Mathf.Epsilon)
{
Vector3 target = Vector3.MoveTowards(pos, end, boxMoveSpeed);
box.transform.position = target;
pos = box.transform.position;
yield return null;
}
}
Для любой проверки в дальнейшем см. this gist .