Unity:播放后重置Singleton ScriptableObjects

问题描述

我有一个单例课程,其中包含有关我的游戏的一般信息。

public class GeneralGameData : ScriptableObject
{
    private static GeneralGameData _currentGeneralGameData;

    public static GeneralGameData CurrentGeneralGameData
    {
        get
        {
            if (_currentGeneralGameData == null)
            {
                _currentGeneralGameData = CreateInstance<GeneralGameData>();
            }

            DontDestroyOnLoad(_currentGeneralGameData);

            return _currentGeneralGameData;
        }
    }

    public string GameName;

    public string GameVersion;

}

这堂课没有礼物。

我还有一个窗口来显示和更改

 public class GeneralGameDataMenuItem : EditorWindow
{
    [MenuItem("CoreMaker/GeneralGameData")]
    private static void _generalGameData()
    {
        Getwindow<GeneralGameDataMenuItem>("GeneralGameData");
    }

    void OnGUI()
    {
        GeneralGameData.CurrentGeneralGameData.GameName = EditorGUILayout.TextField("GameName",GeneralGameData.CurrentGeneralGameData.GameName);
        GeneralGameData.CurrentGeneralGameData.GameVersion = EditorGUILayout.TextField("GameVersion",GeneralGameData.CurrentGeneralGameData.GameVersion);

        EditorUtility.SetDirty(GeneralGameData.CurrentGeneralGameData);
    }
}

问题在于,在我点击播放或重新启动单位后,它不会保存我的更改。 任何解决方案?

解决方法

ScriptableObject打算另存为资产。在[CreateAssetMenu(menuName = "MyGame/GeneralGameData")]类声明上方添加ScriptableObject行,然后在项目窗格中右键单击,单击Create > MyGame > GeneralGameData。填写您需要的所有字段。任何需要引用它的脚本都可以添加一个GeneralGameData类型的公共字段,并将该资产添加到检查器中。

,

这是基于Nailuj29s答案的固定代码,但是您不需要通过拥有公共字段来引用它,而是只需要使用GeneralGameData.CurrentGeneralGameData

公共类GeneralGameData:ScriptableObject { 私有静态GeneralGameData _currentGeneralGameData;

    public static GeneralGameData CurrentGeneralGameData
    {
        get
        {
            if (_currentGeneralGameData == null)
            {
                if (AssetDatabase.FindAssets("GeneralGameData",new []{ "Assets/CoreMaker" }).Length != 1)
                {
                    _currentGeneralGameData = CreateInstance<GeneralGameData>();

                    if (!AssetDatabase.IsValidFolder("Assets/CoreMaker"))
                    {
                        AssetDatabase.CreateFolder("Assets","CoreMaker");
                    }

                    AssetDatabase.CreateAsset(_currentGeneralGameData,"Assets/CoreMaker/GeneralGameData.asset");
                }
            }

            _currentGeneralGameData = AssetDatabase.LoadAssetAtPath<GeneralGameData>("Assets/CoreMaker/GeneralGameData.asset");

            return _currentGeneralGameData;
        }
    }

    public string GameName;
  

    public string GameVersion;
    
}

请记住,当您引用GeneralGameData.CurrentGeneralGameData时,它将创建和资产,如果删除该资产,则会丢失数据。