我为#unitytips发布了一条简短的推文,内容涉及如何使用Unity创建闪亮的2D灯光效果,并收到了一些请求以明确说明其实现方式,因此我认为我将尝试完成整个设置过程。
更新资料
由于我在这篇文章上有很多疑问,而且我实际上没有时间完成游戏的事实,所以截图是从(谁正确完成了游戏的)截图中获取的,我整理了一些代码并推送了它到GitHub。 现在,您都可以尝试使用它,但是请注意,该项目还包含许多其他内容,例如:
- 从Tiled导入地图
- 具有可变出口的动态房间预制件
- 通过简单的路径检查生成迷宫
如果您对代码有其他疑问,可以在GitHub上发布问题,或者如果您想对代码做出贡献,请分叉存储库并向我发送请求请求!
提迪伊/技术官僚
具有照明效果和迷宫生成的Unity3D示例2D游戏。 – tidyui / technocrat
github.com
现在,让我们回到故事吧!!!
游戏内萤幕撷取画面

场景设定

1. 图层
为了完成这项工作,我们需要两个额外的层。 在本文中,我将其称为“ 阴影投射器”和“ 照明 ”。 像名称一样,所有投射阴影的对象都应设置为shadowcaster层,而所有接收阴影的对象都应设置为光照层。 在我的设置中,我只有一个平面接收阴影以使其尽可能高效。
2. 物体投射阴影
对于每个应该投射阴影的基于sprite的对象,创建一个具有适当形状的3D对象,并将其放置在sprite的后面 (即,沿z轴距离相机更远)。 尝试确保所有对象都在相同的z值处结束,这与您以后要添加充当地板的平面相同(除非您希望对象漂浮在空中)。 由于除了投射阴影外,我们没有使用此对象,因此请删除除MeshRenderer之外的所有组件。
请记住,高于光源位置的阻挡器不会被光源照亮,这会使它们在光层中变暗。 为了解决这个问题,要么加亮3D对象的材质颜色,要么向上创建第二个光源,该光源仅影响Shadowcaster层上的对象。
阴影投射器设置:
- 图层: shadowcaster
- 投射阴影: 开启
- 接收阴影: 关闭
3. 创建地板
接收阴影的地板可以只是一个简单的平面 。 同样,请确保仅保留对象的MeshRenderer组件,并将平面放置在z轴上阴影投射器的后面 。
飞机设置:
- 层数: 照明
- 投射阴影: 关闭
- 接收阴影: 开
使平面成为主相机的子代,并使其与相机视口的大小相同 。 如果希望不受光线照射的区域完全变暗,请将分配的材料的颜色设置为黑色。 使平面的基础颜色越浅,阴影效果将变得越微妙。
4. 添加灯光
创建一个点光源(或您选择的任何其他光源)并将其定位在z轴上,以使该光源完全或部分被您在第2节中创建的对象所阻挡。
灯光设置:
- 剔除面罩: 阴影投射器 , 照明
5. 摄像头
现在创建一个新相机,使其成为主相机的子代。 确保相机在正交尺寸等方面与主相机具有完全相同的设置,否则照明纹理将与主相机的输出不匹配。
相机设定:
- 剔除面罩: 阴影投射器 , 照明
- 渲染到纹理: 开
6. 主摄像头
现在,主摄影机需要使用着色器混合从轻型摄影机渲染的纹理与其自身的输出。 由于我不是着色器专家,因此我使用了Prime31提供的SpriteLightKit中的BlendImageEffect着色器。 您可以在GitHub上找到该仓库:
https://github.com/prime31/SpriteLightKit
相机设定:
- 剔除面具: 除阴影投射器和照明设备外的所有东西
7. 结论
我希望这能对我如何迫使Unity给我2D实时阴影提供一些见解。 即使我在经典的《 塞尔达传说》风格的自上而下游戏中使用它,该方法也适用于平台游戏。