[我花2個月做了敘事短篇游戲]我是如何實現(xiàn)劇情演出的(下)

作者:陳虹松
前言
上期傳送門:[我花2個月做了敘事短篇游戲]我是如何實現(xiàn)劇情演出的(上)
生活總是麻煩事情不斷,還是準(zhǔn)備先把這一節(jié)內(nèi)容補(bǔ)全收尾后再專心做些其他事情。而其他事情呢,比如說拓展圈子(找適合的人),比如說新的游戲計劃,這些后面單獨拿寫一份出來吧,如果有興趣的朋友可以關(guān)注下。
回到正文,這篇內(nèi)容是Timeline的補(bǔ)齊,因為2019后unity更新了一次自定義軌道部份的內(nèi)容,之前寫的代碼已經(jīng)不適用了。但是修改的部份其實不算復(fù)雜,我們只需要了解部份接口就可以開始進(jìn)行代碼添加自定義的Timline片段。太過深入部份底層部份,這篇文章不會牽扯太多,因為我一貫的文章內(nèi)容都是面向初學(xué)者的,這個目標(biāo)基本不會改變。
Timeline自定義功能
創(chuàng)建軌道
打開Timeline窗口,可以看到有個名為PlayableTrack的軌道,這個軌道是默認(rèn)存放我們自定義腳本的。
PS:Unity是可以增加自定義軌道的,這里像進(jìn)階的朋友可以看:https://blog.csdn.net/zhenghongzhi6/article/details/104041067

創(chuàng)建自定義功能片段
我們右鍵資源目錄,創(chuàng)建Playable Asset C# Script

本質(zhì)上,這里無非是unity幫忙建立了個C#的腳本,添加了Serializable的屬性,繼承其Timeline的抽象類PlayableAsset
以下為創(chuàng)建好的腳本

序列化重要的知識
Timeline文件是做為資源配置保存的,任何涉及到數(shù)據(jù)要保存成為具體文件(資源配置),都需要序列化(保存)與反序列化(讀?。?。因此我們創(chuàng)建的配置相關(guān)的腳本是必須添加Serializable屬性的,這樣才能保證你創(chuàng)建的屬性能夠正確的保存在硬盤中。

在上面截圖大家也看到了,除了Playable Asset之外還有個Playable Behaveiour腳本的創(chuàng)建。這里并不是一定要創(chuàng)建兩個腳本的意思,而是Unity告訴你,它是通過分離配置和數(shù)據(jù)處理來實現(xiàn)功能的。
所以我們可以直接在一個腳本文件中創(chuàng)建兩個類
下方是一個播放Dotween功能的timeline自定義功能片段
PlayTweenClip
繼承PlayableAsset,用作在Timeline界面上能配置片段屬性。PlayTweenClipBehaviour直接作為其變量保存,這樣避免相同屬性要書寫兩次
CreatePlayable是抽象類中必須實現(xiàn)的函數(shù),目的是Timeline實例化創(chuàng)建成功后將配置的Behaviour類生效在這個軌道的片段上
PlayTweenClipBehaviour
繼承PlayableBehaviour,這個類中的變量根據(jù)需求自己定義,務(wù)必注意的是,像Image、Text、Animator這類需要外部引用的變量,需要包裹ExposedReference,不然配置好的數(shù)據(jù)不會正確的保存在Timeline資源中
要獲得該資源本身需要通過.Resolve(playable.GetGraph().GetResolver())方法獲取
PS:這里你能看到PlayTweenClipBehaviour也是添加了Serializable屬性的



拓展框架信息
這里既然講到了數(shù)據(jù)分離,簡單擴(kuò)展下框架的內(nèi)容:
我們經(jīng)常能聽到MVC、MVP、MVVM等名字的框架,其實框架本身,無非就是M(數(shù)據(jù))V(顯示),而通過什么方式來操作數(shù)據(jù),修改顯示,就是C、P、VM部份的內(nèi)容。
https://www.zhihu.com/question/37475609/answer/1298931250
需要提醒幾個注意的要點
PlayableAsset腳本里面直接創(chuàng)建PlayableBehaviour的變量這是一個非常方便的寫法,很多Timeline插件都是通過這種方式來創(chuàng)建腳本的,雖然Unity希望分開兩個腳本,但是這樣做無疑會更加的方便書寫。
ScriptPlayable<PlayTweenClipBehaviour>.Create(graph, Temp),這個是將我們的PlayableBehaviour正確生效到PlayableGraph上,也就是建立起來了Timeline軌道本身與功能腳本的關(guān)聯(lián)。PlayableGraph將會把自己表現(xiàn)層配置的數(shù)據(jù)傳遞到PlayableBehaviour讓你書寫的邏輯生效。這也是實現(xiàn)Unity在同一個軌道上,配置多個不同片段數(shù)據(jù)的功能。

PlayableBehaviour的重要可繼承功能函數(shù)說明

OnBehaviourPlay:當(dāng)Timeline進(jìn)入這個片段的時候調(diào)用
OnBehaviourPause:當(dāng)Timeline離開該片段時候調(diào)用,這里務(wù)必注意,并不是Timeline暫定的時候才會調(diào)用
OnGraphStart&OnGraphStop:Timeline的PlayableDirector啟動與離開
獲得播放屬性信息




總結(jié)
自定義腳本的創(chuàng)建只需要PlayableAsset和PlayableBehaviour,分別處理記錄數(shù)據(jù)將Timeline顯示層的數(shù)據(jù)傳入PlayableBehaviour中處理,而PlayableBehaviour能通過Playable和FrameData獲取當(dāng)前軌道信息,通過額外添加的參數(shù)屬性來達(dá)到我們自定義功能的目的。
可以在PlayableAsset中直接定義PlayableAsset變量,達(dá)到節(jié)約代碼量的目的。
引用類型的數(shù)據(jù)變量,務(wù)必需要ExposedReference來傳遞獲取,否則會丟失無法保存。需要熟悉PlayableBehaviour的關(guān)鍵調(diào)用函數(shù),在不修改自定義軌道功能情況下,這個是唯一的獲取關(guān)鍵事件點信息的信息來源。
Timeline的拓展數(shù)據(jù)函數(shù)來源于PlayableExtensions腳本,可以通過PlayableBehaviour類中的Playable數(shù)據(jù)獲取到。
工程案例代碼我在之前的章節(jié)中已經(jīng)存放進(jìn)去了,想更了解的朋友可以去下載工程
Unity版本2019.3.2f1
https://github.com/chs71371/NovelsEditor
