心季是什么原因| 狗消化不良吃什么药| 看破红尘什么意思| 黄晓明的老婆叫什么名字| 常吃猪油有什么好处和坏处| 六月六日是什么日子| 为什么不建议吃大豆油| 玉米的种子是什么| 屁股胀痛什么原因| 房早是什么意思| 哀大莫过于心死是什么意思| 十三幺是什么意思| 干什么能挣钱快| 肺部感染吃什么药| 腰椎痛用什么药| 嘴唇干燥是什么原因引起的| 1953年属蛇的是什么命| 肠道功能紊乱吃什么药效果好| 心脏不舒服挂什么科室| 晕车吃什么药| 老汉推车是什么意思| 急性上呼吸道感染吃什么药| 尿酸高不能吃什么| 迪奥是什么意思| 小鸡啄米什么意思| 外感病是什么意思| 眼皮红肿是什么原因引起的| 小孩有口臭是什么原因引起的| 幽门梗阻是什么意思| 默契是什么意思| 淋巴细胞百分比低说明什么问题| 属猴男和什么属相最配| 金字旁加巨念什么| 胃气上逆有什么好的办法治疗| 做胃镜有什么好处| 给小孩办身份证需要什么| 国字脸适合什么发型| 空调除湿和制冷有什么区别| 12月11号是什么星座| 尾盘放量拉升意味着什么| 油价什么时候调整| 棺材一般用什么木头| 沙棘是什么植物| 为什么医院不用咳特灵| 腿疼膝盖疼是什么原因| 机器灵砍菜刀是什么意思| 梦见胎死腹中预示什么| 阿莫西林和头孢有什么区别| 放化疗是什么意思| 体重除以身高的平方是什么指数| 眼睛痒是什么原因| 俗气是什么意思| 阴离子是什么| 单纯疱疹病毒吃什么药| 为什么癌症治不好| 脖子疼是什么原因| 耍小聪明是什么意思| 跳舞有什么好处| 懵是什么意思| 梅子什么时候成熟| 高大上是什么意思| 枸橼酸西地那非片是什么药| 摧残是什么意思| 什么叫台风| 女性生活疼痛什么原因| 胸椎退行性变什么意思| 湿热体质适合喝什么茶| 华是什么意思| 遗精是什么原因引起的| 风湿热是什么病| 什么叫混合斑块| 房颤与早搏有什么区别| 三十年婚姻是什么婚| 飞机杯什么感觉| 茯苓不能和什么一起吃| 什么头什么耳| 胃酸分泌过多是什么原因造成的| 导演是干什么的| 十八罗汉是什么意思| notebook是什么意思| 舌头发麻看什么科| 射频消融术是什么意思| 小孩说话晚是什么原因| 毛峰茶属于什么茶| 手指抽筋是什么原因| 上海的市花是什么花| 什么头什么耳| 什么情况需要割包皮| 大舅哥是什么意思| 吃什么能缓解便秘| 不约而至是什么意思| 高反人群一般是什么人| wtf是什么意思| 梦见龙是什么意思| 20至30元什么烟最好抽| 老人嘴唇发紫是什么原因| 梦字五行属什么| 女人的胸长什么样| 腺肌症吃什么食物好| 蛇盘疮长什么样| 咩是什么意思| 43岁属什么| 从容面对是什么意思| 来大姨妈肚子疼是什么原因| mc是什么意思啊| 吐血拉血是什么病的症状| 梦见蛇挡路是什么意思| 巴旦木是什么树的果实| 促胃动力药什么时候吃| 儿童鼻窦炎吃什么药| 银杏叶提取物治什么病| 吃什么润肺养肺最快| 脚烧热是什么原因| 96100是什么电话| 白化病是一种什么病| 什么是正缘| 烽烟是什么意思| 今天忌什么宜什么| 锆石是什么| 敲木鱼是什么意思| 王的五行属性是什么| 什么叫脑白质病| 内分泌紊乱有什么症状表现| 白芷有什么作用与功效| 枸杞是补什么的| 阿迪耐克为什么那么贵| 支原体感染是什么意思| 高粱是什么颜色| 尿管型偏高是什么原因| 湿热吃什么药好| 6.29是什么星座| 豆瓣酱可以做什么菜| 男性脾大是什么原因| 划船是什么意思| 低压高什么原因| 阑尾炎挂什么科室| 首套房有什么优惠政策| 月经期适合吃什么食物| 公卿是什么意思| 吾子是什么意思| 什么桥下没有水脑筋急转弯| crp是什么检查项目| 桂花代表什么生肖| 玫瑰茄是什么东西| 调兵遣将是什么生肖| 一什么新闻| 血清铁蛋白是检查什么| 长一智的上一句是什么| 大逆不道什么意思| 女性私下有苦味主要是什么原因| 脚踝浮肿是什么原因| 胃胀气打嗝吃什么药| 一岁半宝宝反复发烧是什么原因| 香菜炒什么好吃| 唇炎应该挂什么科室| 二建什么时候考试| 7月15是什么节日| 叻叻是什么意思| 脑供血不足吃什么药效果好| 为什么牙龈老是出血| 株连九族是什么意思| 日本为什么侵华| 站台是什么意思| 今年是什么| 反复口腔溃疡是什么原因| 13是什么| 老放屁是什么情况| 复出是什么意思| 血糖仪h1是什么意思| 牙龈翻瓣术是什么意思| 去离子水是什么水| 邹的左边读什么| 什么运动可以瘦脸| 喉咙长期有痰是什么原因| 颈椎生理曲度变直是什么意思| 糖尿病人可以吃什么| 川贝是什么| 一周不排便是什么原因| 碳素笔是什么笔| 一厢情愿是什么生肖| lin是什么意思| 茶壶嘴为什么不能对着人| 有什么别有病| 什么药治痔疮最快| 维生素b6主治什么病| 颈动脉斑块吃什么药好| 嘿咻是什么意思| 苏州五行属什么| 光环是什么意思| 氧分压是什么意思| 1942年属什么生肖属相| 屎壳郎为什么要推粪球| 脑震荡是什么症状| 肝内小囊肿是什么意思| 柿子像什么| 弥补是什么意思| 额头上长斑是什么原因造成的| 捡尸是什么意思| 氟骨症是什么病| 什么的天安门| 耳朵发炎吃什么消炎药| 感冒鼻子不通气吃什么药| 湿疹是什么病的前兆| 沮丧是什么意思| 人大副主任是什么级别| 什么颜色最显白| 芭菲是什么| suv是什么意思| 牡丹什么时候开花| 看睾丸去医院挂什么科| 奥美拉唑有什么副作用| 什么茶刮油| 外感风热是什么意思| 信必可为什么轻微哮喘不能用| 羊肉不放什么调料| 女人出虚汗是什么原因引起的| 吃什么可以祛斑| 脾胃虚弱吃什么水果| 面霜和乳液有什么区别| 裸捐是什么意思| 亢奋是什么意思| 鸡粉是什么| 梦见摘菜是什么意思| 家里为什么有小飞虫| 1985年属什么生肖| 流鼻血挂什么科| 血热是什么意思| 美元长什么样子图片| 拜土地公时要念什么好| 手指甲没有月牙是什么原因| 舒张压偏高是什么原因| 完全性右束支阻滞是什么意思| 产检请假属于什么假| 眼睛疼是什么原因| 葡萄是什么季节的水果| 结扎后需要注意什么| 高铁服务员叫什么| 呕吐吃什么药| 女人喝劲酒有什么好处| 胆囊大是什么原因| 人出现幻觉是什么原因| 脸颊两侧长斑是什么原因怎么调理| 高圆圆老公叫什么名字| 小211是什么意思| cnv是什么意思| 什么是泥炭土| 孕前检查一般有什么项目| 两个日是什么字| 壮志凌云是什么生肖| usim卡是什么卡| ck香水属于什么档次| 中暑吃什么药好| 大是大非是什么意思| 香蕉与什么食物相克| pr医学上什么意思| 兰花长什么样| 术后吃什么刀口恢复得快| 不想长胡子有什么办法| 女性缺镁有什么症状| 什么减肥最快不反弹| 狐臭和腋臭有什么区别| 社保断了有什么影响| 吃什么药能冲开宫腔粘连| 头发沙发是什么意思| 百度

