动画图编辑器是一个可视化的基于节点的工具,赋予技术艺术家和动画师在 Roblox Studio 中直接构建复杂动画逻辑的能力。通过提供一个简化的界面来创建混合树等行为,它消除了对角色运动手动脚本的传统依赖。
该系统与您现有的动画工作流程协同工作:
- 动画编辑器:继续使用 动画编辑器 作为您创作单个剪辑和微调关键帧及曲线的主要工具。
- 动画图编辑器:使用此工具将这些剪辑组织成逻辑树,以驱动复杂的游戏行为。
旨在增强协作,视觉图允许开发人员快速检查、调试和理解动画师创建的逻辑。当艺术家专注于完善互动运动时,开发人员仍然可以以编程方式访问动画图节点,以直接控制混合动画和状态。
构建图形
要开始为可动画角色构建逻辑,请通过 Studio 功能区中的头像选项卡访问动画图编辑器。以下步骤演示如何初始化一个骨架并使用默认的行走和挥手动画构建基本节点网络。
要深入了解实际应用,您可以探索 动画图参考文件,其中包含基础和复杂的实现示例。
要创建您自己的动画图,类似于参考中提供的基本示例,请使用以下步骤:
在 Studio 中,通过导航到 头像 选项卡并选择 角色 ⟩ 我的头像 添加一个可动画的骨架。

通过导航到 头像 选项卡中的 图形编辑器 打开动画图编辑器。

在 3D 视口中选择可动画的骨架,然后选择 创建图形。
在图形编辑器中,右键单击并选择 剪辑。

在新的剪辑节点中,设置动画 ID。
选择 动画 ID 下拉菜单。
要提交特定的动画资产 ID,请单击 导入。

在 动画 ID 字段中,添加默认的行走动画:507777826。
选择 导入。
通过重复步骤 4-5 添加另一个剪辑节点,使用默认的挥手动画:507770239。

在图形编辑器中,右键单击并选择 添加。

将剪辑节点连接到添加节点,通过将右上角的输出连接器拖动到适当的端口:
- 将带有行走动画的 剪辑 节点连接到 基础 端口。
- 将带有挥手动画的 剪辑 节点连接到 附加 端口。

从添加节点,将右上角的输出连接器连接到图形输出 姿势 端口。

通过按 播放按钮 测试动画。

尝试测试各种权重、速度、播放模式和其他动画。有关单个节点的更多信息,请参见 节点参考。
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 的闲置输入)。
- 事件数据 – 节点发出或消耗的事件,以触发内部图逻辑或外部 Luau 脚本。此行为可能会在测试开发过程中发生变化。
全局事件规则
对于所有节点和 过渡,默认情况下适用以下规则:
- 事件从其源节点向上传播通过图形。每个事件携带一个权重,表示其源在最终混合中的影响。如果权重在任何时候达到零,则事件被静音。
- 没有自定义事件逻辑的节点将所有事件原样传递;在输入之间进行混合或选择的节点可能会缩放权重或阻止来自非主要输入的事件(请参见每个节点的事件部分)。
- 到达图形顶部的标记事件可以通过 AnimationTrack:GetMarkerReachedSignal() 观察到。
剪辑

