public override void DrawPreview(Rect previewArea)
        {
            if (style == null)
            {
                style = (GUIStyle)"MeTransPlayhead";
            }
            AnimationClip target = base.target as AnimationClip;
            //AnimationClipSettings animationClipSettings = AnimationUtility.GetAnimationClipSettings(target);

            Rect rect;
            int  offsetY = 15;

            rect        = previewArea;
            rect.height = offsetY;
            GUI.Box(rect, GUIContent.none);
            rect.x += 33;
            Event     current   = Event.current;
            int       controlID = GUIUtility.GetControlID(kScrubberIDHash, FocusType.Keyboard, previewArea);
            EventType eventType = current.GetTypeForControl(controlID);

            switch (eventType)
            {
            case EventType.MouseDown:

                if (rect.Contains(current.mousePosition) && current.button == 1)
                {
                    GenericMenu menu = new GenericMenu();
                    foreach (string animationClipEvent in EditorConfigUtils.AnimationClipEvents)
                    {
                        AnimationEvent animationEvent = new AnimationEvent();
                        animationEvent.time            = ((current.mousePosition.x - rect.x) / (rect.width - rect.x)) * target.length;
                        animationEvent.stringParameter = animationClipEvent;
                        animationEvent.functionName    = "receiptAnimationEvent";
                        menu.AddItem(new GUIContent(animationClipEvent), false, menuHandle, animationEvent);
                    }
                    menu.ShowAsContext();
                }
                break;
            }


            Handles.color = Color.green;
            int size = offsetY;

            float maxWidth = rect.width - rect.x;
            int   i        = 0;

            foreach (AnimationEvent animationEvent in target.events)
            {
                float      percent = animationEvent.time / target.length;
                float      x       = rect.x + percent * maxWidth;
                GUIContent c       = new GUIContent();
                c.tooltip = animationEvent.functionName;
                Rect tempRect = new Rect(x - size / 2f, rect.y, size, rect.height);
                GUI.Box(tempRect, c, style);

                if (eventType == EventType.MouseDown)
                {
                    if (tempRect.Contains(current.mousePosition))
                    {
                        if (current.button == 1)
                        {
                            GenericMenu menu = new GenericMenu();
                            menu.AddItem(new GUIContent("clear"), false, clearHandle, animationEvent);
                            menu.ShowAsContext();
                            current.Use();
                        }
                        selectKeyFrameIndex = i;
                        selectKeyFrameInfo  = animationEvent;
                        //Debug.Log(keyFrameInfo.percent);
                    }
                }
                i++;
            }

            switch (eventType)
            {
            case EventType.MouseDrag:
                if (selectKeyFrameInfo != null)
                {
                    float v = Mathf.Min(Mathf.Max(current.mousePosition.x - rect.x, 0), maxWidth);
                    selectKeyFrameInfo.time = (v / maxWidth) * target.length;

                    if (selectKeyFrameIndex > -1)
                    {
                        isDirty = true;
                        AnimationEvent[] events = AnimationUtility.GetAnimationEvents(target);
                        if (selectKeyFrameIndex < events.Length)
                        {
                            events[selectKeyFrameIndex] = selectKeyFrameInfo;
                            AnimationUtility.SetAnimationEvents(target, events);
                        }
                    }
                    current.Use();
                }
                break;

            case EventType.MouseUp:
            case EventType.Used:
                selectKeyFrameIndex = -1;
                selectKeyFrameInfo  = null;
                break;
            }


            rect        = previewArea;
            rect.width  = 40;
            rect.height = offsetY;


            if (isDirty && string.IsNullOrEmpty(savePath) == false)
            {
                if (GUI.Button(rect, "save", (GUIStyle)"sv_label_5"))
                {
                    List <KeyFrameInfo> list = new List <KeyFrameInfo>();
                    foreach (AnimationEvent animationEvent in target.events)
                    {
                        KeyFrameInfo item = new KeyFrameInfo();
                        item.time            = animationEvent.time;
                        item.func            = animationEvent.functionName;
                        item.stringParameter = animationEvent.stringParameter;
                        item.intParameter    = animationEvent.intParameter;
                        item.floatParameter  = animationEvent.floatParameter;

                        if (animationEvent.objectReferenceParameter)
                        {
                            item.objectReferenceParameterInstanceID =
                                animationEvent.objectReferenceParameter.GetInstanceID();
                        }
                        list.Add(item);
                    }
                    AmfHelper.save(list, savePath);
                    isDirty = false;
                }
            }

            previewArea.y      += offsetY;
            previewArea.height -= offsetY;
            base.DrawPreview(previewArea);
        }
