【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


好了,今天就就讓小新絮絮叨叨到這裏了。沒講清楚的地方歡迎評論,不點贊收藏我可能不會回覆你的哦(¬、¬) (¬_¬)

我是大智,你的技術探路者,下次見!

別走!點贊收藏哦!

好,你可以走了。

發佈了142 篇原創文章 · 獲贊 77 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章