【问题标题】:Move UI component after it was instantiated实例化后移动 UI 组件
【发布时间】:2015-07-20 21:31:42
【问题描述】:

我正在制作一款 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 持有脚本并激活/停用面板)
实际结果:尽管面板确实被实例化了 3 次,但它们都处于相同的位置,即使我的 Update() 函数改变了它的位置,它们也不会改变。我做错了什么?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    给出建筑物的世界位置会导致面板基本上位于屏幕上的相同位置。需要的是计算到屏幕位置的世界位置,并使用计算出的屏幕位置来放置面板。

    试试这样的:

    panel.transform.position = Camera.main.WorldToScreenPoint(this.gameObject.transform.position);
    

    【讨论】:

    • 男人!效果很好!非常非常感谢你!它工作完美!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多