美文网首页Unity
Unity项目Lost Crypt分析-5

Unity项目Lost Crypt分析-5

作者: 黑山老雕 | 来源:发表于2020-01-16 00:34 被阅读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,作用暂时不明。

    相关文章

      网友评论

        本文标题:Unity项目Lost Crypt分析-5

        本文链接:https://www.haomeiwen.com/subject/dkdzactx.html