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

Zapis i odczyt

VPS Starter Arubacloud
0 głosów
259 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,250 wizyt
pytanie zadane 12 października 2016 w PHP przez Ditrix Mądrala (5,650 p.)
0 głosów
2 odpowiedzi 550 wizyt
pytanie zadane 28 lipca 2016 w PHP przez rucin96 Użytkownik (500 p.)
0 głosów
2 odpowiedzi 225 wizyt
pytanie zadane 24 maja 2016 w C i C++ przez Kacperos_89 Początkujący (400 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...