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

使用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属性
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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);
        }
    }
}

最终效果

署名 - 非商业性使用 - 禁止演绎 4.0