Unity

Unity项目Lost Crypt分析-5

2020-01-16  本文已影响0人  黑山老雕

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,作用暂时不明。

上一篇下一篇

猜你喜欢

热点阅读