如何在Unity的水平布局中将特定的孩子放在前面
Posted
技术标签:
【中文标题】如何在Unity的水平布局中将特定的孩子放在前面【英文标题】:How to bring a specific child on the front in horizontal layout in Unity 【发布时间】:2021-03-19 21:07:34 【问题描述】:所以基本上我有一手牌。这些卡片是游戏对象预制件,当我将其悬停时,它会放大并略微向上移动。但是当缩放它时,它会覆盖他左边的卡片并留在他右边的卡片后面,我希望这张卡片能越过卡片。
我试图改变 z 索引和层,但手上的所有卡片都由相同的水平布局统治......
我应该只在悬停的卡片的每一侧推动卡片吗?或者有人有办法在其他人面前画一个特定的孩子?
【问题讨论】:
【参考方案1】:您可以做的是动态添加一个新的 Canvas 到您想要在前面的对象,并覆盖排序:
在代码中,你可以这样做:
var newCanvas = yourGameObject.AddComponent<Canvas>();
newCanvas.overrideSorting = true;
newCanvas.sortingOrder = 1; // this has to be higher than order of parent 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);
// ...
【讨论】:
感谢您的回答,我尝试添加一个画布,但它似乎删除并中断了任何指针事件,您知道它的行为是否正确吗?也许我做错了?我的游戏对象有多个需要保持活动状态的指针事件,例如拖动卡片。我只希望对象显示在相同水平布局中的其他对象的前面。 嘿 Tanguy,很抱歉没有早点回复您。添加新画布时,您还需要添加新的 raycaster 以使事件正常工作。更新了答案以显示完整代码。希望对您有所帮助! 是的,我对 Unity 和 raycast 还很陌生……我应该知道这一点,但我非常感谢您的帮助,这正是我想要的行为!以上是关于如何在Unity的水平布局中将特定的孩子放在前面的主要内容,如果未能解决你的问题,请参考以下文章
如何在可扩展的listview android中将孩子添加到特定的父母