一、在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);
}