Jump to content
Unity Insider Forum

Player Prefs mit float speichern


Tom12

Recommended Posts

Hallo liebe Community,

ich programmiere gerade ein Clicker Idle Spiel. Nun möchte ich die Coinanzahl speichern.

meine Coins sind als float "geschrieben". was ich bis jetzt habe

 

public float Points;

private void Start()
    {
        Points = PlayerPrefs.Getfloat("Point");
    }

 public void Save()
    {
        PlayerPrefs.SetFloat("Point", Points);
    }

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Rein logisch würde ich es in die 'OnApplicationQuit()' methode schreiben.

void OnApplicationQuit(){
	Debug.Log("saving..");
	Save();
}

https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnApplicationQuit.html )

Aber ich bin mir nicht 100% sicher, ob man sich darauf verlassen kann, dass Unity die immer aufruft..

 

Ich würde sagen 'SetFloat' ist von der performance her gesehen keine sehr 'teure' methode, deshalb könntest du sie einfach immer aufrufen, wenn sich der Wert von 'Points' ändert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

 

Mr 3d war schneller, :D OnApplicationQuit() sollte auch gehen... Der Unterschied ist eigentlich nur, daß OnDestroy() vorher aufgerufen wird.

Wenn du nicht viel programmieren möchtest, dann sollte das hier funktionieren, es speichert die Punkte, wenn du das Spiel beendest. Die "prints" kannst du entfernen, sie helfen nur damit du siehst was passiert. Die Punkte müssen natürlich irgendwann geändert werden zwischen Start() und OnDestroy(). Daher habe ich mal die Methode SetPoints() ergänzt. Diese kannst du von "außen" aufrufen:

// In einer anderen Klasse, die Verwendung von "GameScore"
// Das Skript GameScore muss an einem Gameobject hängen!
using UnityEngine;
using System.Collections;

public class MyGame : MonoBehaviour
{
  private GameScore gameScoreSaver;
  
  void Start() {
    gameScoreSaver = (GameScore)FindObjectOfType(typeof(GameScore));
  }

  void CalculateScore() {
    // Highscore ?
    float highscore = gameScoreSaver.GetPoints();
    
    // Der Spieler hat 50 Punkte erreicht, nur ein Beispiel...
    float points = 50; 
    if (points>highscore) gameScoreSaver.SetPoints(points);
  }
}
using UnityEngine;
using System.Collections;

public class GameScore : MonoBehaviour
{

    private float Points;

    void Start()
    {
        Points = PlayerPrefs.GetFloat("Point");
        print("Loaded Points: " + Points);
    }
    
    // Punkte setzen
    public void SetPoints(float points) {
       Points = points; 
    }

    // Punkte abfragen
    public float GetPoints() {
       return Points; 
    }

    void OnDestroy()
    {
        PlayerPrefs.SetFloat("Point", Points);
        print("Saved Points: " + Points);
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 19 Minuten schrieb Zer0Cool:

Das liegt daran, daß 0 Punkte geladen werden und du dann auch 0 Punkte speicherst. Wie bereits gesagt, du musst irgendwann Punkte setzen. Daher hatte ich dir ja oben ein Beispiel geschrieben.

und wie soll ich dann die den Inhalt der Float "Points" speichern also statt 0 dann Points ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaube du verstehst mich nicht... Schau dir oben mal die beiden Klassen genauer an ...

Beim Start läd Unity die Punkte, die sind 0, weil keine Punkte gespeichert wurden oder weil die letzten gespeicherten Punkte eben 0 waren.
Wenn du dein Spiel verlässt werden wieder 0 Punkte gespeichert, weil sie haben sich nicht verändert!
Du musst die Punkte die du speichern willst auch irgendwann setzen, ansonsten speichert Unity immer 0.
Daher hatte ich dir oben ein Beispiel gegeben, mit der "GameScore"-Klasse. Diese Klasse hat eine Methode SetPoints() und diese Methode muss dein Spiel aufrufen und diese Punkte werden dann auch gespeichert. Schau dir einfach mal die MyGame-Klasse an, sie enthält alles was du brauchst.
Und deine Punkte oben als public-Variable an dein Skript zu übergeben macht keinen Sinn, weil du dort immer dieselbe Punktzahl speicherst. Daher werden Methoden verwendet um die aktuelle Punktzahl zu setzen (siehe wiederum Klasse "MyGame").

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...