设置朝向效果演示:
![](https://www.fantsida.com/assets/files/2024-01-06/1704551326-429438-d897a369ac9046908a10ccdd087e86d3.gif)
内容很长,分成两帖:
【推荐unity插件】最详细的Cinemachine(虚拟相机系统)案例讲解01
【推荐 unity 插件】最详细的 Cinemachine (虚拟相机系统)案例讲解 02
一、前言
相信很多同学都用过Unity的Cinemachine插件,使用它可以很方便地实现一些摄像机效果,比如摄像机追踪、推拉镜头、分镜等效果。Cinemachine的知识特别的多又很常用,本来是想做一期来讲一下的,结果搜索发现已经有人做过了,而且内容挺全的,但是内容可能比较啰嗦,还有部分没有补充,所以我就先转载下来,后续有时间再优化修改补充,觉得内容不错的,很欢迎大家去支持原作者。
插件提供了很多场景案例,大家可以看下插件的官方文档:
https://docs.unity3d.com/Packages/com.unity.cinemachine@2.8/manual/CinemachineUsing.html
注:本文使用的Unity版本为2021.3.1f1c1,Cinemachine版本为2.8.4
二、插件下载
在PackageManager中搜索Cinemachine,点击Install安装即可
![](https://www.fantsida.com/assets/files/2024-01-06/1704550687-499011-824db3e8916e44c8aef8871cddcefb25.png)
本文我要讲解插件的案例,所以需要把Samples也引入到工程中,点击Samples的Import按钮,
![](https://www.fantsida.com/assets/files/2024-01-06/1704550738-949974-76b65676387141c5ae65130360d564c6.png)
完成后我们就可以在工程中看到Cinemachine的插件包和案例包了,如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704550758-192131-3c41472d19e74e9daa726a4e8df48731.png)
现在我们开始吧~
注:本文讲解的案例顺序不是按照目录顺序,而是根据常用程度进行排序
三、案例1:第三人称自由视角,Free Look character场景
1、场景演示
双击打开Free Look character场景,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551036-360217-2bd8d26dac3d4cd29e78bcd1ce1d186a.png)
这是第三人称自由视角的摄像机效果,如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704551061-629854-b4abfddc3d7441f8ad7f11cdb7e045b7.gif)
画个图
![](https://www.fantsida.com/assets/files/2024-01-06/1704551085-277117-6a81d0478a2a4adaadabbc4e9fc83d09.png)
2、组件参数
2.1、CinemachineBrain:核心
主摄像机上挂CinemachineBrain组件,参数默认即可,它是整个虚拟相机系统的核心,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551127-257679-e9558cb3f8244b81a0894ba076b06e59.png)
2.2、CinemachineFreeLook:第三人称自由视角相机
CM FreeLook1节点上挂了CinemachineFreeLook组件,它实现了第三人称自由视角的相机逻辑,是非常常用的一个相机功能,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551161-166588-6c4f158fbfed4d3dad32ec680f1cf235.png)
下面我介绍一下这个组件的[参数设置]
2.2.1、设置Follow:跟随
我们需要设置追踪的目标物体,这里设置追踪的目标是主角的Root节点,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551213-148567-42f6722d9e5e4734ac0d6ad39426b8e1.png)
如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704551225-454370-342ec2cbb6b5407ca8884754c6c632cd.png)
设置了Follow对象,摄像机就会跟着追踪的对象移动了。
![](https://www.fantsida.com/assets/files/2024-01-06/1704551244-887986-5208dcd0ae3a492fbe941c60658c6ee2.gif)
2.2.2、设置LookAt:朝向
设置LookAt,可以让相机角度始终朝着目标的方向,这里设置的是看向主角的头,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551280-97261-0c3ddb4183e54eb0aaab4917d13c0694.png)
如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704551313-662428-4a931557f8f847bc9ae8b08d08369de2.png)
我们可以看到相机的Z轴(蓝色的那根轴)始终朝着主角的头,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551326-429438-d897a369ac9046908a10ccdd087e86d3.gif)
2.2.3、三个圆环轨道:环绕约束
摄像机围绕主角环绕的范围是由三个圆环轨道决定的,如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704551372-712590-1981d8f163b942d29b15f835d8fb5e01.png)
我们可以调整这三个圆环轨道的高度和半径,如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704551392-888241-336a217caab348b9a86c9911886b9be4.png)
如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704551408-504502-4aea71fbe757499a9f2499d45eea9de0.gif)
2.2.4、圆环轨道之间的连接曲线:Spline Curvature
三个圆环之间有一根连接的曲线,它是摄像机在竖直方向上移动的约束,你可以把它想象成就是一根弯曲的杆子,在它对面有一根形状与它一样的隐形的杆子,相机只能在这根隐形的杆子上移动,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551449-50740-7a2a4baf2c5745aa9260c3ba10bd5073.png)
我们可以调节Spline Curvature来调整这根连接杆的弯曲程度,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551457-789638-dc093438fd44434382b3025573def3ba.png)
如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704551466-480692-19ae2f37ace241129daa25ca2ee99588.gif)
2.2.5、相机移动策略,移动阻尼:Body Y/Z Damping
我们有三个圆环轨道,分别对应三个机位视角:顶部机位、中部机位、底部机位,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551607-233206-d1c96d633161489f875aa069e8a17848.png)
我们可以调整每个机位的相机移动阻尼、画面构图等,以Middle Rig中部机位为例,
我们可以调整相机跟随的移动阻尼,阻尼越大,跟随速度越慢,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551615-933921-9d8afd83e8534406ab12ce1a1a43c96d.png)
Y Damping用于控制相机在竖直方向上的跟随阻尼,比如角色跳跃的时候,相机也会跟着在竖直方向上 “跳”,相机的 “跳” 会受到这个Y Damping阻尼影响。
同理,Z Damping控制垂直于屏幕方向移动的阻尼,比如角色往垂直于屏幕的方向走,相机也跟着往前,相机在这个方向上的跟随受到Z Damping阻尼的影响。
注:阻尼可以减少由于相机速度过快而出现画面抖动的效果。
阻尼为 0 会显得跟随很僵硬,可能出现画面抖动;阻尼过大则会导致相机跟随太慢,跟不上主角。
我调整Z Damping给大家演示一下,首先看下Z Damping为1时的效果,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551636-380384-28257968ba294ce19c0f31ced87ecd0e.gif)
接着我把Z Damping阻尼调大到20,可以看到相机跟随已经跟不上主角的移动了,特别是主角跑起来的时候,建议保持默认的1即可,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551661-952587-a090aa36bd42447e8f7625caf3c848ba.gif)
2.2.6、相机旋转策略,瞄准:Aim
展开Aim下拉按钮,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551700-760812-acccceb923ae4e0e94c1df358720962a.png)
我们可以在Game试图中看到出现了一些线和一些区域块,如下,它是通过约束相机的旋转来达到让瞄准的物体显示在画面区域内的,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551714-157856-cdb9ca4f6b02476e8b294a6abf8c0979.png)
如果你没有显示上面的线和区域,检查一下Game Window Guides是否是勾选状态,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551723-299929-c378c9e72d924dfea26afc8fac3c8d5b.png)
我们可以切换瞄准的策略,默认是Composer,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551733-745186-96681254680246aeb507c438abe2f948.png)
每种瞄准策略含义如下
瞄准策略 | 说明 |
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来校准瞄准的位置,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551788-416814-ead06e1509174e57848535361936d585.png)
如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704551806-557240-979db9e856c849aa9238a0051bf79724.gif)
2.2.8、预测:Lookahead
![](https://www.fantsida.com/assets/files/2024-01-06/1704551820-363136-fbb2ca120dc549489438cf49f6c50f05.png)
参数 | 说明 |
Lookahead Time | 预测提前的秒数,默认为0,如果大于0,会预测目标的位置,如果主角移动速度很快,可以适当进行预测,如果主角移动速度不快,但开启了预测,可能会导致相机抖动 |
Lookahead Smoothing | 预测算法的平滑度,提高平滑度可以减少预测抖动,但会导致预测滞后 |
Lookahead ignore Y | 预测算法会忽略Y轴的移动 |
我们把Lookahead Time调大到1,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551901-885491-f2be476d56624e0e9c3b097a037637df.png)
效果如下,可以看到,过度预测导致了相机的抖动,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551939-928859-fd212e421ea34fa2a9736ae6b352007f.gif)
我们保持1秒Lookahead Time,此时我们把Lookahead Smoothing调大到8,
![](https://www.fantsida.com/assets/files/2024-01-06/1704551952-793877-a8fed8065bc2441090a3f1c8e2bd2764.png)
效果如下,可以看到,相机提前预测了目标位置,抖动平滑了一些,但是由于我们的主角移动速度并不快,预测导致相机超前,最后还得折返回来,所以这里我们没有必要开启预测。
如果你的项目的主角是飞机,飞行速度快,则可以考虑开启预测。
![](https://www.fantsida.com/assets/files/2024-01-06/1704551991-300061-97eb1756a7174d2eb1886d83b4f2d4cb.gif)
Lookahead Ignore Y就是忽略Y轴方向上的预测,比如跳跃动作,我们不想让相机做Y轴上的预测,就可以勾选它,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552005-953074-71f4421bd68e46c2b3bcd8f3d4073c2c.png)
一般情况下,我们都不需要开启预测,保持为0即可,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552012-35927-687a8fef1d364f6ebc275ffa850ffbf0.png)
2.2.8、瞄准阻尼:Horizontal/Vertical Damping
![](https://www.fantsida.com/assets/files/2024-01-06/1704552141-642274-7793bfc633b24053bc08b844dd0e3a9f.png)
注意,这个和2.2.5小节讲的Body Y/Z Damping阻尼是不同的,Body Y/Z Damping是移动阻尼,而Horizontal/Vertical Damping是旋转阻尼,
为了方便观察,我先把Follow设为None,让相机固定位置不动,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552156-249014-989ea2634f084346a674df9bc001b2cf.png)
现在我们先看Horizontal Damping为0.5时的效果,此时水平旋转阻尼比较小,相机的旋转是可以跟上主角的移动的,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552164-625377-5e9aef06d3f2486ab742044d8b2ec842.gif)
现在我们把Horizontal Damping调整到3,效果如下,可以看到,相机的水平旋转由于阻尼的作用而出现了滞后,适当的阻尼可以减少抖动,过大的阻尼会带来滞后,我们保持默认的0.5就好了,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552200-910520-dbdf4d69aa4b453b9caeec5c1fb36dfb.gif)
2.2.9、画面构图(重要)
喜欢摄影的同学应该都听说过构图,比如三分法、中央对称法、对角线三角形、留白、黄金比例等等。在Cinemachine中,提供了Dead Zone、Soft Zone来约束主角在画面中的位置,我们可以调整对应的参数来实现自己的画面构图,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552217-284033-eb5da4006cd04484984b4a82ec629ca1.png)
Dead Zone和Soft Zone区域如下,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552231-303142-c074bf3048ea43558a42563d936ac4ce.png)
Dead Zoon范围内,主角的移动不会触发相机的旋转,为了演示,我把Dead Zone调大一点点,我们可以通过Dead Zone Width和Dead Zone Height来调整Dead Zoon的区域大小,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552261-124793-401fb0ac2d2b436295ca225971a6bd6e.png)
可以看到,Dead Zoon范围内,主角的移动不会触发相机的旋转,只有当主角的位置超出了Dead Zone的区域,才会触发相机的旋转,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552271-686649-b85a0519ea2a4dfcab704b7212aea7da.gif)
我们可以把Dead Zone区域调为``0```,这样主角只要发生移动,就会触发相机的旋转,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552297-118511-c932bc5a2b074acb83c7b3c072fb64d9.png)
同理,Soft Zone的区域是一个缓冲区域,在这个区域内,相机会插值旋转(慢慢旋转),直至把主角 “推” 回到 Dead Zone内,如果主角的位置超过了Soft Zone的区域,相机就会立刻旋转确保主角留在Soft Zone区域内。
比如我现在把Soft Zone区域调小,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552414-289862-6e5e1001c77541f79d508da4683cd4e1.png)
测试效果如下,可以看到,当主角尝试超过Soft Zone区域时,相机的旋转速度会立刻跟上,确保主角在Soft Zone区域内,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552438-614334-78245a21d3f241afb76bd508c6e5c4e2.gif)
Screen X和Screen Y是用来调整整个Zone的屏幕位置的,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552448-722280-88970ab039884cd1a80b0ba06d92e1d6.png)
比如把整个Zone调整到屏幕左下角,这样主角在画面中的位置就是左下角了,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552469-786591-2b3f94959d7949d1816d609602a86ff5.gif)
Bias X和Bias Y用来调整Soft Zoon相对于整个Zoon的位置偏移,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552482-473872-523e9adba62844d7a8ff89f22d84e962.png)
效果如下,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552503-686002-b728491efd3c4c01820f4cbe841726f7.gif)
2.3、小结
这个案例中,我们主要设置CinemachineFreeLook组件的Follow、LookAt对象,调整移动阻尼:Body Y/Z Damping,调整一下Aim的Dead Zone、Soft Zone就差不多了,可以快速应用到自己的实际项目中。
3、用代码控制相机移动(绕圆环旋转)
等我们移动鼠标的时候,相机会围绕圆环轨道移动,如下
![](https://www.fantsida.com/assets/files/2024-01-06/1704552515-868070-ff0c250e5986490a9aa1a9080d6610b7.gif)
这是因为CinemachineFreeLook组件监听了Mouse Y、Mouse X输入,它根据鼠标的移动去控制相机的移动,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552534-574912-0b3035395066430fa5a9a0fc36f2728f.png)
如果我们先禁用它自身的这个控制,可以把这两个Input Axis Name设置为空,
![](https://www.fantsida.com/assets/files/2024-01-06/1704552551-210849-e39264884c8049d797237db251fee692.png)
接着,我们在代码中去设置CinemachineFreeLook组件的m_XAxis和m_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;
}
}
作者:向宇it
原文链接:https://xiangyu.blog.csdn.net/article/details/134374639
向宇的客栈QQ交流群:826534924