一、在Unity中使用JSON存储和读取动画数据流程
1.定义动画数据类
2. 将动画数据序列化为JSON字符串。可以使用JsonUtility.ToJson()方法实现。
3. 将JSON字符串保存到文件中,例如使用File.WriteAllText()写入。
4. 读取时,从文件中读取JSON字符串,使用JsonUtility.FromJson()反序列化回动画数据类。
5. 根据反序列化后的动画数据类,获取相应的AnimationClip进行播放等操作
二、动画数据存储 读取方法
API------AnimationUnitily
1、通过AnimationUtility.GetCurveBindings方式得到float曲线绑定数据,返回EditorCurveBinding[]这样一个数组,存储运动数据
2、通过AnimationUtility.GetEditorCurve方法获取AnimationCurve对象,存储关键帧的集合
通过AnimationUtility.GetCurveBindings接口获取与动画剪辑相关的所有动画事件,然后再通过AnimationUtility.GetEditorCurve接口得到绑定所指向的float曲线
binding.path是模型中所操作的对象节点路径;binding.propertyName是所操作的对象节点属性(例如Position、Rotation、Scale、BlendShape等);curve为关键帧曲线;curve.length和curve.keys.Length都是关键帧个数;最后循环中的curve[i].value是关键帧中数值,curve[i].time是关键帧中时间。
代码中使用的是LitJson
JsonMapper.ToJson(data),JsonMapper.ToObject来序列化和反序列化
//AnimationUtility.//JsonUtility.ToJson 将动画数据序列化为JSON字符串//File.WriteAllText() 将JSON字符串保存到文件中int length;/// <summary>/// 动画数据类/// </summary>public class AnimationData{//动画名public string name;//动画时长public float time;//3个位置信息public Dictionary<string, List<float>> dicPos = new Dictionary<string, List<float>>();//事件信息public AnimationEvent animEvent;}private void Start(){AnimationClip clip = GetComponent<Animation>().clip;//实例化AnimationData data = new AnimationData();//读取信息data.name = clip.name;data.time = clip.length;foreach (var binding in AnimationUtility.GetCurveBindings(clip)){AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, binding);//Debug.Log("/" + binding.propertyName + "\tKeys: " + curve.keys.Length);List<float> keyframeValues = new List<float>();data.dicPos.Add(binding.propertyName, keyframeValues);length = curve.length;for (int i = 0; i < curve.length; i++){//Debug.Log("Keys" + i + ":" + curve[i].value);//添加元素keyframeValues.Add(curve[i].value);}}string filePath = Path.Combine(Application.persistentDataPath, "AnimationData");//序列化为JSON字符串//string json = JsonUtility.ToJson(data);string json = JsonMapper.ToJson(data);Debug.Log(json);//保存文件File.WriteAllText(filePath, json);//反序列化string json1 = File.ReadAllText(filePath);AnimationData data1 = JsonMapper.ToObject<AnimationData>(json1);}