使用Unity2017開發MTV:一個Timeline和Cinemacine的實踐
0x00 前言
Hi,各位新年好。先給各位拜個年了。
今天的這篇博客是關於Unity在2017年以來推出的若干工具和功能的一個小的實踐。
例如Progressive Lightmapper、Timeline、Cinemachine、PostProcessing Stack等等。下文所使用的額外工具也都可以在asset store或者是github上進行下載使用。例如DefaultPlayables、Cinemachine、PostProcessing Stack在asset store上有,PostProcessing Stack v2在github上有。
https://www.zhihu.com/video/951230847366414336最後的目標是製作一個這樣的小電影(有音樂)~逃。
0x01 Progressive Lightmapper-光的效果
首先我們來創建一個空的場景,並且在lighting窗口中去掉Skybox並將Ambient Color去掉。
而整個場景則十分簡單,目前只包括一個plane作為舞台,3個顏色分別為紅黃綠的cube作為舞台上的背景。並且將方向光替換為點光源,這樣更像是一個舞台上的燈光。但是此時只有直接光照,而欠缺物體表面反彈出來的間接光的影響,因此看上去並不真實。
下面我就要來增加一些間接光的效果。首先對組成舞台的對象勾選Lightmap Static,同時為了儘可能的減少性能開銷,可以將light的模式設置為baked,同時關閉Realtime GI而只使用Baked GI。在這裡我使用了Progressive Lightmapper來烘焙間接光照的信息,而非比較常用的Enlighten Lightmapper。這是因為Progressive Lightmapper能夠即時對烘焙進度提供反饋,以使得我們對修改的結果有一個預期。
https://www.zhihu.com/video/951231387777392640修改場景後(隱藏綠色的cube),可以即時看到烘焙過程中Progressive Lightmapper發射的光子。
加入間接光之後,整個場景看上去真實了很多。這裡我們還可以修改light的Indirect Multiplier屬性,從默認值1修改為2,可以增強間接光的效果。
ok,一個簡單的舞台搭好了,接下來就要有請我們的主角——Lzzy,一個在asset store上的免費模型。
導入場景之後,我們可以看到Lzzy並沒有受光。這是因為Lzzy並非是lightmap static,因此光照在bake模式下是不會對這個模型生效的,因此我們將點光的光照模式設置為mixed。這樣,Lzzy就受到了光照的效果,但是觀察一下,它只有直接光照的效果,而沒有間接光的效果,這是不真實的,因為舞台的紅色背景牆顯然也會反彈光子到lzzy的身體表面。
這時候,我們就可以來使用light probe來給動態對象提供光照信息了。這樣我們的Lzzy就能獲取從紅色背景牆反彈過來的間接光了。
讓Lzzy在舞台的背景牆前走過,可以看到Lzzy依次被紅色背景牆、黃色背景牆、綠色背景牆照亮了。
https://www.zhihu.com/video/9512314617481297920x02 Timeline-角色動作
基本的舞檯布置完成,接下來我們就來使用TimeLine編排MV中女主角Lzzy的行為動作吧。在Window菜單列表內我們可以選擇打開Timeline窗口,根據提示我們創建一個名為lzzyTimeline的asset和一個Playable Director組件。將我們的女主角拖入Timeline窗口內,此時會提示有很多不同類型的track可供創建。這裡我們選擇Animation Track,來處理角色的動作。
在右側的時間線內,我們既可以直接拖入一個現成的animatino clip,也可以點擊紅色的record圓點來創建動作。在這裡我直接使用了一個名為HumanoidWalk的animation clip,作為主角的第一個動作。同時,右上角的齒輪按鈕可以在frame和seconds之間切換時間線的單位。這裡我將主角走路的時間設定為3秒種。
之後我們來添加餘下的幾個動作,讓主角從側門登台走到舞台中心後轉身向前,站定之後開始跳舞。當涉及到兩個動作切換時,往往會有一些銜接上的問題,例如過度是否自然、兩個動作看上去速度是否一致等等。
在處理動作過渡時,我們可以讓兩個動作進行融合,只需要很簡單的將兩個clip在時間線內部分重疊即可。
如果要修改clip的速度,在時間線內選中該clip,在inspector窗口中修改Speed Multiplier即可。
對了,如果要在前一個動作的Offset或後一個動作的Offset的基礎上播放的話,需要右鍵點擊timeline中的animation clip,選擇Match Offset to…
0x03 Cinemachine-攝像機動作
舞台和角色都已經就位了,接下來我們就來設置一下攝像機吧。這裡就用到了Cinemachine這個工具了。在Timeline窗口內,點擊add,可以看到Cinemacine Track這個選項,選擇創建一個Cinemacine Track。當然,我們也可以直接將一個camera拖拽到Timeline上,之後也會出現選擇track的菜單。
這樣,我們的camera上就自動創建出了一個叫做Cinemacine Brain的組件,攝像機現在也有大腦了。
接下來,我們再來在剛剛創建的Cinemacine Track時間線中創建3個Cinemachine Shot,分別對應主角走路登台、走向觀眾、開始跳舞這3個階段。
打開Cinemachine Shot的inspector窗口,我們要創建對應的Virtual Camera。
Virtual Camera創建好之後,我們就可以在Virtual Camera對象上設置相機動作的一些相關屬性來,例如我們可以設置Follow屬性以確定跟隨的目標,還可以設置Look At屬性,以確定注視目標。
這裡我以Lzzy為跟隨對象,並讓相機注視Lzzy的頭部。
而第二個shot,被我安放在了舞台的角落裡,這次不再讓相機跟隨Lzzy進行移動,但仍然Look At Lzzy的頭部。但是角落的這個相機移動的比較死板平滑,如果想要增加一些自然度,或者是模擬出手持相機拍攝的感覺的話,就可以藉助Virtual Camera上的Noise這個選項進行選擇,裡面提供了若干不同強度的相機抖動效果,能夠讓相機移動的更加自然。
而最後一個shot,也就是Lzzy跳舞時所使用的shot,這裡我會使用移動式攝像機架——也就是Camera dolly——來實現一個有趣的效果。
首先,讓我們選擇Cinemacine->create dolly camera with track來創建一個移動式攝像機架。在場景中會創建一個DollyTrack1對象和一個Virtual Camera對象CM vcam3,這個Virtual Camera對象不僅和DollyTrack有關聯,同時也會被我們第三個shot所使用。
選中DollyTrack後,就可以在場景中設置軌道的節點(Waypoints)了,十分方便。
但是,DollyTrack並不能直接在這裡使用。它需要通過剛剛提到的Virtual Camera對象CM vcam3來控制,修改CM vcam3的Path Position屬性,就使相機按照軌道的節點來進行移動。我們應該怎麼動態的修改這個屬性呢?當然還是藉助Timeline了,Timeline中的Animation Track不僅可以實現動畫效果,還能動態修改屬性。
我們只需要在Timeline窗口中把CM vcam3添加進去,用兩個關鍵幀來修改Path Position屬性即可。
https://www.zhihu.com/video/951231662063878144Perfect!
0x04 PostProcessing Stack-後處理
原始片源已經有了,接下來我們自然會想到要使用一些後處理的效果來增強表現了。Unity之前提供了post-processing stack作為後處理的強力工具,後來又推出了v2版本。在Unity的Asset store和github上都能夠獲取,那麼我們接下來就使用post-processing stack v2來添加一些效果吧。
post-processing stack v2主要的組件有2個,其一是Post-process Layer,另一個則是Post-process Volume。
將Post-process Layer組建放在目標相機上,並且在Volume blending中設置需要的layer。
而Post-process volume則可以掛載在某一個空的對象上,該對象的layer設置為Post-process Layer上所要激活的即可。
一些的效果例如bloom、color grading、motion blur、ssr等等都可以使用。
0x05 加上開頭和結尾
我們MV的主要部分已經在Timeline中製作好了。但是多個Timeline能否嵌套呢?比如這個視頻有正片,但是也應該有片頭片尾呀,正片的內容可能不同,但是一般片頭片尾的變化是很小的,所以我們需要能夠管理多個Timeline的方法。
其實是有方法的,我們大可以再創建一個新的Timeline,之後使用一個叫Control Track的track來管理多個Timeline。
之後,我們再來創建一個片頭和片尾。這裡主要是通過創建UGUI的元素來實現,如果下載了DefaultPlayables(在asset store中有)後,Timeline會提供一些和UI相關的track,這裡我們用到了image和text相關的track。簡單的實現一下就是這樣的一個效果。
片頭結束之後,便是是正片的內容了,正片的Timeline被封裝在ContolPlayableAsset中。
ref
Progressive Lightmapper
DefaultPlayablesCinemachineTimelinePostProcessing Stack-EOF-
最後打個廣告,歡迎支持我的書Unity 3D腳本編程:使用C#語言開發跨平台遊戲
歡迎大家關注我的公眾號慕容的遊戲編程:chenjd01
推薦閱讀:
※為什麼需要模擬HDR
※譯:UE4是如何渲染一幀的(1)
※趁熱度來做個捏臉
※圖靈宇宙漫遊指南
※拓幻圖形學工程師教學手冊(第三講)|一字一字敲出OpenGL學習教程