我下面有代码来实例化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-它们引用的是同一对象。正如我在日志中看到的并使用断点进行检查:
但是实际上我有2个或更多的实例化对象!由于Box_1.005764
和Box_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]));
}
清楚地表明,我有多个盒子,但它们没有动。但是,我发现如果我调整游戏窗口的大小,它们有时会移动,并在特定时间点停止移动。
对于@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。
答案 0 :(得分:0)
问题是由画布引起的。但是我还是不明白。
默认画布应该可以工作,但是我将画布渲染模式设置为“屏幕空间-相机”,并将主相机连接到了它(“世界空间”也不起作用)。
我改回默认的“屏幕空间-覆盖”,现在可以使用了。