UI和3D物体之间的叠层问题

ui可以添加canvas并设置overrideSorting和sortingOrder,如果需要交互需要添加GraphicRaycaster组件

3d物体需要修改MeshRenderer的sortingOrder属性。

再利用好深度可以很好的处理好这种叠层的问题,规划好sortingOrder


using UnityEngine;
using UnityEngine.UI;
using Frame.Runtime.UI;

public class SortOrderSet : UIMonoViewComponent
{
    [SerializeField]
    private int SortOrder = 0;

    [SerializeField]
    private int m_UISortOrder = 0;
    [SerializeField]
    private int m_RenderSortOrder = 0;

    public void SetUISortOrder(int order, bool raycast = true )
    {
        Canvas canvas = GetComponent<Canvas>();
        if (canvas == null)
        {
            canvas = gameObject.AddComponent<Canvas>();
        }

        GraphicRaycaster gr = GetComponent<GraphicRaycaster>();
        if (raycast)
        {
            if (gr == null)
            {
                gameObject.AddComponent<GraphicRaycaster>();
            }
        }
        else
        {
            if (gr != null)
            {
                DestroyImmediate(gr);
            }
        }

        m_UISortOrder = order;
        canvas.overrideSorting = true;
        canvas.sortingOrder = m_UISortOrder;
    }

    public void SetRenderSortOrder(int order)
    {
        m_RenderSortOrder = order;
        foreach (var render in transform.GetComponentsInChildren<MeshRenderer>(true))
        {
            render.sortingOrder = m_RenderSortOrder;
        }
    }
}



首页 我的博客
粤ICP备17103704号