简介
Unity保存数据的方式有很多,比如我们经常用的json,xml和Txt,笔者今天讲到的是另外一种保存方式,asset文件,这个是unity提供的一种新的保存数据的方式,笔者也是刚使用没多久,这里就不详细进行介绍了,笔者今天主要是介绍一键自动创建对应的asset文件。
代码
public class CreateAssetEditor
{
[MenuItem("Assets/Create/CreateAsset",false,81)]
public static void OnCreateAsset()
{
foreach (var guid in Selection.assetGUIDs)
{
var path = AssetDatabase.GUIDToAssetPath(guid);
var pathSplit = path.Split('/');
var className = pathSplit[pathSplit.Length - 1].Replace(".cs", "");
var classType = GetClassByClassName(className);
var assetPath = path.Replace(".cs", ".asset");
if (File.Exists(assetPath))
{
LBLogWrapper.Error("创建失败,资源已经存在");
}
else if (classType != null)
{
var classInst = ScriptableObject.CreateInstance(classType);
AssetDatabase.CreateAsset(classInst,assetPath);
}
else
{
LBLogWrapper.Error("创建失败,脚本不可创建");
}
}
}
[MenuItem("Assets/Create/CreateAsset",true)]
private static bool IsValidateFun()
{
return (from guid in Selection.assetGUIDs
select AssetDatabase.GUIDToAssetPath(guid)
into path
select path.Split('/')
into pathSplit
select pathSplit[pathSplit.Length - 1]).Any(className => className.Contains(".cs"));
}
/// <summary>
/// 通过类名获取对应的类
/// </summary>
/// <param name="className"></param>
/// <returns></returns>
private static Type GetClassByClassName(string className)
{
var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
return allAssemblies.SelectMany(assembly => assembly.GetTypes()).FirstOrDefault(type =>
type.Name == className && type.IsSubclassOf(typeof(ScriptableObject)));
}
}
脚本的原理很简单,就是获取当前选择的脚本,判断是否可以创建asset文件,如果可以就是通过类名获取对应的类对象和,这里需要注意的是,文件名字必须等于类名,然后通过类名获取对应的类型,就可以生成对应的asset文件了。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 841774407@qq.com