コード例 #1
0
        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不会执行
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
ファイル: SceneGUIDrawer.cs プロジェクト: mengtest/XMLib.AM
        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));
                }
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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));
            }
        }
コード例 #6
0
ファイル: StateConfig.cs プロジェクト: mengtest/XMLib.AM
        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);
        }
コード例 #7
0
        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;
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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);
                }
            }
        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
        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();
        }
コード例 #12
0
        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 动作信息
        }
コード例 #13
0
        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();
        }