示例#1
0
        public void SetData(ActionData actionData)
        {
            m_ActionData = actionData;
            if (m_ActionData.GetType().IsSubclassOf(typeof(DurationActionData)))
            {
                m_DurationActionData = (DurationActionData)m_ActionData;
            }
            m_DataDrawer = new ObjectDrawer("Action Data", m_ActionData);

            m_ActionBriefName = string.Empty;
            var nameAttrs = m_ActionData.GetType().GetCustomAttributes(typeof(ActionBriefName), false);

            if (nameAttrs != null && nameAttrs.Length > 0)
            {
                m_ActionBriefName = ((ActionBriefName)nameAttrs[0]).Name;
            }
        }
示例#2
0
        public void OnDrawGUI(Rect rect)
        {
            LineSetting setting = LineSetting.Setting;

            Rect itemRect = Rect.zero;

            itemRect.x      = Data.FireTime * setting.WidthForSecond - setting.ScrollPosX;
            itemRect.y      = rect.y;
            itemRect.height = setting.TracklineHeight;
            itemRect.width  = MIN_ACTION_WIDTH;

            DurationActionData durationActionData = null;

            if (Data is DurationActionData)
            {
                durationActionData = (DurationActionData)Data;

                itemRect.width = Mathf.Max(itemRect.width, durationActionData.DurationTime * setting.WidthForSecond);
            }
            else
            {
                itemRect.x -= itemRect.width * 0.5f;
            }
            GUI.Label(itemRect, BriefName, IsSelected ? "flow node 6" : "flow node 5");

            int       eventBtn   = Event.current.button;
            EventType eventType  = Event.current.type;
            bool      isContains = itemRect.Contains(Event.current.mousePosition);

            Rect leftRect  = new Rect(itemRect.x, itemRect.y, MIN_ACTION_WIDTH * 0.5f, itemRect.height);
            Rect rightRect = new Rect(itemRect.x + itemRect.width - MIN_ACTION_WIDTH * 0.5f, itemRect.y, MIN_ACTION_WIDTH * 0.5f, itemRect.height);

            bool isInLeftRect  = false;
            bool isInRightRect = false;

            if (durationActionData != null && !durationActionData.IsFixedDurationTime)
            {
                EGUI.DrawAreaLine(leftRect, Color.yellow);
                EGUI.DrawAreaLine(rightRect, Color.yellow);

                EditorGUIUtility.AddCursorRect(leftRect, MouseCursor.ResizeHorizontal);
                EditorGUIUtility.AddCursorRect(rightRect, MouseCursor.ResizeHorizontal);

                isInLeftRect  = leftRect.Contains(Event.current.mousePosition);
                isInRightRect = rightRect.Contains(Event.current.mousePosition);
            }

            if (eventBtn == 0)
            {
                if (eventType == EventType.MouseDown && isContains)
                {
                    if (durationActionData != null)
                    {
                        if (isInLeftRect)
                        {
                            dragType = ActionDragType.ItemLeft;
                        }
                        else if (isInRightRect)
                        {
                            dragType = ActionDragType.ItemRight;
                        }
                        else
                        {
                            dragType = ActionDragType.Item;
                        }
                    }
                    else
                    {
                        dragType = ActionDragType.Item;
                    }

                    IsSelected = true;
                    Event.current.Use();
                }
                else if (dragType != ActionDragType.None && eventType == EventType.MouseUp)
                {
                    dragType = ActionDragType.None;
                    Event.current.Use();
                }
                else if (dragType != ActionDragType.None && IsSelected && eventType == EventType.MouseDrag)
                {
                    Vector2 deltaPos  = Event.current.delta;
                    float   deltaTime = deltaPos.x / setting.WidthForSecond;
                    if (dragType == ActionDragType.ItemLeft)
                    {
                        if (Data.FireTime < durationActionData.DurationTime + Data.FireTime || deltaTime < 0)
                        {
                            Data.FireTime += deltaTime;
                            durationActionData.DurationTime -= deltaTime;
                        }
                    }
                    else if (dragType == ActionDragType.ItemRight)
                    {
                        durationActionData.DurationTime += deltaTime;
                    }
                    else if (dragType == ActionDragType.Item)
                    {
                        Data.FireTime += deltaTime;
                    }

                    float timeLength = ParentDrawer.ParentDrawer.Data.TimeLength;
                    if (Data.FireTime < 0)
                    {
                        Data.FireTime = 0;
                    }
                    else if (Data.FireTime > timeLength)
                    {
                        Data.FireTime = timeLength;
                    }

                    if (durationActionData != null)
                    {
                        durationActionData.DurationTime = Mathf.Max(0.0f, durationActionData.DurationTime);

                        float endTime = durationActionData.FireTime + durationActionData.DurationTime;
                        if (endTime > timeLength)
                        {
                            durationActionData.DurationTime = Mathf.Min(durationActionData.DurationTime, timeLength - durationActionData.FireTime);
                        }
                    }

                    Event.current.Use();
                }
            }
            else if (eventBtn == 1 && isContains && eventType == EventType.MouseUp)
            {
                IsSelected = true;

                GenericMenu menu = new GenericMenu();
                menu.AddItem(new GUIContent("Copy"), false, () =>
                {
                    string actionJson = JsonConvert.SerializeObject(Data, new JsonSerializerSettings()
                    {
                        TypeNameHandling = TypeNameHandling.All,
                    });
                    setting.CopiedActionData = actionJson;
                });
                menu.AddSeparator("");
                menu.AddItem(new GUIContent("Delete"), false, () =>
                {
                    ParentDrawer.OnActionDelete(this);
                });
                menu.ShowAsContext();

                Event.current.Use();
            }
        }