Jump to content
Unity Insider Forum

ScriptableObject nach Playmode nicht resetet, aber nach Editor neustartet schon


MaZy

Recommended Posts

Mion.

Ich habe bei ScriptableObject etwas gemerkt, was ich vorher gar nicht gekannt habe.
Wenn ich ein Wert von ScriptableObject Asset im Playmode ändere - sagen wir mal bool, dann ist es auch nach dem Playmode dieser Wert, den man im Playmode vergeben hat. Beispiel von FALSE zu TRUE. Das bleibt ganze Zeit so im Editor. Bei weiteren Playmodes wäre also das immer noch TRUE. Aber wenn ich jetzt den Editor neustarte, dann ist das wieder auf False umgestellt. Das ist sehr verwirrend.

Warum verhält sich das so? Das macht ja das testen richtig schwierig.

Denn, im Build ist das so, dass bei jedem Spielneustartet die ScriptableObjects ihren Ursprungswert haben. Das ist aber bei Playmode, Exitmode im Editor nicht so. Meiner Meinung nach sollte das so sein (außer man ändert selber im Editor im Inspector oder so).

Ist das normal? Kann mir denken, dass vllt dafür sie nicht gemacht sind, aber dennoch sehr verwirrend.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deine (!) ScriptableObjects sind Assets. Assets werden nicht zurückgesetzt, wenn du den Play Mode ausmachst. Gilt gleichermaßen für alle anderen Assets, wie z.B. Materials.

Wenn du die Werte deiner ScriptableObjects in deinem Code veränderst, hilft dir dieses Pattern:

public class IntVariable : ScriptableObject, ISerializationCallbackReceiver
{
    [SerializeField]
    private int initialValue = default;
    [System.NonSerialized]
    public int value;

    public void OnAfterDeserialize()
    {
        value = initialValue;
    }

    public void OnBeforeSerialize()
    {
        
    }
}

Wenn du im Editor jetzt die "initialValue" verstellst, dann bleibt die Änderung, aber dein Code arbeitet mit "value", welches nicht serialisiert wird.

Du kannst damit jetzt den Laufzeit-Wert weder anschauen (es sei denn, du schreibst ein bisschen Editor-Code) noch ändern (dafür brauchst du dann heftigen Editor-Code, wie ich ihn in Soda eingebaut habe).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die werden zwar nicht zurückgesetzt nachdem Playmode, aber nachdem ich Editor neustarte sind sie zurückgesetzt. Es sei denn, ich ändere per Hand im Inspector. Dann ist es persistent.

Ich finde es ok, solange der Session läuft alles erhalten bleibt, aber ich finde nach Playmode sollte sich das auch so verhalten, wie als wenn man das Spiel schließen würde.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach so... Naja, das Problem löst sich ja auch mit dem Code von mir oben. Ich meine: Warum solltest du wollen, dass dein Runtime-Code dein Projekt verändern kann? Da würde ich lieber verhindern, dass das passiert als zu versuchen, die Änderungen vom Play Mode persistent zu machen.

Ansonsten kannst du sicherlich irgendwie ein AssetDatabase.SaveAssets oder so durchführen, um alles mögliche zu speichern, was sich geändert hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 51 Minuten schrieb Sascha:

Warum solltest du wollen, dass dein Runtime-Code dein Projekt verändern kann?

Nein, das habe ich doch auch nicht vor. Das ist doch mein Problem. Ich möchte ja nicht, dass es verändert, sondern, wenn ich aus dem aus dem Playmode rausgehe, genau so aussieht wie, als würde ich das Spiel gerade starten. Und hast ja gesagt gezeigt, wie man da vorgehen könnte.

Ein Beispiel wäre z.B., wenn ich beim jeden Spielstart etwas abfragen möchte. Eine Art Bestätigung. Zum Beispiel "Dies ist eine Betaversion". Du drückst ok und es ist für das Spiel auf true gesetzt - du hast es gelesen und bestätigt. Starte ich das Spiel neu, ist es logischerweise wieder auf false und ich muss wieder bestätigen, dass ich darüber bescheid weiß.
Doch im Editor kann ich das nicht machen, denn Editor lässt es auf true stehen und ich könnte als Entwickler total verwirrt sein, warum diesmal die Abfrage "Dies ist eine Betaversion" nicht mehr kommt. Das ist nur mein Problem.

Speichern oder geänderte Dinge abgespeichert haben möchte ich nicht. Nur das es sich genauso verhalten sollte, wie im Standaloneversion auch, damit man da nicht durcheinander kommt, wenn man testet.

Disclaimer: Das da oben war nur ein Beispiel und nicht, dass ich sowas vorhabe. Ich benutze hauptsächliche ScriptableObjects eher als Datenbank, wo Dinge nur raus gelesen werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...