美文网首页unityUnityEditorUnity编辑器开发分享
Unity3d 使用代码在脚本同级目录下创建文件夹

Unity3d 使用代码在脚本同级目录下创建文件夹

作者: 雨落随风 | 来源:发表于2018-09-06 23:02 被阅读63次

    需求

    Unity3d编辑器脚本时而不时会有数据持久化需求,换句话说就是怎么保存配置啦,怎么保存数据先不谈,但我们都知道,想要自己写的工具不污染整个工程的结构,往往我们需要将配置文件跟工具脚本整一起,无论如何都要在一起。
    于是,“在指定脚本的同级目录下动态创建文件夹”的需求就这样应运而生啦!

    代码

    简单的描述完这个需求的使用场景,下面我们直接上代码:

    using System.IO;
    using System.Linq;
    #if UNITY_EDITOR
    using ADB = UnityEditor.AssetDatabase;
    #endif
    
    public static class FolderMaker  {
    
        /// <summary>
        /// 编辑器下使用,给定一个类的对象,在这个类的同级目录下创建文件夹并返回路径
        /// </summary>
        /// <typeparam name="T">类</typeparam>
        /// <param name="script">对象</param>
        /// <param name="subPath">指定要创建的文件夹的名称</param>
        /// <returns>文件夹的相对路径,相对于Assets文件夹</returns>
        public static string Creat<T>(T script, string subPath) where T : UnityEngine.Object //class  
        {
            string newPath = "";
    #if UNITY_EDITOR
                string path = ADB.FindAssets("t:Script")
                    .Where(v => Path.GetFileNameWithoutExtension(ADB.GUIDToAssetPath(v)) == script.GetType().Name)
                    .Select(id => ADB.GUIDToAssetPath(id))
                    .FirstOrDefault()
                    .ToString();
            newPath = path.Remove(path.LastIndexOf("/") + 1, Path.GetFileName(path).Length) + subPath;
            if (!ADB.IsValidFolder(newPath))
            {
                newPath = ADB.GUIDToAssetPath(ADB.CreateFolder(path, subPath));
            }
    #else
            return newPath;
    #endif
            return newPath;
        }
    }
    
    

    Tips:

    1. using的使用:AssetDatabase 这个类用的简直不要太频繁,使用using ADB = UnityEditor.AssetDatabase;给他取个别名“ADB”。
    2. 预编译指令的使用:预编译指令是必不可少的,如果这个脚本处于Editor文件夹下,继承MonoBehavior的类将无法访问。挪出来就挺不错,但此时如不使用预编译指令,打包便会报错~
    3. 泛型的使用:泛型的使用使得逻辑复用,同时也能类型安全,where T:UnityEngine.Object 限制了使用环境是Unity,如果限制仅仅为 class ,嗯,随便一个字符串就能打发第一个参数,当然运行也就得不到我们想要的结果,报错呢,也肯定是要报的了。
    4. 实现思路,就是轮番使用UnityEditor下的API,查找到这个脚本,拿到脚本所在的目录拼接并创建新的目录。

    使用

    使用没什么要说的,调用一下这个方法就好了,譬如:

    using UnityEngine;
    public class Car : MonoBehaviour
    {
        private void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                Debug.Log(FolderMaker.Creat(this,"HAHA"+Random.Range(1,150)));
            }
        }
    }
    

    动画

    1. 在上面的动画中,每一次点击鼠标左键便会创建一个文件夹,文件夹名称以“HAHA”开头加上一串随机数。
    2. 另外,笔者在Unity播放状态拖拽并移动了Car这个脚本的位置,但事实上不建议大家这么做。
    3. 其实,这个解决方案只是为了实现编辑器脚本配置文件自动跟随而作,动图演示的貌似用处不大。

    总结

    这是一个简单的笔记,希望遇到有需要的人~

    相关文章

      网友评论

      本文标题:Unity3d 使用代码在脚本同级目录下创建文件夹

      本文链接:https://www.haomeiwen.com/subject/cvifgftx.html