【游戏开发教程】Unity Cinemachine快速上手,详细案例讲解(虚拟相机系统 | 新发出品 | 良心教程)

news2024/11/25 3:05:50

请添加图片描述

文章目录

      • 一、前言
      • 二、插件下载
      • 三、案例1:第三人称自由视角,Free Look character场景
        • 1、场景演示
        • 2、组件参数
          • 2.1、CinemachineBrain:核心
          • 2.2、CinemachineFreeLook:第三人称自由视角相机
            • 2.2.1、设置Follow:跟随
            • 2.2.2、设置LookAt:朝向
            • 2.2.3、三个圆环轨道:环绕约束
            • 2.2.4、圆环轨道之间的连接曲线:Spline Curvature
            • 2.2.5、相机移动策略,移动阻尼:Body Y/Z Damping
            • 2.2.6、相机旋转策略,瞄准:Aim
            • 2.2.7、瞄准偏移:Tracked Object Offset
            • 2.2.8、预测:Lookahead
            • 2.2.8、瞄准阻尼:Horizontal/Vertical Damping
            • 2.2.9、画面构图(重要)
          • 2.3、小结
        • 3、用代码控制相机移动(绕圆环旋转)
      • 四、案例2:相机避障不穿墙,Free Look collider场景
        • 1、场景演示
        • 2、组件参数
          • 2.1、CinemachineCollider:相机碰撞
            • 2.1.1、Add Extension拓展
            • 2.1.2、Collide Against:被认定为障碍物的Layer
            • 2.1.3、Ignore Tag:忽略碰撞检测的Tag
            • 2.1.4、Transparent Layers:透明层
            • 2.1.5、Minimum Distance From Target:与目标的最小距离
            • 2.1.6、Avoid Obstacles:是否避开障碍物
            • 2.1.7、Distance Limit:碰撞检测的射线长度
            • 2.1.8、Camera Radius:相机半径
            • 2.1.9、Strategy:避障策略
            • 2.1.10、Maximum Effort:一次可处理的最多的障碍物数量
            • 2.1.11、Smoothing Time:相机移动的平滑时间
            • 2.1.12、Damping:避障后相机恢复位置的阻尼
            • 2.1.12、Damping When Occluded:避障时的相机阻尼
      • 五、案例3:简单追踪,FollowCam Simple Follow场景
        • 1、场景演示
        • 2、组件参数
        • 2.1、CinemachineVirtualCamera:虚拟相机
          • 2.1.1、Follow与LookAt:追踪目标
          • 2.1.2、Binding Mode:Body绑定模式
            • 1、Lock To Target On Assign 模式(常用)
            • 2、Lock To Target With World Up 模式
            • 3、Lock To Target No Roll 模式
            • 4、Lock To Target 模式
            • 5、World Space 模式
            • 6、Simple Follow With World Up 模式
      • 六、案例4:动画状态驱动自由视角,StateDrivenCamera场景
        • 1、场景演示
        • 2、组件参数
          • 2.1、CinemachineStateDrivenCamera:状态驱动虚拟相机
          • 2.1.1、父节点:CinemachineStateDrivenCamera
          • 2.1.2、子节点:多个虚拟相机
          • 2.1.3、设置Animated Target
          • 2.1.4、设置State
      • 七、案例5:分镜/切镜,ClearShot场景
        • 1、场景演示
          • 1.1、ClearShot场景
          • 1.2、ClearShot closest场景
          • 1.2、ClearShot character场景
        • 2、组件参数
          • 2.1、CinemachineClearShot:自动选择/切换最适合的摄像头
          • 2.2、CinemachineBlendListCamera:虚拟相机过渡/混合器
          • 2.3、CinemachineTriggerAction:虚拟相机触发器
            • 2.3.1、碰撞体勾选Is Trigger
            • 2.3.2、设置过滤
            • 2.3.3、设置Skip First
            • 2.3.4、设置On Object Enter响应
      • 八、案例6:多目标追踪,Dolly Group场景
        • 1、场景演示
        • 2、组件参数
      • 九、其他案例
          • 1、打BOSS视角:BossCam场景
          • 2、双重目标:DualTarget场景
          • 3、近物透明,FadeOutNearbyObjects场景
          • 4、第三人称瞄准,3rdPersonWithAimMode场景
          • 5、镜头震动,Impulse场景
      • 十、完毕

一、前言

嗨,大家好,我是新发。
相信很多同学都用过UnityCinemachine插件,使用它可以很方便地实现一些摄像机效果,比如摄像机追踪、推拉镜头、分镜等效果。
插件提供了很多场景案例,大家可以看下插件的官方文档:
https://docs.unity3d.com/Packages/com.unity.cinemachine@2.8/manual/CinemachineUsing.html

趁五一假期有时间,我准备对插件里的案例场景进行讲解,方便大家快速上手,希望大家学以致用。

提示:本文内容较长,建议收藏后使用电脑观看。

注:本文使用的Unity版本为2021.3.1f1c1Cinemachine版本为2.8.4

二、插件下载

PackageManager中搜索Cinemachine,点击Install安装即可,
在这里插入图片描述
本文我要讲解插件的案例,所以需要把Samples也引入到工程中,点击SamplesImport按钮,
在这里插入图片描述
完成后我们就可以在工程中看到Cinemachine的插件包和案例包了,如下
在这里插入图片描述
现在我们开始吧~

注:本文讲解的案例顺序不是按照目录顺序,而是根据常用程度进行排序

三、案例1:第三人称自由视角,Free Look character场景

1、场景演示

