MMD聯(lián)動(dòng)Unity學(xué)習(xí)筆記 Vol.27 Timeline使用動(dòng)畫片段&自定義代碼控制

前言? ? ??
????這期筆記來自Shallot夏洛特大佬的視頻。主要內(nèi)容是使用動(dòng)畫片段及自定義代碼控制Timeline。視頻在下面


使用動(dòng)畫片段
? ? 下面我們了解如何在Timeline編輯器的軌道里對角色使用不同的動(dòng)畫文件,并且如何對它們進(jìn)行變換,并且還會介紹如何將我們錄制的動(dòng)畫轉(zhuǎn)換成為動(dòng)畫片段。
????假如我們要做一個(gè)剪輯或者說是對話場景,我們有許多不同的動(dòng)畫,并且想讓角色播放這些動(dòng)畫,讓他看起來是與另外的角色在進(jìn)行互動(dòng),在這個(gè)事例里我們就會使用Timeline播放不同的動(dòng)畫來達(dá)成這個(gè)目標(biāo)。另外我們還會對相機(jī)錄制動(dòng)畫來制作鏡頭剪輯。

????在這場景里有兩個(gè)角色模型都是使用了人型Rig。
????在這里,我們想要做一個(gè)雙方輪流互動(dòng)的對話系統(tǒng),所以我先設(shè)置好他們的位置,讓他們面對面站著。

????在每個(gè)角色的身后也都放置有一個(gè)相機(jī),看向?qū)Ψ?。同時(shí)也創(chuàng)建有一個(gè)Timeline,每一個(gè)角色放置在一個(gè)軌道上。

????賦在這里的角色身上掛有Animator組件,組件里有對應(yīng)的形象,這樣Timeline可以直接對它們的動(dòng)畫形象應(yīng)用動(dòng)畫片段。

????這里也有許多軌道應(yīng)用于不同的相機(jī),如果我運(yùn)行起來可以看到并沒有什么事情發(fā)生,所以讓我們給角色添加動(dòng)畫,給他們帶來生命吧。

????在角色動(dòng)畫軌道上,右鍵點(diǎn)擊選擇,從動(dòng)畫片段添加。

????然后可以直接選取需要的動(dòng)畫片段。

????或者可以直接從工程窗口直接拖入動(dòng)畫片段??梢灾苯油蟿?dòng)片段到我們想讓它開始播放的位置。

????我們還可以拖拽它的左端或者右端來縮短或者擴(kuò)展它的播放時(shí)間。

????如果想添加一個(gè)相同的片段,可以選中它,按下CTRL+D復(fù)制一個(gè),或者鼠標(biāo)右鍵選擇復(fù)制。

????直接把復(fù)制出來的片段拖給另一個(gè)角色。運(yùn)行一下,兩個(gè)角色看起來比之前有活力了。我們想要?jiǎng)赢嬕恢毖h(huán)下去,可以設(shè)置屬性來辦到。

????這些設(shè)置可以修改片段在播放前或者播放后的一些行為。讓我們把它們的屬性從“保持”改為"繼續(xù)"。

????預(yù)覽一下,可以看到它,Timeline完成這些片段以后,它們還是在繼續(xù)播放的,或者你可以擴(kuò)展片段的長度到剪輯的最末端,有相同的效果。

????我們再給角色添加另一個(gè)動(dòng)畫片段。

????在初始化的時(shí)候,新片段會自動(dòng)緊貼到上一個(gè)片段,可以連續(xù)播放。

????如果我們把新的動(dòng)畫片段往前拖,那么這兩個(gè)動(dòng)畫將會自動(dòng)融合。往前拖得越長,融合的時(shí)間也會越長。

????可以多次嘗試找出你覺得最適合的融合時(shí)間點(diǎn),我們可以拖動(dòng)每一個(gè)片段的開始或者介紹端來對融合片段進(jìn)行微調(diào)。
????還需要知道的一點(diǎn),是我們可以再次編輯融合曲線來調(diào)整融合動(dòng)畫。

????默認(rèn)被設(shè)置為自動(dòng)曲線。如果想自定義可以修改成手動(dòng)模式。

????然后選擇一個(gè)曲線預(yù)設(shè)。

????或者自定義一個(gè)曲線。

????這就是基本的動(dòng)畫片段操作,你可以繼續(xù)給Timeline添加內(nèi)容并編輯。

????假設(shè)我們還需要一臺相機(jī),給他錄制不同的位置,制作鏡頭,使用同一臺相機(jī),完成鏡頭剪輯,在這里我給相機(jī)錄制了動(dòng)畫,我想把這兩個(gè)軌道轉(zhuǎn)換成片段,這樣更靈活。

????可以鼠標(biāo)右鍵點(diǎn)擊我們的錄制數(shù)據(jù)軌道,然后選擇轉(zhuǎn)換成片段軌道。

????然后其實(shí)可以只是用一個(gè)軌道來編輯了。

