Sonstiges: Entwicklertagebuch - Der Weg zum eigenen Switch-Spiel
Michael Grönert, am 26.12.2016, Seite 25 von 25

BadToxic Discord-Server | GameMaster Discord-Server | BadToxic auf Twitter
BadToxic auf Instagram | BadToxics Entwickler-Instagram | BadToxic auf YouTube
Teil 25: Charakter-Individualisierung
Wir sind es gewohnt, in RPGs und anderen Spielen eigene Charaktere zusammenstellen zu können. Wir wählen das Geschlecht, regulieren Körpergröße und Statur und können alle möglichen Details anpassen. Im Tagebucheintrag 23 haben wir einen 3D-Charakter im Manga-Style erstellt, doch dieser bleibt bisher so wie wir ihn mit dem Programm VRoid Studio gebastelt haben. Heute wollen wir erforschen, inwieweit wir das Aussehen dieses Charakters noch innerhalb von Unity und unserem Spiel beeinflussen können.
Auf was können wir Einfluss nehmen?
Um das herauszufinden untersuchen wir, wie das Spieler-Objekt welches wir nach dem Konvertierungsprozess aus VRoid Studio erhalten haben. Im folgenden Screenshot seht ihr eine bereits leicht verfeinerte Version der Objekt-Hierarchie, die wir dann mit unserem Spieler verschmolzen haben.

Struktur unseres Spieler-Objektes
Unter „Armature“ finden wir jede Menge Knotenpunkte, die für verschiedene Körperteile und Gelenke stehen. Von der Hüfte gehen etwa die Beine und der Torso bzw. die Wirbelsäule aus. Von dort wiederum die Brust und von dieser die Schultern und der Hals. Der Grundgedanke ist nun, dass wir diese Einzelteile unterschiedlich skalieren, also dehnen oder stauchen, um neue Proportionen zu erhalten. Doch ist das wirklich so einfach? Nein, natürlich ist es das nicht. Zunächst muss man beachten, dass auch alle darunter liegenden Teile mit verzerrt werden. Wollen wir beispielsweise breitere Schultern, bekommen auch die Arme einen größeren Durchmesser. Aber natürlich nur auf der Achse die wir verändern - breitere Schultern verursachen also sogar einen ovalen Armdurchschnitt, was wir nicht wollen. Außerdem gibt es zwischen den Knotenpunkten Rotationen, wodurch das ganze etwas komplizierter wird. So kann das Ändern der X-Achse eines Objektes auch die Y-Achse der Kindobjekte beeinflussen, statt deren X-Achsen. Wahrscheinlich sogar Anteilig - also etwa zu 20% die X-Achse und zu 80% die Y-Achse.
Wollen wir also einzelne Körperteile verändern, müssen wir die Änderungen bei deren Kind-Objekten wieder kompensieren. Machen wir beispielsweise die Arme um 10% länger, müssen wir die darunterliegenden Hände um 10% kürzer machen. Dazu muss uns bekannt sein welche Achsen des Kindes wir um wie viel anpassen müssen, um insgesamt die 10% zu erreichen. Um bei diesem Beispiel zu bleiben - die Hände vielleicht um 6% auf der X-Achse verkürzen, und jeweils 2% auf den Y- und Z-Achsen. Hier zu berechnen was wie geändert werden muss, scheint mir aufwändiger als es auszuprobieren, auch wenn das etwas grob ausfällt.
Wie können wir das umsetzen?
Noch schwieriger ist die Planung der Umsetzung. Wir wollen eine UI, bei der wir mit Schiebereglern verschiedene Körperteile verändern können. Der darunter liegende Code braucht Referenzen auf die einzelnen Körperteile, die er verändern soll. Also erstellen wir einen „CharacterCustomizationController“, wie ich die C#-Klasse genannt habe, welcher einen „Player“ bekommt, ihn eigenständig durchläuft und anhand der Knoten-Namen die Referenzen sammelt um später direkt darauf zugreifen zu können. Jeder Slider eines veränderbaren Körperteils bekommt einen Wertebereich nach Augenmaß - eine minimale und maximale Dehnung bzw. Stauchung. Und nun das Trickreiche: Zudem bekommt jeder Slider eine Liste von Referenzen auf weitere Körperteile, die zur Kompensation genau gegenteilig skaliert werden sollen. Zu jeder dieser Referenzen benötigt er einen 3D-Vektor, welcher angibt, zu welchen Anteilen diese referenzierten Körperteile auf welchen Achsen skaliert werden sollen.

