Warum hat C# mit [System.Serializable] für die Aufbewahrung Instanz? (Unity3D)
Wollte ich ein Programm, wenn es einen TextAsset von inspector(es ist in 'ExampleEditor'), benutzerdefinierte Daten-Instanz für die Verwendung blendshape Animations.
Zuerst machte ich meine eigenen Daten Klasse nicht über [System.Serializable].
public class Matrix {
public int row;
public int col;
public double[,] mat;
}
Meine Strategie war eine TextAsset, parsing string aus TextAsset und schließlich die Herstellung einer Matrix-Instanz eine Feld-variable in 'Beispiel.cs'. Ich dachte, wenn es initialisiert wurde, und der zuerst zugeordnete, ich war in der Lage, verwenden Sie die variable im Beispiel-Instanz. Jedoch, Es hat nicht funktioniert, Es warf 'NullReferenceException'.
So fand ich die Lösung mit '[System.Serializable]'. Es hat funktioniert. (und ich wusste, dass Unity3D nicht bieten multi-dimensionale array für Ihre serialisierungsmethode.)
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class Matrix {
[System.Serializable]
public class mRow {
public List<float> aRow = new List<float>();
}
[HideInInspector]
[SerializeField]
public int row;
[HideInInspector]
[SerializeField]
public int col;
//[HideInInspector]
[SerializeField]
public List<mRow> mat = new List<mRow>();
}
Schließlich, ich weiß die Lösung, Aber ich weiß nicht, warum dieses problem war passiert. Es ist mit GC?
InformationsquelleAutor user1732445 | 2013-07-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deine Frage ist nicht sehr klar, aber ich glaube zu wissen, was Sie nicht verstehen.
Ihnen nicht erklären, wie du das getan hast (vielleicht rufen die parsing-Funktion aus einer benutzerdefinierten Inspektor?).
Jedoch, trotz, wie Sie es geschafft haben, initialisieren Sie ein Feld aus dem editor, wenn das Feld nicht serialisierbar ist, wird es null sein, wenn das Umschalten von editor-play-Modus.
Passiert denn, wenn der Eingabe-Modus spielen,
Unity3D
serialisiert alleC#
Klassen Auffüllen der relativenC++
Klassen der engine. Wenn ein Feld nicht einem öffentlichen Feld von einer Art, die Einheit kann serialize (oder sogar ein eigenes Feld markiert mit einemSerializeFieldAttribute
immer ein Typ, derUnity
serialisieren können ),Unity3D
nicht serialisieren.Also beim Umschalten in den play-Modus die Referenz null.
In anderen Worten, alle Felder, die Sie initialisieren wollen, die aus dem editor MUSS serialisierbar sein, damit Sie verwendet werden können in den play-Modus.
Den obigen code macht nicht viel Sinn. Wenn Sie planen, to intialize ein serialisiertes Feld aus der Inspektor nicht initialisiert code, sonst könnten Sie verlieren schließlich die Referenz.
Ein Beispiel für einen solchen Fehler:
Den code oben wird Störungen verursachen. Wenn Sie initialisiert
aList
vom Inspektor, Sie werden korrekt serialisiert, aber wenn Sie den Schalter im play-Modus e dieStart
callback wird aufgerufen,aList
wird neu initialisiert und Sie werden am Ende mit einem Verweis auf eine leere Liste.Hier ist eine schöne blog-post erklären details, wie
Unity3D
Griff Serialisierung von Objekten. Lesen!!!Vielen Dank für Ihre Antwort, "Aber, trotz, wie Sie es geschafft haben, initialisieren Sie ein Feld aus dem editor, wenn das Feld nicht serialisierbar ist, wird es null sein, wenn das Umschalten von editor-Modus spielen." Dieser Teil war wirklich hilfreich.
InformationsquelleAutor Heisenbug