Tony the bachelor boy
Tony beginnt in Kürze sein Bachelor-Studium und er ist so etwas von begeistert! Der arme Kerl hat jedoch keine Ahnung, was Prüfungen und Projekte mit einem so anstellen können.
Sein erstes Semester hat nun begonnen und Tony ist völlig überfordert. Die immensen Auswirkungen der Prokrastination erfährt der Gute gerade am eigenen Leib. Kannst du Tony helfen, alle seine Semester zu bestehen?
«Tony the bachelor boy» ist ein Web-Game, welches ich mit Unity programmiert habe. Wenn du mehr dazu erfahren möchtest und wissen möchtest, was dieser fotorealistische Amboss mit diesem Projekt zu tun hat, dann klappe die Kritik auf. Du kannst ihn hier auch interaktiv auf Sketchfab anschauen!
(mou)
Dieses Projekt ist getreu dem inoffiziellen Motto unseres Studiengangs «eifach mol öbbis mache» entstanden. Ich wusste beim Projektstart nur, dass ich mich vertiefter im 3D-Design mit Blender und der Game-Engine Unity einarbeiten wollte.
Blender
Wie bei jedem Projekt startete ich meine Suche auf Youtube. Da bin ich auf eine Tutorialreihe von Andrew Price, aka BlenderGuru, gestossen, welche sich um den besagten fotorealistischen Amboss dreht. Ich dachte mir zuerst, wer zur Hölle interessiert sich denn für einen Amboss? Es waren viele und lange Videos, was mich dann doch stutzig machte und mich verleitete, durch die Videos zu scrollen. Als ich merkte, wie stark sie ins Detail gehen, haben sie mich dann doch überzeugt.
Der Amboss hat mich sehr viel mehr Zeit und Nerven gekostet, als ich es ursprünglich geschätzt habe. Da das Tutorial mit einer älteren Blender-Version erstellt wurde, waren Einstellungen in andere Menüs geschachtelt, unbenannt worden oder gänzlich rausgestrichen worden. Ehrlich gesagt habe ich viele Sachen schlichtweg einfach auch verkackt. Nichtsdestotrotz war es ein enorm bereicherndes Projekt. Es war spannend, in Blender in gewissen Punkten sehr tief einzutauchen und das Zusammenspiel der Funktionen besser zu verstehen.
Ich konnte enorm viel über Topologie, Hard-Surface-Modeling, UV unwrapping, Sculpting, Texturen und Masken, Baking, Custom Brushes und den Node Editor lernen. Das wichtigste Learning für mich war, wie man hochaufgelöste 3D-Modelle mittels einer Normal Map auf ein Low Poly Mesh übertragen kann. Durch diesen Prozess können Details simuliert werden, mit einem Bruchteil der dafür benötigten Polygone. Perfekt für Exporte in Games etc.
Setup der Texturen, um ein realistisches Ergebnis zu erhalten.
Das komplexe Node Setup funktioniert jedoch nur innerhalb von Blender. Damit ich den Amboss auf Sketchfab laden konnte, musste ich noch Custom Texturen baken. An dieser Stelle möchte mich herzlich bei Denis Cliofas für all seinen Support bedanken.
Was nun?
Als ich dann endlich mit dem Amboss fertig war, drängte sich die Frage auf, was ich nun damit anfange. Ich vermutete, dass Thomas wohl nicht so Freude hätte, einen zwar wahnsinnig tollen Amboss, aber eben trotzdem nur einen Amboss zu sehen. Da hatte ich dann die zündende Idee. Ich kann den Amboss in ein Unity Game importieren!
Unity
Nach einiger Recherche schien mir dann ein Tutorial des Channels «Brackeys» am besten geeignet. Es ist kein zu steiler Einstieg, ist skalierbar und deckt alle Unity Basics sehr gut ab. Ich konnte mich dadurch relativ einfach und verständlich in Themen wie Physics, Scripting mit C Sharp, Prefabs, Scenemanagement, wie man einen eigenen GameManager programmiert etc. einarbeiten. Obwohl wir Unity im zweiten Semester behandelten, musste ich mir eigentlich alles autodidaktisch beibringen, da wir damals «nur» in 2D gearbeitet hatten.
Eigentlich wollte ich den Amboss noch importieren. Der erste Arbeitstitel für mein Game war «Mate vs. Anvil». Da ich Kaffee nicht mag, ist Mate das Elixier, das mich durch dieses Studium bringt. Der Amboss sollte die Leistungsnachweise symbolisieren. Thomas hat mir dann in einem Coaching jedoch geraten, dies aussen vor zulassen, da es nicht zu dem minimalistischen Style des Spieles passt. Ich fand diesen Einwand sehr berechtigt.
Erweiterungen
Das Projekt hat mich nicht mehr losgelassen. Das Tutorial war sehr gut, aber es gab viele Sachen, die für mich nicht vollendet wirkten. Den Zwischenstand nach dem Ende der Tutorialreihe kannst du dir hier ansehen: https://532160-3.web.fhgr.ch/
Um (einigermassen) zu verstehen, was ich eigentlich mache, versuchte ich mir die Grundlagen von C-Sharp autodidaktisch beizubringen. Dies war definitiv eine grosse Herausforderung. Aber Spaghetti-Code gehört einfach zum Lernprozess.
Story
Den Story Aspekt hatte ich zuerst ignoriert, da ich mich auf die Game-Engine fokussieren wollte. Dies hat Thomas natürlich angemerkt und nach einigem hin und her, musste ich mir doch eingestehen, dass er recht hat. Zack bäng meringue, Tony the bachelor boy wurde geboren.
Audiomanager
Ein Game ohne Sound fühlte sich einfach nicht richtig an. Ich habe mich diverser Free-Sounds bedient. Ich habe mit verschiedenen Integrationsmöglichkeiten des Audios experimentiert, die grösste Flexibilität bietet jedoch ein selbst programmierter Audiomanager.
Der Mehraufwand hat sich deutlich gelohnt. Durch den Audiomanager konnte ich Sounds auch ohne Zuordnung zu einem fixen GameObject per Script abspielen und die Verwaltung der Sounds war einfach und übersichtlich. Ebenfalls kann ein Sound (bspw. Hintergrundmusik) über mehrere Szenen ohne Unterbruch durchgespielt werden.
Pause Screen
Die Grundfunktionalität des Pausierens war relativ einfach. Die Lautstärke der Musik hat mich jedoch schon eine Weile gestört und ich war jeweils zu faul, sie über meinen Laptop zu regulieren. Deshalb wollte ich die Möglichkeit bieten, dass man die Lautstärke innerhalb des Pause Screens anpassen kann.
Ich hätte bei der Regulierung über den Laptop bleiben sollen. Diese Funktion hat mich fast in den Wahnsinn getrieben. In dem Tutorial konnte man den Slider Value nur innerhalb eines Levels einmal anpassen (und das ziemlich abgehackt), danach war die Anpassungen nur noch visuell. Dies stellte mich vor mehrere Probleme: Wie kann ich die Bearbeitung kontinuierlich und flüssig machen und Einstellungen über mehrere Levels speichern? Nach vielen Stunden in Foren und Kommentarspalten habe ich dann die Lösung gefunden. Mittels den Playerprefs kann man Settings in Unity speichern und mittels eines Logarithmus konnte ich die Anpassung der Lautstärke flüssiger abbilden.
Stupid loading screen tips
Ich habe eine Hassliebe für die teilweise sehr fragwürdigen Loadingscreen-Tips bei Games. Natürlich musste ich dies für mein eigenes Spiel ebenfalls verwenden, jedoch in Form von veränderten Zitaten. Damit ich nicht bei jedem Loadingscreen manuell erfassen und stylen muss, habe ich diese ausgelagert und sie werden in zufälliger Reihenfolge ausgegeben.
Da das Game keinen effektiven Loadingscreen hat, habe ich es einfach in den LevelComplete Screen als kleine Motivation gepackt.
Animationen
Damit die UI-Elemente nicht so langweilig wirken, habe ich jeweils einen simplen Fade-In Effekt animiert.
Playtest
Kurz vor der Abgabe habe ich mit einigen Freunden und Freundinnen noch einen Spieletest durchgeführt, um allfällige Bugs noch zu beseitigen. Das Feedback zu interpretieren war jedoch nicht sehr einfach. Für einen Teil war das Spiel zu schnell und/oder schwer, für die anderen war es zu einfach. Das Game sollte eine kurzweilige und spassige Sache sein. Ich habe die einzelnen Levels ständig angepasst, um einen Mittelweg zu finden.
Export
Ich habe das Spiel zuerst als Windows .exe exportiert. Das war sehr einfach und funktionierte gut. Nur würde sehr wahrscheinlich kein Mensch mein Digezz Projekt herunterladen und installieren. Die Files wirkten schon etwas «shady». Glücklicherweise kann man mit Unity einen WebGL Export machen. Dieser war leider ziemlich buggy und kostete mich anfangs einiges an Zeit. Ich musste auch noch gewisse Anpassungen vornehmen, damit das Spiel im Browser geladen werden kann. Doch auch dieser Aufwand hat sich sehr gelohnt.
Fazit
Das Projekt war wirklich ein harter Brocken. Ich habe mir ein paar Mal überlegt, ob ich nicht einfach alles hinschmeissen soll. Der Editor, wie man Scripts verknüpft und wie alle Elemente zusammenspielen, war sehr gewöhnungsbedürftig. Objektorientiert mit C Sharp programmieren war ebenfalls eine grosse Herausforderung und ich musste meinen Code diverse Male überarbeiten. Ich musste eine Unmenge an Bugs fixen, aber sehr wahrscheinlich habe ich einen grossen Teil noch gar nicht entdeckt. Für ein Anfängerprojekt bin ich mit dem Resultat jedoch sehr zufrieden. Ich hätte gerne noch eine Option eingearbeitet, wo man die Schwierigkeit, resp. die Geschwindigkeit des Players auswählen kann. Dies konnte ich aus zeitlichen Gründen leider nicht mehr umsetzen.