Unity Camera,ui和特效显示

Unity Camera的两种模式

Perspective【透视】,Orthographic【正交】
Unity Camera,ui和特效显示

正交Orthographic(无消失点投影)
  1. 无法判断距离

正交视图无法看到一个物体是远离自己还是正在我们面前。因为它不会根据距离收缩。所以如果你如果你画一个固定大小的物体在视点前面,同时画一个同样大小的物体在第一个物体的远后方,你无法说那个物体是第一个。因为两个都是一样的大小,根距离无关。他们不会随着距离而收缩。

  1. UI或2D游戏使用正交相机

通常我们在unity中制作2DUI,或是2D游戏的时候,就会把Camera的投射选择此项,例如NGUI的UICamera组件,默认的视图就是正交,还有2DTookit,也会把Main Camera的视图选择成正交。

透视Perspective(有消失点投影)

透视视图和我们从眼睛看到的视图是一样的。

  1. 例子:远小近大

一个高个子的人站在你面前,他看上去是很高的。但是如果这个高个子站在100米以外,他甚至还没有你的拇指大。他看上去会随着距离而缩小,但是我们实际上都知道,它依然是个高个子。这种效果叫做透视。

  1. 四个视角

这个在3D中经常用到,例如3D Max中几种不同的视图,而Unity的场景视图也有多种视角。例如更改Unity编辑器的布局方式,就会有四个不同的视角
Unity Camera,ui和特效显示
让物体远你近一点 如果你要让一个物体离你近一点,那么你需要把Z值调小,负数越大(Z值越小)就越在前面显示,同理当Z为正数(越大)就显示在后面

Canvas的渲染模式

在项目中经常会遇到粒子特效被UI遮盖的问题,要解决这个问题首先要知道为什么粒子系统不能显示在UI上。

原因是,Canvas的默认渲染模式是Screen-Overlay,也就意味着,Canvas在屏幕空间中渲染,会显示在场景的最上方,遮住除UI外的一切物体(粒子系统是在世界空间中渲染的,受摄像机影响)。此时Canvas的渲染不受Camera影响,场景中没有摄像机也能正常渲染。Canvas的大小随着分辨率和视口的改变而改变。

总结:此模式只适合单纯的UI开发,比如游戏的排行榜,游戏结束之后的界面,并且会自动适应屏幕大小,但是要注意,所谓的适应屏幕,不是说你把图片设置到摄像机所显示游戏的界面一样大,他就会自动适应。

所以我们要想让粒子特效显示到UI 前面,首先必须修改Canvas的渲染模式(Render Mode)。还有两种模式:Screen-Camera和World Space。

Screen-Camera模式下:需要给Canvas指定一个渲染摄像机,渲染的过程受摄像机的参数影响。此时Canvas相当于距离摄像机一定距离的一个Plane。UI大小和到摄像机的距离无关,而是随着摄像机的Field of View的变化而变化。还可以有透视/平视效果。 因为此时Canvas是距离摄像机一定距离的Plane,因此,如果有物体比这个Plane距离摄像机更近,就会显示在Canvas之上,反之,则显示在之下。 假如我们把粒子系统拖到Canvas下面,成为它的子物体,把Local Position归零,就可以看到粒子系统显示在UI之上了。把它的Z轴修改地距离摄像机更近一点当然也是可以的。(这样做,会把粒子系统的Transform变成RectTransform,不过这个对它的位置没有没有任何影响,只是表示方式变了而已)

总结:对于Order in Layer,可以理解为栈,先进去的后显示,后进去的先显示。也就是说,数值越大,就越靠前,这个模式需要单独的渲染摄像机,这也是大多数游戏所使用的渲染模式,如果游戏元素不多,可以把Main Camera设置为渲染相机,否则就单独创建一个相机用于渲染。

World Space模式下:Canvas就相当于场景中的一个Plane,只不过Canvas使用的依然是Rect Transform而不是Transform,一般不用这个模式。

粒子特效显示在UI上层的解决方法

首先,必须保证Canvas画布的渲染模式为了相机渲染

Unity Camera,ui和特效显示

方法:一:将需要控制UI显示层级的Image换成Sprite

1.创建一个粒子系统,和两张Sprite.

2.设置Sprite1的Order in Layer为 -1,设置Sprite1的Order in Layer为 1,粒子的Order in Layer成了 0,此时粒子夹在两张图片中间
Unity Camera,ui和特效显示
Unity Camera,ui和特效显示
Unity Camera,ui和特效显示

Unity Camera,ui和特效显示

方法二:在需要控制UI显示层级的Image上增加Canvas组件

如下图所示,同样实现了方法一的效果

Unity Camera,ui和特效显示
Unity Camera,ui和特效显示
Unity Camera,ui和特效显示

不过在实际的开发中,推荐使用方法一,方法二会带来更多的Drawcall以及渲染上的一些性能损耗。方法二慎用。方法一从实质上说等于把粒子特效剔除到UI层以外。

所以在unity 2D游戏上,最好不要把粒子特效放在UI上,还有一种方法,可以专门为粒子特效架设一个摄像机(实用3D游戏)。