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(){...}
}
我在 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(){...}
}