以下是我的可编写脚本对象的代码:
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中设置任何内容时,如果我关闭了统一,那么一切都会丢失。
为什么会这样呢?我如何保持变化时,密切和开放的团结?有办法把这些信息存储到磁盘上吗?
发布于 2021-07-29 15:22:11
你需要打电话给EditorUtility.SetDirty(scriptableObject)。尽管您似乎在 OnValidate 中调用了OnValidate,但是在从代码中修改变量时不会调用OnValidate。只有在通过检查器修改变量或撤消/重新执行先前的更改时才会调用它。
EditorUtility.SetDirty的一个替代方法是在修改ScriptableObject之前调用Undo.RecordObject(scriptableObject);此方法还允许撤消/重做更改。
你不需要在EditorUtility.SetDirty或AssetDatabase.SaveAssets的OnValidate里面打电话。您还不需要公共字段上的SerializeField属性。
https://stackoverflow.com/questions/68576738
复制相似问题