유니티/수업 내용

스크립터블 오브젝트 생성 툴

hyunjin-dev-log 2021. 12. 23. 16:56
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Linq;
using System.IO;
using UnityEditorInternal;

public class PrintFileNameEditor : EditorWindow
{
    private Object[] objs;
    public ReorderableList list;
    private string saveFileName;

    [MenuItem("Tools/PrintFileNameEditor")]
    static void OpenWindow()
    {
        GetWindow<PrintFileNameEditor>();
    }
    private void OnEnable()
    {    
        list = new ReorderableList(objs, typeof(Texture2D));
    }
    void OnGUI()
    {
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("reset")) {
            this.objs = null;
            this.saveFileName = "";
        }
        if (GUILayout.Button("build"))
        {
            string[] list = new string[this.objs.Length];
            int idx = 0;
            foreach (var obj in this.objs) {
                list[idx++] = obj.name;
            }

            ItemNameScriptableObject asset = ScriptableObject.CreateInstance<ItemNameScriptableObject>();
            if (string.IsNullOrEmpty(this.saveFileName)) {
                saveFileName = "ItemDataObj";
            }

            AssetDatabase.CreateAsset(asset, string.Format("Assets/ScriptableObjects/{0}.asset", this.saveFileName));
            AssetDatabase.SaveAssets();

            EditorUtility.FocusProjectWindow();

            Selection.activeObject = asset;
            asset.itemNames = list;
        }

        GUILayout.EndHorizontal();

        DragAndDrop.visualMode = DragAndDropVisualMode.Generic;
        
        if (Event.current.type == EventType.DragExited)
        {
            this.objs = DragAndDrop.objectReferences;
        }

        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("스크립터블 파일명 : ", GUILayout.Width(120));
        this.saveFileName = EditorGUILayout.TextField(this.saveFileName);
        EditorGUILayout.EndHorizontal();

        if (objs != null)
        {
            for (int i = 0; i < this.objs.Length; i++)
            {
                this.objs[i] = EditorGUILayout.ObjectField(this.objs[i], typeof(Texture2D), true);
                if (this.objs[i] == null) {
                    var list = this.objs.ToList();
                    list.Remove(this.objs[i]);
                    this.objs = list.ToArray();
                }
            }
        }
        EditorGUILayout.EndVertical();
    }


    private void OnSelectionChange()
    {
        try
        {
            var imgs = Selection.GetFiltered<Texture2D>(SelectionMode.Assets);
            Debug.Log(imgs.Count());
        }
        catch (IOException e1)
        {
            Debug.Log("하위 그림 파일을 찾을수 없습니다.");
        }
        catch (System.InvalidOperationException e2) {
            Debug.Log("게임 오브젝트는 선택 할수 없습니다.");
        }
     
    }
}