2015-01-06 3 views
2

Не знаете, почему мой код не работает, поскольку я следил за примерами, которые я нашел. Попытка заставить мою игру iOS сохранять и загружать данные обратно с помощью Unity3D, но не используя player.prefs.Сохранение и загрузка данных игры не работает

На сцены я это

void OnDisable(){ 
    GameController.Save(); 
} 

void OnEable(){ 
    GameController.Load(); 
} 

Game Controller представляет собой статический метод ..

static public void Save() 
    { 
     Debug.Log("Saving Player Data..."); 
     print ("Saving Player Data..."); 
     var bf = new BinaryFormatter(); 
     var file = File.Create(Application.persistentDataPath + "/CatEscapeInfo.dat"); 

     var data = new PlayerData 
     { 
      PlayerLives = PlayerLives, 
      Score = Score, 
      Distance = Distance, 
      CurrentLevelNo = CurrentLevelNo, 
      HighestLevelCompleted = HighestLevelCompleted 
     }; 

     bf.Serialize(file, data); 
     file.Close(); 
     //PlayerPrefs.SetString (data); 
     Debug.Log ("Player Data Saved: " + PlayerLives + ", " + Score); 
     print ("Player Data Saved: " + PlayerLives + ", " + Score); 
    } 

    static public void Load() 
    { 
     Debug.Log("Loading Player Data..."); 
     if (File.Exists(Application.persistentDataPath + "/CatEscapeInfo.dat")) 
     { 
      var bf = new BinaryFormatter(); 
      var file = File.Open(Application.persistentDataPath + "/CatEscapeInfo.dat", FileMode.Open); 
      var data = bf.Deserialize(file) as PlayerData; 
      file.Close(); 

      Debug.Log("Player Data Loaded: " + data.PlayerLives + ", " + data.Score); 
      print ("Player Data Loaded: " + data.PlayerLives + ", " + data.Score); 

      if (data != null) 
      { 
       PlayerLives = data.PlayerLives; 
       Score = data.Score; 
       Distance = data.Distance; 
       CurrentLevelNo = data.CurrentLevelNo; 
       HighestLevelCompleted = data.HighestLevelCompleted; 
      } 
     } 
    } 

Даже если у меня есть этот код работает, когда я вручную закрыть игру на прошивке и принести он поддерживает его никогда не загружает игру обратно в статистику, которую он имел. Любые мысли? Я что-то упускаю?

Обновление: В iOS XCode я нахожу, что он выплевывает эту трассировку стека при попытке «загрузить», хотя в этой точке файл еще не существует.

На Загрузка Это Трассировка стека:

> (Filename: 
> /Applications/buildAgent/work/d63dfc6385190b60/artifacts/iPhonePlayer-armv7Generated/UnityEngineDebug.cpp 
> Line: 49) 
> 
> SerializationException: Unexpected binary element: 255 at 
> System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject 
> (BinaryElement element, System.IO.BinaryReader reader, System.Int64& 
> objectId, System.Object& value, 
> System.Runtime.Serialization.SerializationInfo& info) [0x00000] in 
> <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject 
> (BinaryElement element, System.IO.BinaryReader reader) [0x00000] in 
> <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph 
> (BinaryElement elem, System.IO.BinaryReader reader, Boolean 
> readHeaders, System.Object& result, 
> System.Runtime.Remoting.Messaging.Header[]& headers) [0x00000] in 
> <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize 
> (System.IO.Stream serializationStream, 
> System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x00000] in 
> <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize 
> (System.IO.Stream serializationStream) [0x00000] in <filename 
> unknown>:0 at GameController.Load() [0x00000] in <filename 
> unknown>:0 at GameController.OnEnable() [0x00000] in <filename 
> unknown>:0 (Filename: Line: -1) 

о сохранении Это Трассировка стека:

> Saving Player Data... UnityEngine.Debug:Internal_Log(Int32, String, 
> Object) UnityEngine.Debug:Log(Object) 
> UnityEngine.MonoBehaviour:print(Object) GameController:Save() 
> GameController:OnDisable() UnityEngine.Object:Destroy(Object, Single) 
> UnityEngine.Object:Destroy(Object) GameController:Awake() (Filename: 
> /Applications/buildAgent/work/d63dfc6385190b60/artifacts/iPhonePlayer-armv7Generated/UnityEngineDebug.cpp 
> Line: 49) 
> 
> ExecutionEngineException: Attempting to JIT compile method 
> 'PlayerData__TypeMetadata4:.ctor()' while running with --aot-only. 
> 
> at System.Reflection.MonoCMethod.Invoke (System.Object obj, 
> BindingFlags invokeAttr, System.Reflection.Binder binder, 
> System.Object[] parameters, System.Globalization.CultureInfo culture) 
> [0x00000] in <filename unknown>:0 Rethrow as 
> TargetInvocationException: Exception has been thrown by the target of 
> an invocation. at System.Reflection.MonoCMethod.Invoke 
> (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder 
> binder, System.Object[] parameters, System.Globalization.CultureInfo 
> culture) [0x00000] in <filename unknown>:0 at 
> System.Reflection.MonoCMethod.Invoke (BindingFlags invokeAttr, 
> System.Reflection.Binder binder, System.Object[] parameters, 
> System.Globalization.CultureInfo culture) [0x00000] in <filename 
> unknown>:0 at System.Reflection.ConstructorInfo.Invoke 
> (System.Object[] parameters) [0x00000] in <filename unknown>:0 at 
> System.Activator.CreateInstance (System.Type type, Boolean nonPublic) 
> [0x00000] in <filename unknown>:0 at 
> System.Activator.CreateInstance (System.Type type) [0x00000] in 
> <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.CreateMemberTypeMetadata 
> (System.Type type) [0x00000] in <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.GetObjectData 
> (System.Object obj, 
> System.Runtime.Serialization.Formatters.Binary.TypeMetadata& metadata, 
> System.Object& data) [0x00000] in <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObject 
> (System.IO.BinaryWriter writer, Int64 id, System.Object obj) [0x00000] 
> in <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectInstance 
> (System.IO.BinaryWriter writer, System.Object obj, Boolean 
> isValueObject) [0x00000] in <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteQueuedObjects 
> (System.IO.BinaryWriter writer) [0x00000] in <filename unknown>:0 
> at 
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectGraph 
> (System.IO.BinaryWriter writer, System.Object obj, 
> System.Runtime.Remoting.Messaging.Header[] headers) [0x00000] in 
> <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize 
> (System.IO.Stream serializationStream, System.Object graph, 
> System.Runtime.Remoting.Messaging.Header[] headers) [0x00000] in 
> <filename unknown>:0 at 
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize 
> (System.IO.Stream serializationStream, System.Object graph) [0x00000] 
> in <filename unknown>:0 at GameController.Save() [0x00000] in 
> <filename unknown>:0 at GameController.OnDisable() [0x00000] in 
> <filename unknown>:0 UnityEngine.Object:Destroy(Object, Single) 
> UnityEngine.Object:Destroy(Object) GameController:Awake() 

ответ

2

Поместите этот код Awake или Start Funtion в сценарии сцены:

// Forces a different code path in the BinaryFormatter that doesn't rely on run-time code generation (which would break on iOS). 
Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes"); 

По умолчанию в бинарном сериализаторе Mono используется JIT-компиляция, которая не поддерживается iOS. К счастью, есть способ (код выше), чтобы переключить его на использование отражения.

Proof/Смотрите также:

+0

Это было на 100%. Спасибо! Добавив это к Awake, он исправил это. – Mastro

0
Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes"); 

Создать ошибку в редакторе Unity, как:

«Окружающая среда» не найден в пространстве имен

После нескольких часов поисков я нашел следующий код, который работает отлично:

System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER","yes"); 

Я надеюсь, что это поможет.

Смежные вопросы