Я пытаюсь сохранить игру каждый раз, когда игрок достигает портала, а затем, когда игра остановлена, и когда игрок хочет снова сыграть, он может нажать кнопку продолжения в стартовом меню, чтобы начать с уровня, который он последний разблокирован.Сохранение/загрузка 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; должен работать правильно?
спасибо, что ответили, я действительно сделал ошибку. Я изменил его и попытался как в редакторе, так и в построенной игре (после перестройки), и он все еще не работает, может быть, это что-то еще? в сценарии продолжения: я изменил Application.LoadLevel ("Level1"); к Application.LoadLevel («level3») для тестирования, а затем загружает уровень 3, и если я удалю весь оператор if, оставив только Application.LoadLevel (levelcount); нажатие кнопки продолжения ничего не делает, поэтому я думаю, что уровень уровня не увеличивается по какой-то причине –
Я не вижу никаких ошибок. Вы уверены, что существует путь 'Application.persistentDataPath + '/playerInfo.dat?'. Попробуйте использовать 'Debug.Log', чтобы найти место ошибки. – Imapler
Я проверил и да, он существует, я собираюсь обновить сценарии в своем сообщении, потому что они уже не правы, так как я добавляю +1 в savescript и просто заметил, что скрипт в сообщении не работает, t даже сделайте это, дайте мне вторую и я попробую debug.log спасибо –