Die zweischneidiges Schwert der Serialisierung
Unity will für alle Dinge einfacher machen, auch für Menschen mit begrenzten Programmierkenntnisse (Anfänger, Designer).
um ihnen zu helfen, zeigt Unity Daten im Inspektor. Dies ermöglicht es dem Codierer, Code zu erstellen, und der Designer, indem er die Werte optimiert, ohne MonoDevelop/eine IDE zu öffnen.
Es gibt zwei Möglichkeiten, Werte Anzeige im Inspektor haben:
public int myVar = 10;
[SerializeField] private int myOtherVar = 0; // Can also be protected
Das zweite ist besser, da es mit Verkapselung Prinzip entspricht (Variablen sind private/geschützt und über Methoden oder Eigenschaften modifiziert).
Wenn Sie eine Variable im Editor anzeigen, wird der im Skript angegebene Wert nur beim Ziehen des Skripts verwendet. Unity serialisiert dann diese Werte und kümmert sich nicht mehr um irgendwelche Änderungen am Skript. Dies kann zu Verwirrung führen, wenn zum Beispiel myVar
im Skript auf 20 gesetzt wird, danach wird es nicht verwendet. Die Serialisierung wird in die Szenendatei geschrieben.
Die beiden Linien im Beispiel arbeiten genau in der gleichen Weise.
Mögliche Lösungen
Es ist möglich, die Einheit, um neue Werte in einem Skript zu prüfen, durch Zurücksetzen auf den Einstellungen Rad der Skriptkomponente zu drücken. Das wird auch alle anderen Variablen der Komponente zurücksetzen, also tun Sie das nur, wenn das beabsichtigt ist.
Wenn Sie die Variable privat machen und das Attribut [SerializeField]
aussparen, wird der Serialisierungsprozess deaktiviert, sodass Unity nicht mehr in der Szenendatei nach einem anzuzeigenden Wert sucht. Stattdessen wird der Wert zur Laufzeit vom Skript erstellt.
Wenn eine Komponente an der Einheit des Hinzufügen, ein neues Objekt des Typs des Bauteils erzeugt wird. Die angezeigten Werte sind die serialisierten Werte dieses Objekts.Aus diesem Grund können nur Memberwerte angezeigt werden und statische Variablen nicht, da sie nicht serialisierbar sind. (Dies ist eine .NET-Spezifikation, die nicht unbedingt für Unity spezifisch ist.) Da Unity does not serialize static fields daher das Hinzufügen des Modifikators static
das Problem zu lösen scheint.
die OP Erklären
Im OP Fall auf der Grundlage der Anmerkungen, Ihr öffentlicher Bereich einen Wert von 1 im Editor wurde zeigt. Sie dachten, dass dieser Wert ein Standardwert war, als es tatsächlich der Wert war, den Sie dem Feld am wahrscheinlichsten gegeben haben, als Sie es ursprünglich deklariert haben. Nachdem Sie das Skript als Komponente hinzugefügt haben, haben Sie den Wert 10 festgelegt und meinen, es sei fehlerhaft, da es immer noch den Wert 1 verwendet. Sie sollten jetzt verstehen, dass es wie geplant ordnungsgemäß funktionierte.
Was macht Unity serialisieren?
Standardmäßig serialisiert und zeigt Unity Wertetypen (int, float, enum usw.) sowie String, Array, List und MonoBehaviour an. (Es ist möglich, ihr Aussehen mit Editor-Skripte zu ändern, aber das ist off-topic.)
Die folgende:
public class NonMonoBehaviourClass{
public int myVar;
}
ist standardmäßig nicht serialisiert. Auch dies ist die .NET-Spezifikation. Unity serialisiert MonoBehaviour standardmäßig als Teil der Engine-Anforderung (dadurch wird der Inhalt in der Szenendatei gespeichert). Wenn Sie eine „klassische“ Klasse im Editor angezeigt werden sollen, sagen Sie einfach so:
[System.Serializable]
public class NonMonoBehaviourClass{
public int myVar = 10;
}
Offensichtlich Sie es zu einem Spielobjekt nicht hinzufügen können, so dass Sie innerhalb eines MonoBehaviour verwenden müssen:
public class MyScript:MonoBehaviour{
public NonMonoBehaviourClass obj = new NonMonoBehaviourClass();
}
Dies zeigt das Objekt im Inspektor an und erlaubt Änderungen an der myVar
Variable in der Instanz NonMonoBehaviourClass
. Und wieder werden alle Änderungen an innerhalb des Skripts nicht berücksichtigt, nachdem der Wert serialisiert und in der Szene gespeichert wurde.
Extra-Tipps, was im Inspektor
Zum Abschluss Anzeige, Schnittstellen sind im Inspektor nicht angezeigt, entweder weil sie enthalten keine Variablen - nur Methoden und Eigenschaften. Im Debug-Modus werden Eigenschaften standardmäßig nicht angezeigt. Sie können diesen Modus mit der Schaltfläche mit drei Zeilen in der oberen rechten Ecke des Inspektors ändern. Die ersten beiden Einstellungen sind Normal/Debug. Der erste ist der Standard, der zweite wird auch private Variable anzeigen. Dies ist nützlich, um ihre Werte zu sehen, kann aber nicht vom Editor geändert werden.
Wenn Sie also eine Schnittstelle benötigen, die angezeigt werden soll, müssen Sie eine abstrakte Klasse in Betracht ziehen, da sie eine ähnliche Funktionalität bietet (außer Mehrfachvererbung), aber auch MonoBehaviour sein kann.
Referenzen:
http://docs.unity3d.com/ScriptReference/SerializeField.html
http://docs.unity3d.com/Manual/script-Serialization.html
https://www.youtube.com/watch?v=9gscwiS3xsU
https://www.youtube.com/watch?v=MmUT0ljrHNc
Vielen Dank für diese Frage eine ausführliche Antwort zu verfassen!Ich hoffe, es macht Ihnen nichts aus, wenn ich eine Notiz anfüge, in der erwähnt wird, warum MsYvettes Zusatz von 'static' das Problem zu beheben scheint. – Serlite
Danke, dass du dir die Zeit genommen hast, eine so gute Antwort zu schreiben! Ein Vermögenswert, den wir auf der Website brauchen, selbst wenn wir schließlich ein dupuliertes Ziel finden. –
Jede Ergänzung/Änderung ist willkommen. – Everts