Unity Animation组件使用详解:Play方法重载与动画播放控制
本文将深入解析 Unity 中
Animation
组件的使用方式,重点梳理Play()
方法的多种重载形式及其使用场景,结合 PlantUML 图示帮助你快速掌握动画控制逻辑。适用于处理较简单的播放需求,如 UI 动效、物体旋转、小动画等,不涉及 Animator 控制器。
文章目录
1. Animation组件基础概念
在 Unity 中,Animation
是早期提供的动画播放组件,适用于不需要状态机控制、过渡或混合动画的简易动画场景。
添加方式
- 选中 GameObject
- 菜单:
Component > Miscellaneous > Animation
- 拖入
.anim
文件到 Animation 的Clips
列表中
与 Animator
不同,Animation
的控制完全依赖于代码或组件面板的剪辑顺序,适合以下场景:
- UI 控件简单缩放/位移动画
- NPC 简单行为动画(如挥手)
- 工具逻辑演示动画(编辑器动画)
2. Animation.Play() 方法重载一览
Unity 提供了多种 Play()
方法,用于满足不同控制需求。其函数声明如下:
public bool Play(string animation, PlayMode mode); // ✅推荐
public bool Play(string animation); // ✅推荐
public bool Play(PlayMode mode); // ✅推荐
public bool Play(); // ✅推荐
// 以下为已废弃方法 ❌ 不建议再用
[Obsolete] public bool Play(AnimationPlayMode mode);
[Obsolete] public bool Play(string animation, AnimationPlayMode mode);
3. Play重载方法解析与使用场景
Play(string animation, PlayMode mode)
播放指定名称动画,带播放模式设置:
animation.Play("run", PlayMode.StopSameLayer);
animation
: 动画剪辑名mode
:PlayMode.StopSameLayer
(推荐)或PlayMode.StopAll
适合:同一 GameObject 上有多个动画剪辑,避免动画间干扰。
Play(string animation)
播放指定动画,使用默认模式 StopSameLayer
:
animation.Play("walk");
等价于:
animation.Play("walk", PlayMode.StopSameLayer);
Play(PlayMode mode)
播放默认绑定的 Animation.clip,设置播放模式:
animation.Play(PlayMode.StopAll);
Play()
播放默认绑定的 Animation.clip,默认模式 StopSameLayer
:
animation.Play();
4. 已废弃重载方法说明
早期 Unity 使用 AnimationPlayMode
枚举控制播放模式,后续被 PlayMode
替代。以下方法现已标记为 Obsolete
:
[Obsolete] public bool Play(AnimationPlayMode mode);
[Obsolete] public bool Play(string animation, AnimationPlayMode mode);
建议:迁移至对应 PlayMode
重载方法,避免未来版本升级问题。
5. PlayMode 枚举说明
public enum PlayMode {
StopSameLayer, // 停止同层级动画,保持其他层级不变(推荐)
StopAll // 停止所有动画后播放
}
使用建议
用法示例 | 说明 |
---|---|
Play("run") |
播放 run 动画 |
Play("jump", PlayMode.StopAll) |
播放 jump 动画并停止所有动画 |
Play(PlayMode.StopSameLayer) |
播放默认动画 clip |
6. 示例:按空格播放动画
以下示例脚本展示如何通过空格键触发动画播放:
using UnityEngine;
public class AnimationPlayer : MonoBehaviour {
private Animation anim;
void Start() {
anim = GetComponent<Animation>();
}
void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
if (!anim.isPlaying) {
anim.Play("jump", PlayMode.StopAll);
}
}
}
}
7. 常用 API 总结
API 方法 | 功能说明 |
---|---|
Play() |
播放默认动画 |
Play("run") |
播放指定动画 |
Stop() |
停止所有动画播放 |
isPlaying |
判断是否在播放动画 |
anim["walk"].speed = 2f |
设置播放速度 |
anim["walk"].wrapMode = WrapMode.Loop |
设置循环模式 |
8. PlantUML 动画播放逻辑图
@startuml
class Animation {
+Play()
+Play(string animation)
+Play(PlayMode mode)
+Play(string animation, PlayMode mode)
-Play(AnimationPlayMode mode)
-Play(string animation, AnimationPlayMode mode)
}
enum PlayMode {
StopSameLayer
StopAll
}
Animation --> PlayMode : 播放控制参数
@enduml
该图展示了 Animation
类中的方法重载与推荐使用方向。
9. 实践建议与常见误区
类别 | 项目 | 内容 |
---|---|---|
✅ 建议 | 命名规范 | 动画名避免使用中文或空格 |
✅ 建议 | 动画复用 | 同一剪辑可在多个对象间复用,提高效率 |
✅ 建议 | 播放优化 | 检查 isPlaying 防止重复播放 |
❌ 误区 | 动画混合 | Animation 不支持动画混合或过渡 |
❌ 误区 | 状态管理 | 不建议使用 Animation 实现复杂状态机 |
10. 延伸阅读:AnimationClip 动态创建与事件系统
你可以通过代码动态生成 AnimationClip
并添加到 Animation
上,实现运行时动画注入:
AnimationClip clip = new AnimationClip();
clip.legacy = true;
AnimationCurve curve = AnimationCurve.Linear(0f, 0f, 1f, 90f);
clip.SetCurve("", typeof(Transform), "localEulerAngles.y", curve);
animation.AddClip(clip, "rotateY");
animation.Play("rotateY");
也可以使用 AnimationEvent
添加事件回调:
AnimationEvent evt = new AnimationEvent();
evt.functionName = "OnAnimEvent";
evt.time = 0.5f;
clip.AddEvent(evt);
11. 总结与展望
Animation
是 Unity 提供的轻量动画控制方式,适用于对性能要求高、动画结构简单的场景。
适用场景:
- 简单交互反馈动画(按钮闪烁、旋转)
- 工具编辑器动画预览
- 模拟演示项目中快速开发动画逻辑
未来扩展方向:
- 动态生成动画轨迹(位置、旋转、透明度)
- AnimationClip 自动管理与加载系统
- Unity Timeline 或 Playables API 的衔接与迁移
📌 如果你对 Animation
使用有更多问题,欢迎评论交流!