Unity项目Lost Crypt分析-5
2D 灯光
洞穴中放置了一个环境光以及一个Altar的点光源。
2D灯光的文档在此:https://docs.unity3d.com/Packages/com.unity.render-pipelines.lightweight@6.7/manual/2DLightProperties.html
注意选择正确的Target Sorting Layer,才能点亮所在层的物体。
2D Light可以选择的Blend Style是在Render2DData中定义的。
image.png
其他场景中的灯光
既然看到了这里的灯光,就干脆看看其他的灯光。
全局有一个环境光,通过Target Sorting Layers的设置,只点亮室外环境(Cave不点亮)
image.png
树上放了点光源照亮树顶。
sunLight.gif
地窖中模拟从孔中射入的灯光, freeform类型:
image.png
入口区域的灯:
image.png
树的顶端也有freeform的灯光:
image.png
角色在户外也给了专门的灯光(原谅我,本来想用鼠标写一个角色,但是笔画太多了!写个Char代替吧):
image.png
Sprite类型的灯光
Sprite类型的灯光可以用来做树间漏下的光影:
treelight.gif
甚至还给其中一对光加上了缓慢摆动的动画,营造光影浮动的效果。
image.png
树上投下的光斑也是用Sprite Light
treelight1.gif
统一设置颜色的脚本Material Color Setter
Material Color Setter用来把下属的所有的材质的颜色做一个改变。
image.png
后续在调用setColor的时候,颜色会相应地被设置。
[GradientUsage(true)]
[SerializeField] Gradient gradient = null;
[SerializeField] string colorName = null;
[SerializeField] Material[] materials = null;
public void Refresh()
{
}
public void SetColor(float time)
{
foreach (var material in materials)
material.SetColor(colorName, gradient.Evaluate(time));
}
精灵的Shader
精灵的Shader叫做 ShaderGraph_Sprit_Lit。下图一个常用的伎俩,用时间t乘以系数后,乘以{0,-1},得到一个在Y方向不断减少(?)的矢量。然后作为偏移量叠加到UV,然后这个不断移动的UV作为噪声的UV,得到噪声不断偏移的效果。
image.png
计算火把的影响:
首先用Distance计算物体上点的位置与火把位置的差距,然后乘以一个系数。
image.png
距离应为绝对值,然后做Power运算,并用1减去,做反转。
image.png
然后与花纹相乘后,叠加到身体上。如果火把离得很远的话,基本上上一步算出来的就都是黑色,相乘以后基本就是0.所以花纹就不会显示。
image.png
而外部的轮廓主要受Fresnel的控制。在Shader Graph中,这个值的alpha是半透明的,所以在预览窗口能看到。但是在游戏中,它默认设置的alpha为0,所以一开始是看不到的。
image.png
调整为不透明之后就可以看到这个精灵的轮廓。
image.png
在精灵的Color Setter中,可以看到它是从半透明到白色,所以可以预见,在白天它是设置成半透明,晚上设置成白色,变为可见。
image.png
ColorController
再来看Lights这个prefab,上面挂载了LightColorController的脚本。当时间变化的时候,所有子模块中的ColorSetter都会一起工作,按照time调整成事先设定好的颜色。
private void Update()
{
if (currentTime != time)
UpdateSetters();
}
public void UpdateSetters()
{
currentTime = time;
foreach (var setter in setters)
setter.SetColor(time);
}
ColorSetter的接口也是在这里定义的。
public interface ColorSetterInterface
{
void Refresh();
void SetColor(float time);
}
tunelight.gif
最后,Lights上还挂载了一个Animator,现在并未设定Animator Controller,作用暂时不明。