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); }
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); }