![]()
Unite Shanghai 2025于 10 月 23-24 日圓滿舉辦。在團結引擎專場中,Unity 中國高級技術研發經理王剛帶來分享《團結動畫系統新功能(AnimGraph,RigGraph,IK&Retarget)》,本文為演講全文實錄。點擊閱讀原文,可以訪問 Unite Shanghai 2025 演講錄像,一起學習 Unite 分享的最新技術干貨。
![]()
王剛:非常感謝大家的到來,今天給大家匯報一下團結動畫系統過去一年已經上線的功能。從長遠目標來看,動畫系統的改造是四個方面。首先,很多動畫功能要節點化,而且要增加更多的動畫功能。第二,關于 timeline 的長期目標是蒙太奇化。第三,在團結系統里給大家提供輕量級實時綁定系統和角色物理系統。第四,animation 要往性能優化的方向走,提供群體動畫的方案。
今天主要講這三個功能:
通用骨骼 IK & Retarget
動畫功能編輯器 AnimGraph
Rig 編輯器 RigGraph
IK & Retarget
我們先看第一塊。原來 Unity 的動畫系統重定向只基于 humanoid 骨骼,但很多用戶都是通用骨骼,所以我們想在通用骨骼基礎上擴展 IK 和重定向的能力,盡量能讓大家復用以前項目的動畫資產。
首先,為了基于通用骨骼,新的動畫系統有兩個新的資產,TRig 和 TRetargeter。它們主要應用于以下兩個核心場景——定制化 IK 綁定:借助 TRig 資產,開發者可以為特定骨架結構創建個性化的 IK 綁定方案,以滿足不同角色在動作表現上的獨特需求。定制化動畫重定向:通過結合使用 TRig 與 TRetargeter,可以實現靈活高效的動畫重定向功能,使動畫資源能夠在不同骨架之間共享與復用。TRig、TRetargeter 和其他部分的關系圖如下:
![]()
在上圖中,Generic Avatar 是通用骨骼,然后 TRetargeter 必須由 TRig (source) 和 TRig (Target) 兩個骨骼的資產確定,進行骨骼鏈匹配。無論是 IK 還是 Retarget,都有 play mode 和 editor mode。editor mode 就是傳統需要在 editor里面來做的編輯流程,支持 play mode 是為了在 runtime 里面可以用,以便很多角色實時動捕后要進行實時重定向、實時 IK 調整。
![]()
在 editor 模式下,TRig 有自己的編輯界面,可以配置 IK 求解器、骨骼鏈,也有自己的預覽畫面。在預覽效果里,可以對 Retarget 也進行預覽、編輯和修正。同樣,在 editor 模式下,如果您對重定向結果滿意,可以把它 bake 成 Animation clip。在 Play Mode下,結合 AnimGraph 實時修改參數查看效果。
![]()
通用 IK 組件中,所有加 T 開頭的都可以支持 generic 的骨骼。
TOverrideTransform 作用于單個骨骼對象
TTwoBoneIK 作用于三關節骨骼鏈
TFABRIK 作用于超過三個關節的骨骼鏈
TFBIK 作用于任意骨骼模型。我們改造了它的求解器方法,現在基于 PBD 的方法進行求解。
中間的流程圖是 IK 更新的順序,也就是說,如果想動態設置 IK goal,就需要在 LateUpdate 環節設置。
![]()
在上圖界面中,因為 IK 是分組的,您可以添加很多 IK 求解器,IK 求解過程會根據該順序依次執行求解器,可以拖動求解器來修改求解器的求解順序。當 IK 目標綁定上 IK 組件的時候,會跟對應的骨骼綁定在一起。
![]()
![]()
上圖是運行時態的例子,團結引擎中結合 AnimGraph 來實現運行時的 IK,可以動態進行 IK 功能的調節。左邊是一個 AnimGraph Node 節點界面,該界面中先有兩個 Animation clip,進行了 blend,如果對某一個關節的功能不滿意,可以添加實時的 IK Node 節點,該節點可以關聯 TRig 資產,在運行時修改 IK 目標的相關設置。可以在添加 IK Node 后的 AnimGraph Inspector 界面關聯 TRig 資產,也可以直接將 TRig 資產拖入圖中自動生成 IK Node。一些IK相關的控制參數可以在此節點中暴露出來,凡是暴露出來的參數就可以動態每一幀進行修改。
![]()
![]()
這是我們重定向的編輯界面。一個 TRetargeter 資產關聯了兩個 TRig 資產,分別表示源角色和目標角色。首先我們需要設置他們的重定向姿勢,在 inspector 里有提供了一些快速設置的方式,你可以將他們都設置為 TPose,也可以使用 clip 中的姿勢或者自動對齊。基礎的重定向我們是基于骨骼鏈去進行計算的。我們需要在各自的 TRig 資產中配置他們的骨骼鏈。將他們對應的骨骼鏈進行映射之后,我們就可以預覽動畫重定向后的效果。骨骼鏈的信息分別存儲在各自的 TRig 資產中,同樣對于人形角色我們可以一鍵自動生成。只有位于骨骼鏈上的骨骼會被作用重定向。
![]()
我們可以在這個界面中配置 source 和 target 之間的關系,和所有重定向相關的配置,最后可以選擇用IK來進行修正。這就是無論是 editor 狀態還是實時狀態,基于IK的重定向過程,用它來支持通用骨骼。這個通用骨骼我們也做了一個鏡像功能,比如好多格斗類的游戲就會需要鏡像。
![]()
上方的動圖是在運行時模式下,Retarget node 就需要編輯 TRetargeter 的參數,在節點里暴露出來,然后實時進行修改。
![]()
上方動圖展示的就是加了 IK 的修正。把 source 機器人 Retarget 到角色之后,對于腳踝關節進行了 IK 修正。
對于重定向的結果,既可以離線保存為 clip,也可以在運行時配合 AnimGraph 實時地重定向,可以開放特定端口進行修改。整體的話,對于類人形角色,基本全流程都配置了自動操作的按鈕,大家可以很輕松的完成類似 humanoid 的重定向流程。但不同的是,對于結果不滿意的時候,也可以對其中的每一個環節進行參數和配置上的修改
最后,歡迎大家多嘗試去重定向不同類型的角色,我們會根據更多實際中的例子來完善我們的工作流程。
AnimGraph
接下來講 AnimGraph。AnimGraph 其實就是兩個編輯器,一個是動畫功能節點的編輯器,一個是動畫控制邏輯腳本的編輯器。
在上方的 demo 中,我們把以前的兩個項目的動作合到新的角色上。上面的角色是由 motion matching 控制的,下面的是由狀態機控制的。拿槍的動作都是從下面角色來的,所有的跑、跳動作都是從上面角色來的。我們有兩個實時的 TRetargeter 把以前的資產重定向過來,再做了 layer mix、Blend,輸出新的動作。
![]()
上圖是動畫功能節點的 Graph,這些按連接順序排列,最后連到 output 上,讓你可以編輯動畫功能的執行邏輯。現在已經發布的動畫相關功能的節點化包括 Animation clip、BlendTree、狀態機,第二排是各種和 blend 相關的功能,第三排是和骨骼相關的功能,比如鏡像、重定向、IK 和一些約束。最下面一排功能,是考慮大家把以前 animator 的項目轉成 AnimGraph 項目,這個節點可以把 controller 拖到 AnimGraph 里,它可以作為一個節點封裝,然后再連其他的動畫功能節點,最大限度讓大家復用以前 animator 項目里的東西。Rig Graph Node 是實時綁定系統的節點。后面每三個月的版本都會提供更多的動畫節點。
![]()
接下來講一下 AnimGraph 狀態機和原來 animator 的狀態機有什么不一樣。最左側的圖是各種多狀態機混合 layer mask。現在每一個狀態機的 state node 其實是一個動畫節點 graph 的子 graph。也就是說,原來的狀態機里,要么只能放 blend tree,要么只能放 animation clip,現在每一個 state 進去之后還是一個節點編輯器,每個 state 里面還可以重新編輯動畫其他節點功能連接,再創建一個子的 state machine。右下角圖例就是一個子的 state machine,套在最上面圖中的某一個 state 中。
我們看最右邊的節點列表,現在每個 state 里面都有一些 binding function, binding 了 script graph 里面那些可視化編輯腳本。這里面每個狀態都可以 binding 一個 Function。如果不是狀態機里的 state node,假設是正常的 animation node,它都有一個 binding function,第一次初始化要綁哪一個 script,每一幀 update 要綁哪一個 script,都要綁到 Function 里邊,每一個函數都是可視化編輯腳本函數。
![]()
EventGraph 和 Function 可輔助 AnimGraph,實現更靈活的動畫輸出控制。EventGraph 給大家提供了一個可視化的腳本邏輯編輯,可以控制 node graph 中動畫的各種參數,可以控制狀態機里動畫執行順序邏輯,減少了用 monobehavior 來寫 C# 腳本的必要。像一些已經預留的 EntryNode:OnStart、OnUpdate、OnLateUpdate,就是固定的更新事件。OnAnimationGraphMove 節點是當連接執行邏輯時,會每幀觸發后續執行圖。您可在執行圖中處理動畫系統生成的位移(deltaPosition)和旋轉(deltaRotation),實現自定義 RootMotion。其功能與 OnAnimatorMove 類似。還支持CustomEvent(自定義事件)、AnimationEvent(動畫事件)。
![]()
在 EventGraph 中,某些節點是通過反射機制能拿到的節點。如果對這些反射機制提供的節點不滿意,可以自己創造一些函數,如果可復用,就可以放在 Function 這一欄。這里面也是通過基本反射可以得到一些對象、運算、類,然后控制這些邏輯去做。每一幀的 update 都可以更新 parameters。
RigGraph
最后簡單介紹下實時綁定和控制系統 RigGraph,是一套在團結引擎里面的控制器系統。
![]()
上圖是這套基于通用人形骨骼的綁定控制的實時邏輯的核心圖,這里面包含兩個不同關節的部位,有兩種模式,一個是 forward 前向模式,控制器到骨骼,還有逆向模式,骨骼到控制器。相當于把原來綁定控制的能力輕量級地拿到了團結引擎編輯器里。
上圖是正常的配置頁面,所有的控制器如圖所示。整個人形角色的資產就是大概按照左邊的樣子,由 Rig Graph Manager 出發,script machine 的核心就是處理前向和后向的控制器到骨骼的實時解算過程,整個 Rig Graph 把變量暴露出來,都可以進行實時修改。而 Effector 就相當于控制器,用來控制骨骼。
![]()
![]()
上圖講了前向解算和后向解算的時間點。在 process animation 更新的時間點里, On Setup Event 第 0 幀觸發一次,用于初始化控制點的 Transform 值。On Forwards Solve(前向解算)在 Setup Event 之后,Backwards Solve 之后執行,每幀均觸發,是 Rig Graph 中最主要的解算方向,定義控制點控制骨骼的邏輯。On Backwards Solve(反向解算)在 Setup Event 之后,Forwards Solve 之前執行,每幀均觸發,是從當前骨骼姿勢中,解算出控制點的 Transform 值,常用于控制點動畫烘焙。我們先做 backward 解算,再做 forward,這兩個同時存在的情況下才這么解,如果沒有的話可以忽略。
任意一個控制器要編輯,有兩種模式,一個是全局的,一個是本地的。全局是不管這個動畫現在跑在什么 pose 上,都要把關節變成特定姿勢,它會覆蓋掉原來的動畫。 local 模式是將收到的狀態 plus 到之前的狀態上,而且它支持只改局部的骨骼,比如只改腿,或改全身。
![]()
![]()
因為在動畫系統里面有兩套動畫運行邏輯,一個是 animator,一個是 animation graph,Rig graph 可以配合這兩種。配合 animator 就是剛剛的 Rig graph manager 整個 component 的掛載機制,當組件一樣掛到了 animator 上。在 animation graph 里,我們給大家提供節點化的功能,可以配置 rig graph node。團結引擎的 AnimGraph 可通過 Rig Graph Node 節點實現骨骼動畫運行時控制功能。
![]()
接下來介紹一個優化功能,整個一套實時綁定控制器到骨骼的解算綁定系統是用可視化節點做出來的,由于那個性能比較差,所以我們做了 Graph code generator 方案,也就是說我們會把它轉化成高性能的 C# 代碼。左邊圖中,每個 node 節點 script 進行連接,我們會把所有的對象在內存分配里進行池化減少 GC 操作,然后按照 burst 執行標準產生代碼,運行性能會大大提升。右圖中,優化以后這個角色是 0.4 毫秒的實時解算,上圖優化前是 10-20 毫秒的數量級,性能優化提升還是非常大的。
![]()
![]()
RigGraph 有控制器編輯動畫的能力,可以在 timeline 里面 K 動畫,K 的是控制器不是骨骼,因為這套綁定系統已經在骨骼的基礎上提供了更易用的控制器,在 timeline 存的是控制器的數據,timeline 運行的時候,控制器通過 RigGraph 把控制器解算成骨骼,驅動骨骼動畫。
![]()
![]()
最后是動畫烘焙功能,因為有兩種模式——控制器到骨骼,骨骼到控制器,所以我們的動畫烘焙也是雙向的。我們在 timeline 單獨做了動畫烘焙模塊,假設編輯好了控制器的東西,想把它編輯成正常的 animation clip 里面存的是骨骼數據,那么就把控制點動畫 bake 成骨骼動畫。反過來,如果外面已經有一個動捕好的骨骼數據,也可以 bake 到控制器上,這是兩種模式。
今天就給大家介紹到這里,后面會給大家提供更多的動畫節點。
Unite Shanghai 2025演講回放錄像已上線 Unity 中文課堂,點擊閱讀原文即可訪問,購票用戶可免費觀看。請持續關注,一起學習 Unite 分享的最新技術動向。
Unity 官方微信
第一時間了解Unity引擎動向,學習進階開發技能
每一個“點贊”、“在看”,都是我們前進的動力
![]()
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.