【Cinemachine】VirtualCamera虚拟相机详解(一)

摘要: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中的AimBodyNoise属性,用来控制相机在移动、旋转时是什么样子。

在任意时间,每个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事件,相机变为活动时会触发对应的事件。

BodyAimNoise后面深入学习。

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哦


好了,今天就就让小新絮絮叨叨到这里了。没讲清楚的地方欢迎评论,不点赞收藏我可能不会回复你的哦(¬、¬) (¬_¬)

我是大智,你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容

  • 摘要:相机是Unity世界的眼睛,一个智能相机更是能帮咱们节省大把的时间和精力。Cinemachine现在已经大量...
    洪智阅读 3,141评论 0 6
  • 这个是我刚刚整理出的Unity面试题,为了帮助大家面试,同时帮助大家更好地复习Unity知识点,如果大家发现有什么...
    编程小火鸡阅读 3,898评论 2 35
  • 这个是我刚刚整理出的Unity面试题,为了帮助大家面试,同时帮助大家更好地复习Unity知识点,如果大家发现有什么...
    dingz阅读 597评论 0 0
  • 一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,...
    胤醚貔貅阅读 2,080评论 0 13
  • 源于内心对书法的执着,闲来无事就要练练字的,尽管写的不好,还是要坚持的啦。
    苏阿花_阅读 229评论 0 0