首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#/Unity无法将可编写脚本的对象保存到磁盘

C#/Unity无法将可编写脚本的对象保存到磁盘
EN

Stack Overflow用户
提问于 2021-07-29 13:23:00
回答 1查看 1.8K关注 0票数 0

以下是我的可编写脚本对象的代码:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace ModelManager
{
    [CreateAssetMenu(fileName = "New Texture Set", menuName = "Model Manager/New Texture Set")]

    public class TextureSetSO :  ScriptableObject
    {
        [SerializeField]
        public RaceModelSO race;
        public List<Textures> textures;
        private RaceModelSO _race;

        private void OnEnable()
        {
            _race = race;
        }

        private void OnValidate()
        {
            if (race != _race)
            {
                _race = race;
                textures.Clear();
                if (race)
                {
                    if (race.GetRaceBodySlots().Length != 0)
                    {
                        for (int i = 0; i < race.GetRaceBodySlots().Length; i++)
                        {
                            Textures textures = new Textures();
                            textures.raceSlot = race.GetRaceBodySlots()[i];
                            this.textures.Add(textures);
                        }
                    }
                }
            }
            EditorUtility.SetDirty(this);
            AssetDatabase.SaveAssets();
        }

        private void OnDestroy()
        {
            AssetDatabase.SaveAssets();
        }

        private void OnDisable()
        {
            AssetDatabase.SaveAssets();
        }
    }
    [Serializable]
    public class Textures
    {
        public RaceSlotSO raceSlot;
        public Texture normalMap;
        public Texture albedoMap;
        public Texture metalicMap;
        public Texture ambientOcullsionMap;
        public Texture emissionMap;
    }
}

每当我使用编辑器在List<Textures> textures中设置任何内容时,如果我关闭了统一,那么一切都会丢失。

为什么会这样呢?我如何保持变化时,密切和开放的团结?有办法把这些信息存储到磁盘上吗?

EN

回答 1

Stack Overflow用户

发布于 2021-07-29 15:22:11

你需要打电话给EditorUtility.SetDirty(scriptableObject)。尽管您似乎在 OnValidate 中调用了OnValidate,但是在从代码中修改变量时不会调用OnValidate。只有在通过检查器修改变量或撤消/重新执行先前的更改时才会调用它。

EditorUtility.SetDirty的一个替代方法是在修改ScriptableObject之前调用Undo.RecordObject(scriptableObject);此方法还允许撤消/重做更改。

你不需要在EditorUtility.SetDirty或AssetDatabase.SaveAssets的OnValidate里面打电话。您还不需要公共字段上的SerializeField属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68576738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档