双击打开Free Look character场景,
在这里插入图片描述
这是第三人称自由视角的摄像机效果,如下
请添加图片描述
画个图

在这里插入图片描述

2、组件参数

2.1、CinemachineBrain:核心

主摄像机上挂CinemachineBrain组件,参数默认即可,它是整个虚拟相机系统的核心,
在这里插入图片描述

2.2、CinemachineFreeLook:第三人称自由视角相机

CM FreeLook1节点上挂了CinemachineFreeLook组件,它实现了第三人称自由视角的相机逻辑,是非常常用的一个相机功能,
在这里插入图片描述
下面我介绍一下这个组件的参数设置。

2.2.1、设置Follow:跟随

我们需要设置追踪的目标物体,这里设置追踪的目标是主角的Root节点,
在这里插入图片描述
如下
在这里插入图片描述
设置了Follow对象,摄像机就会跟着追踪的对象移动了。
请添加图片描述

2.2.2、设置LookAt:朝向

设置LookAt,可以让相机角度始终朝着目标的方向,这里设置的是看向主角的头,
在这里插入图片描述
如下
在这里插入图片描述
我们可以看到相机的Z轴(蓝色的那根轴)始终朝着主角的头,
请添加图片描述

2.2.3、三个圆环轨道:环绕约束

摄像机围绕主角环绕的范围是由三个圆环轨道决定的,如下
在这里插入图片描述
我们可以调整这三个圆环轨道的高度和半径,如下
在这里插入图片描述
如下
请添加图片描述

2.2.4、圆环轨道之间的连接曲线:Spline Curvature

三个圆环之间有一根连接的曲线,它是摄像机在竖直方向上移动的约束,你可以把它想象成就是一根弯曲的杆子,在它对面有一根形状与它一样的隐形的杆子,相机只能在这根隐形的杆子上移动,
在这里插入图片描述
我们可以调节Spline Curvature来调整这根连接杆的弯曲程度,
在这里插入图片描述
如下
请添加图片描述

2.2.5、相机移动策略,移动阻尼:Body Y/Z Damping

我们有三个圆环轨道,分别对应三个机位视角:顶部机位、中部机位、底部机位,
在这里插入图片描述
我们可以调整每个机位的相机移动阻尼、画面构图等,以Middle Rig中部机位为例,
我们可以调整相机跟随的移动阻尼,阻尼越大,跟随速度越慢,
在这里插入图片描述
Y Damping用于控制相机在竖直方向上的跟随阻尼,比如角色跳跃的时候,相机也会跟着在竖直方向上 “跳”,相机的 “跳” 会受到这个Y Damping阻尼影响。
同理,Z Damping控制垂直于屏幕方向移动的阻尼,比如角色往垂直于屏幕的方向走,相机也跟着往前,相机在这个方向上的跟随受到Z Damping阻尼的影响。

注:阻尼可以减少由于相机速度过快而出现画面抖动的效果。
阻尼为 0 会显得跟随很僵硬,可能出现画面抖动;阻尼过大则会导致相机跟随太慢,跟不上主角。

我调整Z Damping给大家演示一下,首先看下Z Damping1时的效果,
请添加图片描述

接着我把Z Damping阻尼调大到20,可以看到相机跟随已经跟不上主角的移动了,特别是主角跑起来的时候,建议保持默认的1即可,
请添加图片描述

2.2.6、相机旋转策略,瞄准:Aim

展开Aim下拉按钮,
在这里插入图片描述

我们可以在Game试图中看到出现了一些线和一些区域块,如下,它是通过约束相机的旋转来达到让瞄准的物体显示在画面区域内的,
在这里插入图片描述
如果你没有显示上面的线和区域,检查一下Game Window Guides是否是勾选状态,
在这里插入图片描述
我们可以切换瞄准的策略,默认是Composer
在这里插入图片描述
每种瞄准策略含义如下

瞄准策略说明
Composer将目标保持在相机镜头内,可以设置多种约束
Group Composer将多个目标保持在相机镜头内
Hard Look At将Look At目标固定在镜头中心的位置
POV根据用户的输入旋转相机
Same As Follow Target将相机的旋转和跟随目标的旋转同步

下面以Composer 策略为例,介绍一下各个参数的用途。

2.2.7、瞄准偏移:Tracked Object Offset

Tracked Object Offset相参数控制对于跟踪目标的偏移,比如我们Look At的目标是Head节点,但是这个节点与主角的真实头部偏了一些,我们就可以通过调整Tracked Object Offset来校准瞄准的位置,

在这里插入图片描述
如下
请添加图片描述

2.2.8、预测:Lookahead

在这里插入图片描述

参数说明
Lookahead Time预测提前的秒数,默认为0,如果大于0,会预测目标的位置,如果主角移动速度很快,可以适当进行预测,如果主角移动速度不快,但开启了预测,可能会导致相机抖动
Lookahead Smoothing预测算法的平滑度,提高平滑度可以减少预测抖动,但会导致预测滞后
Lookahead ignore Y预测算法会忽略Y轴的移动

我们把Lookahead Time调大到1
在这里插入图片描述
效果如下,可以看到,过度预测导致了相机的抖动,
请添加图片描述
我们保持1Lookahead Time,此时我们把Lookahead Smoothing调大到8
在这里插入图片描述
效果如下,可以看到,相机提前预测了目标位置,抖动平滑了一些,但是由于我们的主角移动速度并不快,预测导致相机超前,最后还得折返回来,所以这里我们没有必要开启预测。
如果你的项目的主角是飞机,飞行速度快,则可以考虑开启预测。
请添加图片描述

