Hallo

Mein Name ist Jonas und ich studiere technische Informatik. Mittlerweile mach ich das auch schon eine Weile und es wird langsam Zeit meine Bachelor Thesis zu starten. Da ich immer schon Lust dazu hatte mal ein Computerspiel zu machen, hab ich mich dazu entschieden mich während meiner Thesis damit näher zu beschäftigen und die Erfahrungen die ich dabei hoffentlich sammeln werde hier niederzuschreiben.

25.8.2015

Der Plan

Dem Umstand geschuldet, dass das Wort „technisch“ im Namen meines Studiums auftaucht kann ich aber nicht einfach ein Spiel programmieren. Um dem Wort „technisch“ gerecht zu werden muss da halt noch irgendwas technisches oder physikalisches hinzugefügt werden. Nach Absprache mit meinem Professor konnten wir uns darauf einigen das ich eine Discgolf Simulation mit Hilfe einer Game-Engine erstelle in dem der Wurf der Scheibe physikalisch möglichst korrekt simuliert wird.

26.8.2015

Die Wahl der Engine

Bevor ich damit Anfange zu programmieren oder groß Konzepte aufstelle muss ich mich erstmal für eine Engine entscheiden und das ist gar nicht mal so einfach. Wer heute ein Computerspiel mit Hilfe einer Enigne erstellen will hat die Qual der Wahl. In den letzten Jahren haben sich viele Engine Entwickler auf Grund des Indi-Spiele-Hypes darauf konzentriert die Engines zugänglicher für Anfänger und kleinere Teams zu gestalten. Wenn man als Hobby-Entwickler die passende Engine sucht landet man vermutlich bei einer von drei Engines. Die Hauptfrage ist also Unity3D, Unreal-Engine oder Cry-Engine. Ich denke die Engines auf Performance zu vergleichen ist nicht wirklich Sinnvoll, vor allem nicht als Hobby-Entwickler, da man die Engine vermutlich eh nicht ausreizen wird. Also stellt sich eher die Frage nach Features, Tools, Programmiersprache, Workflow und Drittsoftware Schnittstellen. Ich habe mich auf Grund dieser Kriterien für Unity3D entschieden. Und zwar wegen folgender Punkte.

- Ich halte Unity3D immer noch für die geeignetste Engine um kleine Spiele mit wenig Leuten Engine zu machen
- Es ist möglich in Unity3D mit C# zu Programmieren was wohl eine der schönsten Programmiersprachen ist.
- Die Spielerstellung in Unity3D basiert auf dem Decorater-Pattern. Das heißt man kann Spielobjekten dynamisch Funktionalitäten und Eigenschaften hinzufügen.
- Unity3D hat eine gute Schnittstelle zu Blender welches die 3D-Modellierungssoftware ist die ich zum erstellen sämtlicher 3D Objekte nutzen werde.

27.8.2015

Von Blender zu Unity

Da ich mich jetzt für eine Engine entschieden habe ist es an der Zeit sich erst einmal mit den Basisfunktionen dieser zu Beschäftigen. Die erste Aufgabe die ich hier in Angriff genommen hab ist das Einfügen von eigenen Modellen in die Engine. Wie schon erwähnt nutze ich für die Modell die 3D-Modellierungssoftware „Blender“. Da ich kein ganzes Spiel machen werde sondern die Modelle nur als Beispiele dienen reichen mir einige wenige Objekte die ich ins Spiel einfüge. Ich brauche also einen Charakter als Spieler, eine Scheibe zum Werfen, einen Baum als Hindernis und einen Korb als Ziel.
img01
img01
img01
img01
Prinzipiell verlief das importieren der Blender Objekte ohne Skelett in die Engine ziemlich Problemlos. Es müssen in Blender für jedes Objekt zwei Meshes modelliert werden. Zum einen das Mesh, das auch gerendert werden soll und man hier auf den Bildern sehen kann. Zum anderen das Collision-Mesh das im Grunde ein Gitter ist welches das Rendermesh umspannt und der Berechnung der Kollisionen dient. Die Beiden Meshes werden dann einzeln von Blender als .fbx exportiert und in Unity importiert. Innerhalb Unitys wird dann das Collsion-Mesh und die Texturen dem RenderMesh hinzugefügt und die Objekte sind Bereit ins Spiel gebracht zu werden.

30.8.2015

Skeleton Mesh

Den Spielcharakter in Unity zu bringen war ein wenig komplizierter. Da dieser ein Skelett sowie diverse Animationen beinhaltet. Um den Charakter zu riggen (ein Skelett zu erstellen) hab ich eine leicht modifizierte version des Blender Addons „rigify“ benutzt. Das es einem Erleichtert menschliche Charaktere zu riggen und zu animieren. Auch das Charakter Mesh wird samt Skelett als .fbx Datei von Blender exportiert. Hier ist wichtig das nur Deform-Bones also Teile des Skeletts die das Mesh verformen exportiert werden, da man ansonsten lauter nutzlose Objekte in seinem Spielcharakter hat. In Unity muss man nun noch den die Texturen den Materialien des Charakters zuweisen und die Animationen die geloopt werden sollen passend einstellen.

2.9.2015

Setup des Spielcharakters

Um dem Spielcharakter leben einzuhauchen fehlen noch ein paar zusätzliche Schritte. Als erstes brauch auch unser Spielcharakter ein Collision-Mesh. Da das Mesh der Spielfigur jedoch wesentlich komplexer ist als z.B der Baum und dazu noch animiert werden soll ist es nicht Sinnvoll dem Spielcharakter ein „maßgefertigtes“ Collision-Mesh zu spendieren. Stattdessen bietet es sich an Capsule-Collider den Unity schon von Haus aus mitliefert zu verwenden. Außerdem benötigt der Spielcharakter noch eine Rigid-Body Komponente um ihn im Raum bewegen zu können. Um den Spieler ordentlich zu animieren bietet Unity die Komponente „Animator“. Der Animator ist im Grunde eine state machine oder zu deutsch Zustandsautomat. In ihm werden die Animationen die verwendet werden sollen, in meinem Fall vorerst „Gehen“, „Rennen“, „Stehen“ und „Werfen“, als Status definiert und die Übergänge von Status zu Status über Transaktionen mit Bedingungen definiert. Danach ist der Charakter soweit ins Spiel gebracht und über Programmcode kontrolliert zu werden.

4.9.2015

Unity und Decorator

Wie schon erwähnt ist die in Unity verwendete Programmiersprachen C#. Es ist zwar auch möglich in Java Script oder Boo zu programmieren ich bevorzuge jedoch, wie die meisten anderen auch, C#. Zunächst muss beachtet werden, dass Unity das Decorator Pattern verwendet. Das heißt, jedes Spielobjekt, in C# „GameObject“, besteht aus Basiskomponenten wie Position, Rotation und Scalierung, in C# in der Klasse „Transform“ zusammengefasst. Will man einem Spielobjekt weitere Funktionen oder Eigenschaften zuweisen tut man dies indem man dem Spielobjekt eine Komponente hinzufügt. Will man z.B. Ein Objekt beweglich machen so muss dem GameObject ein RigidBody hinzugefügt werden. Auf die Komponente RigidBody kann nun von einem Script, das wiederum eine Komponente des GameObjects ist, über die Methode „GetComponent()“ zugegriffen und manipuliert werden.

7.9.2015