Ich versuche ein zweidimensionales Array im Editor zu zeigen, wie die "Layer Collision Matrix" in Unity gezeigt wird:
Obwohl ich anstelle von Kontrollkästchen Ints und ein vollständiges Gitter (nicht die Dreiecksform) brauche, kann ich nicht herausfinden, wie man das tut. Ich kann einen benutzerdefinierten Editor bekommen, obwohl das Gitter ausfällt . Also, kann ich irgendwie den Code des Editors des Physikmanagers sehen (die Layer Collision Matrix ist da drin) oder kennt jemand einen guten Weg dies zu tun?
Hinweis: Die bevorzugte Sprache ist c #, auch wenn dies möglich ist.
Danke.
Der Code für das, wonach Sie suchen, ist ziemlich komplex, deshalb werde ich mich darauf verlassen, dass Sie wissen, wovon ich hier rede. Die Unity-Dokumente sind Ihr Freund.
Erstelle ein GUIArea
, wo dein spezielles Editor-Tool sein wird. Drinnen legen Sie a
Funktionsaufruf, der dann die anderen Renderfunktionen aufruft. ich
Ich vermute, du wirst hier eine Kapselung machen wollen. Durch das Einkapseln der GUI in eine andere Funktion können Sie ihre Funktionalität (innerhalb der Grenzen Ihrer Abstraktion) duplizieren und die Dinge auf dem Bildschirm leichter verschieben.
Entwerfen Sie drei Ankerpunkte ( Vector2
). Sie sollten jeweils die obere linke darstellen
Koordierung Ihrer Zeilenbeschriftungen, Spaltenbeschriftungen und Datenfelder. Beachten Sie, dass
der Spaltenanker muss direkt über (der gleiche x-Wert wie) sein
Zeilenanker, da rotierend (nächster Schritt) den Anker transformieren wird.
Verwenden Sie GUIUtility.RotateAroundPivot()
, um die GUI-Transformation zu drehen
Matrix um 90 ° um den Spaltenankerpunkt.
Schreibe eine lange GUI.Label
(oder mehrere davon) für deine Labels.
Verankere sie am Säulenanker. Für das Bild oben, Ihr Etikett
String könnte etwas wie lesen
"Default \ nTransparentFX \ nIgnoreRaycast \ nWater", wo \ n erstellt wird
eine neue Zeile.
Drehen Sie erneut um -90 ° zurück zur ursprünglichen Matrix. Alternativ, du
kann GUI.matrix
vor Schritt 3 kopieren und dann für a zurückgeben
garantierter Matrix-Reset. Das Hin- und Herdrehen kann aufgrund von Gleitkomma- und anderen Ungenauigkeiten zu Fehlern führen.
Schreibt Beschriftungen für die Zeilen. Die gleiche Methode wie zwei Schritte zurück. Anker sie an der Reihe Anker.
Das ist der schwierigere Teil. Iterieren Sie durch Ihr Datenfeld und erstellen Sie ein
klein EditorGUI.IntField()
oder StringField()
oder gerade
ObjectField()
für jedes Element in Ihren Daten. Jedes Element wird
brauche einen eigenen Anker, der dann mit dem Datenfeldanker summiert wird.
Wenn Ihr Datenfeld ein quadratisches 2D-Array ist, werden die Anker abgeleitet
sei einfach - obwohl du auch leere Elemente in deinem Array hast (wenn
Sie möchten die oben beschriebene genaue Funktionalität). Wenn du möchtest
Speicher sparen, müssen Sie die Element-Indizes in konvertieren
Koordinaten mit einigen kniffligen Mathe. Ich bin mir nicht ganz sicher
Kopf, wie ich es machen würde.
Ich hoffe, ich vergesse nichts. Die GUI von Unity ist ein b ----. Kommentar und ich werde mein Bestes tun, um Ihnen zu helfen.