Example #1
0
    //动画设置
    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();
    }
Example #2
0
    //生成动画组
    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();
    }
Example #3
0
    //生成动画
    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);
    }