Lookahead Ignore Y就是忽略Y轴方向上的预测,比如跳跃动作,我们不想让相机做Y轴上的预测,就可以勾选它,
在这里插入图片描述
一般情况下,我们都不需要开启预测,保持为0即可,
在这里插入图片描述

2.2.8、瞄准阻尼:Horizontal/Vertical Damping

在这里插入图片描述
注意,这个和2.2.5小节讲的Body Y/Z Damping阻尼是不同的,Body Y/Z Damping是移动阻尼,而Horizontal/Vertical Damping是旋转阻尼,
为了方便观察,我先把Follow设为None,让相机固定位置不动,
在这里插入图片描述
现在我们先看Horizontal Damping0.5时的效果,此时水平旋转阻尼比较小,相机的旋转是可以跟上主角的移动的,
请添加图片描述
现在我们把Horizontal Damping调整到3,效果如下,可以看到,相机的水平旋转由于阻尼的作用而出现了滞后,适当的阻尼可以减少抖动,过大的阻尼会带来滞后,我们保持默认的0.5就好了,
请添加图片描述

2.2.9、画面构图(重要)

喜欢摄影的同学应该都听说过构图,比如三分法、中央对称法、对角线三角形、留白、黄金比例等等。在Cinemachine中,提供了Dead ZoneSoft Zone来约束主角在画面中的位置,我们可以调整对应的参数来实现自己的画面构图,
在这里插入图片描述
Dead ZoneSoft Zone区域如下,
在这里插入图片描述
Dead Zoon范围内,主角的移动不会触发相机的旋转,为了演示,我把Dead Zone调大一点点,我们可以通过Dead Zone WidthDead Zone Height来调整Dead Zoon的区域大小,
在这里插入图片描述
可以看到,Dead Zoon范围内,主角的移动不会触发相机的旋转,只有当主角的位置超出了Dead Zone的区域,才会触发相机的旋转,
请添加图片描述
我们可以把Dead Zone区域调为``0```,这样主角只要发生移动,就会触发相机的旋转,
在这里插入图片描述

同理,Soft Zone的区域是一个缓冲区域,在这个区域内,相机会插值旋转(慢慢旋转),直至把主角 “推” 回到 Dead Zone内,如果主角的位置超过了Soft Zone的区域,相机就会立刻旋转确保主角留在Soft Zone区域内。

比如我现在把Soft Zone区域调小,
在这里插入图片描述
测试效果如下,可以看到,当主角尝试超过Soft Zone区域时,相机的旋转速度会立刻跟上,确保主角在Soft Zone区域内,
请添加图片描述
Screen XScreen Y是用来调整整个Zone的屏幕位置的,
在这里插入图片描述
比如把整个Zone调整到屏幕左下角,这样主角在画面中的位置就是左下角了,
请添加图片描述

Bias XBias Y用来调整Soft Zoon相对于整个Zoon的位置偏移,

在这里插入图片描述
效果如下,
请添加图片描述

2.3、小结

这个案例中,我们主要设置CinemachineFreeLook组件的FollowLookAt对象,调整移动阻尼:Body Y/Z Damping,调整一下AimDead ZoneSoft Zone就差不多了,可以快速应用到自己的实际项目中。

3、用代码控制相机移动(绕圆环旋转)

等我们移动鼠标的时候,相机会围绕圆环轨道移动,如下
请添加图片描述
这是因为CinemachineFreeLook组件监听了Mouse YMouse X输入,它根据鼠标的移动去控制相机的移动,
在这里插入图片描述
如果我们先禁用它自身的这个控制,可以把这两个Input Axis Name设置为空,
在这里插入图片描述
接着,我们在代码中去设置CinemachineFreeLook组件的m_XAxism_YAxis成员的m_InputAxisValue 即可,例:

using UnityEngine;
using Cinemachine;

public class Main : MonoBehaviour
{
    private CinemachineFreeLook vcam;

    void Start()
    {
        vcam = GetComponent<CinemachineFreeLook>();
    }

    void Update()
    {
        // 自己通过代码获取 x、y分量,比如通过摇杆获取,这里我就仍然使用 Mouse X 和 Mouse Y吧
        var x = Input.GetAxis("Mouse X");
        var y = Input.GetAxis("Mouse Y");
        // 相机移动
        vcam.m_XAxis.m_InputAxisValue = x;
        vcam.m_YAxis.m_InputAxisValue = y;
    }
}

关于摇杆的实现,可以参见我之前写的这篇博客的第六节:【游戏开发创新】用Unity等比例制作广州地铁,广州加油,早日战胜疫情(Unity | 地铁地图 | 第三人称视角)


四、案例2:相机避障不穿墙,Free Look collider场景

1、场景演示

双击打开Free Look collider场景,
在这里插入图片描述
这也是第三人称自由视角的摄像机效果,在此基础上加了CinemachineCollider,避免相机穿墙的问题,效果如下
请添加图片描述
画个图

在这里插入图片描述

2、组件参数

2.1、CinemachineCollider:相机碰撞

在上面案例1的基础上,加多了一个CinemachineCollider组件,
在这里插入图片描述

2.1.1、Add Extension拓展

如果你点击AddComponent按钮,你是找不到这个CinemachineCollider组件的;
在这里插入图片描述

正确的姿势是点击CinemachineFreeLookAdd Extension下拉选项,添加CinemachineCollider拓展,

在这里插入图片描述

2.1.2、Collide Against:被认定为障碍物的Layer

虚拟相机的碰撞是通过射线检测来实现的,射线检测的时候可以传一个LayerMask参数过滤要检测的层,这里Collide Against参数就是设置被认为障碍物的Layer,只有被勾选的Layer才会参与射线碰撞检测,
在这里插入图片描述

2.1.3、Ignore Tag:忽略碰撞检测的Tag

如果我们想要剔除掉某个Tag的物体,不对特定Tag的物体进行碰撞检测,可以设置Ignore Tag参数,这里设置的是Player,也就是不与主角做碰撞检测(也就是说摄像机有可能从主角身上穿过去)
在这里插入图片描述

2.1.4、Transparent Layers:透明层

透明层的物体被认为是透明的,不作为障碍物处理。
可能有同学要问了,上面不是已经有个Tag来剔除碰撞检测对象了吗,这个透明层是不是有点功能重复了?非也,请往下看,
在这里插入图片描述
首先要清楚这个CinemachineCollider的功能不仅仅是确保相机不穿墙,还要确保主角不被 障碍物 挡住。

比如下面这种情况(我把Transparent Layers设置为Default,这样墙壁被认为是透明层),相机并没有在墙里面,但是视线被墙挡住了,看不见主角,
在这里插入图片描述
我们把Transparent Layers改回Nothing
在这里插入图片描述
此时可以看到,主角画面没有被墙挡住了,现在你知道Transparent Layers是干嘛的了吗~
在这里插入图片描述
如果这里的墙确实是半透明的,那么我们就可以把它的层加入到Transparent Layers,比如这里我特意把墙改为半透明,添加了一个Wall层,
在这里插入图片描述
效果如下
请添加图片描述

2.1.5、Minimum Distance From Target:与目标的最小距离

与目标的最小距离 ,只有大于最小距离,Cinemachine才会进行规避障碍物的操作。

2.1.6、Avoid Obstacles:是否避开障碍物

勾选了才会执行避障逻辑。

2.1.7、Distance Limit:碰撞检测的射线长度

上面我们说到碰撞检测这里用的是射线来检测的,Distance Limit就是射线的长度,为0的时候则以CinemachineFollow目标的距离为射线长度,

2.1.8、Camera Radius:相机半径

相机将尝试与任何障碍物保持此距离。 尽量保持这个值很小。

2.1.9、Strategy:避障策略

在这里插入图片描述

避障策略说明
Pull Camera Forward直接让相机往前走,移动到障碍物之前
Preserve Camera Height相机高度不变,通过向左或向右移动来避开障碍物
Preserve Camera Distance保持相机和目标的距离不变,避开障碍物

Pull Camera Forward 这种策略摄像机会出现瞬移的问题,如下
请添加图片描述

Preserve Camera Height 这种策略摄像机会在水平方向上移动来过渡,而不是像上面那样瞬移,推荐使用这种策略,如下

请添加图片描述
Preserve Camera Distance 这种策略由于为了保持距离,摄像机会出现向上蹿或像下蹿的问题,如下

请添加图片描述

2.1.10、Maximum Effort:一次可处理的最多的障碍物数量

一般4个就可以了,太高影响性能。

2.1.11、Smoothing Time:相机移动的平滑时间

在距离目标最近的点保持相机的最小秒数。如果场景中障碍物很多,会导致摄像机频繁避障而出现相机跳动,比如我在主角周围摆了那么多障碍物,
在这里插入图片描述
此时,就可以适当调大Smoothing Time,减少多余的摄像机避障移动。
我们先看下Smoothing Time0时的效果,可以看到摄像机很跳,
请添加图片描述
现在我们把Smoothing Time调大到2,效果如下,可以看到,摄像机平滑了很多,不会那么跳了,

请添加图片描述

2.1.12、Damping:避障后相机恢复位置的阻尼

遮挡消失后,相机恢复到正常位置的阻尼。
比如我们使用Pull Camera Forward避障策略,然后把Damping调大,可以看到在遮挡消失后,相机位置有一个平滑的过渡恢复效果,
请添加图片描述

2.1.12、Damping When Occluded:避障时的相机阻尼

上面的Damping是避障后恢复的阻尼,这个Damping When Occluded则是避障时的相机阻尼,我们同样使用Pull Camera Forward避障策略进行测试,把Damping When Occluded调大,效果如下,可以看到,当出现遮挡时,摄像机不是瞬移了,而是有个阻尼过渡移动过去,看起来貌似与Preserve Camera Height避障策略差不多,但Preserve Camera Height避障会确保摄像机不穿墙,而这种Pull Camera Forward配合Damping When Occluded的方式是会存在摄像机穿墙的问题的。
请添加图片描述

五、案例3:简单追踪,FollowCam Simple Follow场景

1、场景演示

双击打开FollowCam Simple Follow场景,
在这里插入图片描述
这是一个追踪一架飞机飞行的摄像机效果,效果如下
请添加图片描述
画个图

在这里插入图片描述

2、组件参数

2.1、CinemachineVirtualCamera:虚拟相机

CinemachineFreeLook一样,CinemachineVirtualCamera也是继承CinemachineVirtualCameraBase,相对来说,CinemachineVirtualCamera功能更简单一些。
在这里插入图片描述

2.1.1、Follow与LookAt:追踪目标

同样也是设置FollowLookAt参数,设置追踪的目标和朝向的目标。
在这里插入图片描述

2.1.2、Binding Mode:Body绑定模式

需要重点讲一下Body的绑定模式,
在这里插入图片描述
大家可以打开Transposer场景,
在这里插入图片描述
这个场景里帮我们创建了多个Binding Mode的虚拟相机,方便我们进行测试,
在这里插入图片描述
下文,我将使用一个更直观的案例进行演示~

1、Lock To Target On Assign 模式(常用)

当相机跟踪目标被设置的时候,把相机设置到目标物体的局部坐标系中,但不跟随目标物体的旋转而移动。

简单讲就是:你动我动,你转我不动

请添加图片描述

这种适用于视角固定的追踪,为了方便演示应用效果,我导入另外一个Package资源包,该资源包可以在AssetStore免费下载使用,地址:https://assetstore.unity.com/packages/3d/characters/humanoids/character-pack-free-sample-79870
在这里插入图片描述
稍微整一下场景,如下
在这里插入图片描述
虚拟相机参数设置如下,
在这里插入图片描述

我们运行,效果如下
请添加图片描述

2、Lock To Target With World Up 模式

相机被设置到目标物体的局部坐标系中,但不会跟随目标物体在z轴旋转, 也不会跟随目标物体在x轴倾斜。

简单讲就是:你动我动,你x/z轴转我不动,你y轴转我动。

请添加图片描述
同样,我们使用小男孩演示下镜头效果,注意主角身上的SimpleSampleCharacterControl组件的移动模式切换成Tank模式,
在这里插入图片描述
运行效果如下,适合这种视角始终朝着角色背后的情景,
请添加图片描述
并且主角x轴旋转时,相机不会因为主角的旋转而移动,

请添加图片描述

3、Lock To Target No Roll 模式

相机被设置到目标物体的局部坐标系中,但不会跟随目标物体在```z``轴的旋转。

