2015-07-14 08:23:51 yuechuzhao 阅读数 13135

其实3D物体基本不用考虑渲染顺序问题,但是在纯2D以及3D和2D混杂的情况下就要考虑这个问题了。比如2D游戏当中的游戏场景,UI,UI特效,场景内特效。那么,使用一个统一的渲染顺序显然是有必要的。

事实上这个问题unity3d自身已经提供了解决方案。

http://docs.unity3d.com/ScriptReference/Renderer.html

我们可以看到,所有的Renderer组件都具备两个成员。

sortingLayerName Name of the Renderer's sorting layer.
sortingOrder Renderer's order within a sorting layer.
在Unity3D当中,最优先的渲染顺序是Camera的Depth。然后才是使用sortlayerName和sortingOrder。事实上还可以使用shader来控制RenderQueque,不过现在我们可以不需要使用如此复杂的方式。


我们可以对所有的2D物体(以及需要统一渲染顺序的3D物体,以及粒子特效)使用同一个depth的相机(同一个相机也行)来进行渲染。然后对这些物体的sortLayer和sortingOrder进行设置。大部分的物件,包括粒子在内,都可以直接在inspector上设置这两个属性(unity5里面增加了设置)。

如果无法设置,请在脚本当中通过GetComponent<Renderer>()这个方法来进行设值。当然,直接通过脚本来设置也是可以的。


这里面要特别说明的是,新uGUI系统的canvas,整个canvas下所有的UI都属于同一个渲染顺序,所以它们的sortlayer和sortingOrder是一样的。这点要特别注意。

2017-11-29 13:48:42 lwsas1 阅读数 1921

    今天做项目,做了一个UI界面,但是效果感觉很怪,本来作为背景图的iamge,结果蒙在了其他控件的上面。

    百思不得解,问了同事才知道,Unity的UI元素有渲染顺序的差异,后渲染的元素自然就会覆盖在上面。

   于是,调整了对象列表里的元素顺序,把背景图放在了前面,效果就达到了预期。

   这应该是个很小的细节,但如果不了解这个的话,可能会被卡很久。特意在此记录一下

2017-10-17 21:51:19 u010832643 阅读数 6455

0x00 写在前面
在使用unity3d开发游戏项目时,层级的问题往往伴随着UI的开发,而在引入了3D模型、粒子特效后,层级的问题就变得有些扑朔迷离了,甚至会牵扯到Unity的渲染顺序。本篇主要从UGUI的角度出发,浅析UGUI中影响层级的因素。后续会分析UI与3D对象,UI与粒子特效之间层级的关系。

0x01 影响层级的因素
前提条件:
- Camera-Clear Flags
- Canvas-Render Mode

影响层级的因素:

  • Camera
    • depth
  • Canvas
    • Hierarchy中的排列顺序
    • sorting layer
      • order in layer
  • Shader中的RenderQueue

0x02 Camera中的Clear Flags
skybox
屏幕上的空白处将会以以当前camera的skybox填充。
solid color
屏幕上的空白处将会以当前camera的background color填充。
Depth only
每次绘制前,只是清空深度缓冲区,但是并没有清空颜色缓冲区。(一般适用于多个camera的情况)
Don’t Clear
该模式不清除任何颜色或者深度缓存。每帧绘制在下一帧之上,造成涂片效果

camera的clear Flags选定Don’t Clear 或者 当我们只有一个camera时选定Depth only 会出现以下涂片效果:
涂片效果]

参考资料:https://docs.unity3d.com/Manual/class-Camera.html

0x03 Canvas的Render Mode
Render Mode主要用于定义UI如何渲染于屏幕之上。通常一个Scene只需一个Canvas即可,不过Canvas自身也是支持嵌套的,默认情况下,子Canvas与父Canvas的Render Mode保持一致。
Screen Space-Overlay
此模式下,Canvas会被缩放以适应屏幕,然后直接渲染到屏幕上,无需任何摄像机。屏幕尺寸或者分辨率改变了,UI会自动进行缩放,UI会覆盖所有其他摄像机的画面。
这里写图片描述
该模式下需要特别注意:Canvas需要放在Hierarchy所有元素的顶层,否则UI可能会从视图中消失。这是Unity内置的限制。
原文:Note: The Screen Space - Overlay canvas needs to be stored at the top level of the hierarchy. If this is not used then the UI may disappear from the view. This is a built-in limitation. Keep the Screen Space - Overlay canvas at the top level of the hierarchy to get expected results.


