예제 #1
0
        public static void CreateNewGraph(string graphName)
        {
            EngineGraph currentGraph = (EngineGraph)ScriptableObject.CreateInstance <EngineGraph>();

            if (currentGraph != null)
            {
                currentGraph.graphName = graphName;
                currentGraph.Initialize();

                string path = "Assets/Paradox Engine/Graph/Resources/Data/" + graphName + ".asset";
                AssetDatabase.CreateAsset(currentGraph, path);
                EngineGraphCacheUtilities.SaveSessionCache(path);

                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();

                EngineGraphWindow currentWindow = (EngineGraphWindow)EditorWindow.GetWindow <EngineGraphWindow>();

                if (currentWindow != null)
                {
                    currentWindow.currentGraph = currentGraph;
                }

                CreateNode(currentWindow.currentGraph, EnumNodeType.Start, new Vector2(104, 136));
                CreateNode(currentWindow.currentGraph, EnumNodeType.End, new Vector2(307, 136));
            }
            else
            {
                EditorUtility.DisplayDialog("Paradox Engine", "Graph creation failed.", "OK");
            }
        }
예제 #2
0
        public static void LoadSession(EngineGraph graph)
        {
            var currentWindow = (EngineGraphWindow)EditorWindow.GetWindow <EngineGraphWindow>();

            if (currentWindow != null)
            {
                graph.selectedNode         = null;
                currentWindow.currentGraph = graph;
            }
        }
예제 #3
0
        public static void DisconnectOutput(EngineGraph graph, int nodeID)
        {
            if (graph.nodes[nodeID] != null)
            {
                if (graph.nodes[nodeID].nodeType == EnumNodeType.Branch_Question)
                {
                    NQuestionBranch multiNode = (NQuestionBranch)graph.nodes[nodeID];

                    if (multiNode.multiOutput.hasSomething)
                    {
                        for (int i = 0; i < multiNode.multiOutput.outputNode.Count; i++)
                        {
                            multiNode.multiOutput.outputNode[i].input.inputNode.Remove(multiNode);

                            multiNode.multiOutput.outputNode[i].input.hasSomething = multiNode.multiOutput.outputNode[i].input.inputNode.Count > 0 ? true : false;
                        }

                        multiNode.multiOutput.outputNode   = new List <NTemplate>();
                        multiNode.multiOutput.hasSomething = false;
                    }
                }

                else if (graph.nodes[nodeID].nodeType == EnumNodeType.Branch_Condition)
                {
                    NConditionalBranch multiNode = (NConditionalBranch)graph.nodes[nodeID];

                    if (multiNode.multiOutput.hasSomething)
                    {
                        for (int i = 0; i < multiNode.multiOutput.outputNode.Count; i++)
                        {
                            multiNode.multiOutput.outputNode[i].input.inputNode.Remove(multiNode);

                            multiNode.multiOutput.outputNode[i].input.hasSomething = multiNode.multiOutput.outputNode[i].input.inputNode.Count > 0 ? true : false;
                        }

                        multiNode.multiOutput.outputNode   = new List <NTemplate>();
                        multiNode.multiOutput.hasSomething = false;
                    }
                }

                else
                {
                    if (graph.nodes[nodeID].output.outputNode != null)
                    {
                        graph.nodes[nodeID].output.outputNode.input.inputNode.Remove(graph.nodes[nodeID]);
                        graph.nodes[nodeID].output.outputNode.input.hasSomething = graph.nodes[nodeID].output.outputNode.input.inputNode.Count > 0 ? true : false;

                        graph.nodes[nodeID].output.outputNode = null;
                        graph.nodes[nodeID].output.isOccupied = false;
                    }
                }
            }
        }
        public static void TranslateGraph(EngineGraph graph, LocalizationManager manager)
        {
            IEnumerable <NTemplate> nodes = graph.nodes.Where(x => x.nodeType == Utilities.EnumNodeType.Answer || x.nodeType == Utilities.EnumNodeType.Text);

            NText   textTemplate;
            NAnswer answerTemplate;

            foreach (var node in nodes)
            {
                if (node.nodeType == Utilities.EnumNodeType.Text)
                {
                    textTemplate      = (NText)node;
                    textTemplate.data = manager.GetTextNodeTranslation(node.GetLocalizationID());
                }

                else
                {
                    answerTemplate        = (NAnswer)node;
                    answerTemplate.answer = manager.GetAnswerNodeTranslation(node.GetLocalizationID());
                }
            }
        }
