2014-09-09 3 views
2

Я пытаюсь сохранить игру каждый раз, когда игрок достигает портала, а затем, когда игра остановлена, и когда игрок хочет снова сыграть, он может нажать кнопку продолжения в стартовом меню, чтобы начать с уровня, который он последний разблокирован.Сохранение/загрузка Unity3d

здесь учебник: http://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/persistence-data-saving-loading

здесь один из сценариев на портале, который должен спасти игру:

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

public class Saving : MonoBehaviour 
{ 

    void OnTriggerEnter(Collider other) 
    { 
     if(other.gameObject.tag == "Player") 
     { 
      GameControl.control.levelcount += 1; 
      GameControl.control.Save(); 
     } 
    } 
} 

не дает никаких ошибок.

здесь сценарий для кнопки продолжения:

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

public class ContinueCS : MonoBehaviour { 

    void OnMouseUp(){ 
     GameControl.control.Load(); 
     int levelcount = GameControl.control.levelcount; 
     if(levelcount == 0) 
     { 
      Application.LoadLevel("Level1"); 
     } 
     else 
     Application.LoadLevel(levelcount); 
    } 
} 

нет ошибок

и вот сценарий на основе учебника:

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

    public class GameControl : MonoBehaviour { 
    public static GameControl control; 

    public float score; 
    public int levelcount; 

    void Awake() { 
     if(control == null) 
     { 
      DontDestroyOnLoad(gameObject); 
      control = this; 
     } 
     else if(control != this) 
     { 
      Destroy(gameObject); 
     } 
    } 

    public void Save() 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     FileStream file = File.Create(Application.persistentDataPath + "/playerInfo.dat"); 

     PlayerData data = new PlayerData(); 
     data.score = score; 
     data.levelcount = levelcount; 

     bf.Serialize(file, data); 
     file.Close(); 
    } 
    public void Load() 
    { 
     if(File.Exists(Application.persistentDataPath + "/playerInfo.dat")) 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open); 
      PlayerData data = (PlayerData)bf.Deserialize(file); 
      file.Close(); 

      score = data.score; 
      levelcount = data.levelcount; 

     } 
    } 
} 
[Serializable] 
class PlayerData 
{ 
    public float score; 
    public int levelcount; 
} 

Отредактированный !: это текущая скрипты, все еще не загружая последний разблокированный уровень, продолжают загружать уровень 1, и если я удалю оператор if из продолжения, оставив это:

void OnMouseUp(){ 
     GameControl.control.Load(); 
     int levelcount = GameControl.control.levelcount; 
     Application.LoadLevel(levelcount); 


it simply does nothing so i'm guessing the levelcount just isn't adding up. 

Я начал использовать GameControl.control.x, потому что в учебнике это работало для загрузки, сохранения или добавления в переменные. Единственное отличие состоит в том, что все, что сделано с гибуттонами. управление является статическим, поэтому GameControl.control.levelcount + = 1; должен работать правильно?

ответ

1

При загрузке данных вы десериализуете файл и перезаписываете вновь десериализованные данные старыми переменными.

if(File.Exists(Application.persistentDataPath + "/playerInfo.dat")) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open); 
    PlayerData data = (PlayerData)bf.Deserialize(file); 
    file.Close(); 

    //These lines overwrites the loaded data 
    data.score = score; 
    data.levelcount = levelcount; 
} 

Просто измените порядок, чтобы вместо этого переместить значения в переменные.

if(File.Exists(Application.persistentDataPath + "/playerInfo.dat")) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open); 
    PlayerData data = (PlayerData)bf.Deserialize(file); 
    file.Close(); 

    score = data.score; 
    levelcount= data.levelcount; 
} 
+0

спасибо, что ответили, я действительно сделал ошибку. Я изменил его и попытался как в редакторе, так и в построенной игре (после перестройки), и он все еще не работает, может быть, это что-то еще? в сценарии продолжения: я изменил Application.LoadLevel ("Level1"); к Application.LoadLevel («level3») для тестирования, а затем загружает уровень 3, и если я удалю весь оператор if, оставив только Application.LoadLevel (levelcount); нажатие кнопки продолжения ничего не делает, поэтому я думаю, что уровень уровня не увеличивается по какой-то причине –

+0

Я не вижу никаких ошибок. Вы уверены, что существует путь 'Application.persistentDataPath + '/playerInfo.dat?'. Попробуйте использовать 'Debug.Log', чтобы найти место ошибки. – Imapler

+0

Я проверил и да, он существует, я собираюсь обновить сценарии в своем сообщении, потому что они уже не правы, так как я добавляю +1 в savescript и просто заметил, что скрипт в сообщении не работает, t даже сделайте это, дайте мне вторую и я попробую debug.log спасибо –