简单讲就是:你动我动,你x/y旋转我动,你z轴转我不动。

请添加图片描述
小男孩效果如下,
请添加图片描述
这个情景看起来效果与Lock To Target With World Up一样,但如果主角在绕着x轴旋转,相机会跟着移动,如下

请添加图片描述

4、Lock To Target 模式

这是最容易理解的类型,相机被设置到目标物体的局部坐标系中,将一直跟随目标物体旋转和移动。

简单讲就是:你动我动,你转我动。

请添加图片描述
小男孩效果如下,
请添加图片描述
跟上面的Lock To Target No Roll Lock To Target With World Up 运行效果一样,但如果主角在沿着xy轴旋转,摄像机会跟着移动,
请添加图片描述

其实对于小男孩的这个情景,你使用Lock To TargetLock To Target No Roll Lock To Target With World Up 的运行效果一样,因为这个情景下,小男孩并不会发生xy轴的旋转。

5、World Space 模式

相机跟目标的偏移以世界坐标来进行计算,并始终保持在初始设置的状态。

简单讲就是:你动我动,你转我不动
诶,听起来跟 Lock To Target On Assign 模式一样,其实不一样,区别就在于Follow Offset参数,Lock To Target On Assign 模式是把 Follow Offset当做目标物体的局部坐标系来计算偏移的,而 World Space 模式,则是以世界坐标系来计算偏移的,