????所以我刪掉另外的軌道,非常方便,完美。


自定義代碼控制Timeline
????下面我們了解如何使用自定義腳本控制Playable Director,我們將會寫一個(gè)叫做Timeline Controller的腳本,并引用一個(gè)Playable Director組件。另外我們還會介紹如何使用腳本來控制以及修改多個(gè)Playable Director組件。
????假設(shè)在游戲里,玩家控制角色,按下這個(gè)按鈕就會播放Timeline。場景里有一個(gè)帶有按鈕的講臺,它帶有碰撞盒。

????在講臺的前方設(shè)置了一個(gè)觸發(fā)器,在講臺身上掛著這個(gè)腳本,腳本檢測角色進(jìn)入觸發(fā)器以后,執(zhí)行一個(gè)事件,在檢測玩家是否會按下空格鍵。

????我們還會在游戲里自定義代碼,來播放一個(gè)Timeline。
????在寫代碼之前取消勾選屬性,它在運(yùn)行時(shí)就不會自動(dòng)播放了。

????現(xiàn)在創(chuàng)建我們的腳本,選擇C#腳本重命名為TimelineController。

????要能訪問Playable Director類需要using unityEngine.Playable。(unity2018已經(jīng)取消內(nèi)置的Mono IDE)

????先定義一個(gè)公有變量,這樣我們就可以把想控制的Timeline賦給它。再定義一個(gè)公有函數(shù),返回值為void(沒有返回值),函數(shù)體里就直接播放我們賦值的這個(gè)Timeline。

????回到Unity,把這個(gè)腳本賦給對象,然后將需要播放的Timeline拖入腳本。

????我們還要告訴Timeline Controller腳本何時(shí)播放,記住在你的工程里可以調(diào)用這個(gè)函數(shù)。然而在本示例里我想讓玩家按下按鈕的時(shí)候才調(diào)用play函數(shù),所以我要從交互腳本里調(diào)用它。


????現(xiàn)在只要按下空格鍵就可以播放Timeline剪輯了。場景里有一輛藍(lán)色坦克,它身上也有一個(gè)Timeline。

????如果我們把它的Timeline拖給我們的腳本,按下空格就可以播放。

????現(xiàn)在我們想讓這些剪輯同時(shí)播放,我們當(dāng)然可以再創(chuàng)建一個(gè)按鈕,但是我們現(xiàn)在只想使用一個(gè)按鈕,按一次就可以播放所有剪輯,所以我們需要再修改一下代碼。
????回到Mono? ,確保我們添加的這行代碼(using System.Collections.Generic;),這樣才可以使用list(列表)。將原先的單個(gè)組件改成一個(gè)列表,然后play函數(shù)也要修改,使用foreach循環(huán)來播放列表。

????回到引擎,我們可以看到這里變成了列表,可以自定義數(shù)量。

????我將需要播放的剪輯全部拖進(jìn)來,按下空格鍵,它們都被播放了。

????現(xiàn)在假設(shè)我們想用腳本控制一個(gè)對象上的多個(gè)Timeline,比如說坦克上有兩個(gè)Timeline,一個(gè)是移動(dòng)動(dòng)畫,另一個(gè)是炮頭旋轉(zhuǎn)。當(dāng)玩家按下不同的按鈕,坦克會播放不同的Timeline。????????這個(gè)腳本的定義了兩個(gè)事件,按下空格和回車可以執(zhí)行不同的操作。

????我們又會編輯控制器腳本,讓它知道應(yīng)該播放哪一個(gè)Timeline。請確保添加了這兩行代碼,這樣才可以訪問Timeline,以及使用列表。

????首先定義一個(gè)公有的Timeline列表,然后我們需要從Timeline列表里獲取它們的Playable Director組件,再寫一個(gè)新的函數(shù),參數(shù)使用整型作為索引值。索引是用來表示我們將播放Timeline列表中的哪一個(gè)。然后再定義一個(gè)局部變量,儲存我們從列表里抽取的對象。最后這個(gè)腳本實(shí)際上只是播放一個(gè)Timeline而已。在這里我們就播放列表中的第一個(gè)元素,為了避免錯(cuò)誤,我們需要確保我們抽取的索引值是小于列表值的。如果索引值大于列表的值,那我們就把索引設(shè)為列表里的最后一個(gè)元素。

?????回來引擎,把Timeline拖入腳本。

????然后增加一個(gè)事件,把Timeline控制器腳本被拖入事件對象的接口。

????設(shè)置播放函數(shù)的索引值為零。

???? 同理,再設(shè)置另一個(gè)播放索引為1。

????運(yùn)行,先按下回車,第一個(gè)Timeline就會被播放了,接著按下空格。第二個(gè)就會播放。
????你看到自定義代碼僅僅幾行,就可以輕松控制Timeline。

? ? 最后感謝Shallot夏洛特大佬的分享。示例代碼請到大佬視頻介紹中下載