2016-06-30 39 views
0

Ich habe hier ein bisschen versucht, einen muteSound boolean in meinem SoundManager zu setzen und dann zu einer neuen Szene zu wechseln und den vorher in muteSound gespeicherten Wert beizubehalten, aber ich bin nicht erfolgreich.Wie würde ich einen Wert zwischen den Szenen behalten?

Ich versuchte das DontDestroyOnLoad (this); in der Hoffnung, dass es es in die neue Szene bringen würde, aber aus irgendeinem Grund ist es nicht.

Würde jemand von Ihnen wissen, was mein Problem sein könnte? Benutze ich die korrekte Funktion?

Danke,

+0

Dieses Skript ist an ein Spielobjekt angehängt? –

+0

Ja, es ist an ein Prefab angehängt, das in beiden Szenen verwendet wird. – Alox

+0

Wo rufst du DontDestroyOnLoad (this) an? Sie sollten es auf Start() anrufen – Cabrra

Antwort

2

Einige würden Gebrauch static sagen. Das würde funktionieren, aber vermeiden Sie das, da Sie auf andere Probleme stoßen werden. Was Sie brauchen, ist die PlayerPrefs. Speichern Sie den Wert beim Beenden. Lies den Wert, wenn das Spiel startet. Sie können das in Ihrem SoundManager Skript tun.

bool muteSound = false; 

//Load the value when game starts (default is false) 
void Start() 
{ 
    muteSound = intToBool(PlayerPrefs.GetInt("muteSound", 0)); 
} 

int boolToInt(bool val) 
{ 
    if (val) 
     return 1; 
    else 
     return 0; 
} 

bool intToBool(int val) 
{ 
    if (val != 0) 
     return true; 
    else 
     return false; 
} 

//Save on Exit 
void OnDisable() 
{ 
    PlayerPrefs.SetInt("muteSound", boolToInt(muteSound)); 
} 
+0

Dies ist, denke ich, mehr für zwischen den Spielsitzungen, nicht für Zwischenszenen. –

+0

@GunnarB. Warum ist es nicht für zwischendurch Szenen? Ich weiß, dass er zwischen den Szenen fragt, aber ich habe ihm einfach Zeit gespart, um zu fragen, wie man das für die nächste Spielrunde macht. Normalerweise möchten Sie die Playereinstellungen für das nächste Mal beibehalten, wenn das Spiel erneut gestartet wird. Das ist wie zwei Fliegen mit einer Klappe schlagen. – Programmer

+0

Ja, ein stummes Sound-Ding klingt tatsächlich so, als wolle er zwischen den Sessions auch sparen, also ist das ein guter Punkt. –

-1

war hier meine Lösung:

public class SoundManager : MonoBehaviour { 

    public static SoundManager instance = null; 

    protected virtual void Awake() 
    { 
     if (instance == null) 
      instance = this; 
     else if (instance != this) 
      Destroy(gameObject); 

     DontDestroyOnLoad(gameObject); 
    } 
} 

Während ich mein Problem gedacht war wegen meiner, die Klasse zu einem Singleton das eigentliche Problem war zu ändern, dass es eine andere Klasse war, die ein Singleton sein musste.

Da der Rest des Codes würde nicht mir zu teilen, here is a tutorial was mir geholfen zu verstehen, was ich tat, viel besser, wenn jemand anderes jemals in diese Art von Problem auftritt.

+1

Ich weiß, dies ist eine Antwort auf Ihre eigene Frage, aber Sie sollten wirklich mehr Informationen zur Verfügung stellen. Link-only-Antworten werden abgeraten und Menschen, die die Website in der Zukunft besuchen, mit dem gleichen Problem wie Sie sollten in der Lage sein, genügend Informationen zu erhalten, um sie zu lösen, selbst wenn alle Links in der Antwort tot sind. Aktualisieren Sie einfach die Antwort, um ein paar Notizen über einige der falschen Ideen, die Sie hatten, dass der Artikel klärte, und es sollte eine akzeptable Antwort sein. –

+0

Oh, okay, tut mir leid, das ist das erste Mal, dass ich eine Frage stelle, ich werde es bearbeiten, um einige wichtige Informationen von diesem Link zu haben. Danke :) – Alox

+0

Das Bool kann nur Teil Ihres 'SoundManager' sein. Es muss nicht in "GlobalControl" sein. ** IF ** beide Skripte sind auf demselben Spielobjekt (in der Szene) –

-1

Statt
DontDestroyOnLoad(this); Typ

void Awake() { 
    DontDestroyOnLoad(gameObject); 
} 

einzutippen Wenn dies ich nicht funktioniert vorschlagen, dass Sie die PlayerPrefs überprüfen.
Wenn der Pegel Verwendung
PlayerPrefs.SetFloat("pref name", variable); oder .SetInt(); oder .SetBool();
Und wenn die nächste Stufe Lasten
value = PlayerPrefs.GetFloat("pref name"); oder .GetInt(); verwenden beendet ist oder .GetBool();

Dieser Spieler Prefs auch als spart verwendet werden können, weil sie in der Registry Computer gespeichert sind. Wenn Sie dies für das Laden Dinge wie Geld verwenden, und Sie es zum ersten Mal laden, dies tun:

if(PlayerPrefs.HasKey("money")) { 

    money = PlayerPrefs.GetFloat("money"); 
} else { 

    PlayerPrefs.SetFloat("money", 0); 
    money = 0; 
} 

Wenn Sie dies nicht tun, werden die Werte viel bekommen chaotisch können. Ich hatte große Probleme, wenn ich nicht PlayerPrefs.HasKey(); verwendet habe

+0

'DontDestroyOnLoad (this)' und 'DontDestroyOnLoad (gameObject)' machen dasselbe. Wenn Sie 'DontDestroyOnLoad' aufrufen, wird die gesamte Hierarchie, zu der das Objekt gehört, beibehalten. –

+0

ja, aber er hat es wahrscheinlich nicht in der Wachfunktion aufgerufen. – DzoniGames

0

Sie können tatsächlich ein Spiel Objekt von Szene zu Szene übergeben und alle Werte für zu diesem Spiel Objekt zugeordnet Klassen sind zwischen den Szenen beibehalten.

Sie erstellen im Grunde nur ein leeres Spielobjekt, das Ihre Managerskripte speichert und dann das Spielobjekt von Szene zu Szene weitergibt, wenn Sie sie laden. Dies sollte die Werte für die Skripte beibehalten, die an das leere Spielobjekt angehängt sind.

EDIT: Einige Rechtschreib-/Grammatikfehler behoben.

+1

Das ist eigentlich genau richtig! – Fattie