예제 #5
0
        public static void DisconnectInput(EngineGraph graph, int nodeID)
        {
            if (graph.nodes[nodeID] != null)
            {
                if (graph.nodes[nodeID].nodeType == EnumNodeType.Answer)
                {
                    for (int i = 0; i < graph.nodes[nodeID].input.inputNode.Count; i++)
                    {
                        NQuestionBranch questionNode = (NQuestionBranch)graph.nodes[nodeID].input.inputNode[i];

                        questionNode.multiOutput.outputNode.RemoveAt(questionNode.multiOutput.outputNode.IndexOf(graph.nodes[nodeID]));
                        questionNode.multiOutput.hasSomething = questionNode.multiOutput.outputNode.Count == 0 ? false : true;
                    }
                }

                else if (graph.nodes[nodeID].nodeType == EnumNodeType.Condition)
                {
                    for (int i = 0; i < graph.nodes[nodeID].input.inputNode.Count; i++)
                    {
                        NConditionalBranch conditionNode = (NConditionalBranch)graph.nodes[nodeID].input.inputNode[i];

                        conditionNode.multiOutput.outputNode.RemoveAt(conditionNode.multiOutput.outputNode.IndexOf(graph.nodes[nodeID]));
                        conditionNode.multiOutput.hasSomething = conditionNode.multiOutput.outputNode.Count == 0 ? false : true;
                    }
                }

                else
                {
                    for (int i = 0; i < graph.nodes[nodeID].input.inputNode.Count; i++)
                    {
                        graph.nodes[nodeID].input.inputNode[i].output.outputNode = null;
                        graph.nodes[nodeID].input.inputNode[i].output.isOccupied = false;
                    }
                }

                graph.nodes[nodeID].input.inputNode    = new List <NTemplate>();
                graph.nodes[nodeID].input.hasSomething = false;
            }
        }