大山里的红瑶女童班(组图)

#算法先锋·半月创作挑战赛#
百度 由此,A股细胞结构与活跃程度都将出现积极性变化。

在这里插入图片描述


Unity Camera.cullingMask 使用指南:Layer 精准控制、XR 多视图与性能提升

关键词:Unity、Camera、Culling Mask、Layer 控制、XR 渲染分离、UI 显隐、性能优化


特别说明:
本文为近期项目所遇问题的总结,仅纯文字记录,截图不便分享。见谅!



业务故事:一场“UI 不该出现在眼镜里”的现场事故

“当你的UI界面在VR眼镜里挡住了用户视野,却在PC上毫无问题时,你会怎么做?”

一、故事起源:展厅演示的第一天

展馆模型真实还原,观众佩戴 VR 头显后,可漫游各个展区;同时,操作员在 PC 端可通过鼠标实时监控视角、触发高亮或切屏指令。

为了满足双端显示需求,我们配置了三台相机:

  • PC 主相机:渲染环境、UI、调试信息;
  • VR 头显相机:只渲染环境与玩家视角;
  • UI 专用相机:渲染所有 Canvas 元素,包含菜单、指南、调试层。

二、事故现场:UI “失控”现身

内部测试环境一切正常:PC 端界面完整,VR 端只见清爽的展示,无多余遮挡。
客户演示当天,他戴上头显,第一反应却是:“这 UI 是怎么回事?我眼前都是菜单,根本看不到展品!”

