Unity – Custom Data Objekte im Inspektor

Hier geht es darum, wie man in Unity eigene komplexe Datenstrukturen im Inspektor verwenden kann.

Standardtypen wie string, float, Transform, Texture2D, etc. lassen sich als Einzelelemente ganz einfach im Inspektor darstellen, in dem man sie als public Fields deklariert. Was aber, wenn man eigene Datenstrukturen verwenden möchte?

Eigene Datenstruktur

Beispiel: Folgende Klasse wollen wir im Inspektor füllen können.


public class NpcProfile
{
    public string name;
    public Texture2D image;
}

In der Componentenklasse wird ein Feld vom Typ NpcProfile deklariert.


public class InspectorTest : MonoBehaviour {
    public NpcProfile npcProfile;
}

Und siehe da: Nach Hinzufügen des Skripts zu einem Gameobjekt sieht man nix.

custom-data-inspector-1

Es fehlt mindestens ein Zauberwort.

Serializable

Will man die eigene Klasse im Inspektor sehen und befüllen können, muss man dieser das Attribut Serializable geben. Erst dann ist es möglich, die public Fields der Klasse zu serialisieren und zu speichern.

using UnityEngine;
using System;

[Serializable]
public class NpcProfile
{
...

custom-data-inspector-2

Befüllen mit Gameobjekt

Möchte man möchte ein Feld welches mit einem GameObjekt befüllt werden soll, z.B. in dem man ein GameObjekt aus der Hierarchy direkt auf das Feld im Inspektor zieht, dann muss die Klasse von MonoBehaviour abgeleitet werden.


[Serializable]
public class NpcProfile2 : MonoBehaviour {

 


public class InspectorTest : MonoBehaviour {
    public NpcProfile npcProfile;
    public NpcProfile2 npcProfileAsGameObj;
    ...
}

Jetzt erwartet das Feld ein GameObject Component.

custom-data-inspector-3

Arrays

Um mehrere Elemente der eigenen Datentstruktur im Inspektor anlegen zu können, kann man Arrays verwenden.


[Serializable]
public class InspectorTest {
    ...
    public NpcProfile[] npcProfiles;

custom-data-inspector-4

Alternative: Struct

Man muss nicht zwingend Klassen verwenden, es genügt auch eine Struktur.


[Serializable]
public class InspectorTest {
    ...
    [Serializable]
    public struct NpcProfileStruct
    {
        public string name;
        public Texture2D image;
    }
    public NpcProfileStruct[] npcProfilesAsStruct;
    ...

custom-data-inspector-5

Hinweis:
Möchte man Properties statt Fields verwenden, muss ein CustomPropertyDrawer verwendet werden. Ebenso für Anpassungen der Controlls im Inspektor.

Ich hoffe wie immer, diese erstbeste Lösung war hilfreich.

 

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert