首页 > 解决方案 > Unity2D:实例化的对象总是在错误的位置

问题描述

我有一个名为“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 变换看起来像这样:

播放器列表

在此处输入图像描述

PlayerListItem 也是 PlayerList 的子项:

结构体

感谢任何帮助的人!

标签: c#visual-studiounity3d

解决方案


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

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

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

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

推荐阅读