Unity sortingOrder 特性

本文介绍了Unity中UI元素的排序规则,特别是粒子系统与image的显示层级关系。当sortingOrder相同,粒子会被image遮挡。同时,父物体的sortingOrder会影响子物体,除非子物体单独设置。作者提供了一个自动排序脚本,用于根据显示列表自动排序UI元素。此外,提到可以通过转换为UGUI粒子系统解决排序问题,并推荐了一个支持遮罩的UGUI粒子库。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值