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
亲测管用 还支持遮罩 非常方便

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值