拒绝“纸片感”:Unity URP 2D 动态光照完全配置指南 (附 Laigter 法线生成)
前言:2D 游戏为什么需要“光”?
在传统的 2D 游戏中,光影通常是画死在贴图上的(Baked Lighting)。这导致了一个问题:当角色拿着火把走过黑暗的洞穴时,墙壁不会变亮,角色的脸也不会被火光照红。这种“纸片感”大大削弱了沉浸感。Unity 的 Universal Render Pipeline (URP) 2D Renderer 提供了一套非常强大的实时光照系统。但要让它跑起来,光有引擎不够,你还需要给你的 2D 素材一张“身份证”——法线贴图 (Normal Map)。
今天我们就来跑通这个流程:用 Laigter 生成法线 -> Unity URP 环境搭建 -> 2D 光源配置 -> 昼夜循环脚本实装。
Step 1. 用 Laigter 生成法线贴图 (Normal Map)
法线贴图的作用,是告诉引擎:这张 2D 图片的哪个像素朝上,哪个朝左。没有它,光照就没有方向感。我们使用免费开源的神器 Laigter。
1.1 导入与预览
- 打开 Laigter,将你的角色或墙壁 Sprite (PNG格式) 拖入窗口。
- 在右侧预览窗口,你会看到一个移动的光源。此时预览图可能看起来有点脏,别慌。
1.2 参数调优 (关键)
Laigter 的默认参数通常太强了,需要微调:
- Controls (左侧面板):
- Enhance: 适当降低,避免噪点过多。
- Smooth: 拉高一点(约 1.0-2.0),让表面看起来更光滑,否则会像砂纸一样。
- Invert G: 重点! Unity 的法线通常是 Y 轴向上的 (OpenGL 标准),如果进引擎发现光照方向反了,回来勾选或取消这个选项。
1.3 导出贴图
- 点击右上角的齿轮图标 (Export)。
- 只勾选 Normal Map(除非你需要做 PBR 材质,否则 Specular/Occlusion 暂时不需要)。
- 文件名后缀建议加上
_n,例如Player_n.png。

图注:Laigter 工作台。左侧是参数调节面板,中间是原始 Sprite,右侧是生成的紫色法线贴图预览。注意观察右侧预览中,光照产生的体积感。 目的:展示如何获取光照计算所需的必要数据。
Step 2. 引擎环境:配置 URP 2D Renderer
很多新手如果不做这一步,进游戏放了灯也没反应。因为 Unity 默认不仅不是 2D 光照,甚至可能还没开启 URP。
2.1 创建管线资产
- 在 Project 面板右键 ->
Create->Rendering->URP-> URP Asset (with 2D Renderer)。 - 你会得到两个文件:一个 Asset 配置,一个 2D Renderer Data。
2.2 激活管线
- 打开
Edit->Project Settings->Graphics。 - 在 Scriptable Render Pipeline Settings 槽位中,拖入刚才创建的 URP Asset。
- 检查:此时你的 Game 视图背景可能会变成深灰色,说明 URP 2D 已生效。
2.3 材质升级
- 确保你的 Sprite 使用的材质是 Sprite-Lit-Default。
- 如果你的 Sprite 变黑了,不要惊慌,那是因为场景里还没有灯(默认是全黑的)。

图注:Project Settings 中的 Graphics 设置页。红框高亮了 Scriptable Render Pipeline Settings 的赋值区域,以及 2D Renderer Data 的配置。 目的:确保渲染管线正确切换,这是光照生效的前提。
Step 3. 注入灵魂:绑定法线与放置光源
现在万事俱备,开始组装。
3.1 为 Sprite 赋予法线
不要直接把法线贴图拖到场景里!
- 选中你的原始 Sprite 图片(不是 _n 那个)。
- 在 Inspector 中找到 Sprite Editor 按钮(需要安装 2D Sprite 包)。
- 点击左上角下拉菜单,选择 Secondary Textures。
- 点击右下角
+号,Name 填_NormalMap(必须是这个名字,大小写敏感)。 - 把刚才 Laigter 生成的
_n.png拖进去。点击 Apply。 - 验证:将 Sprite 拖入场景,Inspector 中的 Sprite Renderer 组件下,应该能看到 Secondary Textures 列表里有了法线信息。
3.2 放置第一盏灯 (Point Light 2D)
- 在 Hierarchy 右键 ->
Light->2D-> Point Light 2D。 - 移动灯光靠近角色。
- 见证奇迹:你会发现角色不再是平的,而是有了“受光面”和“背光面”。当移动灯光时,阴影会实时变化。
3.3 调整 Z 轴 (避坑点)
- 2D 光照也是有 Z 轴概念的。确保
Light Z的数值覆盖了 Sprite 的 Z 轴。 - 例如:Sprite Z=0,Light Z=-1,Light Range=10。这样光才能照到物体上。

图注:配置法线后,光照呈现出明显的左亮右暗的体积感,衣服褶皱清晰可见。 目的:直观展示法线贴图对 2D 表现力的决定性作用。
Step 4. 进阶实战:编写昼夜循环脚本
有了点光源(火把),我们还需要一个全局光(太阳/月亮)来控制整体氛围。
4.1 场景准备
- 创建
Light->2D-> Global Light 2D。 - 这是环境光。颜色白色,Intensity 1.0 时就是大白天;颜色深蓝,Intensity 0.2 时就是深夜。
4.2 编写脚本 (C#)
创建一个脚本 DayNightCycle2D.cs,挂载在 Global Light 上。
using UnityEngine;
using UnityEngine.Rendering.Universal; // 必须引用 URP 命名空间
public class DayNightCycle2D : MonoBehaviour
{
[Header("设置")]
public float dayDuration = 120f; // 一天多少秒
public Gradient dayNightColor; // 颜色渐变条
public AnimationCurve intensityCurve; // 强度曲线
private Light2D globalLight;
private float timeElapsed;
void Start()
{
globalLight = GetComponent<Light2D>();
}
void Update()
{
// 计算时间进度 (0 ~ 1)
timeElapsed += Time.deltaTime;
float timePercent = (timeElapsed % dayDuration) / dayDuration;
// 采样颜色和强度
if (globalLight != null)
{
globalLight.color = dayNightColor.Evaluate(timePercent);
globalLight.intensity = intensityCurve.Evaluate(timePercent);
}
}
}
4.3 配置参数
- Gradient (颜色):设置一个渐变条。
- 0% (午夜): 深蓝 (#0A0A30)
- 25% (日出): 橙红 (#FF8C00)
- 50% (正午): 纯白 (#FFFFFF)
- 75% (日落): 紫红 (#800080)
- 100% (午夜): 深蓝 (#0A0A30)
- Animation Curve (强度):
- 两头低 (0.2),中间高 (1.0)。
运行游戏,你会看到整个世界的色调在呼吸般变化,配合角色手中的点光源,氛围感直接拉满。
结语:光影是 2D 游戏的“滤镜”
通过这套 Laigter + URP 的组合拳,我们不需要手绘复杂的阴影,就能让游戏画面拥有动态的生命力。
- Laigter 解决了素材的物理属性。
- URP 2D 解决了渲染的底层逻辑。
- 代码 解决了时间的流逝。
参考资料与工具链接:
- Laigter GitHub Repository - 免费开源的法线生成工具。
- Unity Documentation: 2D Light types - 官方手册,详细解释了不同 2D 光源的用途。
- CodeMonkey: Unity 2D Lighting Tutorial - 非常棒的实操视频参考。
Tags: #Unity #2D光照 #URP #Laigter #技术美术 #独立游戏 #昼夜循环#



