Объект, созданный в Unity, всегда ссылается на один и тот же объект - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть код ниже, чтобы создать экземпляр элемента пользовательского интерфейса и переместить его:

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 - они ссылаются на один и тот же объект.Как я вижу в журнале и проверяю, используя точку останова:

enter image description here

Но на самом деле у меня есть 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]));
}

Это очищает, показывает, что у меня есть более одного ящикано они не двигались.Но я обнаружил, что если я изменю размер игрового окна , они иногда двигаются и останавливаются в определенной точке.

enter image description here


Для @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 .

1 Ответ

0 голосов
/ 28 апреля 2019

Проблема вызвана холстом. Но я все еще не понимаю.

Холст по умолчанию должен работать, но я установил режим рендеринга холста на «screenspace - camera» и подключил к нему основную камеру (также «worldspace» не работает).

Я вернулся к стандартному «screenspace - overlay», и теперь оно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...