【问题标题】:Unity2D: Instantiated Object always at wrong positionUnity2D:实例化的对象总是在错误的位置
【发布时间】:2020-09-21 10:16:07
【问题描述】:

我有一个名为“PlayerList”的游戏对象,其中有一个“PlayerListItem”,我将其实例化并在 PlayerList 中克隆,其代码如下所示:

private void CreatePlayerList()
        {
            int y = 0;
            foreach (var player in gameState.PlayerNames)
            {
                GameObject PlayerName = Instantiate(playerListItem, new Vector3(0, y), Quaternion.identity, playerList.transform);
                PlayerName.GetComponentInChildren<TMP_Text>().text = player.FirstName;
                PlayerObjects.Add(PlayerName);
                y -= 130;

                if (player.FirstName == gameState.PlayerNames[currentPlayer].FirstName)
                {
                    UpdatePlayerStates();
                }
            }
            // Destroying the first empty item
            Destroy(playerListItem);
        }

现在我的问题是,克隆的项目总是在一个完全错误的位置,而不是我实际实例化它们。第一项(实际上是第二项,因为我删除了第一项,因为它是空的)始终具有 X/Y 位置:-420 (x) 和 -573 (y)

奇怪的是之后总是使用-130 y,所以下一项的X Position 和-703 与Y-Position 相同。

看来这是 vector3 函数的问题,因为当我删除它时,所有项目的位置都只有 0,0。我是不是用错了 Vector3 函数?

顺便说一下,我的 GameObjects 的 Rect Transform 看起来像这样:

而且 PlayerListItem 也是 PlayerList 的子项:

感谢任何帮助的人!

【问题讨论】:

  • 在循环的第二次迭代中。 Y 为 -130。所以是的。除非它是第一个项目。这就是它的产卵地
  • 我相信这里的问题是:为什么第二项是(-420,-573) 而不是(0,-130)
  • 没错。我希望第二个项目位于 0, -130,其他所有项目位于 0, y-130
  • 应该 new Vector3(0, y) 是 new Vector2(0, y) 吗?另外,也许您对孩子和相对位置有疑问。您的任何对象是其他对象的子对象吗?
  • @pseudoabdul vector2 做同样的事情。是的,PlayerListItem 是 PlayerList 的子项,我将更新我的初始帖子!

标签: c# visual-studio unity3d


【解决方案1】:

在实例化元素后尝试设置元素的位置。在为 UI 元素设置父级时,将 worldPositionStays 设置为 false 也是一个好主意。

var obj = Instantiate(prefab, Root, worldPositionStays: false);

您可能还需要使用anchoredPosition 而不是position

((RectTransform)obj.transform).anchoredPosition = new Vector2(x,y);

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多