对 AnimationClip 资产的引用。它作为图中的叶节点,生成原始动画数据,供其他节点进行混合、选择或修改。
- 输入
- 无
- 属性
属性 类型 描述 AnimationId 字符串 要播放的动画资产(例如 rbxassetid://12345)。 PlayMode Enum.AnimationNodePlayMode 定义剪辑在达到其持续时间结束时的行为。
- 循环(默认):剪辑完成后自动从头开始重新启动。
- 乒乓:从开始播放到结束,然后立即反向播放从结束到开始。
- 一次并保持:播放一次并在完成时保持最终姿势。
- 一次并重置:播放一次并在完成时回到初始开始姿势。
Reverse 布尔值 控制播放方向。 Speed 数字 播放速率的乘数。0.0 暂停图形,1.0 为正常速度,2.0 为双倍速度。 Trim 布尔值 切换剪辑的持续时间是否应被截断。 TrimStart 数字 播放应开始的绝对时间戳(以秒为单位)。 TrimEnd 数字 播放应终止的绝对时间戳(以秒为单位)。 - 事件数据
- 事件处理: 无。这是一个没有子节点的叶节点。
- 事件发射: 读取嵌入在动画剪辑中的自定义标记(例如,“脚步声”、“武器挥动”),并在它们发生的精确帧上将其作为命名事件发射。如果剪辑被截断,则仅在定义的 [TrimStart, TrimEnd] 区间(包括)内的标记被发射。
选择

通过选择属性在任意数量的输入之间进行选择。每当当前选择更改时,它会触发一个新的 过渡。
- 输入
- Input1...InputN
- 属性
属性 类型 描述 Selection 字符串 要选择的输入的唯一 ID,匹配输入连接的名称(例如,“行走”)。 - 事件数据
- 事件处理: 当前选择的输入的事件以未更改其权重的方式通过。
- 事件发射: 仅通过当前选择的输入的所有事件。在过渡期间,事件发射遵循 全局事件规则。
优先选择

从上到下评估连接的输入列表,并播放第一个条件评估为真的输入。这允许基于特定逻辑的层次动画选择。每当当前选择更改时,它会触发一个新的 过渡。
- 输入
- 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,表示随机种子。 - 事件数据
- 事件处理: 当前活动输入的事件以未更改其权重的方式通过。
- 事件发射: 仅通过当前活动输入的所有事件。在过渡期间,事件发射遵循 全局事件规则。
叠加

将 叠加 姿势叠加在基础姿势之上。当与掩码节点结合使用时,掩码中被掩盖的关节在 叠加 姿势中完全显示 基础 姿势,创建透明叠加效果。
- 输入
- 基础:背景或底层,通常是全身动画,如运动或闲置状态。
- 叠加:要应用于基础的前景或顶层,例如手势或工具使用动画。
- 属性
属性 类型 描述 Weight 数字 用于衰减 叠加 姿势的混合权重。默认值为 1.0(完全覆盖),且不受限制。 - 事件数据
- 事件处理:
- 节点监听来自 基础 和 叠加 输入的事件。
- 事件发射:
- 基础事件:来自基础输入的所有事件未被修改地通过。
- 叠加事件:来自叠加输入的事件按权重属性缩放。
- 在权重为 0.5 时,叠加 事件以一半的权重传播
- 在权重为 0 时,它们被静音。
添加

将 附加 姿势添加到 基础 姿势,按特定 权重 衰减(不受限制)。
- 输入
- 基础:主要动画姿势。
- 附加:要叠加到基础上的姿势。
- 属性
属性 类型 描述 Weight 数字 确定应用于基础的附加姿势的强度。 - 事件数据
- 事件处理: 节点监听来自 基础 和 附加 输入的事件。
- 事件发射: 来自基础和附加输入的所有事件未被修改地通过。
减去

通过从目标姿势中减去相对基础姿势,将动画转换为附加姿势()。权重 在减去之前缩放 B 姿势(不受限制)。
- 输入
- A:目标动画姿势。
- B:要减去的相对基础姿势。
- 属性
属性 类型 描述 Weight 数字 在从 A 中减去 B 之前缩放 B 姿势。在 1.0(默认)时,B 被完全减去;在 0.0 时,不进行减去。 - 事件数据
- 事件处理: 节点监听来自 输入 A 和 输入 B 的事件。
- 事件发射: 来自 输入 A 和 输入 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 配置子输入的时序是否应同步。
- 同步(默认):标准化同步。节点根据活动输入的加权平均值计算“虚拟持续时间”。每个输入节点的时间步长被调整,以便所有子节点收敛到同一相位,使不同长度的动画保持同步。
- 不同步:标准混合,剪辑独立以自己的播放速率推进。
- 事件数据
- 事件处理: 节点监听来自所有当前活动子节点的事件。
- 事件发射: 仅从权重最高的活动输入传播,按其混合权重缩放。来自次要输入的事件被静音。
掩码

将预定义的掩码应用于输入姿势。掩码由骨架层次结构中每个对象(例如关节)的权重定义,允许对动画进行精确控制或“羽化”。
- 输入
- 姿势:要被掩盖的动画姿势。
- 属性
属性 类型 描述 Mask ObjectValue 一个 ObjectValue(作为掩码 AnimationNodeDefinition 的直接子项创建),定义掩码权重。它可以以两种方式工作:
- 直接:ObjectValue 本身包含将骨架对象名称映射到特定权重值的属性。
创建掩码时,您可以选择一个骨架模式(HumanoidRigDescription 或 选择器)来填充层次结构。
- HumanoidRigDescription:为类人角色标准化掩码。
- 选择器:允许用户选择工作区中的任何特定骨架以填充掩码层次结构。
Invert 布尔值 当为真时,将权重值应用为 1 - 权重。这允许以相反的方式重用掩码,而无需创建新资产。 - 事件数据
- 事件处理: 节点监听来自输入 姿势 的所有事件。
- 事件发射: 输入 姿势 的所有事件未被修改地通过。
速度

修改传入动画姿势的播放速率。
- 输入
- 姿势:将修改播放速度的动画姿势或子图。
- 属性
属性 类型 描述 Speed 数字 应用于时间增量()的乘数。0.0 暂停图形,1.0 为正常速度,2.0 为双倍速度。 - 事件数据
- 事件处理: 节点监听来自输入 姿势 的事件。
- 事件发射: 输入 姿势 的所有事件未被修改地通过。请注意,尽管视觉播放速度发生变化,但发射事件(例如标记)的时序将根据修改后的播放速率相应缩放。
图形输出

表示图的最终评估姿势。此节点在动画图编辑器中的所有新图中自动包含。它的存在确保图始终有效并始终生成动画姿势。
- 输入
- 姿势:要应用于骨架的最终处理动画数据。
- 属性
- 无
- 事件数据
- 事件处理: 节点监听通过最终连接输入传递的所有事件。
- 事件发射: 此节点作为动画管道的出口,不会将信号发射回图中。
过渡
动画图中的几个节点(例如 选择、优先选择、序列 和 随机序列)管理在切换活动输入时动画的混合方式。为了防止节点参考中的冗余,这些行为由标准化的过渡属性组定义。
默认过渡

应用于节点的基线混合行为,每当它切换到新的活动输入时。
- DefaultTransitionDuration(数字):完全混合到新姿势所需的时间(以秒为单位)。
- DefaultTransitionCurve (Enum.PoseEasingStyle): 在混合期间应用的缓动函数。当前仅支持 Enum.PoseEasingStyle.Linear 和 Enum.PoseEasingStyle.CubicV2。
过渡覆盖
特定于输入的链接属性,优先于默认过渡。这些在节点过渡 到 该特定输入时应用。
- TransitionOverrideDuration(数字):覆盖默认过渡持续时间。
- TransitionOverrideCurve (Enum.PoseEasingStyle): 覆盖默认过渡曲线。当前仅支持 Enum.PoseEasingStyle.Linear 和 Enum.PoseEasingStyle.CubicV2。
复制
动画图参数和内部节点状态会自动复制。复制模式由创建动画脚本时的 Workspace.AuthorityMode 决定:
- 在 Enum.AuthorityMode.Automatic 中:通过 AnimationTrack:SetParameter() 设置的参数会自动复制到其他对等体。
- 在 Enum.AuthorityMode.Server 中:服务器驱动完整的图形仿真。所有节点状态,例如 Enum.AnimationNodeType.ClipNode 的经过时间,以及图形参数会自动从服务器复制到客户端。拥有玩家的客户端使用预测以实现平滑的本地播放。
示例动画脚本
要生成驱动骨架动画图的示例脚本,请在动画图编辑器中使用 图形 -> 创建动画脚本。这会生成一个脚本层次结构,放置在 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 | 拥有客户端加载并播放图形。参数自动复制到服务器和其他客户端。 |
以下属性存储在动画脚本上并配置其行为:
| 属性 | 类型 | 描述 |
|---|---|---|
| GraphName | 字符串 | 动画图资产的名称。 |
| CharacterName | 字符串 | 图形目标的骨架名称。 |
| SourceAssetId | 字符串 | 图形的已发布资产 ID。在已发布游戏中运行时使用。 |
| IsServerAuthority | 布尔值 | 脚本是否在 Workspace.AuthorityMode 设置为 Server 时创建。决定复制策略。 |
| PreviewInStudio | 布尔值 | 当为真(默认)时,Studio 进行测试时会在本地加载未发布的图形,以便您可以在不发布的情况下进行迭代。设置为 false 以在 Studio 中测试已发布的资产。请注意,这在 Enum.AuthorityMode.Server 中当前不受支持。 |
自动模式下的参数复制
当 Workspace.AuthorityMode 为 自动 时:
- 拥有客户端 驱动玩家角色图形;服务器 驱动 NPC 图形。
- 通过 AnimationTrack:SetParameter() 设置的参数会自动复制到其他对等体。在单个帧内的多个 SetParameter 调用会合并(最后写入者获胜)。
- 不需要额外的脚本来传输参数 — 引擎内部处理复制。
- 其他客户端看到参数更新时会有小延迟(一个发送间隔加上网络延迟)。
服务器权限
当 Workspace.AuthorityMode 为 服务器 时:
- 服务器 对所有图形具有权威性 — 它运行仿真并复制完整的图形状态。
- 复制的内容:参数和内部节点状态,包括经过时间、当前选择、过渡进度、循环计数和 RNG 种子。这确保所有客户端看到相同的动画行为。
- 玩家角色:服务器驱动图形。拥有客户端的 RunClient 脚本会自动在 Animator 上启用 Enum.PredictionMode,因此本地玩家看到平滑的、预测的动画,并在不匹配时与服务器进行调和。
- NPC:服务器独占驱动图形;客户端观察复制的状态,没有本地仿真。
驱动参数
在运行图形的每个脚本中使用 AnimationTrack:SetParameter():
- 在 Enum.AuthorityMode.Server 中的玩家角色:从 RunServer 和 RunClient 两者调用 SetParameter。服务器需要参数来驱动权威仿真,拥有客户端需要相同的参数来驱动其本地预测。
- 在 Enum.AuthorityMode.Automatic 中的玩家角色:从 RunClient(或任何具有 AnimationTrack 访问权限的客户端 LocalScript)调用 SetParameter。
生成的动画脚本包括一个注释掉的 SetParameter 块作为起始点。取消注释并修改它以根据游戏状态(移动速度、类人状态、输入方向等)驱动参数。

