Zapis i odczyt danych z ekwipunku

Witam w kolejnym artykule mojego prostego systemu do zarządzania i tworzenia ekwipunków.

Udało mi się w końcu dodać zapis i odczyt do gry, z możliwością auto-zapisu, przy wyjściu z gry. W tym celu stworzyłem dwie nowe klasy nie będące komponentami: ItemDataParams oraz ItemCollectionSerializer.

Pierwsza z nich jedynie przechowuje dane z przedmiotu. Pierwotnie myślałem o tym, by jedynie przechowywać ID i Ilość i na podstawie tego ID pobierać z bazy właściwości itemu, lecz uznałem to za głupią decyzje, ponieważ przy zmianach ID przedmiotu i wczytaniu gry mogłaby nas spotkać niemiła niespodzianka. Poza tym, nie jestem w stanie przewidzieć, czy na skutek działania jakiejś metody zewnętrznej jakaś właściwość przedmiotu nie została zmieniona. Jeśli tak, to nie chcę resetować tego przedmiotu, ponieważ to mijałoby się z celem.

Klasa ItemCollectionSerializer przyjmuje listę ekwipunku i każdy jej element konwertuje do listy ItemDataParams, po czym zapisuje wszystkie w moim rozszerzeniu ICF (Item Collection File) w ścieżce przechowywanej przez zmienną ContainerPath widoczną w inspektorze. Ja zapisuje wszystkie moje pliki ICF w folderze Resources, a więc ścieżka wygląda następująco: „Assets/Resources/data23.icf”

ItemCollectionSerializer.cs


public class ItemCollectionSerializer
{
private List<ItemDataParams> Params;

public ItemCollectionSerializer(List<ItemData> DataToSave)
{
Params = new List<ItemDataParams>();
foreach (ItemData id in DataToSave )
{
Params.Add(new ItemDataParams(id));
}
}

public ItemCollectionSerializer()
{

}

public void Save(string Path)
{
BinaryFormatter formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, Params);
using (FileStream fs = new FileStream(Path + ".icf", FileMode.Create))
{
var vdata = stream.ToArray();
fs.Write(vdata, 0, vdata.Length);
}
}
}

public List<ItemDataParams> Load(string Path)
{
List<ItemDataParams> IDS = new List<ItemDataParams>();
BinaryFormatter formatter = new BinaryFormatter();

using (var stream = new FileStream(Path + ".icf", FileMode.Open))
{
IDS = (List<ItemDataParams>) formatter.Deserialize(stream);
}

return IDS;
}
}

Następnie w ekwipunku wywołuje w odpowiednich momentach dwie nowe metody: SaveSession oraz RestoreLastSession, które nadpisują stare dane (a jeśli nie istnieje podana ścieżka, to tworzą plik ICF w jej miejscu), i odpowiednio je oczytują i potem dochodzi do przepisania danych z pliku ICF do listy ItemList w ekwipunku.


public void SaveSession()
{
ItemCollectionSerializer ics = new ItemCollectionSerializer(ItemList);
ics.Save(ContainerPath);
}

public void RestoreLastSession()
{
ItemCollectionSerializer ics = new ItemCollectionSerializer();
paramses = ics.Load(ContainerPath);
ItemList.Clear();
foreach (Transform t in SlotList)
{
foreach (Transform i in t)
{
Destroy(i.gameObject);
}
}

foreach (ItemDataParams i in paramses)
{
AddItem(i.ID, i.Amount,i.slotID);
}

}

Pojawiła się również przeciążona wersja metody AddItem, która teraz oprócz ID przyjmuje dwa dodatkowe parametry, ilość oraz siblingIndex slota do którego ma należeć nowo dodany Item. Wcześniej czyszczę listę ze wszystkich niepotrzebnych resztek, a więc jedynym wymogiem jest poprawność pliku ICF.

To by było na tyle na ten wpis, zastanawiam się co by dodać w następnym wpisie, ale nie bardzo wiem co.

Do zobaczenia już wkrótce 🙂

 

 

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s