Screen Space-Camera
此模式下,Canvas会渲染于摄像机前面指定距离的一个平面上。UI在屏幕上的大小并不随此距离变化而变化(有点像正交投影)。场景中的物件可能与UI遮挡。
[图片-Camera]


World Space
此模式下,UI被看作是场景中的一个平面物体。UI此时可以不朝向Camera,其他场景中的物件除了可以与UI遮挡外,还可能与UI穿插。
[图片-World]
参考资料:https://docs.unity3d.com/Manual/class-Canvas.html

0x04 UI与3D物体
通常的游戏项目会采用两个Camera,一个UICamera用于绘制UI,一个GameCamera用于绘制游戏中的3D对象。这时候就引入了新的复杂度,多个Camera如何管理,又如何协同工作的问题。不考虑3DUI的普遍情况下,UI往往位于场景中的3D模型上方。
这里写图片描述

GameCamera的Depth = -1,Culling Mask为everything不进行剔除操作,ClearFlags的标志为skybox,表示空白的地方以天空盒填充。


这里写图片描述
UICamera的Depth = 0,Culling Mask为UI,UICamera嘛盯着UI就够了。Projection一般选Orthographic就好,选择PerspectiveUI可能会出现类似透视Camera下的旋转和扭曲等奇怪的现象。去除Audio Listener是为了避免unity中2 audio listeners的报错。


这里写图片描述
将Canvas的Render Mode设置为Screen Space-Camera。


最后的效果如图:
这里写图片描述

2016-12-14 10:31:29 beihuanlihe130 阅读数 4646

不同Canvas之间可以更改Canvas的SortOrder属性进行控制
在相同Canvas下,可以改变控件的SiblingIndex属性来进行控制

//myOrder的值越大,在Hirerachy面板中层次越靠后,显示越靠前(与SortOrder相同)
transform.SetSiblingIndex(myOrder);
2019-12-31 15:21:14 JohnBlu 阅读数 23

    Overlay的Canvas有个SortOrder的排序,这个只针对于所有OverlayCanvas之间的渲染排序,值越大渲染时机越晚。同时,OverlayCanvas的所有UI对象,都是覆盖在所有3D对象之上的(包括特效)。所以特效要在UI之上,那么UI必须在世界空间的Canvas画布节点下。
    针对于所有的非OverlayCanvas渲染对象,包括3D物体,影响它们渲染顺序有三个参数:SortingLayer、OrderInLayer、RenderQueue。并且3D/2D都遵循这套规则。
    1.首先就是RenderQueue2500天空盒的渲染顺序。在此之前为不透明物体渲染,在此之后为透明物体渲染,前者必然在后者之前渲染。
    2.在2500同一侧的时候,则优先比较SortingLayer(靠前的序列先渲染),其次比较OrderInLayer,再其次比较RenderQueue
    即为RenderQueue为OrderInLayer的细分,OrderInLayer为SortingLayer的细分。
    3.Ui不加任何材质默认的渲染顺序是Transparent(3000),内置的特效材质渲染顺序也都是3000
ps:
    1.任意Ui对象上可以添加Canvas组件来复写SortingLayer和OrderInLayer,但伴随着也需要添加GraphicRaycaster来响应触控(如果需要的话)
    2.canvas、particleSystem、以及某些renderer的子类在inspector面板上都是可直接设置SortingLayer、OrderInLayer,无法面板设置的Renderer代码也是可以设置的。

unity渲染顺序

阅读数 731

Unity UI嵌入3D模型

阅读数 1297

unity3d摄像机

阅读数 32575

Unity3D UGUI学习笔记

阅读数 482

没有更多推荐了,返回首页