现场:

  • VR 端 UI 堆叠、遮挡用户视野;
  • 点击操作失效(实际上点击走的是 PC 相机);
  • 用户无法退出 UI,只能取下头显。

我们一看,果然:VR 相机和 UI 相机都在渲染相同的 UI Layer,“打包”给了头显。

三、初步排查与手动修复

打开 Unity Inspector,发现:

XRCamera.cullingMask = Everything
UICamera.cullingMask = Everything

两台相机都在渲染所有 Layer。
于是,测试人员反复手动:

  1. 取消 XRCamera 的 UI Layer;
  2. 勾选 UICamera 的 UI Layer;
  3. 切场景、切模式,效果断断续续,易出错;

手动操作效率低,且在频繁切换场景时容易遗漏。

四、团队决策:封装一键Layer控制工具

为避免 “手动取消勾选” 的痛苦,我们决定封装一个可复用一键切换的 Culling Mask 控制组件,满足:

  • 只渲染指定 Layer
  • 恢复渲染所有 Layer
  • 回退到上一次状态
  • 自动识别 Camera.main
  • 支持多 Layer 名称输入

一旦写出工具,任何相机都可在 Inspector 或运行时,通过简短代码切换渲染范围。


上述故事纯属虚构,下面开始正文。


技术实践指南:Unity 相机 Culling Mask 控制

1. 背景与动机

在 Unity 项目开发中,尤其是涉及 多层级 UI 管理、XR/VR 分视图渲染、动态视角切换与性能调试 时,我们经常需要灵活控制相机渲染对象的范围。

本质上,我们希望控制:某个 Camera 渲染哪些 Layer