Example #2
0
    public PrefabElement exportMesh(GameObject gameObject)
    {
        Mesh         mesh         = null;
        Material     material     = null;
        MeshData     meshData     = null;
        SkeletonData skeletonData = null;

        SkeletonAnimationData[] animDatas = null;
        GameObject skinObject             = null;

        PrefabElement element = null;
        string        path    = null;



        var render = gameObject.GetComponentInChildren <MeshRenderer>();

        if (render)
        {
            //EditorGUILayout.ObjectField(render.gameObject, typeof(MeshRenderer), false);
            mesh       = render.GetComponent <MeshFilter>().mesh;
            material   = render.material;
            skinObject = render.gameObject;

            path = AssetDatabase.GetAssetPath(mesh);
            if (exportedObj.ContainsKey(path))
            {
                return(exportedObj[path]);
            }
        }
        else
        {
            var skinRender = gameObject.GetComponentInChildren <SkinnedMeshRenderer>();
            if (skinRender)
            {
                //EditorGUILayout.ObjectField(skinRender.gameObject, typeof(SkinnedMeshRenderer), false);
                mesh       = skinRender.sharedMesh;
                material   = skinRender.sharedMaterial;
                skinObject = skinRender.gameObject;

                path = AssetDatabase.GetAssetPath(mesh);

                if (exportedObj.ContainsKey(path))
                {
                    return(exportedObj[path]);
                }

                skeletonData = Export.exportSkeleton(skinRender, gameObject);

                var animator = gameObject.GetComponentInChildren <Animator>();
                var avatar   = animator.avatar;
                var bones    = skinRender.bones;
                var rootBone = skinRender.rootBone;

                animDatas = Export.exportAnimation(skinRender, gameObject);



                // var controller = animator.runtimeAnimatorController as AnimatorController;
                // var layer = controller.layers[0] as AnimatorControllerLayer;
                // var clips=controller.animationClips;
            }
        }

        if (mesh)
        {
            Debug.Log("parse " + gameObject.name);


            meshData = Export.exportMeshData(mesh, skinObject);

            ByteArray byteArray = null;

            SkeletonMeshData data = new SkeletonMeshData();
            data.mesh         = meshData;
            data.skeletonData = skeletonData;

            string root = "E:/project/h5games/data/";


            string refName  = path.Replace("Assets/", "");
            int    dotIndex = refName.IndexOf(".");
            refName = refName.Substring(0, dotIndex) + "/";

            string outpath = root + refName;


            if (null != animDatas)
            {
                data.anims = new string[animDatas.Length];
                for (int i = 0; i < animDatas.Length; i++)
                {
                    SkeletonAnimationData animData = animDatas[i];
                    byteArray = new ByteArray();
                    byteArray.WriteObject(animData);
                    byteArray.Compress();
                    AmfHelper.saveByteArray(byteArray, root + animData.name);
                    data.anims[i] = animData.name;
                }
            }

            if (null != material)
            {
                data.material = Export.ExportMaterial(material);
                string diffpath = data.material.diffTex.url;
                File.Copy(diffpath, outpath + "diff.png", true);
            }


            byteArray = new ByteArray();
            byteArray.WriteObject(data);
            byteArray.Compress();
            AmfHelper.saveByteArray(byteArray, outpath + "mesh.km");

            //element
            element          = new PrefabElement();
            element.name     = path;
            element.refName  = refName;
            element.meshData = data;
            exportedObj.Add(path, element);
        }


        // return Path.GetFileName(path).Replace(Path.GetExtension(path),"");

        return(element);
    }