Unity:改变UI gameObject parent和位置而不移动Child gameObject

Unity: Change UI gameObject parent and position without moving Child gameObject

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

其中一些物品是容器,我决定给每个容器一个自己的 child 游戏对象,一旦打开(即激活游戏对象),代表并包含实际容器的内容。我选择这样做是为了更容易跟踪每个容器的实际容器。

我想要的:当更改项目的 parent(也就是移动它,因为我所有的 parent 都有布局组)时,child 游戏对象应该保持在同一个世界位置

我有:当改变物品的 parent 时,child 游戏对象会改变世界位置

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

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 中是否有内置的东西可以防止 child 游戏对象移动

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

我的房间里有一个叫"sac a dos"的包包

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

我现在在同一个地方创建了一个名为 "Coffre" 的箱子物品,导致包被放置为箱子容器 child 游戏对象

的 child

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

放置的包 child

这里我打开了箱子里的包,导致包的 child 游戏对象错位,因为包的位置改变了

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

当您对元素进行公共显示时,编写一个 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(){...}
}