private void CreateAction() { SpriteAnimationData.ActionData actionData = new SpriteAnimationData.ActionData(); actionData.name = UniqueActionName("NewAction"); allAction.Add(actionData); selection = actionData.name; CurActionData = actionData; settingView.Draw(); timeLineView.Draw(); }
public void Draw() { CurActionData = this.host.CurActionData; clipScrollbar = GUILayout.BeginScrollView(clipScrollbar, GUILayout.Height(100), GUILayout.ExpandWidth(true)); GUILayout.BeginVertical(); //time GUILayout.Box("", EditorStyles.toolbar, GUILayout.ExpandWidth(true)); Rect r = GUILayoutUtility.GetLastRect(); float t = 0.0f; float x = r.x; float fps = CurActionData != null ? CurActionData.fps : 30; while (x < r.x + r.width) { GUI.Label(new Rect(x, r.y, r.width, r.height), t.ToString("0.00"), EditorStyles.miniLabel); x += widthPerTick; t += 1 / fps; } //frame GUILayout.BeginHorizontal(); if (CurActionData != null) { for (int i = 0; i < CurActionData.FrameList.Length; i++) { SpriteAnimationData.FrameData frameData = CurActionData.FrameList[i]; DrawFrame(i, frameData); } GUI.color = Color.red; if (GUILayout.Button("+", "button", GUILayout.Height(60), GUILayout.Width(widthPerTick))) { AddFrame(); } GUI.color = Color.white; // Keyboard shortcuts Event ev = Event.current; int controlId = "Animation.TimeLineView".GetHashCode(); if (ev.type == EventType.KeyDown && GUIUtility.keyboardControl == 0 && selectedFrame != -1) { int newFrame = selectedFrame; switch (ev.keyCode) { case KeyCode.LeftArrow: case KeyCode.Comma: newFrame--; break; case KeyCode.RightArrow: case KeyCode.Period: newFrame++; break; case KeyCode.Home: newFrame = 0; break; case KeyCode.End: newFrame = CurActionData.FrameList.Length - 1; break; case KeyCode.Escape: selectedFrame = -1; HandleUtility.Repaint(); ev.Use(); break; } if (ev.type != EventType.Used && CurActionData.FrameList.Length > 0) { newFrame = Mathf.Clamp(newFrame, 0, CurActionData.FrameList.Length - 1); if (newFrame != selectedFrame) { selectedFrame = newFrame; HandleUtility.Repaint(); ev.Use(); } } } if (ev.type == EventType.KeyDown && (GUIUtility.hotControl == controlId || GUIUtility.keyboardControl == 0) && CurActionData.FrameList.Length > 0 && selectedFrame != -1) { //delete if ((ev.keyCode == KeyCode.Delete || ev.keyCode == KeyCode.Backspace)) { List <SpriteAnimationData.FrameData> list = CurActionData.FrameList.ToList(); list.RemoveAt(selectedFrame); CurActionData.FrameList = list.ToArray(); GUIUtility.hotControl = 0; HandleUtility.Repaint(); } else if (ev.keyCode == KeyCode.Insert) { List <SpriteAnimationData.FrameData> list = CurActionData.FrameList.ToList(); SpriteAnimationData.FrameData tempData = list[selectedFrame]; list.Insert(this.selectedFrame + 1, tempData); this.selectedFrame = this.selectedFrame + 1; CurActionData.FrameList = list.ToArray(); HandleUtility.Repaint(); } } if (ev.type == EventType.MouseDown || GUIUtility.hotControl == controlId) { switch (ev.GetTypeForControl(controlId)) { case EventType.MouseDown: int selectFrame = Mathf.Max(0, (int)Mathf.Floor(ev.mousePosition.x / widthPerTick)); this.selectedFrame = selectFrame; GUIUtility.keyboardControl = 0; GUIUtility.hotControl = controlId; HandleUtility.Repaint(); break; case EventType.MouseUp: if (this.dragSelectFrame != -1 && this.selectedFrame != -1) { List <SpriteAnimationData.FrameData> list = CurActionData.FrameList.ToList(); SpriteAnimationData.FrameData tempData = list[selectedFrame]; list.RemoveAt(selectedFrame); list.Insert(this.dragSelectFrame, tempData); CurActionData.FrameList = list.ToArray(); this.selectedFrame = this.dragSelectFrame; this.dragSelectFrame = -1; HandleUtility.Repaint(); } GUIUtility.keyboardControl = 0; GUIUtility.hotControl = 0; break; case EventType.MouseDrag: dragSelectFrame = Mathf.Max(0, (int)Mathf.Floor(ev.mousePosition.x / widthPerTick)); dragSelectFrame = Mathf.Clamp(dragSelectFrame, 0, CurActionData.FrameList.Length - 1); HandleUtility.Repaint(); break; } } if (selectedFrame != -1 && this.CurActionData != null && this.CurActionData.FrameList.Length > 0) { selectedFrame = Mathf.Clamp(selectedFrame, 0, this.CurActionData.FrameList.Length - 1); string spriteName = this.CurActionData.FrameList[selectedFrame].SpriteName; this.host.textureView.CurTexture = this.host.GetTexture(spriteName); } else { this.host.textureView.CurTexture = null; } } GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.EndScrollView(); Rect rect = GUILayoutUtility.GetLastRect(); GameEditorUtility.DrawOutline(rect, Color.gray); }
private void DrawActionList() { Texture2D blackTexture = new Texture2D(1, 1); blackTexture.SetPixel(0, 0, Color.black); blackTexture.Apply(); GUI.DrawTexture(new Rect(leftBarWidth, 16, 1f, Screen.height - 16), blackTexture); actionListScroll = GUILayout.BeginScrollView(actionListScroll, GUILayout.Width(leftBarWidth), GUILayout.ExpandHeight(true)); bool delete = false; for (int i = 0; i < allAction.Count; i++) { SpriteAnimationData.ActionData actionData = allAction[i]; if (actionData == null) { continue; } bool highlight = selection == actionData.name; GUI.backgroundColor = highlight ? Color.green : new Color(0.8f, 0.8f, 0.8f); GUILayout.BeginHorizontal("AS TextArea", GUILayout.MinHeight(20f)); GUI.backgroundColor = Color.white; GUILayout.Label(i.ToString(), GUILayout.Width(24f)); if (GUILayout.Button(actionData.name, "OL TextField", GUILayout.Height(20f))) { selection = actionData.name; CurActionData = actionData; settingView.Draw(); timeLineView.Draw(); } if (mDelNames.Contains(actionData.name)) { GUI.backgroundColor = Color.red; if (GUILayout.Button("删除", GUILayout.Width(60f))) { delete = true; } GUI.backgroundColor = Color.green; if (GUILayout.Button("X", GUILayout.Width(22f))) { mDelNames.Remove(actionData.name); delete = false; } GUI.backgroundColor = Color.white; } else { // If we have not yet selected a sprite for deletion, show a small "X" button if (GUILayout.Button("X", GUILayout.Width(22f))) { mDelNames.Add(actionData.name); } } GUILayout.EndHorizontal(); } if (delete) { for (int i = allAction.Count - 1; i >= 0; i--) { SpriteAnimationData.ActionData actionData = allAction[i]; if (actionData != null && mDelNames.Contains(actionData.name)) { allAction.RemoveAt(i); if (CurActionData == actionData) { CurActionData = null; settingView.Draw(); timeLineView.Draw(); } } } mDelNames.Clear(); } GUILayout.EndScrollView(); Rect viewRect = GUILayoutUtility.GetLastRect(); leftBarWidth = (int)GameEditorUtility.DragableHandle(4819283, viewRect, leftBarWidth, GameEditorUtility.DragDirection.Horizontal); }
private void DrawTextureSettings() { CurActionData = this.host.CurActionData; if (CurActionData == null) { return; } GUI.color = Color.white; BeginHeader("动作设置"); string changedName = EditorGUILayout.TextField("动作名", CurActionData.name).Trim(); if (changedName != CurActionData.name && changedName.Length > 0) { CurActionData.name = changedName; HandleUtility.Repaint(); } float fps = EditorGUILayout.FloatField("帧率", CurActionData.fps); if (fps > 0) { CurActionData.fps = fps; } float clipTime = CurActionData.FrameList.Length / fps; float newClipTime = EditorGUILayout.FloatField("时长", clipTime); if (newClipTime > 0 && newClipTime != clipTime) { CurActionData.fps = CurActionData.FrameList.Length / newClipTime; } EndHeader(); BeginHeader("图集设置"); if (SpriteAnimationData.SpriteAtlasData != null) { string atlasName = SpriteAnimationData.SpriteAtlasData.name; EditorGUILayout.LabelField("图集名", atlasName); int iwidth = 256; int iheight = 256; Rect rect = GUILayoutUtility.GetRect(iwidth, iheight, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); TextureGrid.Draw(rect); GameEditorUtility.DrawOutline(rect, Color.gray); if (CurTexture != null) { iwidth = (int)rect.width; iheight = (int)rect.height; if (CurTexture.width / CurTexture.height >= iwidth / iheight) { if (CurTexture.width > iwidth) { rect.width = iwidth; rect.height = (CurTexture.height * iwidth) / CurTexture.width; } else { rect.width = CurTexture.width; rect.height = CurTexture.height; } } else { if (CurTexture.height > iheight) { rect.height = iheight; rect.width = (CurTexture.width * iheight) / CurTexture.height; } else { rect.width = CurTexture.width; rect.height = CurTexture.height; } } rect.x += (iwidth - rect.width) / 2; rect.y += (iheight - rect.height) / 2; GUI.DrawTexture(rect, CurTexture); } GUILayout.Space(1); spriteListScroll = GUILayout.BeginScrollView(spriteListScroll, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); for (int i = 0; i < SpriteAnimationData.SpriteAtlasData.spriteDataList.Length; i++) { SpriteAtlasData.SpriteData spriteData = SpriteAnimationData.SpriteAtlasData.spriteDataList[i]; if (spriteData == null) { continue; } bool highlight = selection == spriteData; GUI.backgroundColor = highlight ? Color.green : new Color(0.8f, 0.8f, 0.8f); GUILayout.BeginHorizontal("AS TextArea", GUILayout.MinHeight(20f)); GUI.backgroundColor = Color.white; GUILayout.Label(i.ToString(), GUILayout.Width(24f)); if (GUILayout.Button(spriteData.name, "OL TextField", GUILayout.Height(20f))) { selection = spriteData; } GUI.backgroundColor = Color.green; if (GUILayout.Button("<+", GUILayout.Width(26f))) { selection = spriteData; host.timeLineView.InsertFrame(selection.name, -1); } if (GUILayout.Button("+>", GUILayout.Width(26f))) { selection = spriteData; host.timeLineView.InsertFrame(selection.name, +1); } if (selection != null) { CurTexture = this.host.GetTexture(selection.name); } else { CurTexture = null; } HandleUtility.Repaint(); GUI.backgroundColor = Color.white; GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); } else { GUILayout.Label("请先创建图集,在创建动画!"); } EndHeader(); }