Цитата vova1227 (
)
2. Приложение будет для мобильных устройств, насколько я понял там есть разница в методах сохранения, еще не очень понял в чем именно, но как бы в социализации. Хотя для начала мне хоть как то сохранить прогресс игры.
Как минимум, бинарная сериализация на андроид точно работает, скорее всего и на иос тоже.
Я сделал так -дикт, где ключ - название уровня, а значение - класс уровня. В уровне собственно листы противников, декораций и всего такого.
Код
[System.Serializable]
public Dictionary<string, Level> levels = new Dictionary<string, Level>();
public struct Corpse
{
public string type;
public int x;
public int y;
}
[System.Serializable]
public struct Point
{
public float X;
public float Y;
public float Z;
public Point(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
}
[System.Serializable]
public struct Enemy
{
public string type;
public Point pos;
public Point rot;
public int hp;
public AI_cult_1.State state;
public int ammo;
public bool vis;
}
[System.Serializable]
public struct Decoration
{
public string type;
public Point pos;
public Point rot;
}
[System.Serializable]
public struct Level
{
public List<Corpse> corpses;
public List<Enemy> enemies;
public List<Decoration> decorations;
}
После, добавляем в этот список новый уровень - тот, который мы хотим сохранить (для этого ессна надо находиться на нем же):
Код
Level lvl = new Level();
lvl.decorations = GetAllDecor();//берем все декорации на сцене
lvl.enemies = GetAllEnemies();//находим всех противников на сцене
if (!levels.ContainsKey(SceneManager.GetActiveScene().name)) //если нет уровня в дикте
{levels.Add(SceneManager.GetActiveScene().name,lvl);} //то создадим его
else
{levels[SceneManager.GetActiveScene().name]=lvl;} //а если есть - перезапишем
public List<Decoration> GetAllDecor()
{
List<Decoration> lol = new List<Decoration>();
GameObject[] decors = GameObject.FindGameObjectsWithTag("Decoration");
foreach (GameObject decor in decors)
{
Decoration a = new Decoration();
a.type = decor.name;
a.pos = new Point(decor.transform.position.x,decor.transform.position.y,decor.transform.position.z);
a.rot = new Point(decor.transform.eulerAngles.x,decor.transform.eulerAngles.y,decor.transform.eulerAngles.z);
lol.Add(a);
}
return lol;
}
public List<Enemy> GetAllEnemies()
{
List<Enemy> lol = new List<Enemy>();
AI_cult_1[] enemies_on_scene = Object.FindObjectsOfType<AI_cult_1>();
foreach (AI_cult_1 enemy in enemies_on_scene)
{
Enemy a = new Enemy();
a.type = enemy.name;
a.pos = new Point(enemy.transform.position.x,enemy.transform.position.y,enemy.transform.position.z);
a.rot = new Point(enemy.transform.eulerAngles.x,enemy.transform.eulerAngles.y,enemy.transform.eulerAngles.z);
a.ammo = enemy.countAmmo;
a.hp = enemy.hp;
a.state = enemy.state;
a.vis = enemy.vis;
lol.Add(a);
}
И, собственно, сериализуем и сохраняем эти значения!
Код
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(Application.persistentDataPath + "/save.sav", FileMode.Create))
{
formatter.Serialize(Application.persistentDataPath + "/save.sav", levels);
}
Так, ну а теперь загружаем наш levels:
Код
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(Application.persistentDataPath + "/save.sav", FileMode.Open))
{
levels = (Dictionary<string, Level>)formatter.Deserialize(stream);
}
Ну, как-то так. Может быть где-то промахнулся, но, думаю, ты разберешься.