突然发现unity可以将类直接保存在本地,可以用作某些设置的配置信息。而且选中这个文件,可以在unity编辑器Inspector中看到,常见的int,string,list都可以直接实例化出来,非常方便。因此我就直接拿来试验一下。
首先,创建一个.asset文件,网上文章一大把,但是其中8成的人都只直接复制别人的。我这里也简单说一下,直接上代码。
public class ShaderReplaceData : ScriptableObject
{
public List<string> whiteList = new List<string>();
public List<string> blackList = new List<string>();
}
要保存的类,需要继承ScriptableObject,然后里面就可以随便搞了,不过写完后要在编辑器界面看看,能不能显示出来,能显示出来最好,不能显示出来,例如Dictionary 类型就不行了。
可以直接在编辑器上编辑数据,非常方便。
创建也很简单
void GetAssetData()
{
srData = AssetDatabase.LoadAssetAtPath<ShaderReplaceData>(infoPath);
if (srData == null)
{
srData = ScriptableObject.CreateInstance<ShaderReplaceData>();
Debug.Log("new ShaderReplaceData");
}
Debug.Log("get data over");
}
文件直接使用AssetDatabase.LoadAssetAtPath加载文件然后把类实例出来,如果是第一次,没有这个文件,就使用ScriptableObject.CreateInstance实例化这个数据类。
接下来是保存这个文件,注意,网上大部分都告诉你是第一次保存这个文件,是没有问题的,但是第二次保存就出问题了,编辑器会报错的。先看代码
AssetDatabase.CreateAsset(data, infoPath);
data是你的类,infoPath是一个string类型的地址,这样就保存了,不过第二次保存就会报错,要这样修改一下就好了。
void SaveAssetData()
{
ShaderReplaceData data = ScriptableObject.CreateInstance<ShaderReplaceData>();
data.blackList = srData.blackList;
data.whiteList = srData.whiteList;
AssetDatabase.DeleteAsset(infoPath);
AssetDatabase.CreateAsset(data, infoPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log(infoPath + " save over");
}
在保存这个文件前,要先删除掉旧的文件,我不知道怎么修改里面的内容,因此我采取了简单粗暴的方法,直接删除旧的,创建一份新的文件。但是删除旧文件后,直接的实例化后的数据类也没有了,必须在删除文件之前再弄个类,然后把数据给备份出来。这样删除后,创建新的.asset文件时,将之前备份好的数据写进去就ok了。
最后,还有一个坑,如果你之前一直好好的,然后关闭unity后,再次打开,发现这个.asset文件显示缺失script,你随便修改了几行代码,编译了一下脚本文件,发现这个.asset文件居然又好了,那就是掉坑里的。你创建的这个数据类型,必须单独的保存在一个cs文件中,且这个cs文件类名与文件名一致,还要与你的.asset文件名字一样,否则就会出这样的问题。这样要感谢一个大兄弟之前踩的坑。