直接看代码简单明了:
public class UIDepth : MonoBehaviour
{
public int order;
public bool isUI = true;
void Start()
{
if (isUI)
{
Canvas canvas = this.GetComponent<Canvas>();
if( canvas == null){
canvas = this.gameObject.AddComponent<Canvas>();
this.gameObject.AddComponent<GraphicRaycaster>();
}
canvas.overrideSorting = true;
canvas.sortingOrder = order;
}
else
{
Renderer[] renders = this.GetComponentsInChildren<Renderer>(true);
foreach (Renderer renderer in renders)
{
renderer.sortingOrder = order;
}
}
}
挂载到GameObject上,运行时根据order控制绘制次序。
如果是针对ui控制次序,我们就动态添加Canvas并且设置sortingOrder和GraphicRaycaster。一个是控制绘制次序,一个是让这个canvas组件可以接受事件。ui默认在default layer的order都是0。
如果是模型或是粒子,统一获得Renderer对象来设置sortingOrder。粒子系统的renderer默认是在default layer的order也是0。
首先是layer的绘制顺序,同layer就是sortingOrder的绘制顺序,同sortingOrder然后就是ugui自己的绘制顺序就是节点在场景里的顺序,粒子和模型的自己顺序是依靠position z来控制的。这里设置的order会直接影响sortingOrder,组件的绘制顺序。
ui我们最好以窗口作为单位,来设定一个整体的order,然后内部依然利用ugui自己的规则排序。一个窗口内部的粒子和模型需要和这个窗口order一致才能正确显示。不同的窗口不同的次序,这样可以正确的区分每个窗口的层级和里面包含的粒子与模型顺序。