Exemplo n.º 1
0
    private void OnGUI()
    {
        CurrentSelected = Selection.activeGameObject;

        if (CurrentSelected == null)
        {
            EditorGUILayout.LabelField("Please Select Sequence Object!");
            return;
        }

        UIActionSequence current_seq = CurrentSelected.GetComponent <UIActionSequence>();

        if (current_seq == null)
        {
            return;
        }

        GUILayout.BeginHorizontal();

        fCurrentTimePos = EditorGUILayout.FloatField(fCurrentTimePos, GUILayout.Width(30), GUILayout.Height(20));

        if (bPreview)
        {
            ctrlTime.Speed = 1.0f;
            ctrlTime.Play();

            using (new BackgroundColorScope(Color.red))
                bPreview = GUILayout.Toggle(bPreview, bPreview ? "PreView" : "None", "button", GUILayout.Width(60), GUILayout.Height(20));
        }
        else
        {
            ctrlTime.Speed = 0.0f;
            ctrlTime.Stop();
            bPreview = GUILayout.Toggle(bPreview, bPreview ? "PreView" : "None", "button", GUILayout.Width(60), GUILayout.Height(20));
        }

        if (bPlay)
        {
            ctrlTime.Speed = 1.0f;
            ctrlTime.Play();

            using (new BackgroundColorScope(Color.red))
                bPlay = GUILayout.Toggle(bPlay, bPlay ? "Playing" : "Stop", "button", GUILayout.Width(60), GUILayout.Height(20));
        }
        else
        {
            ctrlTime.Speed = 0.0f;
            ctrlTime.Stop();

            bPlay = GUILayout.Toggle(bPlay, bPlay ? "Playing" : "Stop", "button", GUILayout.Width(60), GUILayout.Height(20));
        }

        GUILayout.EndHorizontal();

        //선택된 시퀸스 오브젝트의 계층정보 보는곳
        EditorGUILayout.BeginHorizontal();
        vScrollPos = EditorGUILayout.BeginScrollView(vScrollPos, false, true, GUILayout.Width(200));

        for (int i = 0; i < current_seq.Actions.Count; ++i)
        {
            var act = current_seq.Actions[i];
            EditorGUILayout.SelectableLabel(act.gameObject.name, GUILayout.Height(20));

            var have = act.gameObject.GetComponents <UIActionBaseInfo>();
            EditorGUI.indentLevel++;
            for (int j = 0; j < have.Length; ++j)
            {
                var child = have[j];
                EditorGUILayout.SelectableLabel(child.GetType().ToString(), GUILayout.Height(20));
            }
            EditorGUI.indentLevel--;
        }

        EditorGUILayout.EndScrollView();

        vTimeLineScrollPos = EditorGUILayout.BeginScrollView(vTimeLineScrollPos, true, true);
        EditorGUILayout.BeginVertical();
        GUILayout.Space(10.0f);

        fCurrentTimePos = GUILayout.HorizontalSlider(fCurrentTimePos, fMinTimePos, fMaxTimePos, "box", "box", GUILayout.Height(2000), GUILayout.ExpandWidth(true));

        ctrlTime.SetMinMaxTime(fMinTimePos, fMaxTimePos);

        var timeLen    = ctrlTime.MaxTime - ctrlTime.MinTime;
        var gridline   = timeLen * 10.0f;
        var sliderRect = new Rect(0.0f, 10.0f, 1400.0f - 200.0f, 2000.0f);

        for (int i = 0; i < gridline + 1; ++i)
        {
            float cur = (timeLen / gridline * i);
            var   x   = GetXFromIdx(i, sliderRect.width, gridline);

            if (i < gridline)
            {
                Handles.DrawLine(new Vector2(sliderRect.x + x, sliderRect.y), new Vector2(sliderRect.x + x, sliderRect.y + sliderRect.height));
            }

            if (cur % 1.0f == 0 && i != 0)
            {
                Handles.Label(new Vector2(sliderRect.x + x - 5.0f, sliderRect.y - 10.0f), cur.ToString("0"));
            }
        }

        for (int i = 0; i < current_seq.Actions.Count; ++i)
        {
            var   act   = current_seq.Actions[i];
            var   have  = act.gameObject.GetComponents <UIActionBaseInfo>();
            float sizey = (20.0f * have.Length) + 30.0f;

            for (int j = 0; j < have.Length; ++j)
            {
                var child = have[j];
                //딜레이부터 총 길이만큼 그려줘야함
                float x    = GetXFromTime(child.Delay, sliderRect.width, gridline);
                float y    = 20.0f + 20.0f * j + sizey * i;
                float w    = GetXFromTime(child.During, sliderRect.width, gridline);
                Rect  area = new Rect(new Vector2(sliderRect.x + x, sliderRect.y + y), new Vector2(w - 5.0f, 5.0f));

                Handles.DrawLine(new Vector2(sliderRect.x + x, sliderRect.y + y), new Vector2(sliderRect.x + x + w, sliderRect.y + y));
                //재생 방식과 반복 횟수에 따라 사각형 길이가 달라짐.
                //기본은 한블럭
                //반복 재생은 횟수만큼 추가로 더 그려준다. (-1 : 무한대)의 경우 그냥 길게 쭉 그려주면됨
                //기본을 제외하고 나머지는 during*2만큼 길어진게 한블럭
                Color colSolid   = new Color(0.5f, 0.5f, 0.5f);
                Color colOutLine = Color.red;
                int   loop       = child.MaxLoop == -1 ? 99999 : child.MaxLoop;

                switch (child.LoopType)
                {
                case UIActionBaseInfo.UIActionLoopType.UIActionLoop_Looping:
                    colOutLine = Color.green;
                    area.width = w * loop;
                    break;

                case UIActionBaseInfo.UIActionLoopType.UIActionLoop_Pingpong:
                    colOutLine = Color.blue;
                    area.width = (w * 2.0f) * loop;
                    break;
                }

                Handles.DrawSolidRectangleWithOutline(area, colSolid, colOutLine);

                if (bPreview || bPlay)
                {
                    child.IsStart = true;
                    float real_start = fCurrentTimePos - child.Delay;

                    if (real_start >= 0.0f)
                    {
                        child.SetCurrentTimePosition(real_start);
                    }
                }
                else
                {
                    child.ReSet();
                }
            }
        }

        EditorGUILayout.EndVertical();

        EditorGUILayout.EndScrollView();

        EditorGUILayout.EndHorizontal();
    }