C# 统一:在不移动子游戏对象的情况下更改UI游戏对象父对象和位置

C# 统一:在不移动子游戏对象的情况下更改UI游戏对象父对象和位置,c#,unity3d,user-interface,unity-ui,C#,Unity3d,User Interface,Unity Ui,我有一个统一的UI,在这里我不断地将项目从一个地方移动到另一个地方 上面提到的一些物品是容器,我决定给每个容器分配它们自己的子游戏对象,这些子游戏对象表示并包含打开游戏对象后实际容器的内容。我选择这样做是为了更容易跟踪每个容器的实际容器 我想要的是:当改变物品的父对象(也就是移动它)时,因为我的父对象都有布局组,所以子游戏对象应该保持在相同的世界位置 我拥有的:当改变物品的父项时,子游戏对象会改变世界位置 我可以做什么:我可以每次重置子游戏对象的位置,就像我第一次使用此代码实例化游戏对象时所做的

我有一个统一的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);
我想知道的是:是否有某种内置的单一行为或统一性阻止了儿童游戏对象的移动

下面是它将应用的其中一种情况的逐步图像:

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

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

我现在在同一个地方创建了一个名为Coffre的箱子物品,使袋子成为箱子的容器子游戏对象的子对象

在这里,我打开了箱子,放在正确的位置,并展示了作为箱子的容器儿童游戏对象的孩子放的袋子


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

我认为你应该将物品数据与其显示分开

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