关于UGUI RenderOrder不正确的问题

[Unity 5.3.4f1]

假设存在以下两个UI Root节点,他们分别设置了独立的Sort Order。NormalRoot对象上的Canvas的Sort Order设置为0,FixedRoot对象上的Canvas的Sort Order设置为250。因此本意在于FixedRoot下的UI可以遮盖NormalRoot下的UI:

关于UGUI RenderOrder不正确的问题_第1张图片
NormalRoot的Sort Order设置

关于UGUI RenderOrder不正确的问题_第2张图片
FixedRoot的Sort Order设置

  运行后却发现结果不是这样,NormalRoot下的MainMenu遮盖了位于FixedRoot下的TopBar:
关于UGUI RenderOrder不正确的问题_第3张图片

  很奇怪的现象,尝试后发现当把UIRoot隐藏再激活后,显示就正常了:
关于UGUI RenderOrder不正确的问题_第4张图片

  由于RenderOrder决定了UI的渲染顺序,因此在代码中打印各自的RenderOrder,发现确实NormalRoot的RenderOrder比FixedRoot的高,很明显,设置的Sort Order没有起效:

  当把UIRoot隐藏再激活后,再次打印各自的RenderOrder,发现正常了:

  这就让我猜测是不是更新顺序之类的问题导致的。我们知道,要使Sort Order起效,Canvas的Render Mode必须一致。启用Debug模式观察后发现子Canvas的RenderMode默认为World Space:
关于UGUI RenderOrder不正确的问题_第5张图片
子Canvas的RenderMode

而UIRoot上的Canvas的RenderMode我设置的是Screen Space - Overlay:
关于UGUI RenderOrder不正确的问题_第6张图片
UIRoot上的Canvas的RenderMode

  根据Unity的官方文档,说明如下:
  A single Canvas for all UI elements is sufficient but multiple Canvases in the scene is possible. It is also possible use nested Canvases, where one Canvas is placed as a child of another for optimization purposes. A nested Canvas uses the same Render Mode as its parent.
注意粗体部分,也就是说,子Canvas会使用父Canvas的RenderMode,那必然是在初始化时完成的,所以猜测的一种可能性是RenderOrder的更新在RenderMode设置之前,导致了RenderOrder的错误。因此手动尝试调整RenderMode为Screen Space - Overlay:
关于UGUI RenderOrder不正确的问题_第7张图片
手动调整NormalRoot上的Canvas的RenderMode为Screen Space - Overlay

  运行后,发现一切正常。

你可能感兴趣的:(关于UGUI RenderOrder不正确的问题)