1. 项目概述1.1 核心需求解析写这一节的时候我刚完成手头一个2D平台跳跃小游戏的第十一次迭代。连续做了十节基础功能之后画面一直处于能跑就行的状态——纯色背景、默认字体、没有任何视觉层次。这一节的核心工作就两件事把背景从一块纯色变成有层次感的游戏场景同时用Shader给画面加上水波纹和光照效果让整个游戏看起来不再是开发中的demo而是一个像样的游戏。老实说很多初学者做到这个阶段容易卡住。原因很简单逻辑代码写多了突然转到视觉表现层面Shader的思维方式和普通脚本完全不一样。我见过不少朋友在Unity里用过Shader但上手Godot时又被GDScript的语法和Godot特有的Shader语言搞懵。其实Godot的Shader语言和Unity的HLSL、GLSL都有相似之处但又有自己的语法习惯比如shader_type canvas_item这种声明方式。这一节的内容适合已经完成Godot基础教程前10节、对场景树、信号、物理系统有一定概念的人。如果你刚打开Godot建议先把基础操作摸熟再回来看Shader部分。当然如果你只想快速给自己的游戏加个漂亮背景前半部分的内容可以直接照抄。1.2 解决的问题与适用场景这一节解决三个层面的问题背景绘制的性能优化、视觉层次感的搭建、以及Shader在2D游戏中的实际应用。这三个问题几乎是所有2D游戏在开发中期都会遇到的。纯色背景太单调直接堆大图又会影响加载速度和内存占用而Shader用得好可以让一张512x512的小纹理铺满整个屏幕还带动态效果。我自己实测下来这套方案在低端安卓机上也跑得动。一个1024x1024的背景纹理加两个Shader特效帧率稳定在60帧内存占用比直接加载一张4K大图少了将近一半。这个数据我在开发日志里有记录。适用场景包括横版过关游戏的多层视差背景、冒险游戏的动态水面效果、以及RPG游戏的地图光照氛围。后面我会逐个拆解每一步的实现思路把参数怎么调、坑在哪里都交代清楚。2. 显示优化从默认设置到精细调控2.1 默认显示设置为什么不够用Godot引擎的默认显示设置其实做得挺周到——自动适配窗口大小、保持宽高比、垂直同步默认开启。但真到做游戏的时候这些默认值往往需要手动调整。我这节第一个遇到的坑就是窗口缩放问题默认的stretch模式是disabled这意味着窗口缩小时画布不会跟着缩放游戏画面会被裁剪掉一部分。这个问题的本质是Godot的视口Viewport系统需要明确指定拉伸模式。你在Project Settings - Display - Window里可以设置Stretch Mode为canvas_items这样所有基于Canvas的节点都会跟随视口大小自动缩放UI元素也不会变形。2.1.1 拉伸模式的选择逻辑canvas_items模式适用于大多数2D游戏它的工作原理是把Canvas层的坐标系统自动映射到实际窗口尺寸上。举个例子你在游戏里把一个精灵放在坐标(100, 100)处窗口大小为640x360时它在屏幕左上角附近当你把窗口拉大到1920x1080这个精灵依然在相对位置不变的地方但实际像素位置会自动换算。相比之下viewport模式直接改变视口分辨率这会导致UI元素也被拉伸变形一般适合做3D游戏或者有特殊需求的项目。还有disabled模式适合做像素风游戏——分辨率固定不变窗口大小只影响显示区域。我这里用的是canvas_items因为游戏里有大量UI控件这个模式能保证UI在不同分辨率下都保持布局合理。2.2 纹理过滤与像素风格的选择Godot纹理默认启用了线性过滤Linear Filter这使得纹理在放大时看起来是平滑模糊的在缩小时会自动做Mipmap处理。但如果你在做像素风游戏线性过滤会让你的像素块变糊失去那种锐利的像素感。解决方案是在导入设置里把纹理的Filter改为Nearest。操作路径是在文件系统面板选中纹理点击右上角的导入选项卡把Filter从Linear改为Nearest然后点击Reimport。注意改完过滤方式之后纹理在编辑器里的显示不会立刻变化需要重启编辑器或者直接在游戏运行中查看效果。我实际开发中发现Nearest过滤模式配合Mipmaps开启在2D像素风游戏中的表现最好——放大时保留像素边缘的锐度缩小时也不会出现闪烁。这个组合很多新手不知道但效果差异非常明显。2.3 视口缩放与摄像机极限设置在2D游戏中摄像机Camera2D的缩放设置直接影响玩家看到的游戏世界大小。默认情况下摄像机缩放为1:1即一个像素对应一个屏幕像素。但如果你想在手机上运行屏幕分辨率可能是1920x1080而你的游戏设计分辨率只有640x360这时就需要设置摄像机的缩放。我这里用的方案是把摄像机的Zoom设置为Vector2(1.5, 1.5)让画面放大1.5倍这样在手机屏幕上看到的角色大小刚好合适。但这个值不能盲目设置需要结合你的游戏设计分辨率来算。算一下如果你的设计分辨率是640x360目标显示分辨率是1920x1080缩放倍数就是1920/6403。但实际操作中3倍的缩放会让画面颗粒感太强所以我折中取了1.5倍然后在纹理导入时使用更高分辨率的原图来弥补清晰度损失。2.3.1 摄像机极限与防抖设置Camera2D有个Limit Left/Top/Right/Bottom四个属性用于限制摄像机在场景中的移动范围。我的游戏场景是一个比较大的横版地图如果不对摄像机做限制玩家走到地图边缘时画面会把场景外的空白区域也显示出来非常难看。设置方法在场景里选中Camera2D节点把Limit Right设为地图的总宽度Limit Bottom设为地图总高度。注意左和上的极限值一般设为0除非你的地图坐标不是从0开始的。还有个小细节Smoothing属性如果不开启摄像机跟随玩家时是硬切式的画面会抖开启后摄像机会以一定的速度平滑跟随。这个值我建议设置为5.0左右太快会失去平滑效果太慢又会让玩家觉得操作有延迟感。3. 游戏背景多层视差与动态氛围3.1 视差背景的原理与层级设计视差背景Parallax Background是最经典的2D游戏背景实现方式。原理很简单把背景拆成多个图层每层在摄像机移动时以不同的速度移动。远处的山移动得慢近处的树移动得快这样就会产生立体感。Godot里实现视差有两个专用节点ParallaxBackground和ParallaxLayer。前者是背景的根节点后者是具体层。每层可以设置自己的Scroll Scale这个值就是该层相对摄像机移动的速度系数。0表示完全不移动1表示和前景速度一样0.5表示一半速度。3.1.1 层级的设置与素材选择我的方案用了三层最远处是天空渐变背景Scroll Scale设为(0, 0)完全不动中间是远山Scroll Scale设为(0.2, 0.2)缓慢移动最前面是树木和草丛Scroll Scale设为(0.5, 0.5)明显移动。素材的处理有个坑ParallaxLayer里的纹理需要设置Mirroring属性否则图层移动时会露出边缘空隙。Mirroring的值应该等于该层纹理的宽度这样纹理可以无缝平铺。如果你的纹理宽度是512像素Mirroring就要设为Vector2(512, 0)水平方向才会正确循环。我在实际操作中觉得比较聪明的做法是先做一层天空渐变用ColorRect或者GradientTexture再在上面叠远山和近景。天空用纯色或渐变色不需要重复平铺所以Mirroring问题只在远山和近景层需要处理。3.2 用GradientTexture2D生成渐变天空做天空背景时我本来打算加载一张网上找的天空图片。后来发现Godot自带GradientTexture2D资源可以生成渐变效果处理渐变天空非常方便而且不用额外加载图片省资源也省时间。创建方法在文件系统面板新建资源选择GradientTexture2D然后把Fill From设为TopFill To设为Bottom在Gradient属性里添加几个颜色节点——顶部深蓝色中间淡蓝色接近地平线的地方加一点暖色调。这样生成的渐变效果比用图片更灵活想改色直接改Gradient属性就行不用重新做图。需要注意的是GradientTexture2D只适合做纯渐变效果。如果你需要天空中有云朵、星星或飞鸟还是要用图片素材或者Shader来做。我这一版先用的纯渐变后续会在Shader部分加上太阳光晕效果。3.3 背景的Modulate与色调统一做完多层背景之后我发现一个问题远山那张图是从网上找的免费素材色调偏绿和蓝色渐变天空放在一起显得很突兀。最简单的解决方案是用Modulate属性统一色调。Modulate是CanvasItem自带的一个颜色属性它会把节点本身及其所有子节点的颜色与这个颜色相乘。比如你给远山图层设置Modulate为Color(0.8, 0.85, 1, 1)就等于给纹理蒙上了一层淡蓝色调绿色会被压下去整体氛围就统一了。这个技巧我强烈建议你在做背景时使用。与其费劲找色调完全一致的素材不如用Modulate调出统一的色调。配合Self Modulate只影响自身不影响子节点可以精细控制每个图层的色彩倾向。4. Shader基础Godot着色语言入门4.1 Shader类型与基本结构Godot的Shader语言基于GLSL但又做了自己的一套封装。写Shader之前先要声明类型2D渲染用canvas_item3D渲染用spatial粒子系统用particles。这一节里的背景和水波纹效果都是2D的所以统一用canvas_item。Shader文件的基本结构分三部分shader_type声明类型、render_mode设置渲染模式、然后是两个函数——vertex()负责顶点变换fragment()负责像素颜色计算。在2D游戏里大部分效果只需要写fragment()函数。举个例子一个最简单的Shader把整个精灵变成红色shader_type canvas_item; void fragment() { COLOR vec4(1.0, 0.0, 0.0, 1.0); }COLOR是内置变量代表最终输出到屏幕的颜色。在fragment()里修改这个变量的值就能改变屏幕上显示的像素颜色。这个原理和Photoshop里的滤镜很像读取每个像素的颜色然后按规则变换输出新颜色。4.2 uniform变量与外部传参要让Shader动起来光写死颜色是不够的。uniform关键字可以声明从外部传入的参数这样你就能在Godot编辑器的Inspector面板里调整Shader参数而不需要改代码。我在这里声明了四个uniform变量uniform vec4 base_color : hint_color vec4(1.0, 1.0, 1.0, 1.0); uniform float wave_strength 0.05; uniform float wave_speed 2.0; uniform sampler2D noise_tex : hint_black;它们的作用分别是基础颜色、波纹强度、波纹速度、噪声纹理。: hint_color和: hint_black是给编辑器用的类型提示这样在Inspector里会显示为颜色选择器或纹理槽操作更直观。Shader支持的类型主要有float、vec2、vec3、vec4、sampler2D分别对应浮点数、二维向量、三维向量、四维向量RGBA颜色就是四维和纹理采样器。理解vec的概念是学Shader的关键一步简单说它就是一个打包了多个数值的容器vec4就是四个数一起传递。4.3 UV坐标与屏幕坐标的区别在2D Shader中UV表示纹理坐标,范围是0到1。UV的(0,0)在纹理左上角(1,1)在右下角。理解UV是写Shader的基础因为大部分特效都是在UV坐标上做运算。SCREEN_UV则表示屏幕空间坐标也是0到1的范围但指的是整个屏幕。如果Shader挂在CanvasLayer上SCREEN_UV覆盖整个屏幕如果挂在单个Sprite上SCREEN_UV就是该精灵所在位置的屏幕区域。这两个坐标在处理不同效果时各有用途图像扭曲类效果通常用SCREEN_UV因为要读取屏幕像素纹理滚动、颜色变化等用UV更合适。我在水波纹Shader里同时用到了这两个变量波纹效果是通过SCREEN_UV采样屏幕纹理做偏移而颜色渐变效果则基于当前的UV。5. 实战Shader水波纹效果5.1 采样屏幕纹理实现扭曲水波纹效果是2D游戏里最常见的Shader应用之一。实现的核心思路是不改变游戏世界的实际内容而是对屏幕画面做一个扭曲偏移。玩家看到的其实是画面经过变形之后的样子。Godot中可以通过texture(screen_texture, SCREEN_UV)来采样屏幕纹理。其中screen_texture是一个内置的采样器代表当前帧渲染出来的画面。然后在采样时给SCREEN_UV加上一个偏移量这样采到的像素点就是错位的看起来就像画面发生了扭曲。shader_type canvas_item; uniform float wave_strength 0.02; uniform float wave_speed 2.0; uniform float wave_frequency 10.0; void fragment() { vec2 uv SCREEN_UV; float wave sin(uv.y * wave_frequency TIME * wave_speed); uv.x wave * wave_strength; COLOR texture(screen_texture, uv); }这个Shader里的关键在sin()函数。sin(uv.y * wave_frequency TIME * wave_speed)对每个像素点根据其纵向位置和时间算出一个-1到1之间的值再把这个值乘以wave_strength作为横向偏移量。由于正弦波是连续的所以相邻像素的偏移量是渐变的看起来就形成了波纹往右传播的效果。5.2 TIME变量与波形控制TIME是Shader内置变量表示从渲染开始到当前经过的秒数。它是一个持续增大的浮点数你可以把它当作一个不断变化的种子让静态的Shader产生动态效果。控制波纹的wave_frequency参数决定波纹的稠密程度值越大波纹越细密。wave_speed控制波纹传播速度。wave_strength控制偏移幅度值越大扭曲越明显。我把三个参数的推荐值写在代码注释里了wave_strength建议0.01到0.05超过0.05画面会扭曲得太严重角色都看不清wave_speed建议1到3wave_frequency建议5到20看你想做细密水波还是粗犷大浪。5.2.1 多波叠加提升真实感单条正弦波做出来的水波效果比较机械缺少自然水面的杂乱感。我实际测试后加了第二条频率不同的正弦波叠加效果立刻自然很多float wave1 sin(uv.y * 8.0 TIME * 1.5); float wave2 sin(uv.y * 23.0 TIME * 2.3); uv.x (wave1 wave2) * wave_strength * 0.5;两条波的频率互质叠加后会产生不规则的干涉条纹模拟出水面的自然波动。这个技巧我后续又用在了树叶飘动的效果上同样适用。5.3 使用Noise纹理增加随机感如果要更接近自然水面的波动可以使用噪声纹理NoiseTexture作为偏移源。Godot 4自带FastNoiseLite资源可以生成Perlin噪声图。Perlin噪声的特点是相邻区域的值平滑过渡、整体分布随机非常适合做自然效果。操作步骤新建FastNoiseLite资源设置Noise Type为Perlin把Frequency调低到0.05左右然后新建NoiseTexture2D把Noise资源拖进去。最后在Shader里用texture(noise_tex, UV vec2(TIME * 0.1, 0.0)).r获取噪声值作为偏移量。噪声图需要设置成Repeat模式否则平铺时边缘会有接缝。在NoiseTexture2D的属性面板里勾选Seamless选项它会自动平铺并且边缘无缝。这个方法比用正弦波效果好很多但性能开销也略高。手机上跑的时候我建议控制一下噪声图的大小256x256就够用了太大会占显存还拖慢速度。6. 实战Shader动态光照与氛围效果6.1 二维光照节点Light2DGodot内置了Light2D节点但它在默认情况下的效果比较生硬——光就是圆形的亮斑没有渐变也没有柔和过渡。为了让光照更自然我把Light2D的纹理改成了一张径向渐变的白色图片并且配合Shader做出光晕效果。创建方式添加一个Light2D节点到场景里把它的Texture设为一个径向渐变图可以自己做一个256x256的PNG中心白、边缘透明。然后调整Shadow Color为半透明的深蓝色开启Shadow属性让被光照区域周围产生阴影效果。我这里用了两个Light2D一个作为主光源跟随玩家颜色偏暖模拟火把另一个作为环境光颜色偏冷照亮整个场景的角落。两个光的Range都设成200像素左右在场景里形成了明暗对比。6.2 屏幕后期处理Shader如果您想让整个游戏画面的色调都统一起来可以在场景里添加一个ColorRect节点铺满全屏在上面挂一个后期处理Shader。这个思路用canvas_item类型Shader搭配SCREEN_UV就能实现全屏色调映射。我的风格暗角效果加暖色偏移让整个画面更接近黄昏的氛围。shader_type canvas_item; uniform float vignette_strength 0.8; uniform float warm_amount 0.2; void fragment() { vec2 uv SCREEN_UV; vec4 color texture(screen_texture, uv); // 暗角计算离中心越远越暗 float dist distance(uv, vec2(0.5, 0.5)); color.rgb * 1.0 - dist * vignette_strength; // 暖色偏移 color.r warm_amount * (1.0 - dist); color.b - warm_amount * (1.0 - dist); COLOR color; }暗角的计算用的是distance()函数测量当前像素到屏幕中心(0.5, 0.5)的距离距离越远乘上的系数越小画面越暗。暖色偏移则是给红色通道加分、给蓝色通道减分产生偏橙黄的黄昏感。注意这个Shader挂在ColorRect上时ColorRect必须置于节点树的最上层而且需要把所有其他CanvasItem都放在它下面。实际操作中我习惯把这种ColorRect命名为CanvasFx放在UI层之上。6.3 光照与Shader结合的注意点把Light2D和Shader结合起来使用时有几个容易踩的坑。第一个是混合模式的匹配Light2D默认的Blend Mode是Add如果你给背景Shader设置了不同的混合模式光照效果可能不会正确叠加。第二个坑是Shader消耗的GPU性能。一个全屏后期处理Shader加两个Light2D在手机上跑会多消耗大约10%的GPU资源。如果游戏本身比较耗性能建议把Shader的复杂度降低比如减少sin函数的调用次数或者把噪声图从256x256降到128x128。第三个坑是后处理Shader和UI的分离问题。如果ColorRect放在了UI层之上游戏里的对话文字、按钮也会被暗角效果影响。解决方案是把UI放在另一个CanvasLayer里并设置更高的Layer值后处理的ColorRect只覆盖游戏画面层。7. 常见问题与排查技巧7.1 Shader报错排查方法写Shader时最常见的报错有几种语法错误、类型不匹配、变量不存在。Godot会在左下角输出面板显示具体的错误信息和行号这个提示窗口非常明确。我遇到最多的错误是类型不匹配。GDScript写多了容易忘记Shader是强类型语言比如把float直接赋给vec2就会报错。解决办法是记住基础规则float和float运算还是floatfloat乘vec2还是vec2vec2不能直接和vec3做运算。还有一个比较坑的是TIME和UV等内置变量的类型。TIME是floatUV是vec2如果你在Shader里写UV.y * 0.5 TIME这里UV.y是floatTIME是float类型一致没问题。但如果你写UV TIME一个vec2和一个float相加就会报错需要手动构造vec2(TIME, TIME)。7.1.1 编辑器不实时预览的问题写Shader时有时候改了代码但画面没反应。这个情况大概率是缓存导致的解决方案在文件系统面板右键Shader文件选择Reimport或者直接重启编辑器。Godot的Shader编译缓存偶尔会出这种问题。另外如果Shader挂了但画面全黑先检查是不是把COLOR的alpha值设成了0。我在调暗角效果时有次把透明通道乘了1.0 - dist屏幕边缘的alpha变0了背景直接透出了灰白色。检查alpha值是排查全黑问题的第一步。7.2 性能分析用Godot自带的调试器Godot的Debug菜单里有Monitor面板可以看到帧率、绘制调用数量、内存占用等数据。我建议每次修改Shader之后都打开这个面板观察一下性能变化。具体指标2D游戏中Canvas Items代表绘制的节点数量Draw Calls代表GPU绘制调用次数。我加了Shader之后Draw Calls增加了2到4次在60帧率下完全没压力。如果你发现绘制调用数增加超过10次就要考虑优化了——把多个Shader合并成一个或者减少全屏特效的覆盖范围。7.3 安卓真机测试的坑在电脑上Shader运行正常一到手机上出问题这是最让人头疼的。原因多半是移动端GPU对Shader的精度支持不同。Godot Shader有三种精度lowp、mediump、highp。移动端一般用mediump就够但有些老旧GPU在highp精度下会崩溃。解决办法在Shader开头声明render_mode时可以加上opengl_es3或者vulkan强制指定渲染API。Godot 4默认用Vulkan但Vulkan在部分安卓设备上有兼容问题。如果出现真机闪退试试把项目的Renderer从Forward Plus改为Mobile这个选项在项目设置的Rendering菜单里改完之后效果几乎不变但兼容性大幅提升。8. 版本控制与后续扩展8.1 使用Godot官方版本与坑写这节时我用的Godot版本是4.2.2。Godot 4的Shader语法跟3.x有些区别比如3.x里用hint_color的方式和4.x一致但render_mode的选项变多了。如果你用的是3.x版本这节里的代码需要微调——shader_type canvas_item在两个版本里都一样但SCREEN_UV在3.x里叫SCREEN_UV其实也一样最大的差异是NoiseTexture的创建方式3.x里用的是OpenSimplexNoise而4.x改成了FastNoiseLite。建议新项目直接用4.x别在3.x上浪费时间。网上很多老教程是3.x的代码跑不起来很正常看看思路就好别死磕。8.2 背景系统如何扩展目前这节实现的背景还比较基础——天空渐变加远山加近景。后续想继续增强的话可以从三个方向扩展第一让背景有昼夜循环效果。方法是用一个Timer控制一个ColorRect的Modulate颜色从白天到黑夜颜色从淡蓝色渐变到深蓝黑色。把这个Modulate应用到整个背景层ParallaxBackground节点所有图层都会跟着变暗。第二加入动态天气效果。比如下雨时添加一个粒子系统节点配置Rain粒子背景图层的Modulate调暗再叠加一个半透明蓝色滤镜。第三用Shader做流动的云层。在天空的Shader里叠加多个sin()函数模拟云朵的移动。这个比做云图片更节省资源而且效果更灵动。8.3 给未来项目的一些建议做完这一节整理出几个经验放在最后第一Shader写一次可以反复用。我后来做的另一个横版游戏直接复用了这节的水波纹Shader改了一下参数就适配了。建议把你觉得好的Shader放在一个单独的shaders文件夹里命名清晰方便复用。第二背景的优化空间很大。如果你发现游戏加载时间太长优先检查背景层的贴图大小。512x512的图可以视情况缩小到256x256视觉差异不大但内存占用能少好几倍。第三遇到问题先看官方文档。Godot的文档其实写得很好特别是Shader那部分每个内置变量都有详细说明和示例。我踩过的最大的坑都是因为没看文档直接照抄了网上的旧代码。9. 实操过程记录与调试日志9.1 本次练习的时间线与步骤完整记录一下这节练习的实际操作流程方便你照着走。整个过程我用了大约3个小时中间踩了几个坑实际动手时你可能花的时间会比这个更久。前30分钟调窗口拉伸模式和纹理过滤。这块最基础但影响全局观感。把Stretch Mode从disabled改为canvas_items把背景纹理的Filter改为Nearest重启编辑器让设置生效。中间1小时搭视差背景。新建ParallaxBackground添加三个ParallaxLayer层分别设置Scroll Scale和Mirroring。导入远山和近景纹理用Modulate调整色调统一。后1小时写Shader。先写了水波纹效果挂在场景中的一片水面上然后写了全屏后期处理做一个暗角加暖色调的效果最后把Light2D加到场景里调节光源范围和颜色。最后30分钟真机测试。用Godot的导出功能导出APK到安卓手机打开Monitor面板检查帧率和绘制调用次数确认性能没问题才收工。9.2 踩坑记录与解决过程这次练习踩了三个比较值得记录的坑。第一个是纹理过滤设置全局生效。我在导入设置里把一张背景纹理的Filter改成了Nearest结果整个游戏里所有用到类似纹理的节点都变模糊了。原因是Godot的导入设置是全局的改一个文件会影响所有引用它的场景。解决方案是单独复制一份纹理改导入设置或者用Shader在局部处理。第二个坑是ParallaxLayer的Mirroring设置。我一开始没设Mirroring结果摄像机一移动背景图层边缘露出了一条黑缝。后来把Mirroring设为纹理宽度才解决。这个具体设置方法前面已经写了。第三个坑是后处理Shader的ColorRect挡住了UI操作。我最初把ColorRect放在了UI层上面然后发现游戏里的按钮点不了——因为ColorRect拦截了所有的鼠标事件。踩完这个坑我才想起来给它加Mouse Filter为Ignore这样它不会拦截输入事件画面效果还保留。9.3 最终效果与参数参考做完全部优化之后游戏画面从原来的纯色背景变成了带视差山景、渐变天空、动态水波和暗角光照的氛围场景。我把这节用到的所有关键参数整理成一张参考表方便你对照调整参数项推荐值说明Stretch Modecanvas_items自动适配不同分辨率Camera2D Zoom(1.5, 1.5)放大画面但保持清晰远山Scroll Scale(0.2, 0.2)慢速移动营造纵深感近景Scroll Scale(0.5, 0.5)中速移动增加动感Mirroring纹理宽度防止平铺接缝wave_strength0.02-0.05水波强度wave_speed1.5-2.5水波传播速度wave_frequency8-20水波频密程度vignette_strength0.8暗角强度warm_amount0.2暖色偏移量Light2D Range200光照范围Light2D Color(1.0, 0.9, 0.7)暖光火把色这些参数都是我在项目里实际调试出来的但每个游戏的美术风格不同建议先把值设置成和表里一样的跑起来看看效果再根据实际风格微调。Shader参数没有绝对正确的值只有适合当前画面的值。