我正在尝试为库存系统中的UI元素设置游戏对象位置,但UI变换的恶劣本性再次让这变成了一场噩梦。这不是我预期的代码,而是我为实验拼凑的一些代码。它让我感到困惑。

GameObject newGearIcon = Instantiate(gearIconPrefab);

newGearIcon.transform.SetParent(gearSlots[index].transform);
newGearIcon.transform.localPosition = Vector3.zero; // 居中在库存格子上
newGearIcon.transform.localScale = new(1, 1, 1); 
// 此时 transform.position ≈ (3.5, -3)

Vector3 globalPosition = newGearIcon.transform.position; // ≈ (3.5, -3)

newGearIcon.transform.SetParent(gearSlots[index + 1].transform, true); 
// 稍微偏右于原来的位置
// local position = (0, 0),global position 仍然 = (3.5, -3),尽管新对象
// 在视觉上居中于第二个格子。全局位置相同,局部位置相同,
// 但图像在游戏中移动了。

newGearIcon.transform.position = globalPosition;
// 这完全没起作用。它已经等于那个值了。

你可以看到我实例化了一个对象,将其父级设置为另一个UI元素,并使其居中。注意,向SetParent()调用传递true似乎对此问题没有任何作用。

我遇到这个问题是因为我注意到当将父级更改为UI元素根部的画布时,对象发生了移动。无论SetParent()中的参数如何,或者更改、更新、存储全局位置以将其重置为父级前的值,都不起作用。

有人对这个行为有潜在见解吗?我尝试了枢轴/中心模式。我检查了对象的枢轴。我尝试了不同的值。据我所知,transform.positiontransform.localPosition都相对于我似乎找不到的另一个值。

这一切之所以出现,是因为我还注意到OnDrop只有在拖放到层级结构更下方的UI元素上时才会触发,这意味着图标需要位于它们所居中的元素之上才能正确移动。Unity UI从未让人失望过。

编辑:格式化,之前用``表示代码段……