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