常见应用如:

  • XR 项目中:仅 PC 屏幕显示 UI,VR 头显中不显示;
  • Portal 或多视角切换场景:主相机与子视角相机渲染不同对象;
  • 开发调试模式:仅在 Debug 模式下显示 Gizmo 层;
  • 镜头特效系统:仅渲染特定对象做后处理。

这些都离不开对 Unity 相机的 Culling Mask 的精细控制。

2. Culling Mask 原理解析

2.1 定义

Unity 中的每个 Camera 都有一个 Culling Mask 属性,它是一个 32 位的位掩码(bitmask),用于表示该相机应该 “看到” 哪些 Layer。

Camera.cullingMask: int → 每一位代表一个 Layer(最多支持 32 个)
2.2 示例代码
// 只显示 UI 层
camera.cullingMask = 1 << LayerMask.NameToLayer("UI");

// 同时显示多个层(使用按位或)
camera.cullingMask = (1 << Layer1) | (1 << Layer2);

// 使用 LayerMask 工具方法
camera.cullingMask = LayerMask.GetMask("Default", "UI", "GuideLayer");

3. 实现目标与功能设计

我们封装一个组件 CameraCullingMaskController,具备以下功能:

方法名功能描述
`ApplyLayersOnly("UIDefault")`仅显示指定 Layer(多个以“”分隔)
RestoreEverything()恢复显示所有 Layer(即 LayerMask.All)
RestoreOriginal()回退到上一次设置前的原始状态
3.1 设计要求
  • 可自动识别并使用 Camera.main
  • 支持传入多个 Layer 名;
  • Layer 合法性校验与报错提示;
  • 可扩展性好,便于嵌入 XR 项目。

4. 完整脚本实现

using UnityEngine;

namespace XRCoreRuntime.Runtime.Component
{
    /// <summary>
    /// 控制 Camera 的 CullingMask 显示特定 Layer 或恢复状态
    /// </summary>
    public class CameraCullingMaskController : MonoBehaviour
    {
        [Header("指定相机,未指定则使用 Camera.main")]
        public Camera? mainCam;

        private int originalCullingMask;

        public void ApplyLayersOnly(string targetLayers)
        {
            if (string.IsNullOrEmpty(targetLayers)) {
                Debug.LogWarning("传入的 Layer 字符串为空!");
                return;
            }

            mainCam ??= Camera.main;
            if (mainCam == null) {
                Debug.LogWarning("Camera 未找到!");
                return;
            }

            originalCullingMask = mainCam.cullingMask;

            var names = targetLayers.Split('|');
            int mask = 0;

            foreach (var name in names)
            {
                int layer = LayerMask.NameToLayer(name.Trim());
                if (layer == -1)
                {
                    Debug.LogError($"Layer \"{name}\" 不存在!");
                    continue;
                }
                mask |= 1 << layer;
            }

            if (mask == 0)
            {
                Debug.LogWarning("未能解析出有效 Layer!");
                return;
            }

            mainCam.cullingMask = mask;
        }

        public void RestoreEverything()
        {
            mainCam ??= Camera.main;
            if (mainCam != null)
                mainCam.cullingMask = ~0;
        }

        public void RestoreOriginal()
        {
            mainCam ??= Camera.main;
            if (mainCam != null)
                mainCam.cullingMask = originalCullingMask;
        }
    }
}

5. 示例调用与调试方法

5.1 示例代码
var ctrl = GetComponent<CameraCullingMaskController>();

// 显示 UI 和 GuideLayer
ctrl.ApplyLayersOnly("UI|GuideLayer");

// 恢复所有
ctrl.RestoreEverything();

// 回退到原状态
ctrl.RestoreOriginal();
5.2 编辑器拓展建议

可通过 CustomEditor 创建按钮,直接点击控制:

@startuml
actor Developer
participant InspectorButton
participant CameraCullingMaskController

Developer -> InspectorButton : 点击 "显示 UI"
InspectorButton -> CameraCullingMaskController : ApplyLayersOnly("UI")

