unityUnityEditorUnity编辑器开发分享

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

2018-09-06  本文已影响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. 其实,这个解决方案只是为了实现编辑器脚本配置文件自动跟随而作,动图演示的貌似用处不大。

总结

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

上一篇下一篇

猜你喜欢

热点阅读