公司动态
Unity基础:Light灯光组件入门——Directional Light、Point Light与Spotlight
Unity基础Light灯光组件入门——Directional Light、Point Light与Spotlight大家好欢迎回到Unity教程系列。上一篇文章我们学习了Camera相机——它决定了玩家看到什么。今天我们要学习的是决定场景看起来怎么样的另一关键要素——Light灯光。灯光是游戏视觉的灵魂。同样的场景不同的灯光布置可以营造完全不同的氛围——明亮欢快的午后、阴森恐怖的黑夜、温暖舒适的室内。掌握了灯光你才能真正驾驭场景的氛围感。这篇文章将带你从零开始认识Unity的灯光系统。一、光照系统概述1.1 光照的重要性想象一下你精心建模的场景给所有物体贴上了高清纹理但如果灯光设置不当——太暗、太亮、阴影生硬、颜色不对——整个场景就会显得不对劲。反之即使使用简单的几何体和材质合理的光照也能让场景看起来非常舒适。在游戏开发中光照不仅影响视觉效果还直接影响性能。实时光照越复杂GPU的计算负担越重。因此理解光照原理并做出合理的取舍是游戏开发者的重要能力。1.2 Unity光照的三种模式Unity支持三种光照模式Realtime实时光照和阴影在每帧动态计算。支持动态物体但性能开销最大。适合移动的光源如角色身上的手电筒、移动的车辆灯光。Baked烘焙光照和阴影提前计算好并烘焙到光照贴图Lightmap中。运行时不需要重新计算性能最优。但只能用于标记为Static静态的物体且光源位置不能改变。Mixed混合结合了实时和烘焙的优点。静态物体使用烘焙光照动态物体使用实时光照。 对于移动平台游戏尽可能多地使用Baked光照是最重要的性能优化手段之一。二、Directional Light——平行光2.1 什么是平行光 Directional Light平行光模拟的是无限远处的光源发出的平行光线。最典型的例子就是太阳——因为太阳距离地球足够远到达地面的光线可以近似为平行光。平行光的关键特点所有光线方向一致平行不随距离衰减光源位置不影响光照效果只有方向重要照亮整个场景中的所有物体覆盖范围无限每个场景通常只有一个主平行光模拟太阳2.2 平行光属性详解Type灯光类型设置为Directional。Color颜色灯光的颜色。白天太阳偏暖微黄月光偏冷蓝白。Intensity强度灯光的亮度。默认值为1。值越大越亮设为0则等于关闭。Indirect Multiplier间接光照倍增强度控制间接光照反弹光的强度。增大这个值可以让暗面更亮模拟更强的环境光反射。Shadow Type阴影类型No Shadows不产生阴影。性能最好。Hard Shadows硬阴影边缘锐利。Soft Shadows软阴影边缘柔和。视觉效果更真实但性能开销更大。Cookie灯光遮罩纹理。可以用来模拟树影、百叶窗投影等效果。Culling Mask与Camera的Culling Mask类似控制哪些Layer的物体受此灯光影响。2.3 平行光的典型设置对于一个室外场景的太阳平行光Type: Directional Color: 微暖的白色如 #FFF4E0 Intensity: 1.0 - 1.5 Rotation: 绕X轴旋转30-60度控制太阳高度角 Shadow Type: Soft Shadows 平行光的Rotation非常重要它决定了光线的方向——Y轴旋转控制太阳在天空中的高度类似纬度X轴旋转控制方位类似经度。// 代码中设置平行光LightsunLightGetComponentLight();sunLight.colornewColor(1f,0.96f,0.88f);// 暖白色sunLight.intensity1.2f;sunLight.shadowStrength0.8f;三、Point Light——点光源3.1 什么是点光源 Point Light点光源模拟的是从空间中一个点向所有方向均匀发射光线的光源。最典型的例子就是灯泡、蜡烛、火把、魔法光球。点光源的关键特点光线从一点向四周辐射光照强度随距离衰减离光源越远越暗有一个有限的影响范围Range性能开销高于平行光需要计算距离衰减3.2 点光源属性详解Range范围光源的最大影响距离。超出Range的物体不受此灯光影响。合理设置Range对性能很重要——Range越大需要光照计算的物体越多。Intensity强度点光源的中心亮度。Color颜色灯光的颜色。暖色黄/橙适合烛光、火把冷色蓝/紫适合魔法、科技灯光。Shadow Type点光源也能产生阴影但性能开销显著高于平行光阴影因为需要渲染6个方向的阴影贴图对应立方体的6个面。Mode模式Realtime实时光照Baked烘焙光照Mixed混合模式3.3 点光源的衰减曲线点光源在Range范围内的衰减曲线可以通过Light组件面板底部的光照曲线图查看。默认是线性到二次衰减的混合。在Inspector中你可以看到一个光照强度随距离变化的小图表。右上角的按钮可以在不同的衰减模式之间切换需要特定的渲染管线支持。3.4 使用场景点光源适合室内灯泡、吊灯火把、篝火、蜡烛魔法球、能量核心爆炸的瞬间闪光角色的手电筒配合Spotlight更好// 代码中创建点光源GameObjectlightObjnewGameObject(PointLight);LightpointLightlightObj.AddComponentLight();pointLight.typeLightType.Point;pointLight.range10f;pointLight.intensity2f;pointLight.colorColor.yellow;四、Spotlight——聚光灯4.1 什么是聚光灯 Spotlight聚光灯模拟的是从一个点向特定方向以锥形发射的光线。最典型的例子就是手电筒、舞台追光灯、汽车前灯。聚光灯的关键特点光线限制在圆锥范围内有照射方向由Transform的Rotation决定随距离衰减圆锥边缘也有衰减有Range距离范围和Spot Angle圆锥张开角度4.2 聚光灯属性详解Range范围聚光灯的最大照射距离。Spot Angle聚光角度圆锥的张开角度度。取值范围0-179。角度越大照射范围越广但边缘衰减越剧烈。Inner / Outer Spot Angle部分渲染管线支持控制内层全亮区和外层渐变衰减区的角度差异。内角和外角差值越大边缘过渡越柔和。Intensity强度灯光的中心亮度。Color颜色灯光的颜色。Shadow Type聚光灯的阴影性能开销介于平行光和点光源之间——聚光灯只需要渲染一个方向的阴影贴图。4.3 制作一个手电筒// 创建手电筒灯光GameObjectflashlightObjnewGameObject(Flashlight);LightflashlightflashlightObj.AddComponentLight();flashlight.typeLightType.Spot;flashlight.range20f;flashlight.spotAngle45f;flashlight.intensity3f;flashlight.colornewColor(1f,0.95f,0.8f);// 微暖白光flashlight.shadowsLightShadows.Hard;// 让手电筒跟随玩家flashlightObj.transform.SetParent(playerCamera.transform);flashlightObj.transform.localPositionVector3.zero;flashlightObj.transform.localRotationQuaternion.identity;五、其他灯光类型5.1 Area Light区域光Area Light模拟的是从一个矩形区域发射的光线。它产生的光照最自然因为真实世界中的大部分光源都有面积但它有一个重要限制⚠️ Area Light只能用于Baked光照烘焙不能用于实时光照。这意味着它只能影响静态物体。常用于模拟天花板灯带、窗户光、显示器屏幕光等。5.2 Emissive Material自发光材质严格来说这不是灯光组件但自发光材质也可以产生光照效果在Baked GI中。将材质的Emission属性设为大于0的值在烘焙全局光照时该材质会成为间接光源照亮周围的静态物体。六、阴影系统6.1 阴影的工作原理Unity使用Shadow Mapping阴影贴图技术来生成阴影① 从灯光视角渲染场景记录每个像素的深度② 从相机视角渲染场景时检查每个像素在灯光视角下的深度③ 如果某个像素被其他物体遮挡深度更大说明它在阴影中6.2 阴影质量设置在Edit Project Settings Quality中可以设置阴影质量Shadow Resolution阴影贴图分辨率Low/Medium/High/Very HighShadow Distance阴影渲染的最远距离Shadow Cascades级联阴影的数量平行光专用提高近距离阴影质量 级联阴影Cascaded Shadows是平行光的特殊优化距离相机越近的区域使用越高分辨率的阴影贴图远处使用低分辨率。级联数量通常设为2或4具体取决于场景规模和性能要求。6.3 阴影性能优化建议移动平台上优先使用Hard Shadows或关闭阴影降低Shadow Resolution可以显著减少内存和渲染开销减小Shadow Distance只让近距离物体投射阴影在MeshRenderer组件中关闭不重要物体的Cast Shadows和Receive Shadows七、场景布光实践7.1 三点布光法三点布光Three-Point Lighting是摄影和电影中经典的布光方法同样适用于游戏场景主光Key Light场景的主要光源通常是一个Directional Light室外或Point Light/Spotlight室内。主光定义场景的整体亮度和主要阴影方向。辅光Fill Light用于照亮主光产生的阴影区域降低对比度。通常是主光亮度的30%-50%放置在主光的对面方向。轮廓光Rim Light / Back Light从物体的侧后方照射为物体边缘添加亮边帮助物体从背景中分离出来。虽然游戏中不常用但角色展示场景可以考虑。7.2 室内场景布光一个典型室内场景的光源设置Key Light主光: Point Light, 位于房间中央天花板 Fill Light辅光: Point Light, 低强度, 角落位置 Accent Light点缀光: Spotlight或小Point Light, 用于照亮特定区域 Ambient Light环境光: 通过Lighting设置中的Environment Lighting7.3 室外场景布光Sun太阳: Directional Light, 偏向暖色 Ambient环境光: 天空散射光, 通过Lighting设置 Reflection反射: Reflection Probe捕捉环境反射八、Lighting窗口设置8.1 打开Lighting窗口Window Rendering Lighting打开光照设置窗口。8.2 关键设置Environment环境Skybox Material天空盒材质定义天空外观和环境反射Sun Source指定哪个Directional Light是太阳Environment Lighting环境光照从天空盒采样得到的间接光Environment Reflections环境反射设置Scene场景Lightmapper选择光照烘焙器Progressive CPU/GPU或EnlightenIndirect Resolution间接光照分辨率Lightmap Resolution光照贴图分辨率Mixed Lighting混合光照Lighting Mode混合光照模式Shadowmask、Subtractive、Baked Indirect九、代码中操作灯光9.1 动态控制灯光usingUnityEngine;publicclassLightController:MonoBehaviour{privateLightlightComponent;voidStart(){lightComponentGetComponentLight();}// 淡入效果publicSystem.Collections.IEnumeratorFadeIn(floatduration){floatelapsed0;floatstartIntensity0;floattargetIntensitylightComponent.intensity;lightComponent.intensity0;while(elapsedduration){elapsedTime.deltaTime;lightComponent.intensityMathf.Lerp(0,targetIntensity,elapsed/duration);yieldreturnnull;}}// 闪烁效果publicSystem.Collections.IEnumeratorFlicker(floatduration,floatminInterval,floatmaxInterval){floatelapsed0;while(elapsedduration){lightComponent.enabled!lightComponent.enabled;floatwaitTimeRandom.Range(minInterval,maxInterval);yieldreturnnewWaitForSeconds(waitTime);elapsedwaitTime;}lightComponent.enabledtrue;}}9.2 昼夜循环usingUnityEngine;publicclassDayNightCycle:MonoBehaviour{publicLightsunLight;publicfloatcycleDuration120f;// 一个完整昼夜循环的秒数publicAnimationCurveintensityCurve;voidUpdate(){// 太阳绕X轴旋转模拟升起和落下floatsunAngle(Time.time/cycleDuration)*360f;sunLight.transform.rotationQuaternion.Euler(sunAngle,0,0);// 根据太阳高度调整亮度floatnormalizedAnglesunAngle%360;floatintensityMathf.Sin(normalizedAngle*Mathf.Deg2Rad);sunLight.intensityMathf.Clamp(intensity,0.1f,1.5f);}}十、本篇总结✅ 本文核心知识点回顾Directional Light模拟无限远光源太阳光线平行无衰减Point Light模拟点光源灯泡光线从一点向四周辐射有Range范围Spotlight模拟锥形光束手电筒有方向、Range和Spot AngleArea Light只能用于烘焙产生最自然的光照效果阴影质量在Quality Settings中配置级联阴影提高平行光阴影质量三点布光法主光辅光轮廓光是经典布光方案移动平台应优先使用Baked光照以优化性能 下一篇文章将学习C#脚本的创建与挂载——如何让你的游戏物体活起来。动手任务① 在一个测试场景中分别添加Directional Light、Point Light和Spotlight调整参数观察效果② 尝试三点布光法布置一个简单场景③ 写一个让灯光闪烁的脚本关于作者拥有多年Unity开发经验的游戏开发者专注Unity系统化教学与最佳实践分享。