Ejemplo n.º 1
0
    void OnGUI()
    {
        if (old_type != current_type)
        {
            old_type = current_type;
            Saved();
            // Initial();
        }
        // ここで今のデータを表示する
        keyList = new List <int>(nodes[current_type].Keys);
        foreach (int key in keyList)
        {
            nodes[current_type][key].Update();
        }
        var ev = Event.current;

        if (ConnectorManager.HasCurrent && ev.type == EventType.mouseDown && ev.button == 1)
        {
            ConnectorManager.CancelConnecting();
        }
        ConnectorManager.Update();
    }
Ejemplo n.º 2
0
        //編集処理
        void Edit()
        {
            //userからの入力情報取得
            var currentEvent = Event.current;

            // graphAreaのサイズ
            graphAreaRect      = new Rect(sideAreaRect.xMax, sideAreaRect.yMin, position.width - sideAreaRect.xMax, position.height);
            MouseIsInGraphArea = graphAreaRect.Contains(currentEvent.mousePosition);
            //Debug.Log(GraphAreaRect);


            //---ノードグラフの描画---------------------------------------------------------------------------------------
            if (currentLayer != null)
            {
                //マウスの中央ボタンでノード全体をドラッグする
                if (currentEvent.type == EventType.MouseDrag && currentEvent.button == 2)
                {
                    foreach (var node in nodes.Values)
                    {
                        node.rect.position += currentEvent.delta;
                    }

                    //描画する
                    Repaint();
                }

                ConnectorManager.Update(Event.current.mousePosition);



                BeginWindows();
                foreach (var node in nodes.Values)
                {
                    node.Update();
                }
                EndWindows();


                // 決定中の接続がある場合は右クリックでキャンセル
                if (ConnectorManager.HasCurrent && currentEvent.type == EventType.MouseDown && currentEvent.button == 1)
                {
                    ConnectorManager.CancelConnecting();
                }

                if (ConnectorManager.HasCurrent)
                {
                    // 関連付けようとしている接続がある場合は描画する
                    Repaint();
                }
            }

            //----------------------------------------------------------------------------------------------------


            // --- Side Area -----------------------------------------------------------------------------------------------
            var sideAreaRectTemp = EditorGUILayout.BeginVertical("box", GUILayout.Width(200), GUILayout.Height(position.height - 6.0f));

            {
                // BeginVerticalの返り値でゼロのときがある. これは省く.
                if (sideAreaRectTemp.width != 0.0f && sideAreaRectTemp.height != 0.0f)
                {
                    sideAreaRect = sideAreaRectTemp;
                }
                //Debug.Log(sideAreaRect);


                //---レイヤーリスト--------------------------------------------------------------------------------

                EditorGUILayout.BeginVertical("box", GUILayout.ExpandHeight(true));

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("LayerList");

                GUI.enabled = !EditorApplication.isPlaying;
                if (GUILayout.Button("+", GUILayout.Width(30)))
                {
                    AddLayer(null);
                }
                GUI.enabled = true;
                EditorGUILayout.EndHorizontal();

                for (int i = 0; i < eventControllerUnderEditing.layerList.Count; i++)
                {
                    var layer = eventControllerUnderEditing.layerList[i];

                    EditorGUILayout.BeginHorizontal();

                    serializedCurrentEventCtrl.Update();
                    SerializedProperty serializedLayer = serializedCurrentLayerList.GetArrayElementAtIndex(i);
                    SerializedProperty textProperty    = serializedLayer.FindPropertyRelative("name");

                    //現在編集されているレイヤー名の前に'*'を表示
                    if (layer == currentLayer)
                    {
                        EditorGUILayout.LabelField("*", GUILayout.Width(10));
                    }

                    GUI.enabled = !EditorApplication.isPlaying;
                    textProperty.stringValue = EditorGUILayout.TextField(textProperty.stringValue);
                    GUI.enabled = true;

                    serializedCurrentEventCtrl.ApplyModifiedProperties();

                    if (GUILayout.Button("Select", GUILayout.Width(50)))
                    {
                        currentLayer = layer;
                        SetEditor();
                    }

                    GUI.enabled = !EditorApplication.isPlaying;
                    if (GUILayout.Button(string.Empty, GUILayout.Width(30)))
                    {
                        GenericMenu menu = new GenericMenu();
                        menu.AddItem(new GUIContent("Delete"), false, DeleteLayer, layer);
                        menu.ShowAsContext();
                    }
                    GUI.enabled = true;

                    EditorGUILayout.EndHorizontal();
                }

                EditorGUILayout.EndVertical();

                //レイヤーが選択されていない場合はここで終了する
                if (currentLayer == null)
                {
                    return;
                }

                //----------------------------------------------------------------------------------------

                //---ゲーム実行中-------------------------------------------------------------------------------------
                if (EditorApplication.isPlaying)
                {
                    if (currentLayer.currentEventNode != null && currentLayer.currentEventNode != currentEventNodePrev)
                    {
                        currentEventNodePrev = currentLayer.currentEventNode;

                        var node = FindNode(currentLayer.serializableEventNodeList[currentLayer.eventNodeList.IndexOf(currentLayer.currentEventNode)]);
                        NodeManager.running = node;
                        //if (currentLayer.currentEventNode.eventClip is IMessageableEventClip)
                        //{

                        //}
                    }

                    if (NodeManager.running != null)
                    {
                        if (NodeManager.running.eventNode.eventClip is IMessageableEventClip)
                        {
                            messageWindow.Position = new Vector2(NodeManager.running.rect.x, NodeManager.running.rect.y + NodeManager.running.rect.height + 10.0f);
                            messageWindow.message  = ((IMessageableEventClip)NodeManager.running.eventNode.eventClip).Message;
                            //Debug.Log(messageWindow.message);
                            messageWindow.Update();
                        }
                    }

                    Repaint();
                }

                // ゲーム実行中ではない場合
                else
                {
                    NodeManager.running = null;

                    //messageWindow.OnGUIEvent = null;
                }
                //-------------------------------------------------------------------------------------------------

                //---ノード詳細画面---------------------------------------------------------------------
                // ノードを作成するための左カラムを描画していく
                EditorGUILayout.BeginVertical("box", GUILayout.ExpandHeight(true));

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField(currentLayer.name);
                EditorGUILayout.EndHorizontal();

                //Game再生中は編集させない
                GUI.enabled = !EditorApplication.isPlaying;
                {
                    // テキストを表示するノードの作成
                    EditorGUILayout.BeginHorizontal();
                    inputEventClip = EditorGUILayout.ObjectField("EventClip(from GameObject)", inputEventClip, typeof(BaseEventClip), true, GUILayout.ExpandWidth(true)) as BaseEventClip;
                    //inputMonoScript = EditorGUILayout.ObjectField("EventClip", inputMonoScript, typeof(MonoScript), true, GUILayout.ExpandWidth(true)) as MonoScript;
                    if (GUILayout.Button("Create", GUILayout.Width(60)))
                    {
                        if (inputEventClip == null)
                        {
                            var eventNode = new SerializableEventNode(inputEventClip);

                            currentLayer.serializableEventNodeList.Add(eventNode);

                            var node = new TextNode(eventNode, NodeColor.Green);
                            nodes.Add(node.Id, node);

                            inputEventClip = null;
                        }
                        else if (inputEventClip.eventController == null)
                        {
                            inputEventClip.eventController = eventControllerUnderEditing;
                            //inputEventClip.layer = currentLayer;


                            var eventNode = new SerializableEventNode(inputEventClip);
                            eventNode.name = inputEventClip.gameObject.name;
                            currentLayer.serializableEventNodeList.Add(eventNode);

                            var node = new TextNode(eventNode, NodeColor.Green);
                            nodes.Add(node.Id, node);

                            inputEventClip = null;
                        }

                        // 対象のeventclipがすでに割り当てられているとき
                        else
                        {
                            ShowNotification(new GUIContent("This EventClip has already been assigned. "));
                        }
                    }

                    EditorGUILayout.EndHorizontal();

                    EditorGUILayout.BeginHorizontal();
                    inputMonoScript = EditorGUILayout.ObjectField("EventClip(from MonoScript)", inputMonoScript, typeof(MonoScript), true, GUILayout.ExpandWidth(true)) as MonoScript;
                    if (GUILayout.Button("Create", GUILayout.Width(60)))
                    {
                        //Debug.Log(inputMonoScript.GetClass());
                        if (inputMonoScript != null && inputMonoScript.GetClass() != null && inputMonoScript.GetClass().IsSubclassOf(typeof(BaseEventClip)))
                        {
                            var name = inputMonoScript.GetClass().Name;


                            //Debug.Log(name);
                            GameObject go = new GameObject();
                            go.transform.parent = eventControllerUnderEditing.transform;
                            go.name             = name;
                            Undo.AddComponent(go, inputMonoScript.GetClass());
                            Undo.RegisterCreatedObjectUndo(go, "Create Event Node( " + name + " )");

                            var eventNode = new SerializableEventNode(go.GetComponent <BaseEventClip>());
                            eventNode.eventClip.eventController = eventControllerUnderEditing;
                            //eventNode.eventClip.layer = currentLayer;

                            eventNode.name = name;
                            currentLayer.serializableEventNodeList.Add(eventNode);

                            var node = new TextNode(eventNode, NodeColor.Green);
                            nodes.Add(node.Id, node);
                            //inputMonoScript = null;
                        }
                        else
                        {
                            ShowNotification(new GUIContent("This is not EventClip."));
                        }



                        //var eventNode = new EventController.SerializableEventNode(inputEventClip);
                        //currentLayer.serializableEventNodeList.Add(eventNode);

                        //var node = new TextNode(eventNode, NodeColor.Green);
                        //nodes.Add(node.Id, node);
                        //inputEventClip = null;
                    }
                }
                GUI.enabled = true;

                EditorGUILayout.EndHorizontal();
                EditorGUILayout.Space();

                EditorGUILayout.EndVertical();


                EditorGUILayout.BeginVertical("box", GUILayout.ExpandHeight(true));
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Node");
                EditorGUILayout.EndHorizontal();

                var selectedNode = NodeManager.selected;

                // 前回のNodeと異なるとき
                if (selectedNode != selectedNodePrev)
                {
                    GUI.FocusControl("");



                    selectedNodePrev = selectedNode;
                }

                if (selectedNode != null)
                {
                    if (NodeManager.message == "Edit")
                    {
                        EditorGUILayout.BeginHorizontal();
                        selectedNode.eventNode.name = EditorGUILayout.TextField("Name", selectedNode.eventNode.name);
                        EditorGUILayout.EndHorizontal();


                        // 取り外し不可能なEventClipの場合は差し替えを許さない
                        if (selectedNode.eventNode.eventClip is IUndetachableEventClip)
                        {
                            GUI.enabled = false;
                        }
                        EditorGUILayout.BeginHorizontal();



                        // Nodeに割り当てるClipの選択
                        {
                            var nextEventClip = EditorGUILayout.ObjectField(
                                "EventClip", selectedNode.eventNode.eventClip, typeof(BaseEventClip), true, GUILayout.ExpandWidth(true)) as BaseEventClip;

                            // 前回のCLipと異なるとき
                            if (nextEventClip != selectedNode.eventNode.eventClip)
                            {
                                // NullからClip
                                if (selectedNode.eventNode.eventClip == null && nextEventClip != null)
                                {
                                    if (nextEventClip.eventController == null)
                                    {
                                        nextEventClip.eventController = eventControllerUnderEditing;
                                        //nextEventClip.layer = currentLayer;
                                        selectedNode.eventNode.eventClip = nextEventClip;
                                    }
                                    else
                                    {
                                        ShowNotification(new GUIContent("This EventClip has already been assigned. "));
                                    }
                                }

                                // Clipから別のClip
                                else if (selectedNode.eventNode.eventClip != null && nextEventClip != null)
                                {
                                    if (nextEventClip.eventController == null)
                                    {
                                        selectedNode.eventNode.eventClip.eventController = null;

                                        nextEventClip.eventController = eventControllerUnderEditing;
                                        //nextEventClip.layer = currentLayer;
                                        selectedNode.eventNode.eventClip = nextEventClip;
                                    }
                                    else
                                    {
                                        ShowNotification(new GUIContent("This EventClip has already been assigned. "));
                                    }
                                }

                                // ClipからNull
                                else if (selectedNode.eventNode.eventClip != null && nextEventClip == null)
                                {
                                    selectedNode.eventNode.eventClip.eventController = null;
                                    selectedNode.eventNode.eventClip = nextEventClip;
                                }
                            }
                        }
                        EditorGUILayout.EndHorizontal();
                        GUI.enabled = true;

                        //---EventClipのプロパティーを表示, 設定--------------------------------------------

                        //Game実行中でも編集可能
                        GUI.enabled = true;

                        eventClipSettingScroll = EditorGUILayout.BeginScrollView(eventClipSettingScroll);
                        selectedEventClip      = selectedNode.eventNode.eventClip;

                        if (selectedEventClip != null)
                        {
                            Selection.activeGameObject = selectedEventClip.gameObject;

                            //タイトル
                            //eventClipFoldout = EditorGUILayout.InspectorTitlebar(eventClipFoldout, selectedEventClip);

                            //SerializedObject target = null;
                            //SerializedProperty iterator = null;
                            //if (selectedEventClip != selectedEventClipPrev)
                            //{
                            //    target = new SerializedObject(selectedEventClip);
                            //    iterator = target.GetIterator();
                            //}

                            ////SerializedObjectとproperyが存在するとき
                            //if (target != null && iterator != null)
                            //{
                            //    if (eventClipFoldout && iterator.NextVisible(true))
                            //    {
                            //        EditorGUI.indentLevel++;

                            //        //再帰的にすべてのプロパティーを表示する
                            //        do
                            //        {
                            //            eventClipPropertyDrawer.DrawSerializedProperty(iterator);
                            //        }
                            //        while (iterator.NextVisible(false));

                            //        EditorGUI.indentLevel--;
                            //    }

                            //    //編集内容を保存
                            //    target.ApplyModifiedProperties();
                            //}
                        }
                        EditorGUILayout.EndScrollView();
                    }
                    else if (NodeManager.message == "Delete")
                    {
                        DeleteNode(selectedNode);
                        NodeManager.message = "(non)";
                        Repaint();
                    }
                }
                GUI.enabled = true;
                EditorGUILayout.EndVertical();
                //----------------------------------------------------------------------------

                //---パラメータ表示-----------------------------------------------------------

                EditorGUILayout.BeginVertical("box", GUILayout.ExpandHeight(true));

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Parameters");

                // Game実行中はパラメータの追加は認めない
                if (EditorApplication.isPlaying)
                {
                    GUI.enabled = false;
                }
                if (GUILayout.Button(string.Empty, GUILayout.Width(10)))
                {
                    GenericMenu menu = new GenericMenu();
                    menu.AddItem(new GUIContent("Add/Int"), false, AddInt, null);
                    menu.AddItem(new GUIContent("Add/Float"), false, AddFloat, null);
                    menu.AddItem(new GUIContent("Add/Bool"), false, AddBool, null);
                    menu.AddItem(new GUIContent("Add/Trigger"), false, AddTrigger, null);
                    menu.ShowAsContext();
                }
                GUI.enabled = true;


                EditorGUILayout.EndHorizontal();


                parameterListScroll = EditorGUILayout.BeginScrollView(parameterListScroll);

                UpdateEventCtrlParam();

                EditorGUILayout.EndScrollView();

                EditorGUILayout.EndVertical();
                // End パラメータ表示 -------------------------------------------------------------------------------------

                //---Conditions表示--------------------------------------------------------


                EditorGUILayout.BeginVertical("box", GUILayout.ExpandHeight(true));

                UpdateEventCtrlConditions();

                EditorGUILayout.EndVertical();
                //---------------------------------------------------------------------------
            }
            EditorGUILayout.EndVertical();
            // End SideArea ----------------


            //---グラフエリア内, 何もないところで右クリック選択解除-------------------------------------------------------------
            if (MouseIsInGraphArea && currentEvent.type == EventType.MouseDown && currentEvent.button == 0)
            {
                NodeManager.selected      = null;
                ConnectorManager.selected = null;



                GUI.FocusControl("");


                Repaint();
            }
            //-----------------------------------------------------------------------------------------------

            //EventControllerに変更適用
            UpdateEventCtrlNode();
        }