Code-Beispiel: Nötige Referenzen und Skalierungs-Vektoren um die Armlängen zu verändern.
Um alles hierfür nötige herauszufinden muss jede Menge ausprobiert werden - man sagt „Trial & Error“ (Versuch und Irrtum). Und dabei sammeln sich etliche Werte an, die auch verwaltet werden wollen. Immerhin brauchen wir mittelmäßige Standardwerte, die am besten der Ausgangssituation entsprechen. Dazu kommen die Minima und Maxima und ein Faktor, um wie viel sich eine Skalierung verändert, wenn man den Slider um eine gewisse Strecke bewegt. Das Minimum und Maximum kann sich natürlich aus dem Faktor ergeben (oder andersherum), da die Slider einen festen Wertebereich von null bis eins haben.

Code-Beispiel: Nötige Faktoren und Standardwerte für zehn veränderbare Körperteile
Diese Werte müssen gespeichert und geladen werden und im Multiplayer außerdem über Netzwerk übertragen werden können, damit man auch die Einstellungen anderer Spieler sehen kann. Auf diesen Aufwand werde ich hier aber nicht genauer eingehen, da es sich hauptsächlich um Schreibarbeit handelt und das Speicher-System und Kommunikation über das Netzwerk bereits in früheren Tagebucheinträgen angesprochen wurde.
Die grafische Umsetzung
Per Tastendruck lassen wir jederzeit mitten im Spiel die Kamera zu unserem Character fahren und zoomen. Wir haben eine zweigeteilte Benutzeroberfläche: Links lassen sich die Kategorien von Körperteilen auswählen und rechts werden dann entsprechende Schieberegler angezeigt. In obigem Video sieht man eine sehr simple und frühe Umsetzung. Hier werden nur Standard-Unity-UI-Grafiken verwendet und Schlüsselwörter beschreiben die Funktionen. Da ich solche Texte nicht so schön finde und man dadurch erhöhten Aufwand hat, das Spiel in mehrere Sprachen zu übersetzen, überlege ich mir, wie man mit Grafiken die gleiche Aussagekraft erzielen kann. In folgendem Video sieht man, wie ich es schließlich umgesetzt habe - einfache Figuren, bei denen jeweils eingezeichnet ist, was sich verändert. Für die Körper-Kategorien links sind ganze Körperbereiche blau markiert. Auf der rechten Seite sind die konkreten Achsen an den betroffenen Stellen eingezeichnet. Außerdem ist die Benutzeroberfläche nun kompakter, hält sich nur am Bildschirmrand und ist vom Design minimal ansehnlicher.
Es ist vollbracht
Somit haben wir unser Ziel erreicht. Tatsächlich habe ich nur Einstellungen für die Körperteile implementiert, für die es mit vertretbarem Aufwand möglich war. Ich habe auch mit Körperteilen experimentiert, bei denen die Verzerrungen der Kindknoten so heftig waren, dass ich sie nicht ohne weiteres ausgleichen konnte. Man kann sich aber auch einige andere Optionen überlegen. Beispielsweise dass wir die Haut-, Augen- und Haarfarben ändern können. Auch andere Kleidung ist wünschenswert, aber vermutlich nicht so ohne weiteres austauschbar, da sie aktuell fester Bestandteil unseres Spieler-Körpers ist. Doch fürs Erste soll uns das zum Thema Charakter Individualisierung genügen.
Und damit möchte ich mich für heute verabschieden. Bis zum nächsten Mal - dann wollen wir einen flüssigen Übergang zwischen der Overworld und den Minispielen schaffen, indem wir unseren „GameGuy“-Handheld aus der Tasche holen und auf ihm ein Spiel starten.
Ihr möchtet die Auszüge aus dem Leben eines Entwicklers lieber in englischer Sprache lesen? Unter diesem Link findet ihr die englische Version dieses Tagebucheintrags!
ANZEIGE:
Um Kommentare zu schreiben, bitte oben einloggen oder jetzt Registrieren!