Unity sortingOrder 特性

1.同一层 有一个image 和一个粒子 如果 sortingOrder 相同,那么粒子 在image的下面 会被image遮挡 和显示列表顺序无关

2.父的 sortingOrder 会影响所有的child, 除非child设置了sortingOrder
也就是说 如果父有 sortingOrder ,child 没设置sortingOrder 那么child的sortingOrder 和父的保持一致。
粒子因为自带sortingOrder 所以 他不受父的 sortingOrder 影响 是几就是几
如果粒子里面再放一个image呢?
这个image 和 粒子的 sortingOrder 没有任何关系,image和最近的canvas上的 sortingOrder 保持一致
说白了 粒子就完全是单独的一套 image走自己的一套

3.有意思的现象 以前开发h5游戏 两个sprite 的 child 之间是不可能穿插的 ,
现在好了 只要设置对了sortingOrder 两个sprite的child 可以穿插显示 非常好玩。

做UI的时候排序非常烦 因为一般会把ui分层
写了一个自动排序类
他会给自己的孩子排序 完全按照显示列表显示

using UnityEngine;

[ExecuteAlways]
public class SortChildSortingOrder : MonoBehaviour
{
    //type = 1 给child排序 都比本身低 显示顺序和显示列表保持一致
    public int m_SortType = 1;
    /*
    * 相对于 最近的父级 的偏移
    */
    public int m_BaseParentSortIndex = 0;

    private void OnEnable()
    {
        int parentSortingOrder = GetParentSortingOrder(transform);
        if (parentSortingOrder == int.MinValue)
        {
            return;
        }
        this.SetSortingOrder(transform, parentSortingOrder + m_BaseParentSortIndex);
        if (m_SortType == 1)
        {
            int sortingIndex = this.GetSortingOrder(transform);
            int count = transform.childCount;
            for (var i = 0; i < count; i++)
            {
                var child = transform.GetChild(count - i - 1);
                var have = this.SetSortingOrder(child, sortingIndex - 1);
                if (have)
                {
                    sortingIndex--;
                }
            }
        }
    }

    private int GetParentSortingOrder(Transform transform)
    {
        int max = 0;
        Transform target = transform;
        while (true)
        {
            target = target.parent;
            int sortingOrder = this.GetSortingOrder(target);
            if (sortingOrder != int.MinValue)
            {
                return sortingOrder;
            }
            max++;
            if (max >= 10)
            {
                return int.MinValue;
            }
        }
    }

    bool SetSortingOrder(Transform child, int sortingIndex)
    {
        Canvas canvas = child.GetComponent<Canvas>();
        if (canvas != null)
        {
            canvas.sortingOrder = sortingIndex;
            return true;
        }
        Renderer renderer = child.GetComponent<Renderer>();
        if (renderer != null)
        {
            renderer.sortingOrder = sortingIndex;
            return true;
        }
        return false;
    }

    int GetSortingOrder(Transform child)
    {
        Canvas canvas = child.GetComponent<Canvas>();
        if (canvas != null)
        {
            return canvas.sortingOrder;
        }
        Renderer renderer = child.GetComponent<Renderer>();
        if (renderer != null)
        {
            return renderer.sortingOrder;
        }
        return int.MinValue;
    }
}

如果实在懒得排序 就得把粒子转换为ugui
https://github.com/mob-sakai/ParticleEffectForUGUI
亲测管用 还支持遮罩 非常方便

你可能感兴趣的:(游戏开发,unity,ui,c#)