如何在URP中让主相机忽略夜视相机的光源?
解决URP中夜视相机专属灯光的问题
为什么原内置管线脚本失效
URP采用统一的可脚本化渲染管线管理流程,MonoBehaviour的OnPreCull/OnPreRender等相机回调执行时机与内置管线差异极大,直接修改灯光启用状态无法在正确的渲染阶段生效,导致脚本失效。
简便解决方案:利用URP灯光剔除遮罩
这是无需代码的最优方案,直接通过URP的相机设置实现灯光的相机专属可见性:
- 创建一个专属层,例如命名为
NightVisionLight - 将你的夜视聚光灯的Layer设置为
NightVisionLight - 选中主相机,在Inspector面板的Universal Additional Camera Data组件中,找到Light Culling Mask选项,取消勾选
NightVisionLight层 - 选中夜视相机,同样在Light Culling Mask中勾选
NightVisionLight层
这样主相机将完全忽略该灯光,只有夜视相机才会渲染它的光照效果。
动态控制方案:RenderPipelineManager回调脚本
如果需要动态开启/关闭夜视灯光(比如按快捷键切换夜视),可以使用URP的全局渲染事件回调替代原脚本:
using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class NightVisionLightController : MonoBehaviour { [SerializeField] private Light nightVisionLight; [SerializeField] private Camera nightVisionCamera; private void OnEnable() { RenderPipelineManager.beginCameraRendering += ToggleLightOnCameraRender; RenderPipelineManager.endCameraRendering += ResetLightAfterRender; } private void OnDisable() { RenderPipelineManager.beginCameraRendering -= ToggleLightOnCameraRender; RenderPipelineManager.endCameraRendering -= ResetLightAfterRender; } private void ToggleLightOnCameraRender(ScriptableRenderContext context, Camera camera) { // 仅在渲染夜视相机时开启灯光 nightVisionLight.enabled = camera == nightVisionCamera; } private void ResetLightAfterRender(ScriptableRenderContext context, Camera camera) { // 渲染完毕后关闭灯光,避免影响后续相机渲染 if (camera == nightVisionCamera) { nightVisionLight.enabled = false; } } }
将此脚本挂载到任意GameObject上,指定对应的夜视灯光和相机即可。
补充:为何层遮罩原方法无效
你之前尝试的主相机剔除遮罩忽略灯光层无效,是因为URP中相机的常规剔除遮罩仅控制物体的可见性,不影响灯光。灯光的可见性由相机的Light Culling Mask和灯光自身的Culling Mask共同控制,这是URP与内置管线的核心差异之一。
内容的提问来源于stack exchange,提问作者WasTabon
相关产品推荐
相关产品推荐

