拒绝“纸片感”:Unity URP 2D 动态光照完全配置指南 (附 Laigter 法线生成)

2026-01-20 10:02:05
文章摘要
文章介绍了UnityURP2D动态光照的完全配置方法,以拒绝2D游戏“纸片感”。首先用Laigter生成法线贴图,接着配置URP2DRenderer,然后绑定法线与放置光源,最后编写昼夜循环脚本。通过这套Laigter+URP的组合,无需手绘复杂阴影,就能让游戏画面拥有动态生命力,提升沉浸感。

前言: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 创建管线资产

  1. 在 Project 面板右键 -> Create -> Rendering -> URP -> URP Asset (with 2D Renderer)
  2. 你会得到两个文件:一个 Asset 配置,一个 2D Renderer Data。

2.2 激活管线

  1. 打开 Edit -> Project Settings -> Graphics
  2. Scriptable Render Pipeline Settings 槽位中,拖入刚才创建的 URP Asset。
  3. 检查:此时你的 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 赋予法线

不要直接把法线贴图拖到场景里!

  1. 选中你的原始 Sprite 图片(不是 _n 那个)。
  2. 在 Inspector 中找到 Sprite Editor 按钮(需要安装 2D Sprite 包)。
  3. 点击左上角下拉菜单,选择 Secondary Textures
  4. 点击右下角 + 号,Name 填 _NormalMap(必须是这个名字,大小写敏感)。
  5. 把刚才 Laigter 生成的 _n.png 拖进去。点击 Apply。
  6. 验证:将 Sprite 拖入场景,Inspector 中的 Sprite Renderer 组件下,应该能看到 Secondary Textures 列表里有了法线信息。

3.2 放置第一盏灯 (Point Light 2D)

  1. 在 Hierarchy 右键 -> Light -> 2D -> Point Light 2D
  2. 移动灯光靠近角色。
  3. 见证奇迹:你会发现角色不再是平的,而是有了“受光面”和“背光面”。当移动灯光时,阴影会实时变化。

3.3 调整 Z 轴 (避坑点)

  • 2D 光照也是有 Z 轴概念的。确保 Light Z 的数值覆盖了 Sprite 的 Z 轴。
  • 例如:Sprite Z=0,Light Z=-1,Light Range=10。这样光才能照到物体上。

图片描述

图注:配置法线后,光照呈现出明显的左亮右暗的体积感,衣服褶皱清晰可见。 目的:直观展示法线贴图对 2D 表现力的决定性作用。


Step 4. 进阶实战:编写昼夜循环脚本

有了点光源(火把),我们还需要一个全局光(太阳/月亮)来控制整体氛围。

4.1 场景准备

  1. 创建 Light -> 2D -> Global Light 2D
  2. 这是环境光。颜色白色,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 配置参数

  1. Gradient (颜色):设置一个渐变条。
    • 0% (午夜): 深蓝 (#0A0A30)
    • 25% (日出): 橙红 (#FF8C00)
    • 50% (正午): 纯白 (#FFFFFF)
    • 75% (日落): 紫红 (#800080)
    • 100% (午夜): 深蓝 (#0A0A30)
  2. Animation Curve (强度)
    • 两头低 (0.2),中间高 (1.0)。

运行游戏,你会看到整个世界的色调在呼吸般变化,配合角色手中的点光源,氛围感直接拉满。


结语:光影是 2D 游戏的“滤镜”

通过这套 Laigter + URP 的组合拳,我们不需要手绘复杂的阴影,就能让游戏画面拥有动态的生命力。

  • Laigter 解决了素材的物理属性。
  • URP 2D 解决了渲染的底层逻辑。
  • 代码 解决了时间的流逝。

参考资料与工具链接

Tags: #Unity #2D光照 #URP #Laigter #技术美术 #独立游戏 #昼夜循环#

声明:该内容由作者自行发布,观点内容仅供参考,不代表平台立场;如有侵权,请联系平台删除。