【问题标题】:Unity: Change UI gameObject parent and position without moving Child gameObjectUnity:在不移动子游戏对象的情况下更改 UI 游戏对象父级和位置
【发布时间】:2020-08-22 21:56:11
【问题描述】:

我在 Unity 中有一个 UI,我不断地将项目从一个地方移动到另一个地方。

其中一些项目是容器,我决定为每个容器提供自己的子游戏对象,表示并包含打开后的实际容器内容(也就是激活游戏对象)。我选择这样做是为了更容易跟踪每个容器的实际容器。

我想要什么:更改项目的父项时(也就是移动它,因为我所有的父母都有布局组),子游戏对象应该保持在相同的世界位置

我所拥有的:更改项目的父项时,子游戏对象会更改世界位置

我能做什么:我可以每次重置子游戏对象的位置,就像我第一次使用此代码实例化游戏对象时所做的那样(相关游戏对象被拉伸)

Vector3[] corners = new Vector3[4];
transform.parent.parent.GetComponent<RectTransform>().GetWorldCorners(corners);
float width = corners[2].x - corners[0].x;
float height = corners[1].y - corners[0].y;
RectTransform itemTransform = item.transform.GetChild(1).GetComponent<RectTransform>();
itemTransform.position = new Vector3(width / 2, height / 2);

我想知道的:Monobehavior 或 Unity 中是否有一些东西可以阻止子游戏对象移动

以下是其中一种适用情况的逐步图片:

我的房间里有一个名为“sac a dos”的袋子

现在我打开了袋子,它出现在屏幕中间

我现在在同一个地方创建了一个名为“Coffre”的箱子物品,将包作为箱子的容器子游戏对象的子项放置

在这里,我打开了箱子,定位在正确的位置,并显示了作为箱子容器子游戏对象的子项放置的包

这里我打开了箱子里的包,导致包的子游戏对象放错了位置,因为包的位置发生了变化

【问题讨论】:

    标签: c# unity3d user-interface unity-ui


    【解决方案1】:

    我认为您应该将项目数据与其显示分开。

    当您有一个共同的元素显示时,编写一个 Show 方法,您可以在其中传递显示的项目数据。

    例子:

    public class ItemDisplay : MonoBehaviour
    {
        public void Show(ItemData itemData)
        {
            this.gameObject.SetActive(true);
    
            foreach (var property in itemData.properties)
            {
                DisplayProperty(property);
            }
        }
    
        private void DisplayProperty(){...}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多