Developer -> InspectorButton : 点击 "恢复全部"
InspectorButton -> CameraCullingMaskController : RestoreEverything()
@enduml

6. 应用场景分析

6.1 XR 项目中 UI 分离显示

场景:希望 UI 仅显示在 PC 上,头显中不显示。

做法

// VR 主相机只渲染环境与默认层
ctrl.ApplyLayersOnly("Environment|Default");
// UI 相机只渲染 UI
ctrl.ApplyLayersOnly("UI");
6.2 开发调试隔离

将调试工具放入 DebugLayer,仅调试时开启:

ctrl.ApplyLayersOnly("Default|DebugLayer");
6.3 Portal 镜头或切换效果

用多台 Camera 渲染不同视角,组合效果类似:

主相机:环境 + 玩家
镜头相机:仅渲染特效层

7. 扩展功能建议

7.1 支持 LayerMask 类型参数

ApplyLayersOnly(string) 改为 ApplyLayersOnly(LayerMask mask),便于在编辑器中使用 MaskField

7.2 添加排除层功能

增加方法:

public void ApplyExcludeLayers(string excludeLayers);

使用位操作方式:

mainCam.cullingMask = ~LayerMask.GetMask("Debug", "UI");

8. 总结与最佳实践

本文从业务事故切入,结合实际项目需求,详尽讲解了 Unity 中相机 Culling Mask 的使用方法。通过封装 CameraCullingMaskController,实现了:

  • 动态 Layer 渲染控制;
  • UI 显示隔离;
  • XR 多视图调度;
  • Portal 场景优化;
  • 性能剔除带来的帧率提升。

技术的价值在于解决实际问题。
下次再遇到“UI 不该出现在眼镜里”的烦恼时,试试这套工具,让每个相机都“只看”自己应该看的内容。

9. 参考资料



从最初的“UI 失灵”到完整的 Culling Mask 控制方案,我们体会到:

一行代码的变化,能让整个系统更加健壮、可维护,也让开发效率成倍提升。

希望这篇文章,既让你在项目演示不再手忙脚乱,也为日后更复杂的多相机、多视图场景打下坚实基础。

评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EQ-雪梨蛋花汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
什么是扦插 大腿肌肉跳动是什么原因 什么样的人不能献血 嘎嘎嘎是什么意思 fresh是什么意思
孔子姓什么名什么 onemore是什么牌子 浊是什么意思 为什么会牙痛 愚昧什么意思
118代表什么意思 王林为什么叫王麻子 吃善存片有什么好处 黄疸是什么意思 舌头发麻看什么科
大小便失禁是什么意思 bf是什么 颈椎挂什么科室 务农是什么意思 痱子是什么样的图片
肚子疼应该挂什么科bjhyzcsm.com 什么水果败火hcv8jop9ns5r.cn 血清谷丙转氨酶偏高是什么意思hcv8jop7ns3r.cn 黄痰是什么原因hcv9jop1ns3r.cn 霉菌有什么症状hcv8jop3ns1r.cn
宫腔镜是什么手术helloaicloud.com 嗤之以鼻是什么意思wmyky.com 福建岩茶属于什么茶hcv9jop5ns7r.cn 白鱼又叫什么鱼hcv8jop4ns2r.cn 暗物质是什么东西hcv8jop3ns6r.cn
婴儿为什么戴银不戴金hcv9jop3ns8r.cn 依山傍水是什么意思shenchushe.com 99朵玫瑰花代表什么travellingsim.com 胃火旺喝什么茶hcv9jop1ns2r.cn 倒霉是什么意思hcv8jop0ns7r.cn
ad滴剂什么时候吃最好hcv9jop4ns0r.cn 梦见豹子是什么预兆jasonfriends.com 什么有助于睡眠hcv7jop9ns0r.cn 冰糖里面为什么有白线mmeoe.com 脾虚是什么意思hcv7jop5ns0r.cn
百度