сериализация массива объектов

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

сериализация массива объектов

Сообщение Torbenlino 01 авг 2018, 21:29

пытаюсь сделать игру на андроид.
на камере висит скрипт отвечающий за инвентарь в нем
есть массив объектов, каждый из которых имеет насколько полей string,int,texture2d
как его сериализовать?
собственно мне нужно их сохранять/загружать, как это сделать лучше всего, куча инфы перерыл,
но ничего годного не могу найти. в юнити и с# новичок, подскажите план действий.
Torbenlino
UNец
 
Сообщения: 31
Зарегистрирован: 17 мар 2018, 01:47

Re: сериализация массива объектов

Сообщение 1max1 01 авг 2018, 22:20

Не уверен что текстуру можно сериализовать, а вот простые типы легко - создаешь структуру и запихиваешь в нее все что надо сохранить:
Синтаксис:
Используется csharp
[System.Serializable]]
struct Save
{
    public int ammo;
    public float health;
    public string name;
    // etc...
}

Потом через JsonUtility сохраняешь/загружаешь как удобно.
Последний раз редактировалось 1max1 02 авг 2018, 02:35, всего редактировалось 1 раз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: сериализация массива объектов

Сообщение Torbenlino 01 авг 2018, 22:28

с простыми типами я уже и так разобрался, проблема в том что нельзя так просто текстуру или геймобжект сериализовать, тем более массив оных,
но как-то же можно все таки, ток не могу допетрить как. башка пухнет уже ~x(
Torbenlino
UNец
 
Сообщения: 31
Зарегистрирован: 17 мар 2018, 01:47

Re: сериализация массива объектов

Сообщение 1max1 01 авг 2018, 22:53

GameObject - сомнительно, придется разбирать на простые составляющие и потом присваивать свойства/поля заново.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: сериализация массива объектов

Сообщение Anonymyx 01 авг 2018, 23:18

Сам по себе GameObject не несет никакой нужной вам информации и смысла разбирать или что-то делать с ним нет.
Текстурку можно легко можно засериализовать по пикселям.
Но обычно все нужное запихивают в папку Resources, при старте загружают в соотв. массив, по категориям, и уже по ID взаимодействуют с объектами.
Т.е. сериализуем не сами объекты, а ID объектов, которые присваиваем объектам. Как их присваивать, каким образом - дело ваше.

Синтаксис:
Используется csharp
[System.Serializable]]
struct Save
{
    int ammo;
    float health;
    string name;
    // etc...
}

Поля должны быть public.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: сериализация массива объектов

Сообщение 1max1 02 авг 2018, 02:35

Поля должны быть public.

Точно, забыл.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: сериализация массива объектов

Сообщение Torbenlino 02 авг 2018, 13:00

а как сериализовать массив интов?
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class Save : MonoBehaviour {

    public GameObject player;

    [System.Serializable]
    public class invSave
    {
        public int id;
    }
   
    public void saveI()
    {
        invSave save = new invSave();
        for (int i = 0; i < GameObject.Find("Main Camera").GetComponent<ainv>().width * GameObject.Find("Main Camera").GetComponent<ainv>().height; i++)
        {      
             save.id = GameObject.Find("Main Camera").GetComponent<ainv>().Currentitems[i].ID;
            print(save.id);
        }

        if (!Directory.Exists(Application.dataPath + "/save"))
        {
            Directory.CreateDirectory(Application.dataPath + "/save");
           
            FileStream f = new FileStream(Application.dataPath + "/save/invs.sv", FileMode.Create);
            BinaryFormatter form = new BinaryFormatter();
            form.Serialize(f, save);
            f.Close();
        }
        else
        {
            FileStream f = new FileStream(Application.dataPath + "/save/invs.sv", FileMode.Open);
            BinaryFormatter form = new BinaryFormatter();
            form.Serialize(f, save);
            f.Close();
        }
    }

    public void loadI()
    {
        if(File.Exists(Application.dataPath + "/save/invs.sv"))
        {
            FileStream f = new FileStream(Application.dataPath + "/save/invs.sv", FileMode.Open);
            BinaryFormatter form = new BinaryFormatter();
            try
            {
                invSave ins = (invSave)form.Deserialize(f);
                for (int i = 0; i < GameObject.Find("Main Camera").GetComponent<ainv>().width * GameObject.Find("Main Camera").GetComponent<ainv>().height; i++)
                {
                    GameObject.Find("Main Camera").GetComponent<ainv>().Currentitems[i].ID = ins.id;
                    print(ins.id);
                }
            }
            catch(System.Exception a)
            {
                Debug.Log(a.Message);
            }
            finally
            {
                f.Close();
            }
        }
        else
        {
            Application.Quit();
        }
    }
}
 

вот я написал полную дичь, типа цикл такой же как в скрипте инвентаря ainv, сохраняю id предметов в 16 ячейках
print(save.id); выдает все норм, все ид на своих местах, но при загрузке print(ins.id); выдает все нули
(ноль - ид пустышки которая лежит в каждой ячейке), но почему-то даже если выставить предметы в ячейки в инспекторе
принт показывает все равно нули. Кароч я так понял что код с циклами в методах сейф/лоад полная чушь, если так и есть то подскажите плес как правильно сериализовать массивы.
Torbenlino
UNец
 
Сообщения: 31
Зарегистрирован: 17 мар 2018, 01:47

Re: сериализация массива объектов

Сообщение Anonymyx 05 авг 2018, 21:12

Я в коде не вижу массив int'ов. Вы сохраняете последнее значение полученное в цикле.
public List<int> itemsIDLsit < вот лист, запихиваете туда каждый ID сохраняете лист, точнее обертку.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: сериализация массива объектов

Сообщение Torbenlino 14 авг 2018, 02:53

все получилось, сохраняю/загружаю, все на своих местах, только как по восстановленным ид отобразить картинки в инвентаре? чет вообще недопетрить. :|
Torbenlino
UNец
 
Сообщения: 31
Зарегистрирован: 17 мар 2018, 01:47


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 22