首席权威白癜风专家 https://m-mip.39.net/disease/mip_5950137.html为解决动画信息的动态加载问题,攻克了动画信息与文本信息的互转技术,为做项目中动画信息的智能处理奠定基础。动画信息内容相对较多,代码量比较大,主要解决思路为存储Animation的各种字段信息,从而达到动画存储的目的。1、首先,确定动画需要存储的内容为Animations,请自行为Animations创建存储结构类;2、其次,按层拨开Animation的真面目(AnimationClip),请自行创建结构类
ListAnimationClipclips=newListAnimationClip();foreach(AnimationStateclipinitem){clips.Add(clip.clip);}3、拨开AnimationClip的真面目(AnimationCurve),请自行创建结构类
//创建存储结构ListClipInfoClipCurves=newListClipInfo();foreach(varclipinclips){//创建存储结构varcurveInfos=newListCurveInfo();ClipCurves.Add(newClipInfo(clip,clip.name,curveInfos,clip.localBounds,clip.frameRate));foreach(varbindinginAnimationUtility.GetCurveBindings(clip)){varkey=CurveKey(binding.path,binding.type,binding.propertyName);Debug.Log(binding.path);varcurve=AnimationUtility.GetEditorCurve(clip,binding);//结构类添加CurveInfo//curveInfos.Add(newCurveInfo(key,curve,binding.path));}}转换为json数据,存储4、按照反向原则,加载到Animation身上即可。具体代码如下:
usingUnityEngine;usingSystem.Collections;usingSystem;usingSystem.Collections.Generic;usingObject=UnityEngine.Object;usingNewtonsoft.Json;usingUnityEditor;usingSystem.Linq;usingLitJson;[Serializable]publicsealedclassClipInfo{publicintClipInstanceID;publicstringclipName;publicListCurveInfoCurveInfos=newListCurveInfo();publicBoundslocalBounds;publicfloatframeRate;publicClipInfo(){}publicClipInfo(Objectclip,stringname,ListCurveInfocurveInfos,BoundslocalBounds,floatframeRate){ClipInstanceID=clip.GetInstanceID();CurveInfos=curveInfos;clipName=name;this.localBounds=localBounds;this.frameRate=frameRate;}}[Serializable]publicsealedclassCurveInfo{publicstringPathKey;publicstringrelativePath;publicListKeyFrameInfoKeys=newListKeyFrameInfo();publicWrapModePreWrapMode;publicWrapModePostWrapMode;publicCurveInfo(){}publicCurveInfo(stringpathKey,AnimationCurvecurve,stringpa){PathKey=pathKey;relativePath=pa;foreach(varkeyframeincurve.keys){Keys.Add(newKeyFrameInfo(keyframe));}PreWrapMode=curve.preWrapMode;PostWrapMode=curve.postWrapMode;}}[Serializable]publicsealedclassKeyFrameInfo{publicfloatValue;publicfloatInTangent;publicfloatInWeight;publicfloatOutTangent;publicfloatOutWeight;publicfloatTime;publicWeightedModeWeightedMode;publicKeyFrameInfo(){}publicKeyFrameInfo(Keyframekeyframe){Value=keyframe.value;InTangent=keyframe.inTangent;InWeight=keyframe.inWeight;OutTangent=keyframe.outTangent;OutWeight=keyframe.outWeight;Time=keyframe.time;WeightedMode=keyframe.weightedMode;}}publicclassAnimationInfo{privatestaticstringCurveKey(stringpathToObject,Typetype,stringpropertyName){returnpropertyName;//return"{pathToObject}:{type.FullName}:{propertyName}";}#ifUNITY_EDITORpublicstaticstringSaveAnimationCurves(ListAnimationClipclips){ListClipInfoClipCurves=newListClipInfo();foreach(varclipinclips){varcurveInfos=newListCurveInfo();ClipCurves.Add(newClipInfo(clip,clip.name,curveInfos,clip.localBounds,clip.frameRate));foreach(varbindinginAnimationUtility.GetCurveBindings(clip)){varkey=CurveKey(binding.path,binding.type,binding.propertyName);Debug.Log(binding.path);varcurve=AnimationUtility.GetEditorCurve(clip,binding);curveInfos.Add(newCurveInfo(key,curve,binding.path));}}stringstr=JsonMapper.ToJson(ClipCurves);//stringstr=JsonConvert.SerializeObject(ClipCurves);returnstr;}#endifpublicstaticListAnimationClipLoadClipCurves(stringstr){ListClipInfoClipCurves=newListClipInfo();ClipCurves=JsonMapper.ToObjectListClipInfo(str);//ClipCurves=JsonConvert.DeserializeObjectListClipInfo(str);//Debug.LogError(ClipCurves.Count);ListAnimationClipclips=newListAnimationClip();foreach(variteminClipCurves){AnimationClipclip=newAnimationClip();clip.localBounds=item.localBounds;clip.frameRate=item.frameRate;clip.name=item.clipName;clip.legacy=true;foreach(varainitem.CurveInfos){AnimationCurvecurve=newAnimationCurve();ListKeyframekeys=newListKeyframe();foreach(varkfina.Keys){Keyframekey=newKeyframe(kf.Time,kf.Value,kf.InTangent,kf.OutTangent,kf.InWeight,kf.OutWeight);keys.Add(key);key.weightedMode=kf.WeightedMode;}curve.keys=keys.ToArray();curve.postWrapMode=a.PostWrapMode;curve.preWrapMode=a.PreWrapMode;clip.SetCurve(a.relativePath,typeof(Transform),a.PathKey,curve);}clips.Add(clip);}returnclips;}}预览时标签不可点收录于话题#个上一篇下一篇