Unity: 改变UI gameObject的父体和位置而不需要移动Child gameObject。

问题描述 投票:0回答:1

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

其中有些物品是容器,我决定给每个容器赋予自己的子gameObject,代表并包含实际容器的内容,一旦打开(也就是激活gameObject)。我选择这样做是为了更容易跟踪每个容器的实际容器。

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

我有什么。当改变物品的父体时,子体gameObject会改变世界位置

我可以做什么。我可以每次重设子gameObject的位置 就像我第一次用这段代码实例化gameObject一样(相对的gameObject被拉伸了)

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中是否有内置的东西可以阻止子游戏对象移动?在Monobehavior或Unity中是否有什么东西可以阻止子游戏对象移动?

下面是它会适用的情况之一的图片步骤。Here I have a bag called "sac a dos in my room

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

Now I have opened The bag, which shows up in the middle of the screen

现在,我已经打开了袋子,它显示在屏幕中央

I now have created a chest item called "Coffre" at the same place, causing the bag to be put as child of the chest's container child gameObject

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

Here I opened the chest, showing the bag that was put as child of the chest's container child gameObject, and positioned at the right place

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

Here I opened the bag in the chest, causing the bag's child gameObject to be misplaced since the bag's position changed

这里我打开了箱子里的包包,由于包包的位置发生了变化,导致包包的子gameObject错位了

c# unity3d user-interface unity-ui
1个回答
0
投票

我认为你应该分离项目数据从他们的显示。

当你有一个共同的显示你的元素写一个显示方法,你可以通过显示的项目数据。

例子。

public class ItemDisplay : MonoBehaviour
{
    public void Show(ItemData itemData)
    {
        this.gameObject.SetActive(true);

        foreach (var property in itemData.properties)
        {
            DisplayProperty(property);
        }
    }

    private void DisplayProperty(){...}
}
© www.soinside.com 2019 - 2024. All rights reserved.