洪流學堂,讓你快人幾步。你好,我是跟著大智學Unity的萌新,我叫小新,這是復(yu)習(xi)動畫系統的最後一節。
小新:「大智,除了使用Layer還有沒有更好的組織狀態的方式呢?感覺一個Layer裡面狀態多的時候,還是很顯得很亂」
大智:「可以嘗試使用Sub-State Machines,也就是子狀態機,可以將一些狀態放到子狀態機裡。我把連結發給你,你先去看看。」
小新:「好嘞」
小新收到了大智QQ發來的信息:
https://docs.unity3d.com/Manual/NestedStateMachines.html
小新開始認真閱讀文檔,下面是他做的筆記:
Sub-State Machines 子狀態機很多時候,角色的一個行動由多個動作組成。比起使用一個動畫完成這個行為,可能定義幾個不同的階段,並且給每個階段使用一個單獨的State會更合理。比如一個「穩定射擊」的動作,包含蹲下、射擊、站起的動作。
這樣分拆的動畫更利於控制,但是帶來的負面影響是狀態機會變得龐大、複雜、難以管理。這時候,可以使用狀態機提供的子狀態機的功能,將這些狀態整合到一個子狀態中。
創建子狀態機在Animator窗口的空白處右鍵,在彈出菜單中選擇Create Sub-State Machine。
子狀態機會顯示為一個細長的六邊形用來和正常的state區分。
編輯子狀態機雙擊這個子狀態機可以打開它,界面會顯示這個子狀態機內的內容(初始會是一個空的狀態機)。窗口的上方會有一個麵包屑路徑顯示當前編輯的是哪個子狀態機(子狀態機內也可以再創建子狀態機),點擊對應的麵包屑路徑可以直接打開對應的位置。
子狀態機內的State編輯和之前的State編輯相同。
子狀態機的Transition子狀態機只是從視覺上將一些狀態摺疊到一個子狀態機中,所以如果想轉換到sub-state machine時,需要選擇具體轉換到哪一個狀態或整個狀態機。
創建Transition時需要選擇選擇狀態時,Transition會直接轉換到對應的狀態。選擇狀態機時,相當於將Transition轉換到對應狀態機的Entry狀態。
子狀態機中有一個額外的狀態名字為(Up)XXX。
這個狀態代表上一層的狀態機。你可以在子狀態機中創建Transition轉換到上一層狀態機中的某個狀態。
選擇狀態時,Transition會直接轉換到對應的狀態。選擇狀態機時,相當於將Transition轉換到對應狀態機的Entry狀態。
小新敲開大智的房門,「沒想到動畫系統這麼多內容,剛開始學的時候感覺還挺簡單的,現在越學東西越多了。」
大智:「所以說要掌握學習的方法,Unity的文檔就是最好的突破口,每次閱讀文檔然後做筆記,是一個非常好的方式,想必這麼久你也從中獲益不少吧?」
小新:「對對,以前都是走馬觀花,遇到不懂的就去百度,下次再遇到還是不懂。現在每次逼自己看英文文檔,翻譯做筆記,能系統地掌握一個知識點,印象也深了不少。」
大智:「最終你還要建立起一套自己的學習方法,技術的道路上需要不斷學習,終究有一天我沒辦法再指導你,但是你這段時間建立起的學習體系,可以一直幫你,讓你走的更遠。」
小新:「哎呀,怎麼說的這麼傷感,我一定好好學不辜負智哥你的栽培。對了,動畫系統裡學了這麼多了,還有沒有其他常用的我還沒學到的東西?」
大智:「確實動畫系統學習了這麼久,該學的都差不多了,要說比較常用的知識點還有Animator Override Controller和State Machine Behaviour。Animator Override Controller可以讓你在保留Animator Controller中的結構和邏輯的同時,覆蓋裡面的一些動畫,比如你有多個角色的狀態機結構邏輯都相同,但是動畫不同,這時候就可以用Animator Override Controller。State Machine Behaviour是一種用腳本的形式,可以掛在State上面,會有一些回調用來處理State不同狀態。具體的內容你還是去看下文檔,系統地學習下做一下筆記。」
小新:「我這就去」
Animator Override ControllerAnimator Override Controller是存放在Project中的一種資產,可以用來擴展已有的Animator Controller,替換Animator Controller中的動畫,但是保留原Animator Controller中的結構、參數和邏輯。
例如:遊戲中有很多類型的NPC(哥布林、獸人、精靈等),狀態機邏輯相同,但是每種NPC有自己獨特的動畫。這時候你只需要創建一個基礎的Animator Controller,結合使用Animator Override Controller可以創建出很多不同的變體。
創建Animator Override Controller在Project中的Create菜單中,選擇Animator Override Controller。
左邊是Override Controller的圖標(加號),右邊是Animator Controller的圖標(播放符號)Animator Override Controller和Animator Controller的圖標很相近,除了左下角一個是加號,一個是播放的標誌。
編輯Animator Override Controller給Controller賦值首先需要給Animator Override Controller一個基礎的Animator Controller。賦值完成後,下面會顯示狀態機中所有的動畫,這時候你可以用新的動畫來覆蓋原來狀態機對應狀態的動畫。
最後Override Controller可以賦值給Animator組件的Controller。
注意:Animator組件的Avatar屬性可能需要替換為對應模型的Avatar。
State Machine BehaviourState Machine Behaviour是一種特殊的腳本。和通用的Unity腳本(MonoBehaviour)掛到GameObject上面類似,StateMachineBehaviour可以掛到Animator Controller的State上面。可以在StateMachineBehaviour腳本中編寫代碼,在狀態進入、離開、停留在特定的state時執行。你就不需要自己去檢測狀態的變化。
可能用於的場景舉例:
進入、離開狀態時播放音效
只在特定的狀態中執行一些代碼
只在特定的狀態中激活特效
創建StateMachineBehaviour選中一個State,點擊Inspector中的Add Behaviour按鈕可以選擇已有的StateMachineBehaviour或創建一個新的StateMachineBehaviour。
StateMachineBehaviour中的事件StateMachineBehaviour中有一些預定義的事件方法:
OnStateMachineEnter 轉換到一個StateMachine時調用。注意轉換到子狀態機中的狀態時不會調用。
OnStateMachineExit 離開StateMachine時調用。注意轉換到子狀態機中的狀態時不會調用。
OnStateEnter 進入當前State時調用
OnStateExit 離開當前State時調用
OnStateUpdate 處於當前狀態時,每次Update都會調用(不包括Enter和Exit的兩幀)
OnStateMove 在MonoBehaviour.OnAnimatorMove之後調用
OnStateIK 在MonoBehaviour.OnAnimatorIK之後調用
小新:「總算是把動畫系統中的內容學完了,真是一個龐大的系統」
大智:「NoNoNo,這還不算完,其實還有很多細節上的東西,因為你沒有實際用到,所以還沒接觸到。」
小新:「我的天吶!」
大智:「不過也不用擔心,遇到問題的時候,好好去看文檔,再解決不了就來找我唄」
小新:「嘿嘿,這個方法好」
大智:「好你個大頭鬼,非得把我累死你才開心。給你布置個作業,用今天新學的內容把你的狀態機好好整理整理」
「收到!我去也!」
「收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。」
【擴展學習】在洪流學堂公眾號回復動畫可以閱讀本系列所有文章,更有視頻教程等著你!
呼~ 今天小新絮絮叨叨的真是夠夠的了。沒講清楚的地方歡迎評論,咱們一起探索。
我是大智(微信:zhz11235),你的技術探路者,下次見!
別走!點讚,收藏哦!
好,你可以走了。
掃描識別上圖二維碼查看課程詳細內容《大話Unity | 動畫系統詳解》包含在《大話Unity》系列專欄中。《大話Unity》系列專欄,包含數十個專題(包括ShaderGraph、Addressable等最新Unity技術)。
掃描識別上圖二維碼查看課程詳細內容《大話Unity》直達連結:https://edu.hongliu.cc