动态修改预设体上脚本的变量参数,保存所修改的数据,动态Apply预设体修改

今天写一个工具,查找一个脚本上对图片的引用,然后把图片的名字赋值到一个新的变量中,
当工具写好后,发现预设体上的图片名字变量还是为空,运行后,这个变量就有值了,当第二次运行就又为空,所以应该是修改的参数并没有保存到预设体上,只是临时赋值了,
各种查
有说使用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;
        }
    }

猜你喜欢

转载自blog.csdn.net/o_ojjj/article/details/123534125