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

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

在 3D 视口中选择可动画的骨架。在图形编辑器视图中,选择左上角的 图形 并选择 新建 以创建一个新图形。
在图形编辑器中,右键单击并选择 插入节点 ⟩ 剪辑。

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

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

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

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

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

- 可选为您的 Speed 变量分配一个参数。
单击并拖动绿色的速度端口到空白区域。将显示一个新的参数节点。

在图形编辑器的左上角,使用参数窗格快速修改节点中的参数。您还可以以 编程方式访问 这个参数。

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

尝试测试各种权重、速度、播放模式和其他动画。有关单个节点的更多信息,请参见 节点参考。
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)节点参考
全局事件规则
对于所有节点和 过渡,默认情况下适用以下规则:
- 事件从其源节点向上传播通过图形。每个事件携带一个权重,表示其源在最终混合中的影响。如果权重在任何时候达到零,则事件被静音。
- 没有自定义事件逻辑的节点会将所有事件原样传递;混合或选择输入之间的节点可能会缩放权重或阻止来自非主要输入的事件(请参见每个节点的事件部分)。
- 到达图形顶部的标记事件可以通过 AnimationTrack:GetMarkerReachedSignal() 观察到。
过渡
动画图中的几个节点(例如 选择、优先选择、序列 和 随机序列)管理在切换活动输入时动画的混合方式。为了防止节点参考中的冗余,这些行为由标准化的过渡属性组定义。
默认过渡

应用于节点的基线混合行为,每当它切换到新的活动输入时。
- DefaultTransitionDuration(数字):完全混合到新姿势所需的时间(以秒为单位)。
- DefaultTransitionCurve(Enum.PoseEasingStyle):在混合期间应用的缓动函数。目前仅支持 Enum.PoseEasingStyle.Linear 和 Enum.PoseEasingStyle.CubicV2。
过渡覆盖

特定于输入的链接属性,优先于默认过渡。持续时间和曲线覆盖在节点过渡 到 该输入时应用,除了 BeforeFinished 过渡,它使用外发输入的覆盖。
- TransitionOverrideDuration(数字):覆盖默认过渡持续时间。
- TransitionOverrideCurve(Enum.PoseEasingStyle):覆盖默认过渡曲线。目前仅支持 Enum.PoseEasingStyle.Linear 和 Enum.PoseEasingStyle.CubicV2。
过渡时机
对于序列节点类型,以下设置控制序列何时推进到下一个输入:
- WaitFor(Enum.AnimationNodeWaitFor):设置推进的条件。使用 Enum.AnimationNodeWaitFor|Finished(默认)等待当前输入完成或完成循环,或使用 Enum.AnimationNodeWaitFor|Trigger 在 WaitForTrigger 为 true 时推进。使用 DefaultWaitFor 设置节点级别的默认值,或使用 TransitionOverrideWaitFor 为输入覆盖它。
- When(Enum.AnimationNodeTransitionWhen):当 等待 为 Enum.AnimationNodeWaitFor|Finished 时应用。使用 DefaultTransitionWhen 设置节点级别的默认值,或使用 TransitionOverrideWhen 为外发输入覆盖它。
- Enum.AnimationNodeTransitionWhen|Finished(默认):在当前输入完成后开始混合。
- Enum.AnimationNodeTransitionWhen|BeforeFinished:在当前输入完成前一个过渡持续时间开始混合,因此混合与其动画的结束重叠。例如,0.2 秒的过渡在动画的最后 0.2 秒期间开始。
RandomSequenceNode 还支持 DefaultTransitionWhen 和 TransitionOverrideWhen 来控制混合开始的时机。
有关状态机过渡,请参见 过渡属性。
复制
动画图参数和内部节点状态会自动复制。复制模式由创建动画脚本时的 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 | 布尔值 | 当为 true(默认)时,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 块作为起始点。取消注释并修改它以根据游戏状态(移动速度、类人状态、输入方向等)驱动参数。