//动画设置 void DrawAnimationSetting(AseAnimationSettings setting, int index) { if (!foldoutStates.ContainsKey(setting.animationName)) { foldoutStates.Add(setting.animationName, false); } EditorGUILayout.BeginVertical(GUI.skin.box); EditorGUI.indentLevel++; string title = string.Format("{0}. {1}", index + 1, setting.animationName); if (foldoutStates[setting.animationName] = EditorGUILayout.Foldout(foldoutStates[setting.animationName], title, true)) { EditorGUI.indentLevel++; setting.loop = EditorGUILayout.Toggle("Loop", setting.loop); //EditorGUILayout.HelpBox("qwer", MessageType.None); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); }
//生成动画组 void GenerateAnimations(AssetImportContext ctx, AseFile aseFile, AseFrame[] frames) { FrameTag[] tags = aseFile.GetAnimations(); List <AseAnimationSettings> settingList; //如果当前没有保存的动画设置 if (animationSettings == null || animationSettings.Length == 0) { settingList = new List <AseAnimationSettings>(); } //已有保存的动画设置 else { //去除其中已失效的动画 RemoveUnusedAnimationSettings(tags); settingList = new List <AseAnimationSettings>(animationSettings); } //如果一个Tag都没有 if (tags.Length == 0) { //直接以文件命名 //生成动画 AseAnimationSettings animationSetting = GenerateAnimation(ctx, name, frames); if (!settingList.Contains(animationSetting)) { settingList.Add(animationSetting); } } //有Tag else { for (int i = 0; i < tags.Length; i++) { FrameTag tag = tags[i]; string animationName = GetAnimationName(tag.TagName); //生成动画 AseAnimationSettings animationSetting = GenerateAnimation(ctx, animationName, frames, tag.FrameFrom, tag.FrameTo); if (!settingList.Contains(animationSetting)) { settingList.Add(animationSetting); } } } animationSettings = settingList.ToArray(); }
//生成动画 AseAnimationSettings GenerateAnimation(AssetImportContext ctx, string name, AseFrame[] frames, int startFrame = 0, int endFrame = 0) { AseAnimationSettings animationSetting = GetAnimationSetting(name); if (generateAnimation) { AnimationClip clip = new AnimationClip(); clip.name = name; clip.frameRate = 25; if (endFrame == 0) { endFrame = frames.Length - 1; } EditorCurveBinding spriteBinding = new EditorCurveBinding(); spriteBinding.type = typeof(SpriteRenderer); spriteBinding.path = ""; spriteBinding.propertyName = "m_Sprite"; int length = endFrame - startFrame + 1; ObjectReferenceKeyframe[] spriteKeyFrames = new ObjectReferenceKeyframe[length + 1]; float time = 0; for (int i = startFrame; i <= endFrame; i++) { ObjectReferenceKeyframe frame = new ObjectReferenceKeyframe(); frame.time = time; frame.value = frames[i].sprite; time += frames[i].duration; spriteKeyFrames[i - startFrame] = frame; } //单独设置最后一帧 float frameTime = 1f / clip.frameRate; ObjectReferenceKeyframe lastFrame = new ObjectReferenceKeyframe(); lastFrame.time = time - frameTime; lastFrame.value = frames[endFrame].sprite; spriteKeyFrames[spriteKeyFrames.Length - 1] = lastFrame; AnimationUtility.SetObjectReferenceCurve(clip, spriteBinding, spriteKeyFrames); AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(clip); //循环设置 if (animationSetting.loop) { settings.loopTime = true; clip.wrapMode = WrapMode.Loop; } else { settings.loopTime = false; clip.wrapMode = WrapMode.Once; } AnimationUtility.SetAnimationClipSettings(clip, settings); ctx.AddObjectToAsset(name, clip); //string filePath = string.Format("{0}/{1}.anim", GetFileDic(ctx.assetPath), name); //AssetDatabase.CreateAsset(clip, filePath); //clip = AssetDatabase.LoadAssetAtPath(filePath, typeof(AnimationClip)) as AnimationClip; //Debug.Log(AssetDatabase.CopyAsset(); //AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(clip), filePath); } return(animationSetting); }