封面

使用UGUI中的层级问题——以背包为例

UGUI的canvas默认层级是UI,Sorting order 是0,由于unity渲染物体时是从上到下直接渲染的,这就导致了渲染出来的效果和我们预期的不一致,因此必须设置层级,指定渲染的先后顺序(层级低的先渲染)才行。

想要实现的效果是有一个背包,背包里有道具,鼠标移上去之后出现一个框显示物品的详细信息,移开就消失。但是默认UI层级会把挡住

解决方案

  1. 在被挡住的UI上添加组件canvas,增大它的sorting order,但是坑爹的是:设置完后,层级的问题解决了,但是UI的所有事件被拦截(包括按钮的点击、UI拖拽等等)
  2. 给UI再设置一个组件Graphic RayCaster,完美解决,既可以显示特效,还不会遮挡UI。
  3. 至此有个问题,如果界面很多都需要设置上述的canvas,那就需要自己实现一个管理类,给每个ui设置它的order,不过canvas会影响合并批次,所以不能有太多,自己权衡。
  4. 给Item上挂一个脚本,实现IPointerEnterIPointerExit接口,分别对应设置Active属性
using UnityEngine;
using UnityEngine.EventSystems;

namespace UI
{
public class BagItem : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
private GameObject desc;


private void Awake()
{
desc = transform.Find("Desc").gameObject;
}

public void OnPointerEnter(PointerEventData eventData)
{
desc.SetActive(true);
}

public void OnPointerExit(PointerEventData eventData)
{
desc.SetActive(false);
}
}
}

最终效果

文章目录
  1. 1. 解决方案
  2. 2. 最终效果
twitter分享
Fork me on GitHub