
1. 项目概述Unity光系统入门与核心价值如果你刚开始接触Unity或者已经做了一些小Demo但总觉得场景里的物体看起来“假假的”、“平平的”那问题大概率出在“光”上。Unity的光系统远不止是放几个灯泡那么简单。它是一套模拟真实世界光照物理的复杂规则集合直接决定了你场景的视觉品质、氛围感和沉浸感。无论是清晨森林里穿过树叶的斑驳光影还是午夜都市霓虹灯下的赛博朋克感亦或是室内温馨的台灯光晕都离不开对光系统的深入理解和巧妙运用。我刚开始学Unity时也在这个环节踩过不少坑。比如明明打了光物体却还是黑的或者场景一运行光照效果和编辑器里预览的完全不一样。这些问题的根源往往是对Unity光系统的工作原理一知半解。今天我就结合自己多年的项目经验把Unity光系统从基础到进阶的核心要点掰开揉碎了讲给你听。这不仅仅是“唐老狮”课程笔记的整理更是融合了大量实战踩坑经验后的深度解读。无论你是想做出更真实的游戏场景还是为VR/AR应用打造沉浸式体验掌握光系统都是你从“能用Unity”到“用好Unity”的关键一步。2. Unity光系统核心组件深度解析Unity的光系统主要由几个核心组件构成光源Light、反射探针Reflection Probe、光照探针Light Probe以及全局光照Global Illumination, GI和光照贴图Lightmap。理解它们各自的作用和协作方式是驾驭光系统的第一步。2.1 四大光源类型及其应用场景在Hierarchy中右键 - Light你会看到四种主要的光源类型。选对类型事半功倍。方向光Directional Light这是最常用也最容易被误解的光源。它模拟的是无限远处的平行光比如太阳。它的特性是无论你把它放在场景的哪个位置它的照射方向和强度在整个场景中都是均匀一致的。这意味着移动它的Transform位置是无效的你只需要调整它的旋转Rotation来控制太阳的方位如早晨、正午、黄昏。它的阴影是平行投影非常适合用于户外场景的主光源。一个常见的误区是在室内场景也滥用方向光这会导致光照缺乏层次感因为真实的室内光线是有明确来源如窗户、灯具并随距离衰减的。点光源Point Light像一个灯泡从空间中的一个点向所有方向均匀发射光线。它的光照强度会随着距离的增加而衰减默认是平方反比衰减符合物理规律。你需要通过调整Range范围和Intensity强度来控制它的影响区域和亮度。点光源会计算逐像素的阴影如果开启阴影性能开销相对较大。它非常适合用于台灯、蜡烛、魔法光球等局部照明。聚光灯Spot Light像手电筒或舞台追光灯从一个点向一个圆锥形区域内发射光线。除了Range和Intensity你还需要关注Spot Angle锥角它决定了光束的宽窄。聚光灯的光照和阴影衰减计算更为复杂性能开销是三种实时光源中最大的。但它能创造出极具戏剧性的效果比如隧道尽头的亮光、探照灯、车头灯等。区域光Area Light这是一个特殊的光源它不是一个点而是一个平面矩形或圆形。区域光无法用于实时照明它仅用于烘焙光照贴图Baked GI。它的光线从整个表面发出能产生非常柔和、自然的阴影和过渡模拟的是灯箱、窗户、霓虹灯牌等大面积发光体带来的光照效果。在编辑器场景中它以一个带箭头的线框平面显示运行时不可见。实操心得在项目初期规划阶段就要想清楚哪些光必须是实时的比如玩家手持的火把、可开关的电灯哪些光是可以烘焙的比如静态的建筑环境光。实时光源动态效果好但费性能烘焙光源效果稳定且性能零开销但无法动态变化。混合使用是王道。2.2 光源属性详解不止是亮和暗选中一个光源在Inspector面板中会看到一系列属性。掌握它们你才能进行精细调控。Type光源类型如上所述可随时切换。Color光的颜色。不要只使用纯白色黄昏的阳光可以偏橙黄阴天的天光可以偏蓝水下可以偏青绿。颜色是营造氛围最快的手段。Mode这是至关重要的一个设置决定了光源的计算方式。Realtime完全实时计算。每一帧该光源都会对场景中所有受光物体进行光照计算。动态物体和静态物体都能被照亮。性能开销最大。Mixed混合模式。这是Unity的“智能”模式。对于标记为Static的静态物体该光源的光照和阴影会被烘焙到光照贴图中成为烘焙光。对于动态物体非Static该光源仍作为实时光源起作用。这是兼顾效果与性能最常用的模式尤其适用于那些本身是静态如墙壁、地板但又需要影响动态物体如玩家、敌人的光源比如静态的街灯。Baked完全烘焙模式。该光源的光照和阴影仅烘焙到光照贴图中。运行时该光源组件虽然存在但不参与任何实时光照计算对动态物体无任何影响。性能开销为零适用于完全静态的环境光。Intensity光照强度。方向光通常用较高的值如0.5-1.5点光源和聚光灯根据模拟的灯泡瓦数来定如100瓦灯泡可能设为5-10。Indirect Multiplier间接光倍增系数。当使用全局光照GI时光线会在物体间反弹。这个系数控制该光源产生的间接光照反弹光的强度。调高它可以让颜色在场景中“弥漫”开来增强氛围但过高会显得不自然。Shadow Type阴影类型。这是让场景“立”起来的关键。No Shadows无阴影。快但物体看起来会漂浮在空中。Hard Shadows硬阴影。边缘锐利计算较快但看起来比较“计算机图形学”。Soft Shadows软阴影。边缘有柔和的过渡更接近真实世界因为光源有大小不是理想的点。视觉效果更好但性能开销也更大。对于方向光你还可以选择Soft Shadows下的Cascaded Shadow Maps这是解决远处阴影闪烁和精度问题的关键技术。2.3 全局光照GI与光照贴图静态美的基石全局光照Global Illumination模拟的是光线在场景中多次反弹的物理现象。比如红色的墙壁会将红色的光反射到旁边的白色地板上使地板染上淡淡的红色。这种效果靠几个实时光源是算不过来的除非你用路径追踪但那不是游戏实时渲染的范畴。Unity的GI解决方案主要依赖烘焙Baking。烘焙是一个预计算过程编辑器会模拟光线从所有Baked和Mixed模式的光源发出在场景中所有标记为Contribute GI的静态物体表面之间反弹最后将每个静态物体表面的最终光照信息颜色、亮度和阴影信息计算并存储到一张或多张图片上这就是光照贴图Lightmap。运行时引擎不再进行复杂的光照计算而是直接使用这些贴图来渲染静态物体从而实现极其复杂、真实且性能开销极低的间接光照和柔和阴影。如何启用和烘焙GI标记静态物体选中场景中不会移动的物体如地形、建筑、大型家具在Inspector右上角勾选Static复选框。这告诉Unity“这个物体参与光照烘焙计算”。打开光照面板Window - Rendering - Lighting(Unity旧版) 或Window - Rendering - Lighting Settings(URP/HDRP)。配置光照设置在Lighting Settings中确保Lightmapping Settings下的Lightmapper选择的是Enlighten旧版兼容或更先进的Progressive GPU (Preview)或Progressive CPU。后者速度更快质量更高是当前推荐选项。开始烘焙点击光照设置窗口底部的Generate Lighting按钮。这个过程可能需要几秒到几小时取决于场景复杂度、光照贴图分辨率等设置。烘焙时你可以看到场景视图中的静态物体逐渐被“绘制”上光照和阴影。避坑指南烘焙后场景变亮或变暗得离谱首先检查所有光源的Mode和Intensity。其次检查Lighting Settings中的Environment部分。Environment Lighting下的Source如果设为Skybox那么你的天空盒材质会为场景提供环境光一种均匀的、来自各个方向的基础光照。Environment Intensity控制其强度。Environment Reflections的Source也常设为Skybox它为反射探针提供默认的反射图像。调整这些参数对场景的整体明暗和色调影响巨大。3. 光照探针与反射探针照亮动态物体的魔法光照贴图虽好但它只对静态Static物体有效。你的玩家角色、敌人、可移动的箱子这些动态物体怎么办如果只用实时光源它们会显得与精心烘焙的静态环境格格不入仿佛是两个世界的东西。这时就需要光照探针Light Probe Group和反射探针Reflection Probe来弥合这个鸿沟。3.1 光照探针捕获并传递烘焙光给动态物体你可以把光照探针理解为在场景空间中放置的一系列“采样点”。在光照烘焙时Unity会计算这些点所在位置的光照信息颜色和强度。运行时当一个动态物体如角色移动时引擎会找到离它最近的几个光照探针并插值计算出该物体当前位置应该受到的环境光照然后将这个光照应用到物体上。如何设置光照探针GameObject - Light - Light Probe Group。这会在场景中创建一个包含8个默认探针点的组。在Scene视图中选中Light Probe Group你可以移动、复制CtrlD、删除单个的探针点。探针的密度和分布是关键。放置原则覆盖动态物体的活动区域在玩家行走的路径、战斗区域密集放置。光照变化剧烈的区域要加密比如门口室内暗室外亮、灯光下与阴影交界处。避免均匀网格应根据场景结构和光照情况有机分布在空旷无变化的地方可以稀疏在角落、遮挡处需要加密以捕捉细微的光影变化。放置好后必须重新点击Generate Lighting进行烘焙光照探针的数据才会被计算和保存。效果验证放置好探针并烘焙后创建一个新的Sphere动态物体在场景中拖动它。你会发现当它从明亮的室外区域移动到昏暗的室内角落时它的亮度会平滑地变化仿佛真的被环境光照亮一样。这就是光照探针在起作用。3.2 反射探针让动态物体也能反射环境类似地静态物体可以通过烘焙的光照贴图获得正确的环境反射如果材质有高光或金属度。但动态物体需要反射探针Reflection Probe来获取周围的反射图像。反射探针的工作方式是在它所在的位置向四周或一个设定的区域渲染一张立方体贴图Cubemap捕获周围的环境。然后附近的动态物体会根据自身的反射强度采样这张立方体贴图来模拟反射效果。如何设置反射探针GameObject - Light - Reflection Probe。关键属性Type:Baked烘焙型。只在烘焙光照时捕获一次环境运行时性能零开销。适用于静态环境。Realtime实时型。每一帧或按指定间隔刷新捕获的环境能反射动态物体比如移动的车辆但性能开销极大慎用。Custom自定义型。可以手动指定一张立方体贴图作为反射内容。Box Size / Box Offset定义探针捕获环境的区域范围。通常调整到一个房间或一个走廊的大小。Resolution立方体贴图的分辨率。分辨率越高反射越清晰性能开销和存储空间也越大。室内128或256通常足够重要的大厅或镜面反射可能需要512。放置策略和光照探针类似需要在环境发生显著变化的区域放置。例如每个风格不同的房间、室内外过渡处、有大量金属或玻璃材质的区域。对于大型开放场景可以使用多个Box Projection模式的探针它们能更好地处理局部反射。实操心得一个常见的优化技巧是对于大多数室内场景使用Baked反射探针就足够了。在光照烘焙时勾选Lighting Settings中Lightmapping Settings下的Baked Reflection Probes这样在烘焙光照贴图的同时也会自动烘焙所有Baked类型的反射探针一举两得。对于有镜面、水面等需要清晰反射动态物体的特殊情况再局部使用Realtime探针并将其Refresh Mode设为Every Frame或Via Scripting并严格控制其影响范围Box Size和更新频率。4. 光照烘焙实战流程与参数调优理解了原理我们来走一遍完整的光照烘焙流程并深入那些让人头疼的参数。4.1 标准烘焙工作流场景准备完成场景基础几何体的搭建并赋予初步材质。物体静态化选中所有确定不会移动的物体建筑、地形、固定植被标记为Static。光源布置与模式设置主方向光太阳通常设为Mixed模式以便为动态物体提供实时阴影。室内主要光源如顶灯根据需求设为Baked或Mixed。如果它需要影响动态角色用Mixed。装饰性光源壁灯、灯带通常设为Baked。放置探针在动态物体活动区域布置Light Probe Group在环境反射变化区域布置Reflection Probe类型先设为Baked。配置Lighting Settings打开光照设置窗口进行关键配置。首次快速烘焙将参数设为低质量如Lightmap分辨率设为20-40点击Generate Lighting进行快速预览检查整体明暗、阴影方向、漏光等问题。迭代调整与高质量烘焙根据预览结果调整光源强度、颜色、探针位置等。确认无误后提高烘焙质量参数进行最终烘焙。4.2 核心烘焙参数详解与避坑在Lighting Settings - Lightmapping Settings下一堆参数让人眼花缭乱。我们抓重点讲Lightmapper推荐Progressive GPU如果你的显卡支持。它比老的Enlighten更快、质量更高且支持更多现代功能。Lightmap Resolution最重要的参数之一单位是“每单位像素数”。它决定了光照贴图的精细度。值越高阴影和光照细节越清晰但贴图尺寸会呈平方级增长烘焙时间也暴增。室内场景建议50-80室外大场景建议10-30。可以先设低值预览。Lightmap Padding光照贴图中不同物体UV图表之间的间隔。防止烘焙后物体边缘的阴影或光照“渗色”到相邻物体上。默认2通常够用如果出现渗色可以增加到4-8。Lightmap Size单张光照贴图的最大尺寸如1024, 2048, 4096。Unity会自动将多个物体的光照信息打包到若干张这个尺寸的贴图上。场景复杂时可能需要提高此值或接受多张光照贴图。Compress Lightmaps压缩光照贴图以减少磁盘和内存占用但会引入轻微的色块。通常勾选除非对质量有极端要求。Ambient Occlusion环境光遮蔽AO。模拟物体缝隙、角落因难以接收到环境光而自然变暗的效果能极大增强物体的体积感和场景的真实性。务必勾选Baked Global Illumination下的Ambient Occlusion并调整Max DistanceAO影响的最大距离和Indirect Contribution间接光对AO的贡献强度。适当强度的AO是让场景脱离“塑料感”的神器。Directional Mode方向模式。选择Directional会生成第二张“方向性光照贴图”存储主要光照方向信息。这允许材质在法线贴图Normal Map的作用下对烘焙光照做出更真实的漫反射反应即“表面细节有正确的明暗变化”。效果更好但内存占用翻倍。对于注重细节的PC或主机游戏推荐使用对于移动端可评估性能后决定。常见问题排查实录问题1烘焙后出现奇怪的明暗条纹或像素块。这是典型的“UV重叠”或“UV拉伸”问题。选中出问题的静态物体在模型导入设置中检查其“光照贴图UV”Lightmap UVs。确保Generate Lightmap UVs已勾选并且Padding值足够建议至少2。对于自定义UV需要在3D建模软件中确保第二套UVUV2没有重叠且拉伸均匀。问题2动态物体在光照探针附近颜色闪烁或突变。原因是光照探针分布太稀疏或位置不当。加密动态物体路径上的探针确保任何位置都能被至少4个探针形成的四面体包围以便平滑插值。问题3烘焙时间过长。首先降低Lightmap Resolution和Lightmap Size进行预览。其次检查是否有不必要的超高面数物体被标记为Static。可以使用Occlusion Culling遮挡剔除来减少烘焙时需要计算的区域但注意遮挡剔除是运行时优化对烘焙计算量的优化有限。最根本的是优化场景将远处或不可见的细节合并或降低精度。问题4室内角落或物体接缝处有漏光Light Leak。增加Lightmap Padding。检查模型几何体是否严密闭合内部是否有面片穿插。有时需要返回3D软件修正模型。5. 现代渲染管线URP/HDRP下的光系统演进如果你使用的是Unity的Universal Render Pipeline (URP) 或 High Definition Render Pipeline (HDRP)光系统的基础概念不变但一些具体实现、功能和设置位置有所不同且通常更强大。5.1 URP下的光系统特点URP专注于跨平台性能和效率它对光系统做了一些简化和优化更简化的光源类型URP中区域光Area Light可能不被支持或者仅以简化形式存在。主要依赖方向光、点光源、聚光灯。内置的后处理与光照效果URP通过可堆叠的“Renderer Features”和“Volume”系统更容易地实现屏幕空间环境光遮蔽SSAO、屏幕空间反射SSR、Bloom辉光等效果这些效果与基础光照结合能快速提升画面质感。Shader Graph与光照交互在URP中你可以使用Shader Graph可视化地编写着色器并轻松访问URP内置的光照变量如Main Light Direction,Additional Lights实现自定义的光照模型这比内置管线灵活得多。光照设置的位置全局光照和烘焙设置现在主要集成在Lighting SettingsAsset和每个Light组件的属性中与内置管线逻辑相通但界面更现代。5.2 HDRP下的光系统特点HDRP面向高端平台追求电影级画质其光系统极其复杂和真实物理正确的光源单位HDRP中光源强度使用真实的物理单位如流明Lumen、勒克斯Lux、坎德拉Candelas。你需要根据真实世界的光源数据来设置例如一个100瓦的白炽灯大约1600流明。体积光与雾效HDRP原生支持高质量的体积光God Rays、体积雾光线在参与介质如空气中的尘埃、雾中的散射效果非常出色。屏幕空间全局光照SSGI与光线追踪Ray TracingHDRP提供了SSGI作为实时全局光照的近似方案效果远好于传统方法。如果硬件支持更能开启真正的光线追踪全局光照Ray Traced GI、光线追踪环境光遮蔽RTAO、光线追踪反射Ray Traced Reflections等实现以假乱真的光影效果。更复杂的光照模式与阴影支持区域光的实时近似矩形光、管状光阴影选项也更丰富包括基于距离的阴影贴图DSM等高级特性。迁移与选择建议如果你是从内置管线或URP转向HDRP需要做好心理准备几乎所有材质和光照都需要重新调整和烘焙因为渲染方程和物理参数完全不同。对于大多数移动端和PC独立游戏URP是平衡效果与性能的最佳选择。对于AAA级PC/主机游戏或建筑可视化、汽车渲染等高端应用HDRP是唯一的选择。6. 性能优化让光影在帧率允许下飞舞美丽的光影代价是性能。如何在效果和帧率间取得平衡实时光源数量是性能杀手严格控制同屏实时光源数量。URP通常建议同屏不超过4-8个重要的实时光源具体取决于平台和URP设置中的Additional Lights数量限制。使用烘焙光替代大多数静态光源。阴影优化尽可能使用烘焙阴影对于静态物体和静态光源阴影一定要烘焙到光照贴图中。减少实时阴影分辨率在Quality Settings中降低阴影贴图Shadow Map的分辨率。控制阴影距离在Light组件或Lighting Settings中设置Shadow Distance。超出此距离的物体将不投射实时阴影这对开放世界游戏至关重要。方向光使用级联阴影CSM合理设置级联数量和分割比例在近处使用高精度阴影远处使用低精度以平衡效果和性能。光照探针与反射探针优化数量最小化只在不-必要的区域放置探针。用脚本动态加载/卸载不同区域的探针组。分辨率最小化反射探针的分辨率能低则低。64x64用于模糊的环境反射128x128用于大多数情况只有特别重要的镜面反射才需要256或更高。更新频率实时反射探针绝不每帧更新使用On Awake或Via Scripting手动控制更新时机如玩家进入房间时。光照贴图优化合理设置分辨率如前所述根据物体大小和重要性差异化设置。可以通过Mesh Renderer组件上的Scale In Lightmap参数单独调整某个物体在光照贴图中的占比即分辨率倍率。重要的主体建筑可以设为1或2远处的小石头可以设为0.5甚至0.2。使用光照贴图压缩和格式使用ASTC或ETC2等压缩格式针对移动平台在Lighting Settings中启用压缩。利用遮挡剔除Occlusion Culling虽然主要优化绘制调用但被剔除的物体也不会参与实时光照计算间接提升了光照性能。光系统的学习是一个螺旋上升的过程。从学会打亮一个场景到理解烘焙与实时的区别再到熟练运用探针弥合动静物体的鸿沟最后能为了性能对光影效果做出精准的权衡。每一次参数调整后耐心的烘焙等待每一次解决漏光或阴影瑕疵的排查都是你向“技术美术”或“图形程序员”迈进的一步。记住最好的光照是让玩家感觉不到它的存在却又完全沉浸其中。开始动手吧从布置你场景中的第一盏有思想的灯开始。