protected override void OnGUI(Rect rect) { FrameConfig configs = win.currentFrame; if (null == configs) { return; } bool lastStay = configs.stayBodyRange; GUILayout.BeginVertical(AEStyles.box); bool nextStay = EditorGUILayoutEx.DrawObject("保持上一帧", lastStay); GUILayout.EndVertical(); if (nextStay) { if (!lastStay) { configs.bodyRanges.Clear(); win.bodyRangeSelectIndex = -1; } } else { if (lastStay) {//从保持到非保持,则拷贝保持的范围到当前 win.CopyBodyRangeToCurrentFrameIfStay(); } win.bodyRangeSelectIndex = EditorGUILayoutEx.DrawList(configs.bodyRanges, win.bodyRangeSelectIndex, ref scrollPos, NewRange, ActionEditorUtility.RangeConfigDrawer); } configs.stayBodyRange = nextStay;//处理完之后再设置,否者CopyBodyRangeToCurrentFrameIfStay不会执行 }
private void InsertFrameTo(bool forward) { if (win.frameSelectIndex < 0) { EditorUtility.DisplayDialog("提示", "请选择一帧", "确定"); return; } FrameConfig frame = win.currentFrame; List <RangeConfig> attackRanges = setting.copyAttackRanges ? frame.attackRanges : null; List <RangeConfig> bodyRanges = setting.copyBodyRanges ? win.FindStayBodyRangeFromCurrent() : null; if (forward || win.frameSelectIndex < win.currentFrames.Count - 1) { int insertIndex = forward ? win.frameSelectIndex : win.frameSelectIndex + 1; for (int i = 0; i < setting.frameCnt; i++) { win.currentFrames.Insert(insertIndex, new FrameConfig(attackRanges, bodyRanges)); } if (forward) { win.frameSelectIndex += setting.frameCnt; } } else { AddFrameToEnd(); } }
public void OnSceneGUI(SceneView sceneView) { Matrix4x4 localToWorld = (Matrix4x4)win.actionMachine.localToWorldMatrix; FrameConfig config = win.currentFrame; if (config == null) { return; } if (config.attackRanges != null) { ProcessRanges(config.attackRanges, localToWorld, true, win.attackRangeSelectIndex, new Color(1, 0, 0, 0.25f)); } if (config.stayBodyRange) {//保持范围的时候,不可以设置 List <RangeConfig> bodyRanges = win.FindStayBodyRangeStartWith(win.frameSelectIndex); if (bodyRanges != null) { ProcessRanges(bodyRanges, localToWorld, false, -1, new Color(0, 0, 1, 0.25f)); } } else { if (config.bodyRanges != null) { ProcessRanges(config.bodyRanges, localToWorld, true, win.bodyRangeSelectIndex, new Color(0, 0, 1, 0.25f)); } } }
public List <RangeConfig> FindStayBodyRangeStartWith(int frameIndex, bool copyNew = false) { StateConfig state = currentState; FrameConfig config = state.GetBodyRangesFrame(frameIndex); List <RangeConfig> result = copyNew ? config?.CopyBodyRanges() : config?.bodyRanges; return(result); }
private void AddFrameToEnd() { List <RangeConfig> attackRanges = null; List <RangeConfig> bodyRanges = null; if (win.frameSelectIndex >= 0) { FrameConfig frame = win.currentFrame; attackRanges = setting.copyAttackRanges ? frame.attackRanges : null; bodyRanges = setting.copyBodyRanges ? win.FindStayBodyRangeFromCurrent() : null; } for (int i = 0; i < setting.frameCnt; i++) { win.currentFrames.Add(new FrameConfig(attackRanges, bodyRanges)); } }
public List <RangeConfig> GetBodyRanges(int frameIndex) { frameIndex %= frames.Count; FrameConfig config = frames[frameIndex]; while (config.stayBodyRange) { --frameIndex; if (frameIndex < 0) { return(null); } config = frames[frameIndex]; } return(config.bodyRanges); }
public void CopyBodyRangeToCurrentFrameIfStay() { FrameConfig config = currentFrame; if (config == null || !config.stayBodyRange) { return; } List <RangeConfig> target = FindStayBodyRangeStartWith(frameSelectIndex); if (target == null) { config.bodyRanges = new List <RangeConfig>(); return; } config.CopyBodyRangeFrom(target); config.stayBodyRange = false; }
public FrameConfig GetAttackRangesFrame(int frameIndex) { if (frames.Count == 0 || frameIndex < 0) { return(null); } frameIndex %= frames.Count; FrameConfig config = frames[frameIndex]; while (config.stayAttackRange) { --frameIndex; if (frameIndex < 0) { return(null); } config = frames[frameIndex]; } return(config); }
private void PasteRangeFrame() { if (win.frameSelectIndex < 0) { EditorUtility.DisplayDialog("提示", "请选择一帧", "确定"); return; } int maxCount = win.currentFrames?.Count ?? 0; if (setting.fromIndex > setting.toIndex || setting.fromIndex < 0 || setting.toIndex < 0 || setting.fromIndex >= maxCount || setting.toIndex >= maxCount) { EditorUtility.DisplayDialog("提示", $"开始应小于结束,且都大于零,小于最大帧数 {maxCount} ", "确定"); return; } FrameConfig frame = win.currentFrame; List <RangeConfig> attackRanges = setting.copyAttackRanges ? frame.CopyAttackRanges() : null;//拷贝一遍,防止修改的列表为当前被拷贝的列表 List <RangeConfig> bodyRanges = setting.copyBodyRanges ? win.FindStayBodyRangeFromCurrent(true) : null; for (int i = setting.fromIndex; i <= setting.toIndex; i++) { if (i == win.frameSelectIndex) {//自身不用拷贝,跳过 continue; } FrameConfig config = win.currentFrames[i]; if (setting.copyAttackRanges) { config.CopyAttackRangeFrom(attackRanges); } if (setting.copyBodyRanges) { config.CopyBodyRangeFrom(bodyRanges); } } }
public void CopyPrevFrame() { if (win.frameSelectIndex < 1) { EditorUtility.DisplayDialog("提示", "请选择有上一帧的一帧", "确定"); return; } int prevIndex = win.frameSelectIndex - 1; FrameConfig prevFrame = win.currentFrames[prevIndex]; List <RangeConfig> attackRanges = setting.copyAttackRanges ? prevFrame.attackRanges : null; List <RangeConfig> bodyRanges = setting.copyBodyRanges ? win.FindStayBodyRangeStartWith(prevIndex) : null; if (setting.copyAttackRanges) { win.currentFrame.CopyAttackRangeFrom(attackRanges); } if (setting.copyBodyRanges) { win.currentFrame.CopyBodyRangeFrom(bodyRanges); } }
private void DrawFrameTool() { GUILayout.BeginVertical(); GUILayout.Label("帧操作"); setting.frameCnt = EditorGUILayoutEx.DrawObject("帧数(N)", setting.frameCnt); if (GUILayout.Button("添加 N 帧到末尾")) { GUI.FocusControl(null); AddFrameToEnd(); } if (GUILayout.Button("向前插入 N 帧")) { GUI.FocusControl(null); InsertFrameTo(true); } if (GUILayout.Button("向后插入 N 帧")) { GUI.FocusControl(null); InsertFrameTo(false); } if (GUILayout.Button("删除选择帧")) { GUI.FocusControl(null); if (win.frameSelectIndex < 0) { EditorUtility.DisplayDialog("提示", "请选择一帧", "确定"); return; } if (win.frameSelectIndex >= 0) { win.currentFrames.RemoveAt(win.frameSelectIndex); } } if (GUILayout.Button("从上一帧拷贝")) { CopyPrevFrame(); } GUILayout.BeginHorizontal(); setting.fromIndex = EditorGUILayoutEx.DrawObject("开始", setting.fromIndex); setting.toIndex = EditorGUILayoutEx.DrawObject("结束", setting.toIndex); GUILayout.EndHorizontal(); if (GUILayout.Button("粘贴范围")) { PasteRangeFrame(); } if (GUILayout.Button("删除范围")) { DeleteRangeFrame(); } if (GUILayout.Button("设置使用上一帧范围")) { for (int i = setting.fromIndex; i <= setting.toIndex; i++) { FrameConfig config = win.currentFrames[i]; config.bodyRanges.Clear(); config.stayBodyRange = true; } } GUILayout.Space(4f); GUILayout.Label("操作选项"); win.setting.enableQuickKey = EditorGUILayoutEx.DrawObject("启用快捷键", win.setting.enableQuickKey); setting.copyAttackRanges = EditorGUILayoutEx.DrawObject("拷贝攻击范围", setting.copyAttackRanges); setting.copyBodyRanges = EditorGUILayoutEx.DrawObject("拷贝身体范围", setting.copyBodyRanges); win.setting.frameListViewRectHeight = EditorGUILayoutEx.DrawObject("帧视图高", win.setting.frameListViewRectHeight); win.setting.frameWidth = EditorGUILayoutEx.DrawObject("帧宽", win.setting.frameWidth); GUILayout.EndVertical(); }
private void DrawFrames(List <FrameConfig> frames, List <object> actions, Rect rect) { int frameCnt = frames.Count; float headWidth = 20f; float topHeight = 30f; float frameWidth = win.setting.frameWidth; float frameSpace = 4f; float actionHeight = 30f; float actionSpace = 4f; float actionOffset = 0f; float barSize = 16f; float viewHeight = rect.height - barSize - topHeight; float viewWidth = frameWidth * frameCnt; float minViewWidth = rect.width - barSize - headWidth; if (viewWidth < minViewWidth) { viewWidth = minViewWidth; } float actionsHeight = actionHeight * actions.Count; if (actionsHeight > viewHeight) { viewHeight = actionsHeight + actionHeight; } Rect framePosition = new Rect(rect.x + headWidth, rect.y, rect.width - headWidth - barSize, rect.height - barSize); Rect frameView = new Rect(framePosition.x, framePosition.y, viewWidth, rect.height - barSize); Rect actionIdPosition = new Rect(rect.x, rect.y + topHeight, headWidth, rect.height - barSize - topHeight); Rect actionIdView = new Rect(actionIdPosition.x, actionIdPosition.y, headWidth, viewHeight); Rect actionPosition = new Rect(rect.x + headWidth, rect.y + topHeight, rect.width - headWidth, rect.height - topHeight); Rect actionView = new Rect(actionPosition.x, actionPosition.y, viewWidth, viewHeight); Rect beginFrameRt = new Rect(frameView.x, frameView.y, frameWidth, frameView.height); Rect beginActionIdRect = new Rect(actionIdView.x, actionIdView.y, headWidth, actionHeight); Rect beginActionRt = new Rect(actionView.x, actionView.y, actionView.width, actionHeight); Rect beginActionBgRt = new Rect(actionView.x, actionView.y, actionView.width, actionHeight); Rect beginFrameBtnRt = beginFrameRt; beginFrameBtnRt.height = topHeight; Rect beginFrameBgRt = beginFrameRt; beginFrameBgRt.y += topHeight; beginFrameBgRt.height = frameView.height - topHeight; //----------------------------------------------------- #region 帧 GUI.BeginScrollView(framePosition, Vector2.right * actionViewScroll.x, frameView, GUIStyle.none, GUIStyle.none); for (int i = 0; i < frameCnt; i++) { Rect btnRt = beginFrameBtnRt; btnRt.x += frameWidth * i; btnRt.width -= frameSpace; Rect bgRt = beginFrameBgRt; bgRt.x += frameWidth * i; bgRt.width -= frameSpace; bool selected = win.frameSelectIndex == i; FrameConfig config = win.currentFrames[i]; string title = string.Format("{0}\n{1}|{2}", i, config.stayAttackRange ? "←" : (config.attackRanges?.Count ?? 0).ToString(), config.stayBodyRange ? "←" : (config.bodyRanges?.Count ?? 0).ToString()); if (GUI.Button(btnRt, title, selected ? AEStyles.item_head_select : AEStyles.item_head_normal)) { win.frameSelectIndex = selected ? -1 : i; } GUI.Box(bgRt, GUIContent.none, selected ? AEStyles.item_body_select : AEStyles.item_body_normal); } GUI.EndScrollView(); #endregion 帧 //----------------------------------------------------- #region 控制条 actionViewScroll = GUI.BeginScrollView(actionPosition, actionViewScroll, actionView, true, true); for (int i = 0; i < actions.Count; i++) { object action = actions[i]; int beginFrame = 0; int endFrame = frameCnt - 1; IHoldFrames holdFrames = action as IHoldFrames; if (holdFrames != null) { beginFrame = holdFrames.GetBeginFrame(); endFrame = holdFrames.GetEndFrame(); } //minmaxslider Rect rt = beginActionRt; rt.y += actionHeight * i + actionOffset; rt.height -= (actionSpace + actionOffset); bool selected = win.actionSelectIndex == i; float beginValue = beginFrame * frameWidth; float endValue = (endFrame + 1) * frameWidth - 2 * EditorGUIEx.minMaxThumbWidth - frameSpace; bool clicked = EditorGUIEx.MinMaxSlider(rt, ref beginValue, ref endValue, 0, viewWidth - 2 * EditorGUIEx.minMaxThumbWidth); if (clicked) { win.actionSelectIndex = selected ? -1 : i; } if (holdFrames != null) { if (holdFrames.EnableBeginEnd()) { //校验 beginFrame = Mathf.RoundToInt(beginValue / frameWidth); endFrame = Mathf.RoundToInt((endValue + 2 * EditorGUIEx.minMaxThumbWidth + frameSpace) / frameWidth - 1); beginFrame = Mathf.Clamp(beginFrame, 0, frameCnt - 1); endFrame = Mathf.Clamp(endFrame, 0, frameCnt - 1); if (endFrame < beginFrame) { endFrame = beginFrame; } // } else {//设置最大值 beginFrame = 0; endFrame = frameCnt - 1; } holdFrames.SetBeginFrame(beginFrame); holdFrames.SetEndFrame(endFrame); } } GUI.EndScrollView(); #endregion 控制条 //----------------------------------------------------- #region 动作序号 GUI.BeginScrollView(actionIdPosition, Vector2.up * actionViewScroll.y, actionIdView, GUIStyle.none, GUIStyle.none); for (int i = 0; i < actions.Count; i++) { Rect rt = beginActionIdRect; rt.y += actionHeight * i; rt.height -= actionSpace; bool selected = win.actionSelectIndex == i; if (GUI.Button(rt, $"{i}", selected ? AEStyles.item_head_select : AEStyles.item_head_normal)) { win.actionSelectIndex = selected ? -1 : i; } } GUI.EndScrollView(); #endregion 动作序号 //------------------------------------------- #region 动作信息 GUI.BeginScrollView(actionPosition, actionViewScroll, actionView, true, true); for (int i = 0; i < actions.Count; i++) { object action = actions[i]; //label Rect labelRt = beginActionBgRt; labelRt.y += actionHeight * i; labelRt.height -= actionSpace; labelRt.width = viewWidth; bool selected = win.actionSelectIndex == i; if (GUI.Button(labelRt, $"{action.ToString()}", AEStyles.frame_label)) { win.actionSelectIndex = selected ? -1 : i; } } GUI.EndScrollView(); #endregion 动作信息 }
private void OnWindowFunc(int id) { float buttonHeight = 40f; GUILayout.BeginHorizontal(); if (GUILayout.Button("上一帧(Alt+N)", GUILayout.Height(buttonHeight))) { LastFrame(); } if (GUILayout.Button("下一帧(N)", GUILayout.Height(buttonHeight))) { NextFrame(); } GUILayout.EndHorizontal(); if (GUILayout.Button("下一帧并拷贝上一帧(Ctrl+N)", GUILayout.Height(buttonHeight))) { NextFrameWithCopy(); } string title = win.setting.enableAllControl ? "关闭" : "启用"; if (GUILayout.Button($"{title}所有控制柄")) { win.setting.enableAllControl = !win.setting.enableAllControl; } if (!win.setting.enableAllControl) { GUILayout.BeginHorizontal(); if (GUILayout.Button("上一攻击框", GUILayout.Height(buttonHeight))) { LastAttackRange(); } if (GUILayout.Button("下一攻击框", GUILayout.Height(buttonHeight))) { NextAttackRange(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("上一身体框", GUILayout.Height(buttonHeight))) { LastBodyRange(); } if (GUILayout.Button("下一身体框", GUILayout.Height(buttonHeight))) { NextBodyRange(); } GUILayout.EndHorizontal(); } GUILayout.FlexibleSpace(); FrameConfig frameConfig = win.currentFrame; if (frameConfig != null && frameConfig.stayBodyRange) { EditorGUILayout.HelpBox("身体范围为保持状态,不可编辑", UnityEditor.MessageType.Warning); } GUI.DragWindow(); }