動畫圖形編輯器是一個視覺化的基於節點的工具,讓技術藝術家和動畫師能夠直接在 Roblox Studio 中構建複雜的動畫邏輯。通過提供一個簡化的界面來創建像混合樹這樣的行為,它消除了對角色運動的手動腳本的傳統依賴。
此系統與您現有的動畫工作流程協同工作:
- 動畫編輯器:繼續使用 動畫編輯器 作為創建單個剪輯和微調關鍵幀及曲線的主要工具。
- 動畫圖形編輯器:使用此工具將這些剪輯組織成邏輯樹,以驅動複雜的遊戲行為。
旨在增強協作,視覺圖形允許開發人員快速檢查、調試和理解動畫師創建的邏輯。當藝術家專注於完善互動運動時,開發人員仍然可以以編程方式訪問動畫圖形節點,以直接控制混合動畫和狀態。
構建圖形
要開始為可動畫角色構建邏輯,請通過 Studio 功能區中的 Avatar 標籤訪問動畫圖形編輯器。以下步驟演示如何初始化一個裝配體並使用默認的行走和揮手動畫構建基本的節點網絡。
要深入了解實際應用,您可以探索 動畫圖形參考文件,該文件包含基礎和複雜的實現示例。
要創建自己的動畫圖形,類似於參考中提供的基本示例,請使用以下步驟:
在 Studio 中,通過導航到 Avatar 標籤並選擇 Character ⟩ My Avatar 來添加可動畫的裝配體。

通過導航到 Avatar 標籤中的 Graph Editor 打開動畫圖形編輯器。

在 3D 視口中選擇可動畫的裝配體,然後選擇 Create Graph。
在圖形編輯器中,右鍵單擊並選擇 Clip。

在新的 Clip 節點中,設置動畫 ID。
選擇 Animation ID 下拉菜單。
要提交特定的動畫資產 ID,請單擊 Import。

在 Animation ID 字段中,添加默認的行走動畫:507777826。
選擇 Import。
通過重複步驟 4-5 添加另一個剪輯節點,使用默認的揮手動畫:507770239。

在圖形編輯器中,右鍵單擊並選擇 Add。

將剪輯節點連接到添加節點,通過將右上角的輸出連接器拖動到適當的端口:
- 將帶有行走動畫的 Clip 節點連接到 Base 端口。
- 將帶有揮手動畫的 Clip 節點連接到 Additive 端口。

從添加節點,將右上角的輸出連接器連接到圖形輸出 Pose 端口。

通過按下 播放按鈕 測試動畫。

嘗試測試各種權重、速度、播放模式和其他動畫。要獲取有關單個節點的更多信息,請參見 節點參考。
API 整合
創建和部署動畫圖形遵循標準的 Roblox 動畫管道。在動畫圖形編輯器中選擇一個裝配體後,會創建一個新的 AnimationGraphDefinition 資產。該資產作為您的節點、連接和參數的容器。一旦您的邏輯完成,您就可以發布圖形以獲得標準資產 ID。
在您的腳本中,您可以像傳統動畫一樣將這些圖形加載到 Animator 上。要驅動圖形的內部邏輯,使用 AnimationTrack:SetParameter() 將實時值(例如移動速度或狀態布爾值)直接傳遞到圖形的變量中。
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- 您的已發布圖形 ID
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- 通過 RunService 動態更新參數
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)節點參考
每個動畫圖形節點作為邏輯閘或數據源,處理動畫數據,然後再到達角色裝配體。此部分提供動畫圖形編輯器中功能塊的技術細分。所有節點目前都輸出一個動畫姿勢。
每個節點部分包括:
- 定義 – 節點的目的和在圖形中的角色的摘要。
- 輸入 – 進入節點的數據流。多個輸入表示為 Input1、Input2、...、InputN。
- 輸入屬性 – 直接與特定輸入相關的設置(例如,分配給 Blend1D 節點上位置為 0.5 的 Idle 輸入)。
- 事件數據 – 由節點發出或消耗的事件,以觸發內部圖形邏輯或外部 Luau 腳本。此行為可能會在測試開發過程中發生變化。
全局事件規則
對於所有節點和 過渡,默認情況下適用以下規則:
- 事件從其源節點向上傳播,穿過圖形。每個事件攜帶一個權重,表示其源在最終混合中的影響。如果權重在任何時候達到零,則事件會被靜音。
- 沒有自定義事件邏輯的節點會將所有事件原封不動地傳遞;混合或在輸入之間選擇的節點可能會縮放權重或阻止來自非主要輸入的事件(請參見每個節點的事件部分)。
- 到達圖形頂部的標記事件可以通過 AnimationTrack:GetMarkerReachedSignal() 觀察到。
剪輯