在这里插入图片描述
请添加图片描述
小男孩运行效果如下,
请添加图片描述
表现效果与Lock To Target On Assign一样,如果在这种应用情景下,我建议使用World Space,因为少了一步转局部坐标的过程。

6、Simple Follow With World Up 模式

使用相机坐标系来计算与目标物体的偏移,不会跟随物体旋转而改变朝向,相机方向始终向上。
比如这个时候的相机坐标系是这样的,
在这里插入图片描述
把这个坐标系移动到目标物体的中心位置,然后基于这个坐标系做一次Follow Offset偏移,即可得到相机的位置,

在这里插入图片描述
效果如下
请添加图片描述

小男孩运行效果如下,
请添加图片描述

这一看好像与World Space模式的表现是一样的,其实不一样,我们换个视角观察,我让小男孩一直往左走,先看下World Space的效果,
请添加图片描述
现在我们看下Simple Follow With World Up 模式下,小男孩一直往左跑是什么效果,如下,小男孩是绕着圈圈走的。之前就有一个策划拿着某款游戏过来问我,为什么主角一直往右跑的时候看起来好像是在转圈圈,我猜那款游戏用的就是Simple Follow With World Up模式,

请添加图片描述

六、案例4:动画状态驱动自由视角,StateDrivenCamera场景

1、场景演示

双击打开StateDrivenCamera场景,
在这里插入图片描述
这是一个根据主角动画状态切换摄像机机位效果,默认情况下是一个第三人称自由视角,当主角跑起来的时候,会切换到一个固定视角的虚拟相机机位,我们运行,在Scene窗口看下这个切换过程,
请添加图片描述
画个图

在这里插入图片描述

2、组件参数

这个案例我们只需要讲一下CinemachineStateDrivenCamera组件,其它的上文已经讲过了。

2.1、CinemachineStateDrivenCamera:状态驱动虚拟相机
2.1.1、父节点:CinemachineStateDrivenCamera

在父节点上挂CinemachineStateDrivenCamera组件,
在这里插入图片描述

2.1.2、子节点:多个虚拟相机

子节点可以放多个虚拟相机,
在这里插入图片描述

2.1.3、设置Animated Target

因为我们需要根据动画状态来切换不同的虚拟相机,所以需要给CinemachineStateDrivenCamera组件指定Animated Target,把主角的Animator对象赋值给它,
在这里插入图片描述

2.1.4、设置State

我们先看下主角的动画状态机,很简单,只有LocomotionSprint两个动画状态,
在这里插入图片描述
我们在CinemachineStateDrivenCamera组件上分别给这两个动画状态添加要激活的虚拟相机,如下
在这里插入图片描述

