在Unity URP中使用UI相机

时间:2024-03-26 15:16:44

摘自:《游戏瞎折腾手记》https://zhuanlan.zhihu.com/p/157310749

在Unity中制作UI时,我们通常习惯于单独使用一个Camera来拍摄UI内容。

在Unity URP中使用UI相机

场景相机

在Unity URP中使用UI相机

UI相机

 

在Unity URP中使用UI相机

最终画面

这种制作方式有不少优点,比如避免了主场景相机的后处理效果可能会干涉UI内容等问题。

然而在Unity新出的URP(通用渲染管线)中,这一制作方法却有点问题。在相当长的一段时间内,LWRP/URP是无法像以前的内置渲染管线一样叠加Camera的。而后来,总算是可以了,但是操作方法与之前有所不同,故写文记录一下。


在URP中,Camera组件变成这样了

在Unity URP中使用UI相机

当我们直接把UICamera弄出来之后,我们会发现它的效果不符合预期。

在Unity URP中使用UI相机

这时候,我们需要手动多做几步:

首先,把UICamera的RenderType改成“Overlay

在Unity URP中使用UI相机

然后,把它添加到场景主相机的Stack中,

在Unity URP中使用UI相机

这样一来,我们就得到了符合预期的画面效果

在Unity URP中使用UI相机

更进一步

把UI相机手动添加到场景相机这个做法,足以应对大部分需求了。但是总觉得有点不舒服

在Unity URP中使用UI相机

于是去和小伙伴们讨论了一下,大概有两个思路:

思路一:全局只用一个Main Camera,由cinemachine来管理

思路二:没有什么事情是往上再摞一层不能解决的

首先我们搞个空的Camera,什么都不干,作为全局唯一的一个RenderType为Base的Camera,从游戏初始化的时候就直接DontDestroyOnLoad ,

然后UICamera和每个场景要用到的各种Camera都给放在这个Camera的Stack里面来。

在Unity URP中使用UI相机


那么,从代码里控制

实际上,即使在URP中,Camera还是那个Camera,UnityEngine.Camera那个Camera. 什么stack啊、renderType啊都是没有的。

它们都在这里:

在Unity URP中使用UI相机

在URP中,没有Camera上都会附带一个这样的组件,位于命名空间UnityEngine.Rendering.Universal

在Unity URP中使用UI相机

我们也可以对Camera组件使用扩展方法GetUniversalAdditionalCameraData来获得到它

在Unity URP中使用UI相机

而那个Stack,就是它里面的一个List<>

在Unity URP中使用UI相机