Я не могу поместить 4 целых и 2 двойных в файл сохранения - PullRequest
0 голосов
/ 17 июня 2019

Я новичок в единстве, но я знаю с ++, поэтому у меня есть некоторые основы. Я пытался сохранить эти переменные в течение 3 часов, и это всегда одна и та же ошибка, независимо от того, что я делаю:

«Исключение SerializationException: тип« UnityEngine.MonoBehaviour »в сборке« UnityEngine.CoreModule, версия = 0.0.0.0, культура = нейтральный, PublicKeyToken = null »не помечен как сериализуемый."

Я не понимаю почему, потому что класс помечен:

using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
using UnityEngine;

[System.Serializable()]
public class MoneyHandlerData : MonoBehaviour
{
    public int pickaxe = 0;
    public int nbDwarves = 1;

    public double moneyAccount = 10000;
    public double moneyPerSec = 500;

    public int bow = 0;
    public int nbElves = 0;
}

Вот класс, который я использую для сериализации:

using System.Collections;
using System.Collections.Generic; 
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary; 
using System.IO;
using UnityEngine;

public class SaveLoad : MonoBehaviour
{
    public MoneyHandlerData save;

    public void Saving()
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create (Application.persistentDataPath + "/save.mst");
        bf.Serialize(file, save); //Here's where the problem is
        file.Close();
        Debug.Log("Game saved");
    }

    public void Loading() 
    {
        if(File.Exists(Application.persistentDataPath + "/save.mst")) 
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/save.mst", 
                FileMode.Open);
            save = (MoneyHandlerData)bf.Deserialize(file);
            file.Close();
            Debug.Log("Game loaded");
        }
    }
}

А вот полное сообщение об ошибке:

SerializationException: Тип 'UnityEngine.MonoBehaviour' в сборке 'UnityEngine.CoreModule, версия = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null' не помечен как сериализуемый. System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (тип System.RuntimeType) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) System.Runtime.Serialization.FormatterServices + <> c__DisplayClass9_0.b__0 (System.Runtime.Serialization.MemberHolder _) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) System.Collections.Concurrent.ConcurrentDictionary'2 [TKey, TValue] .GetOrAdd (ключ TKey, System.Func'2 [T, TResult] valueFactory) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) System.Runtime.Serialization.FormatterServices.GetSerializableMembers (тип System.Type, контекст System.Runtime.Serialization.StreamingContext) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo () (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize (System.Object obj, System.Runtime.Serialization.ISurrogateSelector surrogateSelector, System.Runtime.Serialization. Преобразователь System.Runtime.Serialization.IFormatterConverter, объект System.Runtime.Serialization.Formatters.Binary.ObjectWriter, связыватель System.Runtime.Serialization.SerializationBinder) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize (System.Object obj, System.Runtime.Serialization.ISurrogateSelector surrogateSelector, System.Runtime. Преобразователь System.Runtime.Serialization.IFormatterConverter, объект System.Runtime.Serialization.Formatters.Binary.ObjectWriter, связыватель System.Runtime.Serialization.SerializationBinder) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize (граф System.Object, System.Runtime.Remoting.Messaging.Header [] inHeaders, System.Runtime.Serialization.Formatters.Binary .__ BinaryWriter serWriter, System.Boolean fCheck) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph, System.Runtime.Remoting.Messaging.Header [], System.Boolean fCheck) (в <1f0c1ef1ad524c38bbb55369: 0) System.Runtime.Serialization. System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (serial.Stream System.IO.Stream, граф System.Object) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0) SaveLoad.Saving () (в разделе Активы / Сценарии / Сохранить / SaveLoad.cs: 18) Quit.Exit () (в Assets / Scripts / Quit.cs: 11) UnityEngine.Events.InvokableCall.Invoke () (в C: /buildslave/unity/build/Runtime/Export/UnityEvent/UnityEvent.cs: 166) UnityEngine.Events.UnityEvent.Invoke () (в C: /buildslave/unity/build/Runtime/Export/UnityEvent/UnityEvent/UnityEvent_0.cs: 58)UnityEngine.UI.Button.Press () (в C: /buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs: 66) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (в C: /buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs: 108) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPngine.vent.ventEvent, System.Iventler.Hit.BaseEventData eventData) (в C: /buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs: 50) UnityEngine.EventSystems.ExecuteEvents.Execute [T] (UnityEngine.GityOject.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents + EventFunction'1 [T1] (функция): Update ()

Это едва ли имеет смысл для меня, но если кто-то может просветить меня, пожалуйста, вы бы макМой день (извините, если сообщение слишком длинное)

Спасибо

1 Ответ

3 голосов
/ 17 июня 2019

Вы получаете эту ошибку, потому что вы пытались сериализовать Mono Behavior (то есть компонент) сам. То, что вы хотели сделать, это сериализовать только данные. Что вы можете сделать, это поместить данные в отдельный класс и сериализовать это

[System.Serializable()]
public class MoneyHandlerData  //Note - no monobehaviour
{
    public int pickaxe = 0;
    public int nbDwarves = 1;

    public double moneyAccount = 10000;
    public double moneyPerSec = 500;

    public int bow = 0;
    public int nbElves = 0;
}

Теперь, когда этот класс больше не является MonoBehaviour, вы не можете использовать его как компонент, поэтому вы получаете ошибку ExtensionOfNativeClass. Вы можете сохранить его в состоянии монобиха, хотя

public class MoneyHandler : MonoBehaviour
{
    MoneyHandlerData  data; //Serialize me
}

Вы также можете сделать класс сохранения - загрузки не MonoBehaviour, поскольку он не использует никаких своих функций. Не все должно быть Компонентом в Unity. Вы можете сделать функции статичными, чтобы вы могли получить к ним доступ из любого места и просто позволить им принимать объект, который будет сериализован, в качестве параметра (например, объект MoneyHandlerData)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...