Unity实例化对象始终引用同一对象

时间:2019-04-28 03:35:26

标签: c# unity3d

我下面有代码来实例化UI元素并将其移动:

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.005764Box_2.025746都存在,因此在日志中我只能看到被引用的Box_1.005764

每秒创建一个盒子,并根据时间进行命名。

我很困惑,因为我在实例化之后使用对象 ,所以它不应该是预制的/以前的对象,为什么仍然如此?


由于提出了疑问,我替换了如下的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 :(得分:0)

问题是由画布引起的。但是我还是不明白。

默认画布应该可以工作,但是我将画布渲染模式设置为“屏幕空间-相机”,并将主相机连接到了它(“世界空间”也不起作用)。

我改回默认的“屏幕空间-覆盖”,现在可以使用了。