需求
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:
-
using的使用:AssetDatabase 这个类用的简直不要太频繁,使用
using ADB = UnityEditor.AssetDatabase;
给他取个别名“ADB”。 - 预编译指令的使用:预编译指令是必不可少的,如果这个脚本处于Editor文件夹下,继承MonoBehavior的类将无法访问。挪出来就挺不错,但此时如不使用预编译指令,打包便会报错~
- 泛型的使用:泛型的使用使得逻辑复用,同时也能类型安全,where T:UnityEngine.Object 限制了使用环境是Unity,如果限制仅仅为 class ,嗯,随便一个字符串就能打发第一个参数,当然运行也就得不到我们想要的结果,报错呢,也肯定是要报的了。
- 实现思路,就是轮番使用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)));
}
}
}
动画
- 在上面的动画中,每一次点击鼠标左键便会创建一个文件夹,文件夹名称以“HAHA”开头加上一串随机数。
- 另外,笔者在Unity播放状态拖拽并移动了Car这个脚本的位置,但事实上不建议大家这么做。
- 其实,这个解决方案只是为了实现编辑器脚本配置文件自动跟随而作,动图演示的貌似用处不大。
总结
这是一个简单的笔记,希望遇到有需要的人~
网友评论