我正在制作一款将成为战略游戏的3D游戏。我想通过代码(C#)创建一个面板(一组文本和按钮的UI组),然后移动它们,使它们位于Canvas布局中的GameObject之上。所以我这样做:
if (ThisBuilding == null)
ThisBuilding = this.gameObject;
Panel = Canvas.Instantiate(Panel);
Panel.transform.SetParent(canvas.transform, false); //false to prevent stupid scaling issues created by the parent change
Vector3 centerPosition = ThisBuilding.GetComponentInChildren<MeshRenderer>().bounds.center; //the building GameObject contains a MeshRenderer component in its only children.
panelRect.anchoredPosition = Vector3.Lerp(panelRect.anchoredPosition, centerPosition, 1.0f);
问题是这个脚本在每个建筑物上运行一次(在Start()上),希望面板可以实例化3次,每个面板对应一个建筑物,但由于一些奇怪的原因,这不起作用。
预期结果:每次实例化面板时,其位置与实例化它的建筑物相同(建筑物GameObject保存脚本并激活/停用面板)
ACTUAL RESULT :即使面板确实实例化了3次,它们也处于相同的位置,即使我的Update()函数改变其位置也不会改变。我做错了什么?
答案 0 :(得分:2)
赋予建筑物的世界位置导致面板基本上位于屏幕上的相同位置。我们需要的是计算屏幕位置的世界位置,并使用计算的屏幕位置来放置面板。
尝试这样的事情:
panel.transform.position = Camera.main.WorldToScreenPoint(this.gameObject.transform.position);