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