Notifications
Article
【Cinemachine】VirtualCamera虚拟相机详解(一)
Updated 10 days ago
268
1
VirtualCamera虚拟相机是Cinemachine系统中的核心组成部分,咱们一起来看看虚拟相机是怎么用的吧。
你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。

虚拟相机

Cinemachine中的Virtual Camera(虚拟相机)可以说是最核心的组件。
使用Cinemachine时,你需要记住一个准则:场景中一般只有一个Unity相机(除了需要制作分屏、画中画等效果的时候),上面挂着CinemachineBrain脚本;其他相机都是使用Cinemachine中的虚拟相机,可以有很多个。
给场景添加一个虚拟相机的流程如下:
1、菜单栏,选择Cinemachine > Create Virtual Camera。Unity会在场景中添加一个GameObject,上面有一个Virtual Camera组件。如果你的Unity相机上没有CinemachineBrain脚本,Cinemachine也会自动添加CinemachineBrain脚本到Unity相机上。
2、如果相机需要跟随物体移动,指定一个物体到Follow属性上。虚拟相机会自动将Unity相机的位置和Follow物体保持相对位置,包括Follow物体移动的时候。
3、如果相机镜头需要保持对准物体,指定一个物体到Look At属性上,这样相机镜头就会一直对准这个物体。
4、虚拟相机还有很多属性,可以根据需要设置,后续会继续详解。可以为位置跟随和镜头对准设置不同的算法,通过调节参数得到不同感觉的相机。
Virtual Camera中的Aim,Body和Noise属性,用来控制相机在移动、旋转时是什么样子。
在任意时间,每个Virtual Camera处于下列的状态之一:
  • Live活动状态:活动状态的虚拟相机会控制Unity相机,一般情况下只有一个Live状态的相机。有个特例的情况,当Cinemachine Brain控制一个虚拟相机混合到下一个虚拟相机时,两个虚拟相机都处于Live活动状态。当混合结束后,恢复到只会有一个活动虚拟相机。
  • Standby待命状态:处于待命状态的虚拟相机并不控制Unity相机。但是它仍然跟随和瞄准它的目标物体,并且每帧更新。处于待命状态的虚拟相机的物体时active状态,并且优先级priority不高于活动状态的虚拟相机。
  • Disable禁用状态:处于禁用状态的相机既不控制Unity相机也不会跟随或瞄准他的目标,也不占用运行资源。想要禁用一个虚拟相机,只要禁用它所在的GameObject即可。在Scene窗口中,被禁用的虚拟相机还会显示,但是是禁用状态。但是有特殊情况被禁用的相机仍然可以控制Unity相机:虚拟相机正在参与混合或者受Timeline控制。

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相机中是没有的,可以用来控制镜头的旋转。(在屏幕空间的旋转)
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:可以给虚拟相机添加额外的扩展。后面深入学习。

保存运行时的修改

调节相机时,很多时候需要在运行时进行调节,因为有很多动画在运行时才能知道它具体的位置。但是默认情况下,Unity不会保存任何运行时的修改和改动。
那有没有什么办法能保存运行时的修改呢?其实在《大话Unity:新手村》专题中,咱们提到过如何保存运行时的修改,稍微复习一下:
  • 在Play模式下Copy Component,然后退出运行模式后Paste Component Values
  • 在Play模式下将修改后的GameObject拖成Prefab,然后退出运行模式后再放到场景中
但是Cinemachine通常涉及到很多相机,如果用上面的方法会很麻烦,那有没有什么简单的办法呢?
Cinemachine知道你有这个需求,已经提供了一个特殊的功能来保存运行时的修改。
如上图,在任意一个Virtual Camera上勾选Save During Play可以启用保存运行时修改的功能。这是一个全局的属性,不需要每个相机单独设置,只要在一个Virtual Camera上勾选或者取消勾选即可。
退出Play模式时,Cinemachine会一次性保存Virtual Camera上的修改。同时也可以通过Edit > Undo(Ctrl+Z)来撤销修改。
再深入一下,Cinemachine是如何实现这个功能的呢?
它是通过Cinemachine命名空间中的一个特殊的属性[SaveDuringPlay]。如果你自己的脚本也需要运行时保存的功能,只需要在类上加上这个属性即可。如果不想要类中的某些成员在运行时保存,可以给这些成员加上[NoSaveDuringPlay]属性。
using Cinemachine; using UnityEngine; [SaveDuringPlay] public class PlayModeSaving : MonoBehaviour { [NoSaveDuringPlay] public string Name; public int Age; public string Address; }
【扩展学习】在洪流学堂公众号回复timeline可以下载Timeline&Cinemachine系列教程全文带目录PDF
------------------------------------我是分割线----------------------------------
好了,今天就就让小新絮絮叨叨到这里了。没讲清楚的地方欢迎评论讨论。
我是大智,你的技术探路者,下次见!
别走!点赞,收藏
好,你可以走了。
Tags:
大智
你的Unity技术探路者/洪流学堂公众号主理人/XR创业者 - Student
32
Comments
废宅小林
6 days ago
Kelvin在B站讲的那个仿尼尔机械纪元的镜头特效也是用的这个做的👍
1