Unity之2D摄像机跟随

在2D游戏制作过程中,摄像机的跟随主角移动是必不可少的。有代码实现,也有插件实现。下面分别讲述两种方法。

Unity中提供了专属的摄像机插件进行使用:

官方Cinemachine插件(后面有相关组件介绍):

首先从unity中的window中的package manage中添加Cinemachine插件,完成后会出现Cinemachine如图:

unity 摄像头缩放 unity2d摄像机大小_游戏程序

并且在Cinemachine菜单中创建相关相机;

unity 摄像头缩放 unity2d摄像机大小_游戏程序_02

Cinemachine中的Virtual Camera(虚拟相机)可以说是最核心的组件。使用Cinemachine时,你需要记住一个准则:场景中一般只有一个Unity相机(除了需要制作分屏、画中画等效果的时候),上面挂着CinemachineBrain脚本;其他相机都是使用Cinemachine中的虚拟相机,可以有很多个。(平常使用这个较多)

菜单栏,选择Cinemachine > Create Virtual Camera。Unity会在场景中添加一个。Unity会在场景中添加一个GameObject,上面有一个Virtual Camera组件。如果你的Unity相机上没有CinemachineBrain脚本,Cinemachine也会自动添加CinemachineBrain脚本到Unity相机上。创建后如图:

unity 摄像头缩放 unity2d摄像机大小_游戏程序_03

如果相机需要跟随物体移动,指定一个物体到Follow属性上。虚拟相机会自动将Unity相机的位置和Follow物体保持相对位置,包括Follow物体移动的时候。:

unity 摄像头缩放 unity2d摄像机大小_unity 摄像头缩放_04

将所需要跟随的物体拖拽到此即可

接着是边缘的检测:

相机的边缘检测需要添加Cinemachine Confiner组件,并且创建一个空物体来进行Polygon Collider的存放:

unity 摄像头缩放 unity2d摄像机大小_unity 摄像头缩放_05

并且添加Polygon Collider 2D组件将需要显示的范围进行框起来:

unity 摄像头缩放 unity2d摄像机大小_优先级_06

接着回到虚拟相机中添加Confiner组件并将控制可视范围的空物体拖拽其上面:

unity 摄像头缩放 unity2d摄像机大小_unity 摄像头缩放_07

即可实现边缘检测,超出边缘不可见。

代码实现:

代码实现方法是最常用的方法之一,方便后续管理维护:

首先创建一个C#脚本,命名为CameraFollow:

unity 摄像头缩放 unity2d摄像机大小_c#_08

接着创建一个空物体,并将脚本挂在空物体,且将相机作为其子物体。

unity 摄像头缩放 unity2d摄像机大小_unity_09

其原理是将摄像机固定在一定范围,并且利用Lerp函数进行跟随目标移动,相关代码如下:

public class CamerFollow : MonoBehaviour
{
    public Transform target;
    public float smoothing;

    //定义两个位置进行限制相机移动
    public Vector2 minPosition;
    public Vector2 maxPosition;
    // Start is called before the first frame update
    void Start()
    {
        
    }
    void Update()
    {
        
    }
    void LateUpdate()
    {
        if (target != null)
        {
            Vector3 targetPos = target.position;
            targetPos.x = Mathf.Clamp(targetPos.x, minPosition.x, maxPosition.x);
            targetPos.y = Mathf.Clamp(targetPos.y, minPosition.y, maxPosition.y);
            transform.position = Vector3.Lerp(transform.position, targetPos, smoothing);
        }
    }
}

unity 摄像头缩放 unity2d摄像机大小_unity_10

拖拽需要跟随的目标,并且进行范围设定,此处范围限制可根据具体情况进行设定。如上即可代码实现摄像机跟随。

关于Lerp函数的使用,可以查看手册进行学习。

至此,实现摄像机的两种方法均已经实现,若有不足,望大家评论改正。

CinemachineVitualCamera组件的属性解读:

Solo:用于调试。选中这个按钮时,此虚拟相机会直接控制Unity相机显示在Game窗口中,用于相机的调试。(忽略优先级,但是需要所在GameOjbect是激活状态)
Game Window Guides:勾选时,Game窗口会显示辅助线,用于设置虚拟相机的各个属性。
Look At属性设置了物体,Aim设置为Composer或Group Composer或 Follow属性设置了物体,Body设置为Framing Composer
Save During Play:虚拟相机的属性在运行时的修改可以被保存下来,退出Play状态时不会被重置。
Priority优先级:虚拟相机的重要程度,用于Live镜头的选择。数值越高代表优先级越高。Cinemachine Brain会根据这个属性从所有激活的虚拟相机中选择活动的虚拟相机。在Timeline上使用时这个属性不生效。
Follow跟随目标:虚拟相机会跟随这个物体移动。Body属性基于这个目标物体更新Unity相机的位置。如果你想让相机保持它自己的位置不变,不要设置这个属性。
Look At瞄准:镜头瞄准的物体目标。Aim属性使用这个属性来更新Unity相机的旋转。如果你想相机保持原来的角度,不要设置这个属性。
Standby Update 待命时的更新方式,当虚拟相机物体没有被禁用,但是优先级不足时,虚拟相机处于待命状态。这个属性会影响性能,通常设置为Never是最好的,但是有时候可能需要虚拟相机更新来做一些镜头相关的计算判断。
  • Never 不更新
  • Always 每帧更新
  • Round Robin 循环更新:所有的待命虚拟相机循环更新,每帧更新一个相机(例如有10个待命的相机,第一帧更新第一个相机,第2帧更新第2个相机,…,第11帧更新第1个相机,以此类推)
Lens镜头设置:对应Unity相机中的属性,也可以从Preset中选择或者从现有的设置创建新的Preset。
Dutch镜头旋转。这个属性在Unity相机中是没有的,可以用来控制镜头的旋转。(在屏幕空间的旋转)

ens镜头设置:对应Unity相机中的属性,也可以从Preset中选择或者从现有的设置创建新的Preset。

Dutch镜头旋转。这个属性在Unity相机中是没有的,可以用来控制镜头的旋转。(在屏幕空间的旋转)
Transitions相机转换的相关设置:

Blend Hint混合方式:
None 无,默认线性混合
Spherical Position 根据Look At的物体球面旋转混合
Cylindrical Position 根据Look At的物体柱面旋转混合(水平方向圆弧,垂直方向线性)
Screen Space Aim When Target 在屏幕空间瞄准目标
Inherit Positon 下一个相机变成活动相机时,从上一个相机继承位置,即保持两个相机位置相同。
On Camera Live事件,相机变为活动时会触发对应的事件。
Body、Aim、Noise后面深入学习。
Extension:可以给虚拟相机添加额外的扩展。后面深入学习。