204 lines
7.7 KiB
C#
204 lines
7.7 KiB
C#
// /****************************************************
|
||
// 文件:ScriptableObjectCreator.cs
|
||
// 作者:张铮
|
||
// 邮箱:834207172@qq.com
|
||
// 日期:2022/3/7 18:24:58
|
||
// 功能:
|
||
// *****************************************************/
|
||
//
|
||
// using System;
|
||
// using System.Collections.Generic;
|
||
// using System.IO;
|
||
// using System.Linq;
|
||
// using EditorFramework;
|
||
// using Sirenix.OdinInspector.Editor;
|
||
// using Sirenix.Utilities;
|
||
// using Sirenix.Utilities.Editor;
|
||
// using UnityEditor;
|
||
// using UnityEngine;
|
||
// using WVDFramework;
|
||
//
|
||
// public class ScriptableObjectCreator : OdinMenuEditorWindow
|
||
// {
|
||
// [MenuItem("Utility/ScriptObject/创建",false,2)]
|
||
// //[MenuItem("Assets/Create Scriptable Object", priority = -1000)]
|
||
// private static void ShowDialog()
|
||
// {
|
||
// var path = "Assets";
|
||
// var obj = Selection.activeObject; //当前鼠标选中的 Object
|
||
// if (obj && AssetDatabase.Contains(obj))
|
||
// {
|
||
// path = AssetDatabase.GetAssetPath(obj);
|
||
// if (!Directory.Exists(path)) //主要用来判断所选的是文件还是文件夹
|
||
// {
|
||
// path = Path.GetDirectoryName(path); //如果是文件则获取对应文件夹的全名称
|
||
// }
|
||
// }
|
||
//
|
||
// //设置窗口对应属性
|
||
// var window = CreateInstance<ScriptableObjectCreator>();
|
||
// window.position = GUIHelper.GetEditorWindowRect().AlignCenter(800, 500); //设置窗口的宽和高
|
||
// window.titleContent = new GUIContent(path);
|
||
// window.targetFolder = path.Trim('/'); //避免出现 / 造成路径不对
|
||
// window.ShowUtility();
|
||
// }
|
||
//
|
||
// /// <summary>
|
||
// /// 获取继承 ScriptableObject 且不是Editor相关的所有自定义类(也就是自己编写的类)
|
||
// /// </summary>
|
||
// private static HashSet<Type> scriptableObjectTypes = AssemblyUtilities.GetTypes(AssemblyTypeFlags.CustomTypes)
|
||
// .Where(t =>
|
||
// t.IsClass &&
|
||
// typeof(ScriptableObject).IsAssignableFrom(t) &&
|
||
// !typeof(EditorWindow).IsAssignableFrom(t) &&
|
||
// !typeof(Editor).IsAssignableFrom(t) && t.GetCustomAttribute<ScriptableObjectEditorAttribute>() != null)
|
||
// .ToHashSet();
|
||
// /// <summary>
|
||
// /// 选中的 ScriptableObject(等待创建)
|
||
// /// </summary>
|
||
// private ScriptableObject previewObject;
|
||
//
|
||
// /// <summary>
|
||
// /// 创建 ScriptableObject 时文件存储的目标文件夹
|
||
// /// </summary>
|
||
// private string targetFolder;
|
||
//
|
||
// private Vector2 scroll;
|
||
//
|
||
// private Type SelectedType
|
||
// {
|
||
// get
|
||
// {
|
||
// var m = MenuTree.Selection.LastOrDefault(); //因为可以多选,所以返回选中的是一个列表,这里返回的是列表的最后一个Object
|
||
// return m == null ? null : m.Value as Type;
|
||
// }
|
||
// }
|
||
//
|
||
// protected override OdinMenuTree BuildMenuTree()
|
||
// {
|
||
// mFolderField = new FolderField();
|
||
// OdinMenuTree tree = new OdinMenuTree(false); //不支持多选
|
||
// MenuWidth = 300; //菜单的宽度
|
||
// WindowPadding = Vector4.zero;
|
||
// tree.Config.DrawSearchToolbar = true; //开启搜索状态
|
||
// tree.DefaultMenuStyle = OdinMenuStyle.TreeViewStyle; //菜单设置成树形模式
|
||
// //筛选所有非抽象的类 并获取对应的路径
|
||
// tree.AddRange(scriptableObjectTypes.Where(x => !x.IsAbstract), GetMenuPathForType).AddThumbnailIcons();
|
||
// tree.SortMenuItemsByName();
|
||
// tree.Selection.SelectionConfirmed += x =>
|
||
// {
|
||
// Debug.Log($"双击确认并创建:{x}");
|
||
// this.CreateAsset();
|
||
// };
|
||
// tree.Selection.SelectionChanged += e =>
|
||
// {
|
||
// //每当选择发生更改时发生进行回调2次,一次SelectionCleared 一次是ItemAdded
|
||
// if (this.previewObject && !AssetDatabase.Contains(this.previewObject))
|
||
// {
|
||
// DestroyImmediate(previewObject);
|
||
// }
|
||
//
|
||
// if (e != SelectionChangedType.ItemAdded)
|
||
// {
|
||
// return;
|
||
// }
|
||
//
|
||
// var t = SelectedType;
|
||
// if (t != null && !t.IsAbstract)
|
||
// {
|
||
// previewObject = CreateInstance(t) as ScriptableObject;
|
||
// }
|
||
// };
|
||
// return tree;
|
||
// }
|
||
//
|
||
// private string GetMenuPathForType(Type t)
|
||
// {
|
||
// if (t != null && scriptableObjectTypes.Contains(t))
|
||
// {
|
||
// var name = t.Name.Split('`').First()
|
||
// .SplitPascalCase(); //主要是为了去除泛型相关 例如:Sirenix.Utilities.GlobalConfig`1[Sirenix.Serialization.GlobalSerializationConfig]
|
||
// return GetMenuPathForType(t.BaseType) + "/" + name;
|
||
// }
|
||
//
|
||
// return "";
|
||
// }
|
||
//
|
||
// protected override IEnumerable<object> GetTargets()
|
||
// {
|
||
// yield return previewObject;
|
||
// }
|
||
//
|
||
// private FolderField mFolderField;
|
||
//
|
||
// // private void OnEnable()
|
||
// // {
|
||
// // mFolderField = new FolderField();
|
||
// // }
|
||
//
|
||
// private string filename = default;
|
||
//
|
||
// protected override void DrawEditor(int index)
|
||
// {
|
||
// //scroll 内容滑动条的XY坐标
|
||
// scroll = GUILayout.BeginScrollView(scroll);
|
||
// {
|
||
// base.DrawEditor(index);
|
||
// }
|
||
// GUILayout.EndScrollView();
|
||
//
|
||
// if (this.previewObject)
|
||
// {
|
||
// GUILayout.FlexibleSpace(); //插入一个空隙
|
||
// SirenixEditorGUI.HorizontalLineSeparator(5); //插入一个水平分割线
|
||
// GUILayout.BeginHorizontal();
|
||
// {
|
||
// GUILayout.Label("选择要创建到的路径");
|
||
// var rect = EditorGUILayout.GetControlRect(GUILayoutOptions.Height(20));
|
||
// mFolderField.OnGUI(rect);
|
||
// }
|
||
// GUILayout.EndHorizontal();
|
||
// SirenixEditorGUI.HorizontalLineSeparator(5); //插入一个水平分割线
|
||
// GUILayout.BeginHorizontal();
|
||
// {
|
||
// GUILayout.Label("请输入要创建的文件名字");
|
||
// filename = GUILayout.TextField(filename);
|
||
// GUILayout.Label(".asset", GUILayout.MaxWidth(40));
|
||
// }
|
||
// GUILayout.EndHorizontal();
|
||
//
|
||
// SirenixEditorGUI.HorizontalLineSeparator(5); //插入一个水平分割线
|
||
// if (GUILayout.Button("Create Asset", GUILayoutOptions.Height(30)))
|
||
// {
|
||
// if (mFolderField.Path == "Assets")
|
||
// {
|
||
// if (EditorUtility.DisplayDialog("创建", ".asset文件创建在Assets目录下,是否确定创建", "是", "否")) //显示对话框
|
||
// {
|
||
// CreateAsset();
|
||
// }
|
||
// }
|
||
// else
|
||
// {
|
||
// CreateAsset();
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
//
|
||
// private void CreateAsset()
|
||
// {
|
||
// if (previewObject)
|
||
// {
|
||
// if (filename == default)
|
||
// filename = MenuTree.Selection.First().Name.Replace(" ","");
|
||
// var dest = mFolderField.Path + filename + ".asset";
|
||
// dest = AssetDatabase.GenerateUniqueAssetPath(dest); //创建唯一路径 重名后缀 +1
|
||
// Debug.Log($"要创建的为{previewObject}");
|
||
// AssetDatabase.CreateAsset(previewObject, dest);
|
||
// AssetDatabase.SaveAssets();
|
||
// AssetDatabase.Refresh();
|
||
// Selection.activeObject = previewObject;
|
||
// EditorApplication.delayCall += Close; //如不需要创建后自动关闭可将本行注释
|
||
// }
|
||
// }
|
||
// } |