如何通过C#脚本创建Unity 2D动画并动态设置帧精灵
解答
完全可以通过C#脚本动态创建、修改Animation动画的精灵资源,不需要在编辑器里手动编辑。
注意你伪代码中混淆了两个Unity核心类型:
Animation是挂载在游戏对象上、负责播放动画的组件- 实际存储动画帧数据的资源类是
AnimationClip,所有帧编辑操作都要基于这个类实现
对应你伪代码的可直接运行实现
using UnityEngine; // 基础参数和你的伪代码定义保持一致 Sprite[] animSr = new Sprite[2] { SpriteA, SpriteB }; int animSampleRate = 60; int[] framesIndex = new int[2] { 0, 60 }; // 初始化动画剪辑 AnimationClip generatedClip = new AnimationClip(); generatedClip.frameRate = animSampleRate; // 构造精灵关键帧 ObjectReferenceKeyframe[] spriteKeyframes = new ObjectReferenceKeyframe[framesIndex.Length]; for (int i = 0; i < framesIndex.Length; i++) { spriteKeyframes[i] = new ObjectReferenceKeyframe { // Unity关键帧接口用秒作为时间单位,帧号转时间公式:时间 = 帧序号 / 采样率 time = framesIndex[i] / (float)animSampleRate, value = animSr[i] }; } // 将关键帧绑定到SpriteRenderer组件的sprite属性上 EditorCurveBinding spriteBinding = new EditorCurveBinding { path = "", type = typeof(SpriteRenderer), propertyName = "m_Sprite" }; generatedClip.SetObjectReferenceCurve(spriteBinding, spriteKeyframes); // 给Animation组件使用的示例 // Animation anim = GetComponent<Animation>(); // anim.AddClip(generatedClip, "CustomAnim"); // anim.Play("CustomAnim");
效果说明
以上代码生成的动画剪辑和你预期的动画效果完全一致:
- 采样率60帧/秒
- 第0帧显示SpriteA,第60帧(即动画1秒位置)显示SpriteB
- 直接绑定在物体自身的SpriteRenderer组件上,不需要额外配置
补充说明
- 运行时生成的
AnimationClip存在内存中,不需要保存为本地资产文件即可直接播放 - 如果需要在编辑器下生成可复用的
.anim文件,调用AssetDatabase.CreateAsset(generatedClip, "Assets/你的路径/动画名.anim")即可 - 这套接口不止可以修改精灵,动画控制的任何组件属性(位置、颜色、激活状态等)都可以用相同逻辑动态增删改关键帧
内容的提问来源于stack exchange,提问作者sueyLanglock
相关产品推荐
相关产品推荐

