Unity動畫系統詳解10:子狀態機是什麼?

2021-02-19 洪流學堂

洪流學堂,讓你快人幾步。你好,我是跟著大智學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 Controller

Animator 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 Behaviour

State 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

相關焦點

  • Unity動畫系統詳解9:Target Matching是什麼?
    你好,我是跟著大智學Unity的萌新,我叫小新,這幾周一起來復(yu)習(xi)動畫系統。小新:「大智,我有一個需求,感覺可以用IK去實現,但是使用IK會有問題,我就不知道怎麼辦了。」大智:「具體是什麼需求呢?」小新:「絕地求生裡面人物可以雙手撐牆跳過一個堵牆或者窗戶,我想讓角色的雙手能恰好放到牆上,這個應該怎麼做呢?」
  • Unity動畫系統詳解8:IK是什麼?
    你好,我是跟著大智學Unity的萌新,我叫小新,這幾周一起來復(yu)習(xi)動畫系統。「大智,昨天你說要給我講講IK,趁現在有空,你給我講講唄」「IK你已經明白是什麼意思了吧?」「IK是Inverse Kinematic的縮寫,也就是反向動力學。是根據骨骼的終節點來推算其他父節點的位置的一種方法。
  • Unity動畫系統詳解5:BlendTree混合樹是什麼?
    你好,我是跟著大智學Unity的萌新,我叫小新,這幾周一起來復(yu)習(xi)動畫系統。「智哥,我用Animator做了一個人物移動的狀態機,怎麼看怎麼不順眼,這也太複雜了,你來看看?」**Adjust Time Scale > Homogeneous Speed ** 可以將動畫的速度調整對應到參數的最小值和最大值,但是保持動畫的初始相對速度。這句話看得我欲生欲死,得問問大智是什麼意思按鈕可以將動畫的播放速度調整到動畫列表中所有動畫速度的平均值。Mirroring 鏡像
  • Unity動畫系統詳解6:如何做好角色的移動動畫?(Root Motion詳解)
    你好,我是跟著大智學Unity的萌新,我叫小新,這幾周一起來復(yu)習(xi)動畫系統。「智哥,自從用了混合樹來做人物移動,腰不酸腿不疼,思路更清晰了,一口氣能寫12小時代碼!」「喲,療效這麼好,我看你應該再碼12個小時」「那也沒問題,你來看看我做的這個人物的混合樹是不是棒極了」小新信心滿滿地打開混合樹,給大智看。
  • 運用狀態機提高嵌入式軟體效率
    如果合理運用狀態機機制開發系統軟體,就可以讓MCU進行多任務的分時處理。本文引用地址:http://www.eepw.com.cn/article/152440.htm1 建立有限狀態機的模型 其實在平時的程序設計中,開發人員已經不知不覺地使用了狀態機,如按鍵狀態轉換、菜單顯示狀態的轉換等。但是,很少有系統會使用狀態機進行多任務處理。
  • 新手如何從零開始學習unity
    (二)關於unity客戶端學習,首先你做為一個新手,我建議你從unity2D開始學習,我不建議你一開始就去學3D,因為3D遊戲會涉及到很多比較複雜的計算,那麼也就是在創建遊戲項目的時候,選擇一個2D遊戲去開發,關於2D遊戲的素材,大家自己可以在 某寶上面去購買,買來自己練習,非常便宜,那麼學習2D遊戲的學習順序是什麼呢,在這裡我也給大家整理了一下。
  • 單片機之狀態機淺談
    這樣的歸納,主要是出於對狀態機的內在因果聯繫的考慮。「現態」和「條件」是因,「動作」和「次態」是果。詳解如下:①現態:是指當前所處的狀態。②條件:又稱為「事件」。當一個條件被滿足,將會觸發一個動作,或者執行一次狀態的遷移。③動作:條件滿足後執行的動作。
  • [專欄精選]Unity剛體詳解
    Rigidbody 剛體「大智,昨天我學習了物理系統,知道了碰撞體,那物理系統裡面還有別的東西麼?」「你呀,太天真了,Collider只是物理系統的一部分。你看昨天學的Collider,他們都只是一個靜態的碰撞體。我們昨天學習過物理系統很重要的是模擬物體的受力情況,物體根據物理規則運動呀。」「那通過代碼修改物體的位置不就能運動起來了麼?」
  • 使用unity製作RPG遊戲4——動畫狀態設置
    上一次製作了2D動畫 http://baijiahao.baidu.com/builder/preview/s?讓主角可以在地圖上任意方向的行走RPG遊戲裡的主角往往都是待機和跑步兩種狀態,所以需要複製一份狀態可以刪除所有Animator Controller,保留Animation右鍵Show in Explorer然後複製並且F2重命名一下把一個動畫狀態拖到屬性面板可以自動生成一個
  • 3D場景編輯導出-LayaAir引擎Unity插件使用詳解
    signup=true國際下載地址:https://unity3d.com/get-unity/download/archive需要登陸,再找到對應的歷史版本(國內打開國際地址需要翻牆)2.2 、下載LayaAir的unity插件2.2.1 下載地址LayaAir引擎unity插件下載地址:https://ldc2.layabox.com/layadownload
  • Android狀態機StateMachine
    從而使狀態機狀態停頓到mHaltingState狀態mQuittingState狀態,若進入該狀態, 狀態機將退出。HandlerThread線程對應的Looper將退出,HandlerThread線程會被銷毀,所有加入到狀態機的狀態被清空。
  • C語言狀態機編程思想
    有限狀態機是一種概念思想,把複雜的控制邏輯分解成有限個穩定狀態,組成閉環系統,通過事件觸發,讓狀態機按設定的順序處理事務。
  • UGUI整體解決方案-基礎篇(Unity 2019)
    課程介紹:本課程是UGUI系列課程的第一篇:基礎篇主要是講解UGUI的基礎組件及接口的使用方法,目前UGUI是unity
  • Unity PBR Standard Shader 實現詳解 (三)
    話不多說,接下來點讚上車1.LightingStandard_GI函數看看這個函數長什麼樣子inline void LightingStandard_GI (SurfaceOutputStandard, data.lightmapUV.xy); half3 bakedColor = DecodeLightmap(bakedColorTex); #ifdef DIRLIGHTMAP_COMBINED fixed4 bakedDirTex = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd,
  • 認識一下Qt狀態機QStateMachine
    關於Qt狀態機的介紹就懶得說了,網絡上一搜一大堆,反正也看不懂。我關心的就是怎麼使用,畢竟我只是一個編寫應用程式的程式設計師。簡單粗暴地理解一下狀態機就是一個管理很多狀態的機器。組成一個最簡單的狀態機應該包括狀態機(QStateMachine)、狀態(QState)和過渡(QAbstractTransition子類)。狀態機就相當於一個容器,過渡就是將某一個狀態切換到另一個狀態(當然也可以不切換)。
  • 談談狀態機
    合法的輸入有:1,100,10101不合法的輸入有:10,00,1100我們知道,寫一段程序,搞定數據結構,就搞定了 80%。開發一個 FSM 也是一樣,選取合適的狀態是最最關鍵的。確定了狀態之後,剩下的只是辛苦活。對於這個簡單的問題,大家一眼都能看出,可能存在四種狀態。
  • unity什麼意思
    unity什麼意思unity,聯合、統一、團結、和睦。學單詞,只記住意思可不行,會用才行,小夥伴們可以在評論區造句,我們一起學習哦!我先來:造句:Unity is strength.elasticity什麼意思
  • 《卡通湖水渲染思路》與《Unity Shader ScreenPos》詳解
    從直觀的來看,有這幾個主要效果:沒錯,就這兩個較為直觀的效果,下面的任務不是分析細節,而是針對這兩項效果思考解決方案針對效果一:既然是模擬水的深度,那我們就可以採用基於深度著色的方法來實現,最後對不同深度值進行邊界控制,分配顏色就行了針對效果二:首先很容易想到的是噪聲圖,對灰度值進行邊界處理,加上UV動畫,基本上大功告成了
  • 使用unity製作RPG遊戲3——2D精靈
    context=%7B%22nid%22%3A%22news_9564882242542237691%22%2C%22sourceFrom%22%3A%22bjh%22%2C%22url_data%22%3A%22bjhauthor%22%7D下面需要利用Tiled2Unity把01地圖導入unity下載Tiled2Unity
  • 利用74LS161實現複雜狀態機
    時序邏輯電路的數學模型是有限狀態機(FiniteStateMachine)。7腳和10腳分別為計數控制端EP和ET,當其中有一腳為低電平時計數器保持狀態不變,當均為高電平時為計數狀態。9腳為同步並行置數控制端/LD,低電平有效。11~14腳為數據輸出端QQ30~。15腳為進位輸出端RCO,高電平有效。