對 AnimationClip 資產的引用。這作為圖形中的葉節點,生成原始動畫數據,供其他節點進行混合、選擇或修改。
- 輸入
- 無
- 屬性
屬性 類型 描述 AnimationId 字串 要播放的動畫資產(例如 rbxassetid://12345)。 PlayMode Enum.AnimationNodePlayMode 定義剪輯在達到其持續時間結束後的行為。
- 循環(默認):剪輯結束後自動從頭開始。
- 乒乓:從開始播放到結束,然後立即反向播放從結束到開始。
- 一次並保持:播放一次並在完成後保持最終姿勢。
- 一次並重置:播放一次並在完成後回到初始開始姿勢。
Reverse 布爾值 控制播放方向。 Speed 數字 播放速率的乘數。0.0 暫停圖形,1.0 是正常速度,2.0 是雙倍速度。 Trim 布爾值 切換剪輯的持續時間是否應該被截斷。 TrimStart 數字 播放應開始的絕對時間戳(以秒為單位)。 TrimEnd 數字 播放應終止的絕對時間戳(以秒為單位)。 - 事件數據
- 事件處理: 無。這是一個沒有子節點的葉節點。
- 事件發射: 讀取嵌入在動畫剪輯中的自定義標記(例如 "Footstep"、"WeaponSwing"),並在它們發生的精確幀上將其作為命名事件發射。如果剪輯被截斷,則僅在定義的 [TrimStart, TrimEnd] 區間內(包含)發射標記。
選擇

通過選擇屬性在任意數量的輸入之間進行選擇。每當當前選擇更改時,會觸發新的 過渡。
- 輸入
- Input1...InputN
- 屬性
屬性 類型 描述 Selection 字串 要選擇的輸入的唯一 ID,與輸入連接的名稱匹配(例如 "Walk")。 - 事件數據
- 事件處理: 來自當前選擇輸入的事件以未更改的權重通過。
- 事件發射: 僅通過來自當前選擇輸入的所有事件。在過渡期間,事件發射遵循 全局事件規則。
優先選擇

從上到下評估連接的輸入列表,播放第一個條件評估為真的輸入。這允許基於特定邏輯的層次動畫選擇。每當當前選擇更改時,會觸發新的 過渡。
- 輸入
- Input1...InputN
- Trigger (布爾值):必須為真的邏輯條件,才能激活此輸入。在當前版本中,這與布爾參數相連接。
- TransitionOverrideInterruptible (Enum.AnimationNodeInterruptible): 定義此活動動畫何時可以被更高優先級輸入中斷的規則。覆蓋節點級別的 DefaultInterruptible 設置。
- 始終(默認):該輸入可以隨時被更高優先級條件中斷。
- 完成:當前動畫必須完成播放,才能讓更高優先級的輸入接管。
- 觸發:僅當 InterruptibleTrigger 設置為 true 時,該輸入才可中斷。
- InterruptibleTrigger (布爾值):僅在 TransitionOverrideInterruptible 設置為 Trigger 時可用。當此特定表達式為真時,該輸入可以被中斷。
- 屬性
屬性 類型 描述 DefaultInterruptible Enum.AnimationNodeInterruptible 應用於所有輸入的基線中斷規則。每個輸入可以用自己的 TransitionOverrideInterruptible 輸入屬性覆蓋此設置。 - 事件數據
- 事件處理: 來自當前選擇輸入的事件以未更改的權重通過。
- 事件發射: 僅通過來自當前選擇輸入的所有事件。在過渡期間,事件發射遵循 全局事件規則。
序列

根據定義的等待條件以特定的順序激活連接的輸入。每當當前選擇更改時,會觸發新的 過渡。
- 輸入
- Input1...InputN
- TransitionOverrideWaitFor (Enum.AnimationNodeWaitFor): 指定必須滿足的條件,才能使序列進入下一個輸入。覆蓋節點級別的 DefaultWaitFor 設置。
- 完成(默認):當當前輸入完成一個循環時,進入下一個輸入。進入行為取決於連接的輸入:
- 播放一次的剪輯:當剪輯完成時進入。
- 循環剪輯:在完成一個完整循環後進入。
- 具有無限循環的序列:在所有輸入完成一個完整循環後進入。
- 具有有限循環的序列:在所有循環完成後進入。
- 觸發:當自定義邏輯表達式評估為真時,激活下一個輸入。
- WaitForTrigger (布爾值):僅在 TransitionOverrideWaitFor 設置為 Trigger 時可用。
- 屬性
屬性 類型 描述 LoopCount 數字 循環整個序列的次數。值為 0(默認)表示無限循環。一旦達到計數,該節點將遵循最終輸入的循環或保持設置。 DefaultWaitFor Enum.AnimationNodeWaitFor 應用於所有輸入的基線等待條件。每個輸入可以用自己的 TransitionOverrideWaitFor 輸入屬性覆蓋此設置。 - 事件數據
- 事件處理: 來自當前活動輸入的事件以未更改的權重通過。
- 事件發射: 僅通過來自序列中當前活動輸入的所有事件。在過渡期間,事件發射遵循 全局事件規則。
隨機序列

隨機選擇並播放其連接的輸入之一。當當前選擇的動畫完成時,該節點隨機選擇另一個輸入進行播放。為每個輸入分配特定的權重,以影響其被選中的概率。每當當前選擇更改時,會觸發新的 過渡。
- 輸入
- Input1...InputN
- Weight (數字):確定此輸入被選中的概率;較高的權重增加選擇的機會。
- 屬性
屬性 類型 描述 PlayCount 數字 該節點在停止之前將播放的輸入數量。一旦達到,該節點將遵循最終輸入的循環或保持設置。默認為 0,表示無限。 Seed 數字 用於初始化隨機數生成器(RNG)的值,確保序列在不同客戶端之間保持一致。默認為 -1,表示隨機種子。 - 事件數據
- 事件處理: 來自當前活動輸入的事件以未更改的權重通過。
- 事件發射: 僅通過來自序列中當前活動輸入的所有事件。在過渡期間,事件發射遵循 全局事件規則。
重疊

將 Over 姿勢層疊在基礎姿勢之上。當與遮罩節點結合時,Over 姿勢中被遮罩的關節完全顯示 Base 姿勢,創造出透明的覆蓋效果。
- 輸入
- Base:背景或底層,通常是全身動畫,如運動或靜止狀態。
- Over:要應用於基礎的前景或頂層,例如手勢或工具使用動畫。
- 屬性
屬性 類型 描述 Weight 數字 用於減弱 Over 姿勢的混合權重。默認為 1.0(完全覆蓋),且不受限制。 - 事件數據
- 事件處理:
- 該節點監聽來自 Base 和 Over 輸入的事件。
- 事件發射:
- Base 事件:來自基礎輸入的所有事件都未經修改地傳遞。
- Over 事件:來自 Over 輸入的事件按權重屬性進行縮放。
- 在權重 0.5 時,Over 事件以一半的權重傳播
- 在權重 0 時,它們被靜音。
添加

將 Additive 姿勢添加到 Base 姿勢,並按特定的 Weight 進行減弱(不受限制)。
- 輸入
- Base:主要動畫姿勢。
- Additive:要層疊到基礎上的姿勢。
- 屬性
屬性 類型 描述 Weight 數字 確定應用於基礎的附加姿勢的強度。 - 事件數據
- 事件處理: 該節點監聽來自 Base 和 Additive 輸入的事件。
- 事件發射: 來自基礎和附加輸入的所有事件都未經修改地傳遞。
減去

通過從目標姿勢中減去相對基礎姿勢,將動畫轉換為附加姿勢()。Weight 在減去之前縮放 B 姿勢(不受限制)。
- 輸入
- A:目標動畫姿勢。
- B:要減去的相對基礎姿勢。
- 屬性
屬性 類型 描述 Weight 數字 在從 A 減去 B 之前縮放 B 姿勢。在 1.0(默認)時,B 被完全減去;在 0.0 時,則不進行減去。 - 事件數據
- 事件處理: 該節點監聽來自 Input A 和 Input B 的事件。
- 事件發射: 來自 Input A 和 Input B 的所有事件都未經修改地傳遞。
Blend1D

在單個軸上線性插值兩個最接近當前輸入位置的動畫姿勢。
- 輸入
- Input1...InputN
- Position (數字):每個後續輸入在混合軸上的特定坐標。
- 屬性
屬性 類型 描述 Position 數字 用於取樣動畫的混合軸上的當前活動值。如果 Position 超出定義的輸入位置範圍,則該節點將使用兩個最近的輸入進行外推。 PhaseSync Enum.AnimationNodePhaseSync 配置子輸入的時間是否應該同步。
- 同步(默認):標準化同步。該節點根據活動輸入的加權平均計算“虛擬持續時間”。每個輸入節點的時間步驟被調整,以便所有子節點收斂到相同的相位,保持不同長度的動畫同步。
- 不同步:標準混合,剪輯獨立以自己的播放速率前進。
- 事件數據
- 事件處理: 該節點監聽來自所有當前活動子節點的事件。
- 事件發射: 僅來自權重最高的活動輸入的事件傳播,按其混合權重縮放。來自次要輸入的事件被靜音。
Blend2D

根據 2D 坐標空間中的兩個輸入參數混合多個動畫姿勢。這將 Blend1D 節點概括為處理複雜場景,例如同時根據運動方向和速度進行混合。
- 輸入
- Input1...InputN
- X (數字):每個後續輸入的 X 坐標。
- Y (數字):每個後續輸入的 Y 坐標。
- 屬性
屬性 類型 描述 InputMode Enum.AnimationNodeBlend2DInputMode 定義用於評估混合空間的坐標系:
- 笛卡爾(默認):使用標準 2D 網格坐標。X 和 Y 代表在混合空間中的當前位置。
- 極坐標:使用角度和大小值。X 代表以弧度表示的方向,而 Y 代表運動的大小或強度。方向的權重比大小更重,因此在相似角度但不同大小的輸入之間的混合比在不同角度的輸入之間更平滑。
X 數字 當前的 X 坐標(笛卡爾)或方向(極坐標)。 Y 數字 當前的 Y 坐標(笛卡爾)或大小(極坐標)。 PhaseSync Enum.AnimationNodePhaseSync 配置子輸入的時間是否應該同步。
- 同步(默認):標準化同步。該節點根據活動輸入的加權平均計算“虛擬持續時間”。每個輸入節點的時間步驟被調整,以便所有子節點收斂到相同的相位,保持不同長度的動畫同步。
- 不同步:標準混合,剪輯獨立以自己的播放速率前進。
- 事件數據
- 事件處理: 該節點監聽來自所有當前活動子節點的事件。
- 事件發射: 僅來自權重最高的活動輸入的事件傳播,按其混合權重縮放。來自次要輸入的事件被靜音。
遮罩

將預定義的遮罩應用於輸入姿勢。遮罩由裝配體層次結構中每個對象(例如關節)的權重定義,允許對動畫進行精確控制或“羽化”。
- 輸入
- Pose:要被遮罩的動畫姿勢。
- 屬性
屬性 類型 描述 Mask ObjectValue 一個 ObjectValue(作為遮罩 AnimationNodeDefinition 的直接子項創建),定義遮罩權重。它可以以兩種方式運作:
- 直接:ObjectValue 本身包含將裝配體對象名稱映射到特定權重值的屬性。
創建遮罩時,您可以選擇一個裝配體架構(HumanoidRigDescription 或 Picker)來填充層次結構。
- HumanoidRigDescription:標準化人形角色的遮罩。
- Picker:允許用戶選擇工作區中的任何特定裝配體來填充遮罩層次結構。
Invert 布爾值 當為真時,將權重值應用為 1 - weight。這允許在不創建新資產的情況下反向重用遮罩。 - 事件數據
- 事件處理: 該節點監聽來自輸入 Pose 的所有事件。
- 事件發射: 來自輸入 Pose 的所有事件都未經修改地傳遞。
速度

修改進入動畫姿勢的播放速率。
- 輸入
- Pose:將修改播放速度的動畫姿勢或子圖。
- 屬性
屬性 類型 描述 Speed 數字 應用於時間增量()的乘數。0.0 暫停圖形,1.0 是正常速度,2.0 是雙倍速度。 - 事件數據
- 事件處理: 該節點監聽來自輸入 Pose 的事件。
- 事件發射: 來自輸入 Pose 的所有事件都未經修改地傳遞。請注意,雖然視覺播放速度會改變,但發射事件(例如標記)的時間將根據修改後的播放速率相應縮放。
GraphOutput

表示圖形的最終評估姿勢。該節點自動包含在動畫圖形編輯器中的所有新圖形中。它的存在確保圖形始終有效並持續生成動畫姿勢。
- 輸入
- Pose:要應用於裝配體的最終處理動畫數據。
- 屬性
- 無
- 事件數據
- 事件處理: 該節點監聽所有通過最終連接輸入的事件。
- 事件發射: 此節點作為動畫管道的出口,不會將信號發射回圖形中。
過渡
動畫圖形中的幾個節點(例如 Select、Priority Select、Sequence 和 Random Sequence)管理在切換活動輸入時動畫的混合方式。為了防止節點參考中的冗餘,這些行為由標準化的過渡屬性組定義。
默認過渡

應用於節點的基線混合行為,每當它切換到新的活動輸入時。
- DefaultTransitionDuration(數字):完全混合到新姿勢所需的時間(以秒為單位)。
- DefaultTransitionCurve (Enum.PoseEasingStyle): 在混合過程中應用的緩動函數。目前僅支持 Enum.PoseEasingStyle.Linear 和 Enum.PoseEasingStyle.CubicV2。
過渡覆蓋
特定於輸入的鏈接屬性,超越默認過渡。這些在節點過渡 到 該特定輸入時應用。
- TransitionOverrideDuration(數字):覆蓋默認過渡持續時間。
- TransitionOverrideCurve (Enum.PoseEasingStyle): 覆蓋默認過渡曲線。目前僅支持 Enum.PoseEasingStyle.Linear 和 Enum.PoseEasingStyle.CubicV2。
複製
動畫圖形參數和內部節點狀態會自動複製。複製模式由創建 Animate 腳本時的 Workspace.AuthorityMode 決定:
- 在 Enum.AuthorityMode.Automatic 中:通過 AnimationTrack:SetParameter() 設置的參數會自動複製到其他對等方。
- 在 Enum.AuthorityMode.Server 中:服務器驅動完整的圖形模擬。所有節點狀態,例如 Enum.AnimationNodeType.ClipNode 的經過時間,以及圖形參數會自動從服務器複製到客戶端。擁有玩家的客戶端使用預測以實現平滑的本地播放。
示例 Animate 腳本
要生成驅動裝配體動畫圖形的示例腳本,請在動畫圖形編輯器中使用 Graph -> Create Animate script。這會生成一個腳本層次結構,放置在 StarterCharacterScripts(用於玩家角色)或直接在裝配體上(用於 NPC):
Animate (ModuleScript)
├── RunClient (LocalScript)
└── RunServer (Script, RunContext = Legacy)Animate ModuleScript 包含圖形加載邏輯。RunClient 和 RunServer 腳本在適當的上下文中調用它。包含哪些腳本取決於用例:
| 用例 | 包含的腳本 | 行為 |
|---|---|---|
| NPC(任何模式) | RunServer | 服務器加載並播放圖形。狀態自動複製到所有客戶端。 |
| 玩家 + Enum.AuthorityMode.Server | RunServer + RunClient | 服務器權威驅動圖形。擁有的客戶端啟用 Enum.PredictionMode 以進行基於回滾的本地預測。 |
| 玩家 + Enum.AuthorityMode.Automatic | RunClient | 擁有的客戶端加載並播放圖形。參數自動複製到服務器和其他客戶端。 |
以下屬性存儲在 Animate 腳本上並配置其行為:
| 屬性 | 類型 | 描述 |
|---|---|---|
| GraphName | 字串 | 動畫圖形資產的名稱。 |
| CharacterName | 字串 | 圖形目標的裝配體名稱。 |
| SourceAssetId | 字串 | 圖形的已發布資產 ID。在已發布的遊戲中運行時使用。 |
| IsServerAuthority | 布爾值 | 腳本是否在 Workspace.AuthorityMode 設置為 Server 時創建。決定複製策略。 |
| PreviewInStudio | 布爾值 | 當為真(默認)時,Studio 測試加載未發布的圖形以便您可以在不發布的情況下進行迭代。設置為 false 以在 Studio 中測試已發布的資產。請注意,這在 Enum.AuthorityMode.Server 中目前不受支持。 |
自動模式中的參數複製
當 Workspace.AuthorityMode 為 Automatic 時:
- 擁有的客戶端 驅動玩家角色圖形;服務器 驅動 NPC 圖形。
- 通過 AnimationTrack:SetParameter() 設置的參數會自動複製到其他對等方。在單個幀內的多個 SetParameter 調用會合併(最後寫入者獲勝)。
- 不需要額外的腳本來傳輸參數 — 引擎內部處理複製。
- 其他客戶端會看到參數更新,延遲很小(一次發送間隔加上網絡延遲)。
服務器權威
當 Workspace.AuthorityMode 為 Server 時:
- 服務器 對所有圖形具有權威 — 它運行模擬並複製完整的圖形狀態。
- 複製的內容:參數和內部節點狀態,包括經過的時間、當前選擇、過渡進度、循環計數和隨機數生成器種子。這確保所有客戶端看到相同的動畫行為。
- 玩家角色:服務器驅動圖形。擁有客戶端的 RunClient 腳本自動在 Animator 上啟用 Enum.PredictionMode,因此本地玩家看到平滑的預測動畫,並在不匹配時與服務器進行調和。
- NPC:服務器獨占驅動圖形;客戶端觀察複製的狀態,沒有本地模擬。
驅動參數
使用 AnimationTrack:SetParameter() 從每個運行圖形的腳本:
- 在 Enum.AuthorityMode.Server 中的玩家角色:從 RunServer 和 RunClient 兩者調用 SetParameter。服務器需要參數來驅動權威模擬,擁有的客戶端需要相同的參數來驅動其本地預測。
- 在 Enum.AuthorityMode.Automatic 中的玩家角色:從 RunClient(或任何具有 AnimationTrack 訪問權限的客戶端 LocalScript)調用 SetParameter。
生成的 Animate 腳本包括一個註釋掉的 SetParameter 塊作為起始點。取消註釋並修改它以從遊戲狀態(移動速度、人形狀態、輸入方向等)驅動參數。

