https://blogs.unity3d.com/2019/12/18/download-our-new-2d-sample-project-lost-crypt/

Lost Crypt
Unity项目Lost Crypt分析  A
Lost Crypt

这次我们对 Lost Crypt 这个 Unity 官方项目进行分析。

如图所示,Lost Crypt 是一款 2D 游戏,它可以在 Unity 商店进行下载。


项目 Game Object 。

Cameras

这边先看 Cameras,这个项目使用了 Cinemachine,这是官方出品的一个相当强大的摄像机控制组件。

Cameras

Camera – Bounds 用于控制摄像机边缘碰撞,让摄像机在一个矩形框架内运动。

Camera – Bounds

Camera – Main 主摄相机,不用动他。

Camera – Main

CM VCam – Far 是这边虚拟相机组中的一个,用于远距离显示场景。黄色边框是之前所说的 Camera – Bounds

CM VCam – Far (Scene)
CM VCam – Far (Game)

CM VCam – Near 同样作为虚拟摄像机组中的一个。用于近距离显示场景。

CM VCam – Near (Scene)
CM VCam – Near (Game)

CM VCam – Sara Close 虚拟摄像机组中的一个,用于最近距离显示角色,特写。

CM VCam – Sara Close (Scene)
CM VCam – Sara Close (Game)

Trigger – Intro Transition – Far To Near 触发器,用于推拉摄像机,由远景到近景。

Trigger – Intro Transition – Far To Near

当玩家进入触发器内,触发 OnTriggerEnter2D,然后激活 CM VCam – Near。ObjectActivator 的代码就不贴了, 非常简单。

到这边 Camera 就分析完了,如果你之前了解过 Cinemachine,那么看起来会相当简单。

Environment

Environment 如同字面意思,表示场景内环境。

Environment 子组件

当把其他 GameObject 隐藏,只剩 Environment,如下图所示:

Environment

下面分析 Environment 子物体:

Character Bounds – Left,用于限制住玩家行动范围,使用了 Box Collider 2D:

Character Bounds – Left

Background 我们就不做分析,内部多为环境装饰。但是我们可以看到 Background 下许多子物体都挂载了 ParallaxLayer 组件:

它是一个视差脚本,代码如下:


public class ParallaxLayer : MonoBehaviour
{
    [SerializeField] float multiplier = 0.0f;
    [SerializeField] bool horizontalOnly = true;

    private Transform cameraTransform;

    private Vector3 startCameraPos;
    private Vector3 startPos;

    void Start()
    {
        cameraTransform = Camera.main.transform;
        startCameraPos = cameraTransform.position;
        startPos = transform.position;
    }


    private void LateUpdate()
    {
        var position = startPos;
        if (horizontalOnly)
            position.x += multiplier * (cameraTransform.position.x - startCameraPos.x);
        else
            position += multiplier * (cameraTransform.position - startCameraPos);

        transform.position = position;
    }

}


效果如下:

ParallaxLayer

它的原理是记下相机的初始位置,然后物体的位移等于相机位移乘以一个系数(multiplier)。越近的物体移动就越小。Background (远景) 的系数为正,Middle (中景)是没有这个脚本的。 Foreground(近景)的系数为负数。图中可以看到图像的移动情况。

Middle

Middle 中景没什么好讲的,上图:

Middle

Foreground

Foreground 近景,和远景一样,挂载了 ParallaxLayer,系数为负数。

Foreground

Lights

这里用过 Light 2D 控制场景灯光、时间。

Lights

在 Lights 上挂有 LightColorController 脚本,用于控制全局时间,如下图。

时间控制
时间控制

下面看看 Global,全局光照。挂载了很多 MaterialColorSetter。用于控制材质颜色。

public class MaterialColorSetter : MonoBehaviour, ColorSetterInterface
{
    [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));
    }
}

MaterialColorSetter 实现 ColorSetterInterface 接口。

Spirits 层放置DEMO中的精灵,这些精灵会在夜晚出现。

精灵

每个精灵实体都挂载了 VisibleOnlyDuringNight脚本,用于控制精灵在也晚才能显示出来。

public class VisibleOnlyDuringNight : MonoBehaviour
{
    LightColorController m_LightController;
    Renderer m_Renderer;
    private bool _allowUpdate;

    void Awake()
    {
		m_LightController = FindObjectOfType<LightColorController>();
		m_Renderer = GetComponent<Renderer>();
        _allowUpdate = m_Renderer != null && m_Renderer != null;
    }

    void Update()
    {
        if (_allowUpdate)
            m_Renderer.enabled = m_LightController.timeValue > 0.0f;
    }
}

在这里精灵用了一个自定义的 Shader Material_Spirit_Lit

ShaderGraph_Spirit_Lit

这暂不对 shader 进行讲解。

Forest 用于对森林进行光照,下面时光照对比图:

Light Group – Sun 用于对树顶进行模拟太阳光照。

Light Group – Sun

Light Group – Shafts 用于模拟太阳光穿过树叶造成的效果。

Light Group – Tree Tops 用了一个 Freeform 照亮树顶。

Light Group – Tree Tops

Light Group – Sun Spots – 1 用于模拟光照穿过树叶照射到树干上。用的是 Sprite Light 。

Light Group – Sun Spots – 1

Light Group – Sun Spots – 2 类似于 Light Group – Sun Spots – 1,用于模拟光照穿过树叶照射到地面上。用的是 Sprite Light。

Light Group – Character 角色光照。

Light Group – Grass 照亮草地。

Crypt 照亮遗迹。

分类: Unity

August

Android 开发者、影视后期内容(包装)制作者、Unity 2D游戏开发者

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: