Newer
Older
Dreamsturbia-Project-IADE-Unity3D / Assets / Editor / AIGraphWindow.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
using System.IO;
using UnityEditor.UIElements;

public class AIGraphWindow : EditorWindow
{
    public FSMSave saveFile;
    public string rootDirectory;
    FSMGraphView graphView;
    Button saveButton;
    [MenuItem("Window/FSM Graph")]
    static void Init()
    {
        AIGraphWindow window = (AIGraphWindow)GetWindow<AIGraphWindow>("FSM Graph");
        window.Show();
    }

    private void OnEnable()
    {

        // AddGraphView();

        AddGraphView();
    }

    private void AddGraphView()
    {
        graphView = new FSMGraphView();
        graphView.instance = this;
        graphView.StretchToParentSize();
        
        rootVisualElement.Add(graphView);

        AddToolbar();
    }

    private void OnGUI()
    {
        // graphView.OnGUI();
        /*   if (saveFile == null)
           {
               if (GUILayout.Button("Create FSM"))
               {
                   string path = EditorUtility.OpenFolderPanel("Choose save folder", Application.dataPath, string.Empty);
                   string localPath = Path.Combine("Assets", Path.GetRelativePath(Application.dataPath, path));
                   rootDirectory = localPath;

                   if (path != string.Empty)
                   {
                       if (!Directory.Exists(Path.Combine(localPath, "States")))
                       {
                           AssetDatabase.CreateFolder(localPath, "States");
                       }
                       if (!Directory.Exists(Path.Combine(localPath, "Transitions")))
                       {
                           AssetDatabase.CreateFolder(localPath, "Transitions");
                       }

                       if (!File.Exists(Path.Combine(localPath, "Nodes.asset")))
                       {

                           FSMSave sv = ScriptableObject.CreateInstance<FSMSave>();
                           if (sv.states == null)
                           {
                               sv.states = new List<FSMSave.SavedElement>();
                           }
                           AssetDatabase.CreateAsset(sv, Path.Combine(localPath, "Nodes.asset"));
                       }

                   }

               }
               if (GUILayout.Button("Load FSM"))
               {
                   string path = EditorUtility.OpenFilePanel("Choose save file", Application.dataPath, string.Empty);
                   if (path != string.Empty)
                   {
                       string localPath = Path.Combine("Assets", Path.GetRelativePath(Application.dataPath, path));

                       rootDirectory = Path.GetDirectoryName(localPath);

                       saveFile = AssetDatabase.LoadAssetAtPath<FSMSave>(localPath);

                       AddGraphView();
                       AddToolbar();

                       graphView.Load(saveFile);
                   }

               }
           }
        */

        if (saveButton != null)
        {
            if (saveFile == null)
            {
                saveButton.visible = false;
            } else
            {
                saveButton.visible = true;
            }

        }

    }

    public void CreateFSM()
    {
        string path = EditorUtility.OpenFolderPanel("Choose save folder", Application.dataPath, string.Empty);
        if (path == string.Empty) return;
        string localPath = Path.Combine("Assets", Path.GetRelativePath(Application.dataPath, path));
        rootDirectory = localPath;

        if (path != string.Empty)
        {
            if (!Directory.Exists(Path.Combine(localPath, "States")))
            {
                AssetDatabase.CreateFolder(localPath, "States");
            }
            if (!Directory.Exists(Path.Combine(localPath, "Transitions")))
            {
                AssetDatabase.CreateFolder(localPath, "Transitions");
            }

            if (!File.Exists(Path.Combine(localPath, "Nodes.asset")))
            {

                FSMSave sv = ScriptableObject.CreateInstance<FSMSave>();
                if (sv.states == null)
                {
                    sv.states = new List<FSMSave.SavedElement>();
                }
                AssetDatabase.CreateAsset(sv, Path.Combine(localPath, "Nodes.asset"));

                saveFile = sv;
                graphView.Load(sv);

            }

            

        }
    }


    public void LoadFSM()
    {
        string path = EditorUtility.OpenFilePanel("Choose save file", Application.dataPath, string.Empty);
        if (path != string.Empty)
        {
            string localPath = Path.Combine("Assets", Path.GetRelativePath(Application.dataPath, path));

            rootDirectory = Path.GetDirectoryName(localPath);

            saveFile = AssetDatabase.LoadAssetAtPath<FSMSave>(localPath);

      
            graphView.Load(saveFile);
        }


    }

    void AddToolbar()
    {
        Toolbar toolbar = new Toolbar();

        Label t = new Label(rootDirectory);
        

        saveButton = new Button(() =>
        {

            graphView.Save();
            t.text = rootDirectory;

        });
        saveButton.text = "Save";

        Button newFSMButton = new Button(() =>
        {

            CreateFSM();
            t.text = rootDirectory;
        });
        newFSMButton.text = "New";



        Button loadButton = new Button(() =>
        {
            LoadFSM();
            t.text = rootDirectory;
        });
        loadButton.text = "Load";

        Button editTransitionButton = new Button(()=> {
            TransitionEditorWindow.Init(graphView.OpenTransitions());


        });
        editTransitionButton.text = "Edit Selected Transition";


        toolbar.Add(t);
        toolbar.Add(saveButton);
        toolbar.Add(loadButton);
        toolbar.Add(newFSMButton);
        toolbar.Add(editTransitionButton);


        rootVisualElement.Add(toolbar);
    }
}