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

非Unity编辑器中存储Animation Clips及序列化、Runtime保存问题求解

关于Runtime阶段存储Animation Clip及序列化问题的解决方案

一、Runtime阶段保存Animation Clip为.anim文件

Unity原生不支持在已构建项目的Runtime直接保存.anim格式文件,因为这是编辑器专属的资源格式。可以通过以下两种方案实现类似需求:

  • 自定义序列化格式存储,加载时还原
    定义可序列化的数据结构,提取AnimationClip的核心信息(曲线、时长、循环模式等),示例代码:

    [System.Serializable]
    public class SerializedAnimationData
    {
        public List<SerializedCurveData> curveDatas;
        public float clipLength;
        public bool loop;
    }
    
    [System.Serializable]
    public class SerializedCurveData
    {
        public string relativePath;
        public string propertyName;
        public string componentTypeFullName;
        public List<Keyframe> keyframes;
        public WrapMode preWrap;
        public WrapMode postWrap;
    }
    

    编写工具方法将AnimationClip的曲线数据转成上述结构,用JsonUtility或二进制序列化工具保存到本地文件。加载时反向解析,调用AnimationClip.SetCurve重新构建动画片段。

  • AssetBundle打包(仅限开发版)
    如果是开发场景下的Runtime复用,可以将生成的AnimationClip打包为AssetBundle保存。注意:Runtime打包AssetBundle需要引入UnityEditor命名空间代码,且仅能在开发构建版本中使用,正式发布版会剥离UnityEditor相关类,无法运行。

二、AnimationClip无法序列化的解决办法

原生AnimationClip属于Unity引擎对象,内部数据并非普通可序列化字段,常规序列化工具无法直接处理。解决思路:

  • 转存为自定义可序列化结构:如上述SerializedAnimationData,将AnimationClip的关键信息提取到标记[System.Serializable]的普通C#类中,这类结构可以正常序列化。
  • 避免直接序列化Unity引擎对象:Runtime持久化Unity对象的通用方案是转成普通数据结构再存储,不要直接序列化UnityEngine.Object派生类。

三、自定义类模拟SetCurve功能的方案

自定义类无法复刻原生AnimationClip.SetCurve的底层实现,但可以模拟曲线数据的管理,在还原时调用原生API:

  1. 在自定义的SerializedCurveData中存储relativePath、propertyName、组件类型全名(如"UnityEngine.Transform, UnityEngine.CoreModule")、关键帧列表等信息。
  2. 给自定义类添加类似SetCurve的封装方法,用于收集曲线数据:
    public void AddCurve(string relativePath, Type componentType, string propertyName, AnimationCurve curve)
    {
        var curveData = new SerializedCurveData
        {
            relativePath = relativePath,
            propertyName = propertyName,
            componentTypeFullName = componentType.AssemblyQualifiedName,
            keyframes = new List<Keyframe>(curve.keys),
            preWrap = curve.preWrapMode,
            postWrap = curve.postWrapMode
        };
        curveDatas.Add(curveData);
    }
    
  3. 还原AnimationClip时,通过Type.GetType(componentTypeFullName)获取组件类型,再调用AnimationClip.SetCurve重建曲线。

内容的提问来源于stack exchange,提问作者轰轰BOOMBOOM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:01:14