Unity动画数据的导出和导入

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

        
    }

猜你喜欢

转载自blog.csdn.net/weixin_53163894/article/details/131866832