今天写一个工具,查找一个脚本上对图片的引用,然后把图片的名字赋值到一个新的变量中,
当工具写好后,发现预设体上的图片名字变量还是为空,运行后,这个变量就有值了,当第二次运行就又为空,所以应该是修改的参数并没有保存到预设体上,只是临时赋值了,
各种查
有说使用if (GUI.changed) { EditorUtility.SetDirty(target); }
但是这个只能临时保存两次,运行两次后,仍然为空
找了很久终于找到了解决方法
使用EditorUtility.SetDirty(item.gameObject); AssetDatabase.SaveAssets();
这两个代码必须同时存在,
只有一行存在,仍然保存不了数据
[MenuItem("Assets/CheckSprite")]
static void CheckSprite()
{
if (GetSelectedAssetPath() == null) return;
GameObject go = GetSelectedAssetPath() as GameObject;//获取所选这的预设体
ItemAnim[] itemAnims = go.GetComponentsInChildren<ItemAnim>(true);//查找预设体以及子物体上的某个组件
//对预设it进行修改参数
foreach (var item in itemAnims)
{
int index = item.changeTextureImageArray1.Length;
item.changeTextureImageArray1Name.Clear();
if (index > 0)
{
for (int i = 0; i < index; i++)
{
GameDebugger.instance.GameDebugLog(item.gameObject.name);
item.changeTextureImageArray1Name.Add(item.changeTextureImageArray1[i].name);
GameDebugger.instance.GameDebugLog(item.changeTextureImageArray1[i].name);
}
//保存预设体所修改的参数,注意 这两行一定要有,否则无法保存预设的修改
EditorUtility.SetDirty(item.gameObject);
AssetDatabase.SaveAssets();
}
}
}
static UnityEngine.Object GetSelectedAssetPath()
{
var selected = Selection.activeObject;
if (selected == null)
{
return null;
}
GameDebugger.instance.GameDebugLog(selected.GetType());
if (selected is GameObject)
{
return selected;
}
else
{
return null;
}
}