0

我在 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”的胸部物品,导致袋子被放置为胸部容器子游戏对象的子项

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

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

这里我打开了胸部的包,由于包的位置发生了变化,导致包的子游戏对象放错了位置

这里我打开了胸部的包,由于包的位置发生了变化,导致包的子游戏对象放错了位置

4

1 回答 1

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(){...}
}
于 2020-05-07T20:20:53.837 回答