七、案例5:分镜/切镜,ClearShot场景

ClearShot翻译过来是清晰的镜头的意思,就是从多个相机镜头中选择一个画面质量最好的镜头,切换过去,表现上就像分镜的效果。

啥是分镜呢?首先看下百科的概念,

分镜(Storyboard) 又叫故事板。是指电影、动画、电视剧、广告、音乐录像带等各种影像媒体,在实际拍摄或绘制之前,以图表的方式来说明影像的构成,将连续画面以一次运镜为单位作分解,并且标注运镜方式、时间长度、对白、特效等。根据媒体不同划分成不同分镜。常见的有影片分镜,漫画分镜。影片分镜用以解说一个场景将如何构成,人物以多大的比例收入镜头成为构图、做出什么动作,摄影机要从哪个角度切入或带出、摄影机本身怎么移动、录映多少时间等。

喜欢看漫画的同学应该不陌生,一个场景中我们架设多个虚拟相机机位,为了做出最好的画面表现,我们需要进行镜头切换,比如下面的漫画,一个格子就像是一个机位拍摄的画面,镜头角度、位置等,什么时候去切换镜头,这些对应到Cinemachine中,就是ClearShot要做的事情,

在这里插入图片描述
在这里插入图片描述
Cinemachine给我们做了三个场景,我们先运行看下效果。
在这里插入图片描述

1、场景演示

1.1、ClearShot场景

先双击打开ClearShot场景,运行效果如下
请添加图片描述
场景中架了三个虚拟相机,如下,根据主角是否被遮挡进行最优切换,

在这里插入图片描述
在这里插入图片描述

虚拟相机父节点是一个CinemachineClearShot,下文会介绍这个组件的参数,
在这里插入图片描述
画个图
在这里插入图片描述

1.2、ClearShot closest场景

先双击打开ClearShot closest场景,运行效果如下
请添加图片描述
场景中架了六个虚拟相机,如下,根据与主角的距离进行最优切换,
在这里插入图片描述

其中CinemachineClearShot子节点虚拟相机中嵌了一个CinemachineBlendListCamera,下文会介绍这个组件的参数,
在这里插入图片描述
按照惯例画个图
在这里插入图片描述

1.2、ClearShot character场景

双击打开ClearShot character场景,运行效果如下

请添加图片描述
场景中架设了5个虚拟相机
在这里插入图片描述
其中用到了虚拟相机触发器:CinemachineTriggerAction,用于检测主角是否进入触发器区域,然后进行虚拟相机的切换,下文会介绍这个组件的参数,
在这里插入图片描述
画个图
在这里插入图片描述

2、组件参数

2.1、CinemachineClearShot:自动选择/切换最适合的摄像头

CinemachineClearShot会根据被观察目标的最好画面质量,从子节点中选择一个最合适的虚拟相机。
至于它是根据什么做出最优选择的,大家可以查看CinemachineClearShot.cs源码的ChooseCurrentCamera方法,
在这里插入图片描述
主要是根据虚拟相机的ShowQualityPriority两个参数进行评估的,
在这里插入图片描述
在这里插入图片描述
ShowQuality又是根据相机是否被遮挡、与目标的距离等参数进行评估的。
如果我们想手动触发虚拟相机的切换,可以通过代码设置虚拟相机的Priority参数提高优先级。
这里我们主要讲一下如何设置CinemachineClearShot组件的参数。
我们只需要在子节点中添加虚拟相机,就会自动在下面的列表中显示出来,我们设置一下Priority优先级参数即可,
在这里插入图片描述
另外,CinemachineClearShot本身也有FollowLookAt参数,如果子节点的虚拟相机没有设置FollowLookAt,则会以CinemachineClearShot的为准,否则以子节点虚拟相机的FollowLookAt为准,
在这里插入图片描述

2.2、CinemachineBlendListCamera:虚拟相机过渡/混合器

ClearShot closest场景中用到了CinemachineBlendListCamera,我使用另一个专门的场景来讲解,
双击打开BlendListCamera
在这里插入图片描述
场景中放了两个CinemachineBlendListCamera
在这里插入图片描述
我们把默认的虚拟相机禁用,把第一个CinemachineBlendListCamera激活,可以看到它底下有两个虚拟相机,
在这里插入图片描述
CinemachineBlendListCamera做的事情就是按照我们设定的顺序进行虚拟相机的过渡,注意,这里会按照我们排的顺序进行过渡,而不会进行像ClearShot那样进行画面质量评估,下面这个设置的意思就是先在CM vcam A虚拟相机状态停留0.5秒,然后用2秒时间过渡到CM vcam B,过渡的缓动曲线使用Ease In Out
在这里插入图片描述
常用的缓动曲线如下
在这里插入图片描述

我们调整一下两个虚拟相机的位置,如下
在这里插入图片描述
现在我们运行看看效果,可以看到相机从CM vcam A过渡到了CM vcam B
请添加图片描述
我们还可以让它从CM vcam B回到CM vcam A,我们添加过渡设置,如下
在这里插入图片描述
重新运行,效果如下,可以看到,相机最后又过渡回到了CM vcam A
请添加图片描述
如果我们想要让这个顺序循环执行,可以勾选Loop
在这里插入图片描述

2.3、CinemachineTriggerAction:虚拟相机触发器

