栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity sortingOrder 特性

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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();
        if (canvas != null)
        {
            canvas.sortingOrder = sortingIndex;
            return true;
        }
        Renderer renderer = child.GetComponent();
        if (renderer != null)
        {
            renderer.sortingOrder = sortingIndex;
            return true;
        }
        return false;
    }

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902309.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号