如何在 Unity 的水平布局中将特定的 child 置于最前面

How to bring a specific child on the front in horizontal layout in Unity

所以基本上我有一手牌。这些卡片是游戏对象预制件,当我将其中一张悬停时,它会变大并略微向上移动。但是当缩放时它与他左边的卡片重叠并留在他右边的卡片后面,我希望卡片能够越过卡片。

我尝试更改 z 索引和图层,但手上的所有卡片都由相同的水平布局统治...

我是否应该将卡片推到悬停的卡片的每一侧?或者有人有办法在其他人面前画一个特定的 child 吗?

你可以做的是动态添加一个新的 Canvas 到你想要放在前面的对象,并覆盖排序:

在代码中,你可以这样做:

var newCanvas = yourGameObject.AddComponent<Canvas>();
newCanvas.overrideSorting = true;
newCanvas.sortingOrder = 1; // this has to be higher than order of parent canvas

当然你应该记得在不再需要时删除它canvas。

编辑:使用我验证有效的完整代码更新了解决方案。我错过的是将 raycaster 添加到新的 canvas。这是完整代码:

public class YourClass : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler
{
    private Canvas tempCanvas;
    private GraphicRaycaster tempRaycaster;

    public void OnPointerEnter(PointerEventData eventData)
    {
        // add and configure necessary components
        tempCanvas = gameObject.AddComponent<Canvas>();
        tempCanvas.overrideSorting = true;
        tempCanvas.sortingOrder = 1;
        tempRaycaster = gameObject.AddComponent<GraphicRaycaster>();
        
        // your operations on the object
        transform.localScale = new Vector2(1.1f, 1.1f);
        // ...
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        // remove components that are not needed anymore
        Destroy(tempRaycaster);
        Destroy(tempCanvas);
        
        // your operations on the object
        transform.localScale = new Vector2(1f, 1f);
        // ...
    }
}