插件中的Trigger volumes场景可以针对触发器进行测试,
在这里插入图片描述
可以用它来实现虚拟相机的镜头切换,
请添加图片描述
也可以用来实现机关触发(比如执行TimeLine

请添加图片描述
插件中还有一个Anywhere Door(任意门)场景,用的就是CinemachineTriggerAction触发器来实现两个世界的无缝穿越的,挺有意思的,效果如下

请添加图片描述

下面讲一下CinemachineTriggerAction组件的参数设置。

2.3.1、碰撞体勾选Is Trigger

我们可以打开CinemachineTriggerAction.cs查看源码,里面其实就是使用OnTriggerXXX来检测碰撞,然后执行对应的响应方法,

在这里插入图片描述
注意使用CinemachineTriggerAction的物体上,需要带Collider,并且勾选Is Trigger,如下
在这里插入图片描述

2.3.2、设置过滤

我们可以设定Layer MaskWith TagWithout Tag进行过滤,
在这里插入图片描述
只有通过过滤器的检测才能触发逻辑,
在这里插入图片描述

2.3.3、设置Skip First

Skip First可以用来跳过前面N此的触发,比如第一次进入时不想触发逻辑,则可以把Skip First设置为1,如果想要每次都触发,则把Skip First设置为0,并勾选Repeating
在这里插入图片描述
Skip First逻辑如下
在这里插入图片描述

2.3.4、设置On Object Enter响应

进入触发器,触发响应逻辑,我们可以设置要执行的行为,
在这里插入图片描述
支持的行为如下
在这里插入图片描述

响应行为说明
Custom自定义,使用组件里的Event()自定义触发函数
Priority Boost增加目标虚拟相机的优先级,并把虚拟相机推入优先队列顶部
Activate激活虚拟相机,并把虚拟相机推入优先队列顶部
Deactive禁用目标物体,即执行SetActive(false)
Enable激活目标组件,即设置组件的 enabled 为 true
Disable禁用目标组件,即设置组件的 enabled 为 false
Play播放Timeline
Stop停止Timeline

同理,物体离开触发器会触发On Object Exit,我们也可以设置对应的响应行为,
在这里插入图片描述

八、案例6:多目标追踪,Dolly Group场景

1、场景演示

双击打开Dolly Group场景,
在这里插入图片描述
运行效果如下

请添加图片描述

2、组件参数

这个场景使用了一个Timeline来控制虚拟相机的移动,虚拟相机LookAt的目标是一个TargetGroup物体,
在这里插入图片描述

这个TargetGroup物体上挂着CinemachineTargetGrouop组件,通过它可以实现虚拟相机同时追踪多个物体的效果(原理是动态调整相机的Field Of View来确保多个物体都在画面以内),参数比较简单,主要是设置多个对象物体到列表中即可,
在这里插入图片描述

九、其他案例

我感觉我写得太详细了,不知不觉本文内容已经非常长了,再写下去感觉没有同学能耐心看完了,其他场景案例我这里就不挨个讲解了,大家可以自己玩玩看。

1、打BOSS视角:BossCam场景

请添加图片描述

2、双重目标:DualTarget场景

请添加图片描述

3、近物透明,FadeOutNearbyObjects场景

请添加图片描述

4、第三人称瞄准,3rdPersonWithAimMode场景

请添加图片描述

5、镜头震动,Impulse场景

请添加图片描述

十、完毕

好了,不写了不写了,先到这里吧~
我是林新发,https://blog.csdn.net/linxinfa
一个在小公司默默奋斗的Unity开发者,希望可以帮助更多想学Unity的人,共勉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/880130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“Linux vs. Windows: 一些你可能不知道的区别“

文章目录 每日一句正能量前言分享一些在Linux上顺理成章&#xff0c;换到Windows上就可能令人费解的事介绍或分享一些Linux的使用技巧介绍或分享一些Windows的使用技巧后记 每日一句正能量 世界上最暖心的一句话&#xff0c;不是你在成功时多热切地喝彩&#xff0c;而是在失意时…

大疆秋招指南,网申测评和面试攻略

大疆秋招内容简介 这是一个非常卷的时代&#xff0c;一到毕业季&#xff0c;各种各样规模不一的公司&#xff0c;纷纷向社会招聘&#xff0c;竞争实力强&#xff0c;知名度越高的企业&#xff0c;往往越能得到能力出众的人才的青睐&#xff0c;也正是在一批批新血液的注入下&a…

使用插件实现pdf,word预览功能

效果 代码&#xff1a; 插件地址&#xff1a; https://github.com/501351981/vue-office <a-modalv-model:visible"visible":title"title"ok"handleOk":bodyStyle"bodyStyle":width"1200":maskClosable"false"…

运营商三要素 API:构建安全高效的身份验证系统

当今数字化的世界中&#xff0c;身份验证是各行各业中至关重要的一环。为了保护用户的隐私和数据安全&#xff0c;企业需要寻求一种既安全可靠又高效便捷的身份验证方式。运营商三要素 API 应运而生&#xff0c;为构建安全高效的身份验证系统提供了有力的解决方案。 运营商三要…

【Apple】Logic Pro导入7.1.4.wav并自动分析多声道

Step1: 创建空项目 Step2: 选中下图“使用麦克风或...”这一项&#xff0c;底下要创建的轨道数填1就行。 点击创建之后&#xff1a; Step3: 拖动文件、拖动文件、拖动文件到项目中&#xff0c;并选中复选框“所有所选文件都源自一个项目&#xff08;将创建一个智能速度多轨道集…

Vue3使用vue-print-nb插件调起打印功能

一、效果图 二、使用方式 安装插件 //Vue2.0版本安装方法 npm install vue-print-nb --save yarn add vue-print-nb//Vue3.0版本安装方法&#xff1a; npm install vue3-print-nb --save yarn add vue3-print-nb在全局引用 import Print from vue-print-nb Vue.use(Print)打…

用身边统计学告诉大家ChatGPT听闻过的、用过的、重度使用的大概有多少?

最近摸鱼时&#xff0c;看到有人发帖说信息茧房真的是无处不在。讨论一番后&#xff0c;确实是这样&#xff0c;每个人都在不同程度的“坐井观天”罢了。拿最近火遍全球的ChatGPT来说&#xff0c;身边真的不少人听都没听过。这里有个更详细调查&#xff0c;不过是Sunergia做的&…

一、DVP摄像头调试笔记(排查问题篇)

一、DVP摄像头无应答排查&#xff08;MCLK&#xff09; 1、首先检查当前MCLK 时钟是否存在&#xff0c;MCLK可以理解为摄像头的心跳&#xff08;没有主时钟就是主控或者晶振没有工作&#xff0c;应该检测主控驱动/检查晶振电源不起震问题&#xff09;。目前提供MCLK存在两种方…

推断统计(单因素方差分析)

此时我们是取的四种不同图案的儿童水杯的销量作为样本进行分析&#xff0c;单因素方差分析可以用于比较多个独立的正态总体均值之间是否存在显著差异&#xff0c;是独立样本T检验的推广版&#xff0c;也属于参数假设检验。 进行假设检验时未说明方差是否齐性时都要先进行方差…

并发编程 - 线程间三种常见的通信手段

线程间通信是指多个线程之间通过某种机制进行协调和交互&#xff0c;例如&#xff1a;线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中有以下三种实现线程等待的手段 &#xff1a; Object 类提供的 wait()&#xff0c;notify() 和 notifyAll() 方法&#xff1b;C…

Chapter 2 Crystal Dynamics 2.1 晶格振动

2.1 Lattice Vibration 晶格振动 Born-Oppenheimer Approximation Electrons’ movement: Electron theory free electron theoryenergy band theory Atoms’ movement crystal dynamicslattice vibration 当研究电子运动时&#xff0c;忽略原子运动&#xff1b;当研究原子…

TiDB在科捷物流神州金库核心系统的应用与实践

业务背景 北京科捷物流有限公司于2003年在北京正式成立&#xff0c;是ISO质量管理体系认证企业、国家AAAAA级物流企业、海关AEO高级认证企业&#xff0c;注册资金1亿元&#xff0c;是中国领先的大数据科技公司——神州控股的全资子公司。科捷物流融合B2B和B2C的客户需求&#…

vivo手机录屏在哪里?我来告诉你!(2023最新)

“有人知道vivo手机录屏在哪里吗&#xff1f;刚买了最新款的vivo手机&#xff0c;就是找不到录屏功能在哪&#xff0c;刚好最近需要录屏&#xff0c;很烦躁&#xff0c;有人会吗&#xff0c;求求啦” 随着智能手机的普及&#xff0c;录屏功能逐渐成为用户喜爱的功能之一。vivo…

从零开始 Spring Cloud 10:Elasticsearch

从零开始 Spring Cloud 10&#xff1a;Elasticsearch 图源&#xff1a;laiketui.com 基础 什么是 Elasticsearch Elasticsearch 是一个开源搜索引擎&#xff0c;可以用它实现从海量数据中对数据的高效查询。 关于 Elasticsearch 的历史渊源以及广泛用途&#xff0c;可以观看…

Vue 引入阿里巴巴Iconfont图标库

vue2 Element ui 1、项目设置 2、文件下载到本地 压缩包里有些文件是没有用的&#xff0c;比如demo的文件可以直接删除。 3、src文件夹下&#xff0c;新建iconfont文件 4、main.js文件&#xff0c;引入iconfont.css 5、iconfont.css&#xff0c;引入对应的图标

【LeetCode动态规划#】完全背包问题实战(单词拆分,涉及集合处理字符串)

单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1&#xff1a; 输入: s "l…

macOS - 安装使用 libvirt、virsh

文章目录 关于 libvirt使用安装启动服务virsh 交互模式virsh 帮助命令 关于 libvirt libvirt 官网&#xff1a; https://libvirt.org/gitlab : https://gitlab.com/libvirt/libvirtgithub : https://github.com/libvirt/libvirt 只读&#xff0c;gitlab 的镜像 libvirt是一套…

linux下安装.run后缀名文件

1.文件传输 对于大文件&#xff0c;不能直接拖拽&#xff0c;可以借助工具&#xff0c;例如WinSCP 创建会话时&#xff0c;需要提供虚拟机的主机名&#xff0c;可以采取输入ifconfig的命令&#xff0c;如图所示&#xff1a; ifconfig&#xff08;接口配置&#xff09;命令在 …

node.js+Vue+Express学生宿舍校舍系统-ggr80

关键词&#xff1a;智慧学生校舍&#xff1b;简洁方便直观&#xff1b; 本次的毕业设计主要就是设计并开发一个智慧学生校舍系统。使用数据库mysql。系统主要包括个人中心、学生管理、教师管理、宿管管理、外来人员管理、维修人员管理、学生信息管理、学生签到管理、学生物品管…

全面拥抱AI时刻来临?基于AI技术助力养猪产仔是否可行?

这两天看到一篇论文&#xff0c;蛮有意思的&#xff0c;技术层面倒没有什么新颖的点&#xff0c;主要是落地应用场景比较贴近现实&#xff0c;文章主要就是应用yolov5来开发构建了一套母猪产仔智能化检测预警模型&#xff0c;从而来降低大型养殖场中人工成本。一起来简单看下吧…