摘自:《游戏瞎折腾手记》https://zhuanlan.zhihu.com/p/157310749
在Unity中制作UI时,我们通常习惯于单独使用一个Camera来拍摄UI内容。
场景相机
UI相机
最终画面
这种制作方式有不少优点,比如避免了主场景相机的后处理效果可能会干涉UI内容等问题。
然而在Unity新出的URP(通用渲染管线)中,这一制作方法却有点问题。在相当长的一段时间内,LWRP/URP是无法像以前的内置渲染管线一样叠加Camera的。而后来,总算是可以了,但是操作方法与之前有所不同,故写文记录一下。
在URP中,Camera组件变成这样了
当我们直接把UICamera弄出来之后,我们会发现它的效果不符合预期。
这时候,我们需要手动多做几步:
首先,把UICamera的RenderType改成“Overlay
”
然后,把它添加到场景主相机的Stack中,
这样一来,我们就得到了符合预期的画面效果
更进一步
把UI相机手动添加到场景相机这个做法,足以应对大部分需求了。但是总觉得有点不舒服
于是去和小伙伴们讨论了一下,大概有两个思路:
思路一:全局只用一个Main Camera,由cinemachine来管理
思路二:没有什么事情是往上再摞一层不能解决的
首先我们搞个空的Camera,什么都不干,作为全局唯一的一个RenderType为Base的Camera,从游戏初始化的时候就直接DontDestroyOnLoad
,
然后UICamera和每个场景要用到的各种Camera都给放在这个Camera的Stack里面来。
那么,从代码里控制
实际上,即使在URP中,Camera还是那个Camera,UnityEngine.Camera
那个Camera. 什么stack啊、renderType啊都是没有的。
它们都在这里:
在URP中,没有Camera上都会附带一个这样的组件,位于命名空间UnityEngine.Rendering.Universal
我们也可以对Camera
组件使用扩展方法GetUniversalAdditionalCameraData
来获得到它
而那个Stack,就是它里面的一个List<>