• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapis i odczyt

Object Storage Arubacloud
0 głosów
263 wizyt
pytanie zadane 3 grudnia 2016 w OpenGL, Unity przez Damian_ Nowicjusz (180 p.)
Witam mam problem z zapisem liczby pieniędzy w Unity. Otóż zapisuje to za pomocą: PlayerPrefs.SetInt ("TotalMoney", PlayerPrefs.GetInt ("TotalMoney")+ collectPoints);

Wszystko było by dobrze gdyż podczas kilku gier stan "portfela" zapisuje się poprawnie, lecz później pojawiają się liczby nie wiadomo skąd. Proszę o pomoc.

1 odpowiedź

0 głosów
odpowiedź 3 grudnia 2016 przez niezalogowany

Twój opis nie pomógł zbyt bardzo, nie sądzisz że bezpieczniej jest użyć PlayerPrefs.GetInt ("TotalMoney", 0), tak aby na pewno pobierać jakąś wartość nawet gdy wpis TotalMoney nie istnieje?

Bez kodu wiele Ci nie pomożemy (tylko fragmenty odczyt/zapis), podobnie kroków do reprodukcji...

komentarz 3 grudnia 2016 przez Damian_ Nowicjusz (180 p.)

Skrypt który ma za zadnie wyświetlić stan pieniędzy w menu głównym:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class Highscore : MonoBehaviour {

	public Text highscoreText;
	public Text money;

	//public GameObject shopButtonPrefab;
	//public GameObject shopButtonContainer;

	//public Material playerMaterial;

	public int index = 0;

	public Material[] materials;
	public Renderer rend;





	void Start () 
	{
		//ZmianaSkina (0);

		highscoreText.text = "HighScore: " + ((int)PlayerPrefs.GetFloat("HighScore")).ToString();
		money.text = "Money: " + ((int)PlayerPrefs.GetInt ("TotalMoney")).ToString ();

		rend = GetComponent<Renderer> ();
		rend.enabled = true;
		index = 0;
}
}

W tym skrypcie pobieram stan zdobytych w meczu pieniędzy i dodaje do stanu ogólnego.

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Score : MonoBehaviour {

	public float score = 0;

	public int collectPoints = 0;

	private bool isDead = false;

	public Text scoreText;
	public Text PunktyText;
	public DeathMenu deathMenu;

	void Start () {
		
	}
	

	 void Update () {
		
		if (isDead)
			return;
	}


	public void Dystans(float sco)
	{
		score = sco;
		scoreText.text = ((int)score).ToString ();
	}

	public void Punkty(int pkt)
	{
		collectPoints = pkt;
		PunktyText.text = ((int)collectPoints).ToString ();
	}

	public void OnDeath()
	{
		isDead = true;
		if (PlayerPrefs.GetFloat ("HighScore") < score)
		PlayerPrefs.SetFloat ("HighScore", score);

		PlayerPrefs.SetInt ("TotalMoney", PlayerPrefs.GetInt ("TotalMoney")+ collectPoints);

		deathMenu.ToggleEndMenu (score);
	}


}

Nie mam pojęcia w czym tkwi problem może zrobić to przez zapis do jakiegoś pliku tekstowego czy coś. Gra jest na androida.

komentarz 3 grudnia 2016 przez niezalogowany

Po co rzutujesz GetInt na int skoro zwracana wartość to int? Czemu highscore trzymasz w float skoro i tak ostatecznie rzutujesz go na int? Generujesz w ten sposób szansę na błędy wynikające ze sposobu w jaki trzymane są liczby zmiennoprzecinkowe.

Na serio nie rozumiem po co rzutujesz też normalne zmienne typu int znowu na int, przecież to jest bez sensu: (int)collectPoints.

Musisz też pamiętać, że PlayerPrefs.SetXXX(...) z powodu optymalizacyjnych nie zapisują od razu danych na dysk, domyślnie jest to wykonywane na event OnApplicationQuit().

A więc ustawienie jakiejś wartości i jej pobranie zwróci wynik jeszcze z poprzedniego działania aplikacji: Co pokazuje przykład poniżej:

int myint = PlayerPrefs.GetInt("myint", 0); // zakładamy że myvar nie istnieje, myint = 5

myint += 5; // myint = 5
PlayerPrefs.SetInt("myint", myint);

myint = PlayerPrefs.GetInt("myint", 0); // myint = 0 !!!

Aby zapisać dane na dysk musimy użyć metody PlayerPrefs.Save():

int myint = PlayerPrefs.GetInt("myint", 0); // zakładamy że myvar nie istnieje, myint = 5

myint += 5; // myint = 5
PlayerPrefs.SetInt("myint", myint);
PlayerPrefs.Save(); // update wartości na dysku

myint = PlayerPrefs.GetInt("myint", 0); // myint = 5

Możliwe, że tutaj leży twój błąd ;)

komentarz 3 grudnia 2016 przez Damian_ Nowicjusz (180 p.)

To rzutowanie z int na int wiem że bezsensowne, ale ten te kody zmieniałem kilka razy wcześniej było mi już teraz nie wiem dokładnie po co ta zamiana. Wielkie dzięki za pomoc :)

Podobne pytania

0 głosów
1 odpowiedź 2,263 wizyt
pytanie zadane 12 października 2016 w PHP przez Ditrix Mądrala (5,650 p.)
0 głosów
2 odpowiedzi 557 wizyt
pytanie zadane 28 lipca 2016 w PHP przez rucin96 Użytkownik (500 p.)
0 głosów
2 odpowiedzi 227 wizyt
pytanie zadane 24 maja 2016 w C i C++ przez Kacperos_89 Początkujący (400 p.)

92,555 zapytań

141,403 odpowiedzi

319,559 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...