usingUnityEngine;
usingSystem.Collections;
usingSystem.IO;
usingSystem.Collections.Generic;
usingUnityEditor;
usingUnityEditorInternal;
publicclassBuildAnimation:Editor
{
//生成出的Prefab的路径
privatestaticstringPrefabPath="Assets/Resources/Prefabs";
//生成出的AnimationController的路径
privatestaticstringAnimationControllerPath="Assets/AnimationController";
//生成出的Animation的路径
privatestaticstringAnimationPath="Assets/Animation";
//美术给的原始图片路径
privatestaticstringImagePath=Application.dataPath+"/Raw";
[MenuItem("Build/BuildAnimaiton")]
staticvoidBuildAniamtion()
{
DirectoryInforaw=newDirectoryInfo(ImagePath);
foreach(DirectoryInfodictorysinraw.GetDirectories())
{
List<AnimationClip>clips=newList<AnimationClip>();
foreach(DirectoryInfodictoryAnimationsindictorys.GetDirectories())
{
//每个文件夹就是一组帧动画,这里把每个文件夹下的所有图片生成出一个动画文件
clips.Add(BuildAnimationClip(dictoryAnimations));
}
//把所有的动画文件生成在一个AnimationController里
AnimatorControllercontroller=BuildAnimationController(clips,dictorys.Name);
//最后生成程序用的Prefab文件
BuildPrefab(dictorys,controller);
}
}
staticAnimationClipBuildAnimationClip(DirectoryInfodictorys)
{
stringanimationName=dictorys.Name;
//查找所有图片,因为我找的测试动画是.jpg
FileInfo[]images =dictorys.GetFiles("*.jpg");
AnimationClipclip=newAnimationClip();
AnimationUtility.SetAnimationType(clip,ModelImporterAnimationType.Generic);
EditorCurveBindingcurveBinding=newEditorCurveBinding();
curveBinding.type=typeof(SpriteRenderer);
curveBinding.path="";
curveBinding.propertyName="m_Sprite";
ObjectReferenceKeyframe[]keyFrames=newObjectReferenceKeyframe[images.Length];
//动画长度是按秒为单位,1/10就表示1秒切10张图片,根据项目的情况可以自己调节
floatframeTime=1/10f;
for(inti=0;i<images.Length;i++){
Spritesprite=Resources.LoadAssetAtPath<Sprite>(DataPathToAssetPath(images[i].FullName));
keyFrames[i]= newObjectReferenceKeyframe();
keyFrames[i].time=frameTime *i;
keyFrames[i].value=sprite;
}
//动画帧率,30比较合适
clip.frameRate=30;
//有些动画我希望天生它就动画循环
if(animationName.IndexOf("idle")>=0)
{
//设置idle文件为循环动画
SerializedObjectserializedClip=newSerializedObject(clip);
AnimationClipSettingsclipSettings=newAnimationClipSettings(serializedClip.FindProperty("m_AnimationClipSettings"));
clipSettings.loopTime=true;
serializedClip.ApplyModifiedProperties();
}
stringparentName=System.IO.Directory.GetParent(dictorys.FullName).Name;
System.IO.Directory.CreateDirectory(AnimationPath+"/"+parentName);
AnimationUtility.SetObjectReferenceCurve(clip,curveBinding,keyFrames);
AssetDatabase.CreateAsset(clip,AnimationPath+"/"+parentName+"/"+animationName+".anim");
AssetDatabase.SaveAssets();
returnclip;
}
staticAnimatorControllerBuildAnimationController(List<AnimationClip>clips,stringname)
{
AnimatorControlleranimatorController=AnimatorController.CreateAnimatorControllerAtPath(AnimationControllerPath+"/"+name+".controller");
AnimatorControllerLayerlayer=animatorController.GetLayer(0);
UnityEditorInternal.StateMachinesm=layer.stateMachine;
foreach(AnimationClipnewClipinclips)
{
State state=sm.AddState(newClip.name);
state.SetAnimationClip(newClip,layer);
Transitiontrans=sm.AddAnyStateTransition(state);
trans.RemoveCondition(0);
}
AssetDatabase.SaveAssets();
returnanimatorController;
}
staticvoidBuildPrefab(DirectoryInfodictorys,AnimatorControlleranimatorCountorller)
{
//生成Prefab 添加一张预览用的Sprite
FileInfoimages =dictorys.GetDirectories()[0].GetFiles("*.jpg")[0];
GameObjectgo=newGameObject();
go.name=dictorys.Name;
SpriteRendererspriteRender=go.AddComponent<SpriteRenderer>();
spriteRender.sprite=Resources.LoadAssetAtPath<Sprite>(DataPathToAssetPath(images.FullName));
Animatoranimator=go.AddComponent<Animator>();
animator.runtimeAnimatorController=animatorCountorller;
PrefabUtility.CreatePrefab(PrefabPath+"/"+go.name+".prefab",go);
DestroyImmediate(go);
}
publicstaticstringDataPathToAssetPath(stringpath)
{
if(Application.platform==RuntimePlatform.WindowsEditor)
returnpath.Substring(path.IndexOf("Assets\\"));
else
returnpath.Substring(path.IndexOf("Assets/"));
}
classAnimationClipSettings
{
SerializedPropertym_Property;
privateSerializedPropertyGet(stringproperty){returnm_Property.FindPropertyRelative(property);}
publicAnimationClipSettings(SerializedPropertyprop){m_Property=prop;}
publicfloatstartTime {get{returnGet("m_StartTime").floatValue;}set{Get("m_StartTime").floatValue=value;}}
publicfloatstopTime{get{returnGet("m_StopTime").floatValue;} set{Get("m_StopTime").floatValue=value;}}
publicfloatorientationOffsetY{get{returnGet("m_OrientationOffsetY").floatValue;}set{Get("m_OrientationOffsetY").floatValue=value;}}
publicfloatlevel{get{returnGet("m_Level").floatValue;}set{Get("m_Level").floatValue=value;}}
publicfloatcycleOffset{get{returnGet("m_CycleOffset").floatValue;}set{Get("m_CycleOffset").floatValue=value;}}
publicboolloopTime{get{returnGet("m_LoopTime").boolValue;}set{Get("m_LoopTime").boolValue=value;}}
publicboolloopBlend{get{returnGet("m_LoopBlend").boolValue;}set{Get("m_LoopBlend").boolValue=value;}}
publicboolloopBlendOrientation{get{returnGet("m_LoopBlendOrientation").boolValue;}set{Get("m_LoopBlendOrientation").boolValue=value;}}
publicboolloopBlendPositionY{get{returnGet("m_LoopBlendPositionY").boolValue;}set{Get("m_LoopBlendPositionY").boolValue=value;}}
publicboolloopBlendPositionXZ{get{returnGet("m_LoopBlendPositionXZ").boolValue;}set{Get("m_LoopBlendPositionXZ").boolValue=value;}}
publicboolkeepOriginalOrientation{get{returnGet("m_KeepOriginalOrientation").boolValue;}set{Get("m_KeepOriginalOrientation").boolValue=value;}}
publicboolkeepOriginalPositionY{get{returnGet("m_KeepOriginalPositionY").boolValue;}set{Get("m_KeepOriginalPositionY").boolValue=value;}}
publicboolkeepOriginalPositionXZ{get{returnGet("m_KeepOriginalPositionXZ").boolValue;}set{Get("m_KeepOriginalPositionXZ").boolValue=value;}}
publicboolheightFromFeet{get{returnGet("m_HeightFromFeet").boolValue;}set{Get("m_HeightFromFeet").boolValue=value;}}
publicboolmirror{get{returnGet("m_Mirror").boolValue;}set{Get("m_Mirror").boolValue=value;}}
}
}