예제 #6
0
        public static void LoadSession(string graphPath, bool cache = false)
        {
            EngineGraph currentGraph = null;

            if (graphPath != "")
            {
                string finalPath = graphPath;

                if (!cache)
                {
                    int appPathLen = Application.dataPath.Length;
                    finalPath = graphPath.Substring(appPathLen - 6);
                }

                currentGraph = (EngineGraph)AssetDatabase.LoadAssetAtPath(finalPath, typeof(EngineGraph));

                if (currentGraph != null)
                {
                    EngineGraphWindow currentWindow = (EngineGraphWindow)EditorWindow.GetWindow <EngineGraphWindow>();

                    if (currentWindow != null)
                    {
                        if (!cache)
                        {
                            EngineGraphCacheUtilities.SaveSessionCache(finalPath);
                        }

                        currentWindow.currentGraph = currentGraph;
                    }
                }
                else
                {
                    EditorUtility.DisplayDialog("Paradox Engine", "Graph load failed.", "OK");
                }

                currentGraph.selectedNode = null;
            }
        }
        public void BakeGraph()
        {
            var nodes = _graphToAdd.nodes.Where(x => x.nodeType == EnumNodeType.Answer || x.nodeType == EnumNodeType.Text);

            bool alreadyArchived = _objectNames.Any(x => x == _graphToAdd.graphName);

            if (!alreadyArchived)
            {
                _objectNames.Add(_graphToAdd.graphName);
            }
            else
            {
                Debug.Log("Paradox Engine: Added all the nodes not archived in the data.");
            }


            NText   textNode;
            NAnswer answerNode;

            foreach (var node in nodes)
            {
                if (_cacheData.Any(x => new Guid(x.id).Equals(node.GetLocalizationID())))
                {
                    Debug.Log($"The node {node.name}: InstanceID: {node.GetInstanceID()} is not added, because already exist someone with the same ID.");
                    return;
                }

                if (node.nodeType == EnumNodeType.Text)
                {
                    textNode = (NText)node;

                    var textData = new ParadoxTextNodeLocalizationData();
                    textData.id   = textNode.GetLocalizationID().ToByteArray();
                    textData.data = textNode.data;
                    EditorUtility.SetDirty(textNode);


                    _cacheData.Add(textData);
                }

                else
                {
                    answerNode = (NAnswer)node;

                    var answerData = new ParadoxAnswerNodeLocalizationData();
                    answerData.id   = answerNode.GetLocalizationID().ToByteArray();
                    answerData.data = answerNode.answer;
                    EditorUtility.SetDirty(answerNode);

                    _cacheData.Add(answerData);
                }
            }

            _graphToAdd  = null;
            _addingGraph = false;

            _endElement = _cacheData.Count - (_endElement + 5) <= 0 ? _cacheData.Count : _endElement + 5;
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();

            Repaint();
        }
        private void DataView()
        {
            GUILayout.Label($"Start: {_startElement}, End: {_endElement}");

            EditorGUILayout.BeginVertical();
            _pos = EditorGUILayout.BeginScrollView(_pos, GUILayout.Width(_width));

            if (_cacheData == null || !_cacheData.Any())
            {
                GUILayout.BeginVertical("BOX");

                GUILayout.Label("The Language data don't have any data.");

                GUILayout.EndVertical();
            }

            else
            {
                if (_cacheData.Count > 5)
                {
                    GUILayout.BeginHorizontal();

                    if (_startElement > 0)
                    {
                        if (GUILayout.Button("<< Previous"))
                        {
                            _endElement    = _endElement < _cacheData.Count ? _endElement - 5 : _startElement;
                            _startElement -= 5;
                        }
                    }

                    GUILayout.FlexibleSpace();

                    if (_endElement < _cacheData.Count)
                    {
                        if (GUILayout.Button("Next >>"))
                        {
                            _startElement += 5;
                            _endElement    = _cacheData.Count - (_endElement + 5) <= 0 ? _cacheData.Count : _endElement + 5;
                        }
                    }

                    GUILayout.EndHorizontal();
                }

                GUILayout.Space(10);

                string names = string.Empty;

                for (int i = 0; i < _objectNames.Count; i++)
                {
                    names += i == _objectNames.Count ? $"{_objectNames[i]}.": $"{_objectNames[i]}, ";
                }

                GUILayout.BeginVertical("BOX");
                GUILayout.Label($"Objects baked: {names}", _description);
                GUILayout.EndVertical();

                ParadoxAnswerNodeLocalizationData answerData;
                ParadoxTextNodeLocalizationData   textData;
                ParadoxDropdownLocalizationData   dropdownData;
                ParadoxTextLocalizationData       simpleData;


                for (int i = _startElement; i < _endElement; i++)
                {
                    GUILayout.BeginVertical("BOX");

                    GUILayout.Label($"ID: {new Guid(_cacheData[i].id).ToString()}");

                    if (_cacheData[i].filterType == ELanguageGraphFilter.AnswerNode)
                    {
                        answerData      = (ParadoxAnswerNodeLocalizationData)_cacheData[i];
                        answerData.data = GUILayout.TextField(answerData.data);
                    }

                    else if (_cacheData[i].filterType == ELanguageGraphFilter.TextNode)
                    {
                        textData = (ParadoxTextNodeLocalizationData)_cacheData[i];

                        GUILayout.BeginVertical("BOX");
                        ParadoxTextNodeData nodeData;

                        for (int x = 0; x < textData.data.Count; x++)
                        {
                            nodeData = textData.data[x];

                            if (nodeData.IsDialogue)
                            {
                                GUILayout.Label(textData.data[x].Character.name);
                            }

                            nodeData.Text    = GUILayout.TextArea(nodeData.Text);
                            textData.data[x] = nodeData;

                            GUILayout.Space(2);
                        }

                        GUILayout.EndVertical();
                    }

                    else if (_cacheData[i].filterType == ELanguageGraphFilter.Dropdown)
                    {
                        dropdownData = (ParadoxDropdownLocalizationData)_cacheData[i];

                        for (int y = 0; y < dropdownData.data.Length; y++)
                        {
                            dropdownData.data[y] = GUILayout.TextField(dropdownData.data[y]);
                            GUILayout.Space(2);
                        }
                    }

                    else
                    {
                        simpleData = (ParadoxTextLocalizationData)_cacheData[i];

                        GUILayout.BeginHorizontal();

                        GUILayout.Label("Text:");
                        simpleData.data = GUILayout.TextField(simpleData.data);

                        GUILayout.EndHorizontal();
                    }

                    if (GUILayout.Button("Unsuscribe data"))
                    {
                        int tempI = i;
                        OnRepaint += () => _cacheData.RemoveAt(tempI);
                    }

                    GUILayout.EndVertical();

                    GUILayout.Space(5);
                }
            }

            GUILayout.Space(10);

            if (_addingGraph)
            {
                GUILayout.Label("Graph:");
                _graphToAdd = (EngineGraph)EditorGUILayout.ObjectField(_graphToAdd, typeof(EngineGraph), false);


                GUILayout.BeginHorizontal("BOX");

                if (GUILayout.Button("Bake graph data"))
                {
                    if (_graphToAdd == null)
                    {
                        Debug.Log("Paradox Engine: The graph field can't be null.");
                        return;
                    }

                    BakeGraph();
                }

                if (GUILayout.Button("Cancel"))
                {
                    _graphToAdd  = null;
                    _addingGraph = false;
                }

                GUILayout.EndHorizontal();
            }

            else if (_addingText)
            {
                GUILayout.Label("Text component:");
                _textToAdd = (TextLocalizationSetter)EditorGUILayout.ObjectField(_textToAdd, typeof(TextLocalizationSetter), true);

                GUILayout.BeginHorizontal("BOX");

                if (GUILayout.Button("Bake text data"))
                {
                    if (_textToAdd == null)
                    {
                        Debug.Log("Paradox Engine: The text field can't be null.");
                        return;
                    }

                    if (_cacheData.Any(x => new Guid(x.id).Equals(_textToAdd.GetLocalizationID())))
                    {
                        Debug.LogError("Paradox Engine: The text is already in the data.");
                        return;
                    }

                    BakeText();
                }

                if (GUILayout.Button("Bake all"))
                {
                    var temp = GameObject.FindObjectsOfType <TextLocalizationSetter>().ToList();

                    for (int i = 0; i < temp.Count; i++)
                    {
                        if (_cacheData.Any(x => new Guid(x.id).Equals(temp[i].GetLocalizationID())))
                        {
                            Debug.LogError("Paradox Engine: The text is already in the data.");
                            continue;
                        }

                        BakeText(temp[i]);
                    }
                }

                if (GUILayout.Button("Cancel"))
                {
                    _textToAdd  = null;
                    _addingText = false;
                }

                GUILayout.EndHorizontal();
            }

            else if (_addingDropdown)
            {
                GUILayout.Label("Dropdown component:");
                _dropwdownToAdd = (DropdownLocalizationSetter)EditorGUILayout.ObjectField(_dropwdownToAdd, typeof(DropdownLocalizationSetter), true);

                GUILayout.BeginHorizontal("BOX");

                if (GUILayout.Button("Bake dropdown data"))
                {
                    if (_dropwdownToAdd == null)
                    {
                        Debug.Log("Paradox Engine: The text field can't be null.");
                        return;
                    }

                    if (_cacheData.Any(x => new Guid(x.id).Equals(_dropwdownToAdd.GetLocalizationID())))
                    {
                        Debug.LogError("Paradox Engine: The dropdown is already in the data.");
                        return;
                    }

                    BakeDropDown();
                }

                if (GUILayout.Button("Bake all"))
                {
                    var temp = GameObject.FindObjectsOfType <DropdownLocalizationSetter>().ToList();

                    for (int i = 0; i < temp.Count; i++)
                    {
                        if (_cacheData.Any(x => new Guid(x.id).Equals(temp[i].GetLocalizationID())))
                        {
                            Debug.LogError("Paradox Engine: The dropdown is already in the data.");
                            continue;
                        }

                        BakeDropDown(temp[i]);
                    }
                }

                if (GUILayout.Button("Cancel"))
                {
                    _dropwdownToAdd = null;
                    _addingDropdown = false;
                }

                GUILayout.EndHorizontal();
            }

            else
            {
                if (GUILayout.Button("Add Graph"))
                {
                    _addingGraph = true;
                }

                GUILayout.Space(5);

                if (GUILayout.Button("Add Text component"))
                {
                    _addingText = true;
                }

                GUILayout.Space(5);

                if (GUILayout.Button("Add Dropddown component"))
                {
                    _addingDropdown = true;
                }
            }

            EditorGUILayout.EndScrollView();
            EditorGUILayout.EndVertical();

            OnRepaint();
            OnRepaint = delegate { };
        }
예제 #9
0
        public static void DrawGrid(Rect viewRect, float gridSpacing, float gridOpacity, Color gridColor, EngineGraph currentGraph)
        {
            int widthDivs  = Mathf.CeilToInt(10000 / gridSpacing);
            int heightDivs = Mathf.CeilToInt(10000 / gridSpacing);

            Vector2 offset = Vector2.zero;

            if (currentGraph != null)
            {
                offset = currentGraph.offset;
            }

            Handles.BeginGUI();
            Handles.color = new Color(gridColor.r, gridColor.g, gridColor.b, gridOpacity);

            for (int x = -widthDivs; x < widthDivs; x++)
            {
                Handles.DrawLine(new Vector3((gridSpacing * x) + offset.x, 0, 0), new Vector3((gridSpacing * x) + offset.x, viewRect.height, 0));
            }

            for (int y = -heightDivs; y < heightDivs; y++)
            {
                Handles.DrawLine(new Vector3(0, (gridSpacing * y) + offset.y, 0), new Vector3(viewRect.width, (gridSpacing * y) + offset.y, 0));
            }

            Handles.EndGUI();
        }
예제 #10
0
 public static void DisconnectAll(EngineGraph graph, int nodeID)
 {
     DisconnectInput(graph, nodeID);
     DisconnectOutput(graph, nodeID);
 }
예제 #11
0
        public static void DeleteNode(EngineGraph graph, int nodeID)
        {
            if (graph.nodes.Count <= nodeID)
            {
                return;
            }

            NTemplate deleteNode = graph.nodes[nodeID];

            if (deleteNode == null)
            {
                return;
            }

            if (deleteNode.nodeType == EnumNodeType.Answer)
            {
                for (int i = 0; i < deleteNode.input.inputNode.Count; i++)
                {
                    NQuestionBranch questionNode = (NQuestionBranch)deleteNode.input.inputNode[i];

                    questionNode.multiOutput.outputNode.Remove(graph.nodes[nodeID]);
                    questionNode.multiOutput.hasSomething = questionNode.multiOutput.outputNode.Count == 0 ? false : true;
                }
            }

            else
            {
                for (int i = 0; i < deleteNode.input.inputNode.Count; i++)
                {
                    deleteNode.input.inputNode[i].output.outputNode = null;
                    deleteNode.input.inputNode[i].output.isOccupied = false;
                }
            }

            if (deleteNode.nodeType == EnumNodeType.Branch_Question)
            {
                NQuestionBranch questionNode = (NQuestionBranch)deleteNode;

                for (int i = 0; i < questionNode.multiOutput.outputNode.Count; i++)
                {
                    questionNode.multiOutput.outputNode[i].input.inputNode.Remove(questionNode);
                    questionNode.multiOutput.outputNode[i].input.hasSomething = questionNode.multiOutput.outputNode[i].input.inputNode.Count > 0 ? true : false;
                }
            }

            else if (deleteNode.nodeType == EnumNodeType.Branch_Condition)
            {
                NConditionalBranch conditionalNode = (NConditionalBranch)deleteNode;

                for (int i = 0; i < conditionalNode.multiOutput.outputNode.Count; i++)
                {
                    conditionalNode.multiOutput.outputNode[i].input.inputNode.Remove(conditionalNode);
                    conditionalNode.multiOutput.outputNode[i].input.hasSomething = conditionalNode.multiOutput.outputNode[i].input.inputNode.Count > 0 ? true : false;
                }
            }

            else
            {
                if (deleteNode.output.outputNode != null)
                {
                    deleteNode.output.outputNode.input.inputNode.Remove(deleteNode);
                    deleteNode.output.outputNode.input.hasSomething = deleteNode.output.outputNode.input.inputNode.Count > 0 ? true : false;
                }
            }

            graph.nodes.RemoveAt(nodeID);
            GameObject.DestroyImmediate(deleteNode, true);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
예제 #12
0
        public static void CreateNode(EngineGraph currentGraph, EnumNodeType nodeType, Vector2 mousePos)
        {
            if (currentGraph != null)
            {
                NTemplate currentNode = null;
                switch (nodeType)
                {
                case EnumNodeType.Text:
                    currentNode          = (NText)ScriptableObject.CreateInstance <NText>();
                    currentNode.nodeName = "Text State";
                    break;

                case EnumNodeType.Branch_Condition:
                    currentNode          = (NConditionalBranch)ScriptableObject.CreateInstance <NConditionalBranch>();
                    currentNode.nodeName = "Conditional Branch State";
                    break;

                case EnumNodeType.Condition:
                    currentNode          = (NCondition)ScriptableObject.CreateInstance <NCondition>();
                    currentNode.nodeName = "Condition State";
                    break;

                case EnumNodeType.Branch_Question:
                    currentNode          = (NQuestionBranch)ScriptableObject.CreateInstance <NQuestionBranch>();
                    currentNode.nodeName = "Question Branch State";
                    break;

                case EnumNodeType.Answer:
                    currentNode          = (NAnswer)ScriptableObject.CreateInstance <NAnswer>();
                    currentNode.nodeName = "Answer State";
                    break;

                case EnumNodeType.Delay:
                    currentNode          = (NDelay)ScriptableObject.CreateInstance <NDelay>();
                    currentNode.nodeName = "Delay State";
                    break;

                case EnumNodeType.Start:
                    currentNode          = (NStart)ScriptableObject.CreateInstance <NStart>();
                    currentNode.nodeName = "Start State";
                    break;

                case EnumNodeType.End:
                    currentNode          = (NEnd)ScriptableObject.CreateInstance <NEnd>();
                    currentNode.nodeName = "End State";
                    break;

                case EnumNodeType.Clear:
                    currentNode          = (NClearText)ScriptableObject.CreateInstance <NClearText>();
                    currentNode.nodeName = "Clear Text State";
                    break;

                case EnumNodeType.Change_Flow_Chart:
                    currentNode          = (NChangeFlowChart)ScriptableObject.CreateInstance <NChangeFlowChart>();
                    currentNode.nodeName = "Change Flow Chart State";
                    break;

                case EnumNodeType.Set_Param:
                    currentNode          = (NSetParam)ScriptableObject.CreateInstance <NSetParam>();
                    currentNode.nodeName = "Set Parameter State";
                    break;

                case EnumNodeType.Play_Music:
                    currentNode          = (NPlayMusic)ScriptableObject.CreateInstance <NPlayMusic>();
                    currentNode.nodeName = "Play Music State";
                    break;

                case EnumNodeType.Stop_Music:
                    currentNode          = (NStopMusic)ScriptableObject.CreateInstance <NStopMusic>();
                    currentNode.nodeName = "Stop Music State";
                    break;

                case EnumNodeType.Play_Sound:
                    currentNode          = (NPlaySound)ScriptableObject.CreateInstance <NPlaySound>();
                    currentNode.nodeName = "Play Sound FX State";
                    break;

                case EnumNodeType.Stop_Sound:
                    currentNode          = (NStopSound)ScriptableObject.CreateInstance <NStopSound>();
                    currentNode.nodeName = "Stop Sound FX State";
                    break;

                case EnumNodeType.Play_Voice:
                    currentNode          = (NPlayVoice)ScriptableObject.CreateInstance <NPlayVoice>();
                    currentNode.nodeName = "Play Voice State";
                    break;

                case EnumNodeType.Stop_Voice:
                    currentNode          = (NStopVoice)ScriptableObject.CreateInstance <NStopVoice>();
                    currentNode.nodeName = "Stop Voice State";
                    break;

                case EnumNodeType.Hide_Text_Container:
                    currentNode          = (NHideTextContainer)ScriptableObject.CreateInstance <NHideTextContainer>();
                    currentNode.nodeName = "Hide Text Container State";
                    break;

                case EnumNodeType.Show_Text_Container:
                    currentNode          = (NShowTextContainer)ScriptableObject.CreateInstance <NShowTextContainer>();
                    currentNode.nodeName = "Show Text Container State";
                    break;

                case EnumNodeType.Change_Background:
                    currentNode          = (NChangeBackground)ScriptableObject.CreateInstance <NChangeBackground>();
                    currentNode.nodeName = "Change Background State";
                    break;

                case EnumNodeType.Show_Character:
                    currentNode          = (NShowCharacter)ScriptableObject.CreateInstance <NShowCharacter>();
                    currentNode.nodeName = "Show Character State";
                    break;

                case EnumNodeType.Hide_Character:
                    currentNode          = (NHideCharacter)ScriptableObject.CreateInstance <NHideCharacter>();
                    currentNode.nodeName = "Hide Character State";
                    break;

                case EnumNodeType.Change_Character_Sprite:
                    currentNode          = (NChangeCharacterSprite)ScriptableObject.CreateInstance <NChangeCharacterSprite>();
                    currentNode.nodeName = "Change Character Sprite State";
                    break;

                case EnumNodeType.Move_Character:
                    currentNode          = (NMoveCharacter)ScriptableObject.CreateInstance <NMoveCharacter>();
                    currentNode.nodeName = "Move Character State";
                    break;

                case EnumNodeType.Trigger_Event:
                    currentNode          = (NTriggerEvent)ScriptableObject.CreateInstance <NTriggerEvent>();
                    currentNode.nodeName = "Trigger Event State";
                    break;
                }

                if (currentNode != null)
                {
                    currentNode.name = currentNode.nodeName;
                    currentNode.InitNode();
                    currentNode.myRect.x    = mousePos.x;
                    currentNode.myRect.y    = mousePos.y;
                    currentNode.parentGraph = currentGraph;
                    currentGraph.nodes.Add(currentNode);

                    if (currentGraph.wantsConnection)
                    {
                        currentNode.CallConnection();
                    }

                    AssetDatabase.AddObjectToAsset(currentNode, currentGraph);
                    AssetDatabase.SaveAssets();
                    AssetDatabase.Refresh();
                }
            }
        }