如何在 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);
// ...
}
}
所以基本上我有一手牌。这些卡片是游戏对象预制件,当我将其中一张悬停时,它会变大并略微向上移动。但是当缩放时它与他左边的卡片重叠并留在他右边的卡片后面,我希望卡片能够越过卡片。
我尝试更改 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);
// ...
}
}