2.播放单个动画剪辑

2.Playable播放单个动画剪辑


2.1 知识点

直接播放单个动画剪辑

思路和步骤

Playable API 直接播放单个动画的思路很清晰:建图 → 把 Clip 变成节点 → 接到输出 → 播放

核心步骤

  • 创建 PlayableGraph
    PlayableGraph.Create() 创建图,这是所有节点的容器。

  • 设置时间更新模式
    SetTimeUpdateMode() 指定更新方式,常用 DirectorUpdateMode.GameTime 跟随游戏时间。

  • 创建动画输出
    AnimationPlayableOutput.Create() 创建输出节点并绑定场景中的 Animator,负责把结果真正写回角色。

  • 创建动画剪辑节点
    AnimationClipPlayable.Create()AnimationClip 包装成可播放节点。

  • 连接节点到输出
    SetSourcePlayable() 把剪辑节点接到输出。

  • 播放图
    graph.Play() 开始播放。

  • 清理资源
    组件禁用或退出时 graph.Destroy() 释放资源(不要省略)。

  • 脚本挂到 GameObject 并关联 Clip

关键组件说明

  • AnimationClipPlayable
    Playable 系统中的叶子节点,用于封装单个动画剪辑。内部持有 AnimationClip,每帧根据时间采样动画数据,可控制速度、时间偏移等参数。

  • AnimationPlayableOutput
    图的出口节点,把 PlayableGraph 的结果输出到场景对象。必须绑定 Animator,用 SetSourcePlayable() 指定输入源,可设置输出权重控制混合强度。

优点:链路清晰,方便理解 Graph 的构成与控制点,适合后续做自定义扩展。
缺点:步骤多、代码偏长,需要自己管理图的创建与销毁。

代码实现

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Animations;

/// <summary>
/// 使用 Playable API 播放动画的示例组件
/// 该组件演示了如何通过 PlayableGraph 来播放单个动画剪辑
/// </summary>
[RequireComponent(typeof(Animator))]
public class PlayAnimationSample : MonoBehaviour
{
    /// <summary>
    /// 要播放的动画剪辑
    /// </summary>
    public AnimationClip animationClip;

    /// <summary>
    /// Playable 图,用于管理动画播放流程
    /// </summary>
    PlayableGraph playableGraph;

    /// <summary>
    /// 初始化并开始播放动画
    /// </summary>
    void Start()
    {
        // 创建 Playable 图
        playableGraph = PlayableGraph.Create();

        // 设置时间更新模式为游戏时间
        playableGraph.SetTimeUpdateMode(DirectorUpdateMode.GameTime);

        // 创建动画输出,连接到 Animator 组件
        var playableOutput = AnimationPlayableOutput.Create(playableGraph, "VayneAnimationOutput", GetComponent<Animator>());

        // 将动画剪辑包裹在可播放项中
        var clipPlayable = AnimationClipPlayable.Create(playableGraph, animationClip);

        // 将可播放项连接到输出
        playableOutput.SetSourcePlayable(clipPlayable);

        // 播放该图
        playableGraph.Play();
    }

    /// <summary>
    /// 组件禁用时清理资源,销毁 Playable 图及其所有可播放项和输出
    /// </summary>
    void OnDisable()
    {
        // 销毁该图创建的所有可播放项和 PlayableOutput
        playableGraph.Destroy();
    }
}

代码说明

  • PlayableGraph.Create():创建图。
  • SetTimeUpdateMode(DirectorUpdateMode.GameTime):设置按游戏时间更新。
  • AnimationPlayableOutput.Create():创建输出节点,绑定目标 Animator
  • AnimationClipPlayable.Create():把 AnimationClip 变成可播放节点。
  • SetSourcePlayable():把剪辑节点接到输出。
  • Play():开始播放。
  • Destroy():释放图和节点。建议放在 OnDisable(),确保组件禁用时就能回收。

效果展示

这里给 AnimationPlayableOutput.Create() 传了 VayneAnimationOutput,只是为了在 Visualizer 里更好辨认:

使用工具类快速播放动画剪辑

思路和步骤

Unity 提供了更省事的工具方法:AnimationPlayableUtilities.PlayClip(),一行代码把图搭好并播放。

工具方法内部会自动完成:

  • 创建 PlayableGraph
  • 设置时间更新模式为 DirectorUpdateMode.GameTime
  • 创建 AnimationPlayableOutput 并绑定 Animator
  • 创建 AnimationClipPlayable 并连接到输出
  • 调用 Play() 开始播放

使用步骤

  • 调用 AnimationPlayableUtilities.PlayClip(Animator, AnimationClip, out PlayableGraph)
  • 通过 out 拿到图引用,便于后续 Destroy()

优点:代码短,适合快速验证和原型。
缺点:中间步骤被封装,扩展点少。
适用场景:快速播放单个剪辑、只需要出效果的场景。

