非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:
- 在自定义的
SerializedCurveData中存储relativePath、propertyName、组件类型全名(如"UnityEngine.Transform, UnityEngine.CoreModule")、关键帧列表等信息。 - 给自定义类添加类似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); } - 还原AnimationClip时,通过
Type.GetType(componentTypeFullName)获取组件类型,再调用AnimationClip.SetCurve重建曲线。
内容的提问来源于stack exchange,提问作者轰轰BOOMBOOM
相关产品推荐
相关产品推荐

