I am Lord Opublikowano 24 Czerwca 2014 Udostępnij Opublikowano 24 Czerwca 2014 Robiąc w unity natknąłem się na problem zapisu customowej klasy do pliku, która zawiera tablice. Nie korzystam tutaj z serializacji wbudowanej w unity tylko z tej domyślnej z .net Mam sobie taką klasę i ją chcę zapisać do pliku GML [Serializable] public class ArraysToSerialize { public int[] mapUnlocked = new int[] { 1, 1, 1, 1, 0, 0, 0, 0 }; } Zapis: GML public ArraysToSerialize Arrays = new ArraysToSerialize(); BinaryFormatter bf3 = new BinaryFormatter(); FileStream file3 = File.Create(Application.persistentDataPath + "/arrays.dat"); bf3.Serialize(file3, Arrays); file3.Close(); Wczytywanie: GML // 3 plik if (File.Exists(Application.persistentDataPath + "/arrays.dat")) { var b = new BinaryFormatter(); var f = File.Open(Application.persistentDataPath + "/arrays.dat", FileMode.Open); ArraysToSerialize arrays = (ArraysToSerialize)b.Deserialize(f); f.Close(); mapUnlocked = arrays.mapUnlocked; } else { Debug.LogError("No file to load"); } No i to działa tak że jeżeli nie znajdzie pliku to wczytywanie jest pomijane a gra mi później ten plik tworzy. Potem jak się ją uruchomi ponownie to plik już istnieje i wszystko się poprawnie wczytuje. Ale problem się pojawia wtedy kiedy zechcę dopisać do klasy ArraysToSerialize kolejną tablicę do zapisu do pliku. Np. GML [Serializable] public class ArraysToSerialize { public int[] mapUnlocked = new int[] { 1, 1, 1, 1, 0, 0, 0, 0 }; public int[] nowaTablica = new int[] { 0, 3, 2, 4, 6, 5 }; } Bo wtedy plik "arrays.dat" już istnieje ale wewnątrz niego nie ma tablicy nowaTablica i wywala error przy wczytywaniu. Żeby to zadziałało musiał bym usunąć ręcznie plik "arrays.dat" i wtedy gra by sobie go na nowo poprawnie zapisała. Słyszałem że do takich rzeczy wykorzystuje się try, catch, finally ale nie mam pojęcia jak to działa. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 24 Czerwca 2014 Udostępnij Opublikowano 24 Czerwca 2014 Newtonsoft.Json Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 24 Czerwca 2014 Autor Udostępnij Opublikowano 24 Czerwca 2014 Tylko że to Unity jest. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 24 Czerwca 2014 Udostępnij Opublikowano 24 Czerwca 2014 jest wersja tej libki pod unity :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 24 Czerwca 2014 Autor Udostępnij Opublikowano 24 Czerwca 2014 A nie będzie problemu że robię pod androida? Znalazłem to http://whydoidoit.com/unityserializer/ zabieram się do lektury :P chyba nie zbyt to kompatybilne z Unity4.5.1 bo nawet example sypie błędami Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 24 Czerwca 2014 Administratorzy Udostępnij Opublikowano 24 Czerwca 2014 A nie można tablic kolejno zapisac do pliku przez: var values = string.Join(",", Array.ConvertAll<int, String>(tablica, Convert.ToString)); A odczytać przez: string values = "1,2,3,4,5,6,7,8,9,10"; string[] tokens = values.Split(','); int[] tablica = Array.ConvertAll<string, int>(tokens, int.Parse); Tak jak w PHP korzysta się z implode/explode ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 24 Czerwca 2014 Udostępnij Opublikowano 24 Czerwca 2014 zdaje sie to to: http://json.codeplex.com używamy tego w pracy, na pewno dziala linkowane ze zrodel do projektu unity. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 25 Czerwca 2014 Autor Udostępnij Opublikowano 25 Czerwca 2014 A która wersja jest kompatybilna z .net 3.5 bo taki aktualnie unity używa. I mógłbyś wyjaśnić jak to zlinkować, używam VSe 2013 a nie Mono Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 25 Czerwca 2014 Udostępnij Opublikowano 25 Czerwca 2014 wrzucic zrodla tego projektu do kodu projektu unity? :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 29 Czerwca 2014 Autor Udostępnij Opublikowano 29 Czerwca 2014 Tamto co podał Psyś nie jest dostosowane do unity. Poszukałem czegoś łatwego i znalazłem to: http://wiki.unity3d.com/index.php/SimpleJSON Ta biblioteka ma jedną wadę że wszystko wczytuje jako stringa, niezależnie od tego czy wartości to int, bool, null. I trzeba ręcznie każdą wartość tablicy w pętli konwertować albo czegoś nie rozumiem :D Anyway takie coś zrobiłem i działa dobrze: Wczytywanie z uwzględnieniem braku pliku. GML if (File.Exists(Application.persistentDataPath + "/Arrays.json")) { JSON_Node = JSONNode.LoadFromFile(Application.persistentDataPath + "/Arrays.json"); // wczytywanie pliku JSON Debug.Log("Loaded " + JSON_Node["MapUnlocked"].ToString()); // wypisanie zawartosci tablicy w konsoli // konwertowanie tablicy JSON (string na int) for (int i = 0; i < JSON_Node["MapUnlocked"].Count; i++) { mapUnlocked = JSON_Node["MapUnlocked"].AsInt; } } else { // tworzenie nowego pliku JSON z początkowymi wartościami JSON_Node = JSONNode.Parse("{\"MapUnlocked\":[1,1,1,1,0,0,0,0]}"); Debug.Log("Created file " + JSON_Node.ToString()); JSON_Node.SaveToFile(Application.persistentDataPath + "/Arrays.json"); } Zapis: GML for (int i = 0; i < mapUnlocked.Length; i++) { JSON_Node["MapUnlocked"].AsInt = mapUnlocked; } Debug.LogWarning( "Saved "+JSON_Node["MapUnlocked"].ToString(" ") ); JSON_Node.SaveToFile(Application.persistentDataPath + "/Arrays.json"); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się