代码实现

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Animations;

/// <summary>
/// 使用 Playable Utilities 播放动画的简易示例组件
/// 该组件演示了如何使用 AnimationPlayableUtilities.PlayClip 简化动画播放流程
/// 相比手动创建 PlayableGraph,这种方式更加简洁高效
/// </summary>
[RequireComponent(typeof(Animator))]
public class PlayAnimationUtilitiesSample : MonoBehaviour
{
    /// <summary>
    /// 要播放的动画剪辑
    /// </summary>
    public AnimationClip animationClip;

    /// <summary>
    /// Playable 图,用于管理动画播放流程
    /// 由 AnimationPlayableUtilities.PlayClip 自动创建和管理
    /// </summary>
    PlayableGraph playableGraph;

    /// <summary>
    /// 初始化并开始播放动画
    /// 使用 AnimationPlayableUtilities.PlayClip 一键完成图创建、连接和播放
    /// </summary>
    void Start()
    {
        // 使用工具方法一键创建并播放动画,自动处理所有配置
        AnimationPlayableUtilities.PlayClip(GetComponent<Animator>(), animationClip, out playableGraph);
    }

    /// <summary>
    /// 组件禁用时清理资源,销毁 Playable 图及其所有可播放项和输出
    /// </summary>
    void OnDisable()
    {
        // 销毁该图创建的所有可播放项和输出
        playableGraph.Destroy();
    }
}

代码说明

  • AnimationPlayableUtilities.PlayClip():一行完成创建与播放。
  • out playableGraph:返回创建的图,便于管理。
  • 工具类不会帮你销毁图,Destroy() 仍需手动调用。

效果展示


AnimationPlayableUtilities 这版没有传输出名,Visualizer 里默认显示为 AnimationClip


2.2 知识点代码

PlayAnimationSample.cs

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Animations;

/// <summary>
/// 使用 Playable API 播放动画的示例组件
/// 该组件演示了如何通过 PlayableGraph 来播放单个动画剪辑
/// </summary>
[RequireComponent(typeof(Animator))]
public class PlayAnimationSample : MonoBehaviour
{
    /// <summary>
    /// 要播放的动画剪辑
    /// </summary>
    public AnimationClip animationClip;

    /// <summary>
    /// Playable 图,用于管理动画播放流程
    /// </summary>
    PlayableGraph playableGraph;

    /// <summary>
    /// 初始化并开始播放动画
    /// </summary>
    void Start()
    {
        // 创建 Playable 图
        playableGraph = PlayableGraph.Create();

        // 设置时间更新模式为游戏时间
        playableGraph.SetTimeUpdateMode(DirectorUpdateMode.GameTime);

        // 创建动画输出,连接到 Animator 组件
        var playableOutput = AnimationPlayableOutput.Create(playableGraph, "VayneAnimationOutput", GetComponent<Animator>());

        // 将动画剪辑包裹在可播放项中
        var clipPlayable = AnimationClipPlayable.Create(playableGraph, animationClip);

        // 将可播放项连接到输出
        playableOutput.SetSourcePlayable(clipPlayable);

        // 播放该图
        playableGraph.Play();
    }

    /// <summary>
    /// 组件禁用时清理资源,销毁 Playable 图及其所有可播放项和输出
    /// </summary>
    void OnDisable()
    {
        // 销毁该图创建的所有可播放项和 PlayableOutput
        playableGraph.Destroy();
    }
}

PlayAnimationUtilitiesSample.cs

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Animations;

/// <summary>
/// 使用 Playable Utilities 播放动画的简易示例组件
/// 该组件演示了如何使用 AnimationPlayableUtilities.PlayClip 简化动画播放流程
/// 相比手动创建 PlayableGraph,这种方式更加简洁高效
/// </summary>
[RequireComponent(typeof(Animator))]
public class PlayAnimationUtilitiesSample : MonoBehaviour
{
    /// <summary>
    /// 要播放的动画剪辑
    /// </summary>
    public AnimationClip animationClip;

    /// <summary>
    /// Playable 图,用于管理动画播放流程
    /// 由 AnimationPlayableUtilities.PlayClip 自动创建和管理
    /// </summary>
    PlayableGraph playableGraph;

    /// <summary>
    /// 初始化并开始播放动画
    /// 使用 AnimationPlayableUtilities.PlayClip 一键完成图创建、连接和播放
    /// </summary>
    void Start()
    {
        // 使用工具方法一键创建并播放动画,自动处理所有配置
        AnimationPlayableUtilities.PlayClip(GetComponent<Animator>(), animationClip, out playableGraph);
    }

    /// <summary>
    /// 组件禁用时清理资源,销毁 Playable 图及其所有可播放项和输出
    /// </summary>
    void OnDisable()
    {
        // 销毁该图创建的所有可播放项和输出
        playableGraph.Destroy();
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