You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:51:19