Der ultimative Leitfaden für Anfänger zur Spieleentwicklung in Unity

Unity ist ein großartiges Tool für das Prototyping von Spielen bis hin zu interaktiven Visualisierungen. In diesem Artikel gehen wir auf alles ein, was Sie wissen müssen, um mit Unity beginnen zu können.

Zunächst ein wenig über mich: Ich bin ein Hobby-Unity-Entwickler, 3D-Modellierer und Grafikdesigner, der seit über 5 Jahren mit Unity und Blender zusammenarbeitet. Ich bin jetzt ein Student der Finanzmathematik am University College Dublin und mache gelegentlich freiberufliches Grafikdesign, Web-Prototyping und Game-Prototyping.

Einführung

Dieser Artikel richtet sich an alle, die Unity noch nie zuvor verwendet haben, aber bereits Erfahrung in der Programmierung oder im Bereich Webdesign / -entwicklung haben. Am Ende dieses Artikels sollten Sie einen guten allgemeinen Überblick über die Engine sowie alle erforderlichen Funktionen und den Code haben, um ein grundlegendes Spiel zu erstellen.

Warum Einheit?

Wenn du Spiele machen willst

Es gibt wirklich sehr wenige Optionen, wenn es um die Entwicklung von Indie-Spielen geht. Die drei Hauptoptionen, wenn Sie Spiele erstellen möchten, sind Unreal, Unity oder GameMaker.

Unity ist wahrscheinlich die am wenigsten einschätzende der drei Plattformen. Es bietet Ihnen ein sehr rohes Produkt, ist jedoch sehr flexibel, gut dokumentiert und sehr erweiterbar, um so ziemlich jedes Spielgenre zu entwickeln, das Sie sich vorstellen können.

Es gibt viele sehr erfolgreiche Spiele wie Escape from Tarkov (FPS), Monument Valley (Puzzler) und This War of Mine (Strategie / Überleben), die alle in Unity gebaut wurden.

In Wirklichkeit ist die Engine, auf der Sie Ihr erstes Spiel aufbauen, wahrscheinlich nicht kritisch. Mein Rat ist also, nur eine auszuwählen und mitzumachen.

Wenn Sie Benutzererfahrungen prototypisieren möchten

Da Unity nur eine Engine mit einer Reihe von Physik, Animationen und 3D-Rendering in Echtzeit ist, ist es auch ein großartiger Ort, um vollwertige interaktive Prototypen für UX-Studien zu erstellen.

Unity bietet volle Unterstützung für VR und AR und könnte daher ein großartiges Werkzeug für die Erkundung von Architektur, Automatisierung und Simulationen mit Kunden sein.

Abschnitte zu diesem Artikel

  • Warum Einheit?
  • Unity Editor-Fenster
  • Unity-Spielobjekte
  • Integrierte Komponenten von Unity
  • Benutzerdefinierte Komponenten erstellen
  • Struktur eines MonoBehaviour
  • Manipulieren von GameObjects
  • Raycasting
  • Kollisionserkennung
  • Erweiterte Funktionen
  • Beratung für Neulinge
  • Schöne Ressourcen und Gemeinschaften
  • Fazit

Unity-Editor-Fenster

Das Editorfenster ist in mehrere Abschnitte unterteilt. Wir werden dies sehr kurz behandeln, da wir im gesamten Artikel ständig darauf verweisen werden. Wenn Sie damit bereits vertraut sind, springen Sie einfach vorbei!

Szenenansicht: Ermöglicht die Platzierung und Bewegung von Gameobjects in der Szene Spiel Ansicht: Vorschau , wie der Spieler die Szene von der Kamera sehen Inspector: Gibt Sie Details zu dem ausgewählten Gameobject in der Szene. Assets / Projekt: Hier werden alle Prefabs, Texturen, Modelle, Skripte usw. gespeichert. Hierarchie: Ermöglicht das Verschachteln und Strukturieren von GameObjects innerhalb der Szene

Jetzt können wir gut anfangen!

Unity-Spielobjekte

Was sind GameObjects?

GameObjects sind der Kernbaustein von allem in der Unity-Spiele-Engine. Der Name verrät es fast:

Alles, was Sie in einer Szene in Unity platzieren, muss in ein "Spielobjekt" eingeschlossen werden.

Wenn Sie einen Webdesign-Hintergrund haben, können Sie sich GameObjects als sehr ähnlich wie Elemente vorstellen! Extrem langweilige Container, die jedoch in hohem Maße erweiterbar sind, um komplexe Funktionen oder Grafiken zu erstellen.

Im wahrsten Sinne des Wortes ist alles, von Partikeleffekten, Kameras, Spielern, UI-Elementen usw. (die Liste geht weiter), ein GameObject.

Hierarchie erstellen

Wie bei einer Webentwicklung ist auch ein GameObject ein Container. So wie Sie s verschachteln, um abwechslungsreiche und wünschenswerte Layouts oder Abstraktionen zu erstellen, möchten Sie möglicherweise dasselbe mit Spielobjekten tun.

Die Logik hinter dem Verschachteln von Spielobjekten ähnelt weitgehend der Webentwicklung. Ich werde einige Beispiele nennen.

Unordnung & Effizienz

Webanalogie: Sie haben viele ähnliche Elemente, die als Reaktion auf Benutzerinteraktionen im laufenden Betrieb dynamisch generiert werden können, und möchten sie aufgeräumt halten. Unity-Übersetzung: Wenn Sie einen Minecraft-Klon erstellen und viele Blöcke in der Szene haben, müssen Sie aus Leistungsgründen Blöcke in der Szene hinzufügen und daraus entfernen. Daher ist es sinnvoll, sie für jeden Block einem leeren GameObject zuzuordnen, da durch das Löschen des übergeordneten Blocks alle untergeordneten Blöcke entfernt werden.

Positionierung

Webanalogie: Sie möchten die Position des enthaltenen Inhalts "relativ" zum Container und nicht zur Webseite beibehalten. Unity Translation: Sie haben eine Reihe von Helferdrohnen erstellt, die um den Player herum schweben. Sie würden wirklich nicht lieber Code schreiben, um ihnen zu sagen, dass sie dem Spieler nachjagen sollen, sondern Sie instanziieren sie stattdessen als Kinder des Spieler-Spielobjekts.

Integrierte Komponenten von Unity

Das Akteurkomponentenmodell

GameObjects alleine sind ziemlich nutzlos - wie wir gesehen haben, sind sie so ziemlich nur Container. Um ihnen Funktionen hinzuzufügen, müssen wir Komponenten hinzufügen, bei denen es sich im Wesentlichen um Skripte handelt, die entweder in C # oder Javascript geschrieben sind.

Unity arbeitet mit einem Actor Component-Modell. Einfach ausgedrückt sind die GameObjects die Akteure und die Components Ihre Skripte.

Wenn Sie zuvor Web-Apps geschrieben haben, sind Sie mit der Idee vertraut, kleine wiederverwendbare Komponenten wie Schaltflächen, Formularelemente, flexible Layouts mit verschiedenen Anweisungen und anpassbaren Eigenschaften zu erstellen. Bauen Sie diese kleinen Komponenten dann zu größeren Webseiten zusammen.

Der große Vorteil dieses Ansatzes ist der Grad der Wiederverwendbarkeit und klar definierte Kommunikationskanäle zwischen Elementen. Ebenso wollen wir in der Spieleentwicklung das Risiko unbeabsichtigter Nebenwirkungen minimieren. Kleine Fehler neigen dazu, außer Kontrolle zu geraten, wenn Sie nicht vorsichtig sind, und sind äußerst schwierig zu debuggen. Daher ist die Erstellung kleiner, robuster und wiederverwendbarer Komponenten von entscheidender Bedeutung.

Wichtige integrierte Komponenten

Ich denke, es ist Zeit für ein paar Beispiele der eingebauten Komponenten, die von der Unity Games-Engine bereitgestellt werden.

  • MeshFilter: Ermöglicht das Zuweisen von Materialien zu einem 3D-Netz zu einem GameObject
  • MeshRender: Ermöglicht das Zuweisen von Materialien zu einem 3D-Netz
  • [Box | Mesh] Collider: Ermöglicht die Erkennung von GameObject bei Kollisionen
  • Rigidbody: Ermöglicht eine realistische physikalische Simulation, um auf GameObjects mit 3D-Netzen zu wirken, und löst Erkennungsereignisse auf Box-Collidern aus
  • Licht: Beleuchtet Teile Ihrer Szene
  • Kamera: Definiert das Player-Ansichtsfenster, das an ein GameObject angehängt werden soll
  • Verschiedene UI Canvas-Komponenten zum Anzeigen von GUIs

Es gibt noch viel mehr, aber dies sind die wichtigsten, mit denen Sie sich vertraut machen müssen. Ein Tipp ist, dass Sie über das Unity-Handbuch und die Skriptreferenz offline auf alle Dokumente zugreifen können, wo immer Sie sich befinden:

Benutzerdefinierte Komponenten erstellen

Die integrierten Komponenten steuern in erster Linie die Physik und die Grafik. Um jedoch ein Spiel zu erstellen, müssen Sie Benutzereingaben akzeptieren und diese Standardkomponenten sowie die GameObjects selbst bearbeiten.

Um mit dem Erstellen von Komponenten zu beginnen, gehen Sie in das gewünschte GameObject> Komponente hinzufügen> geben Sie den Namen Ihrer neuen Komponente in die Suchleiste ein> neues Skript (c #).

Als allgemeine Empfehlung würde ich davon abraten, Javascript in Unity zu verwenden. Es wurde nicht mit all den großartigen Dingen, die mit ES6 geliefert wurden, auf dem neuesten Stand gehalten, und die meisten fortgeschrittenen Dinge basieren auf C # -Sachen, die auf Javascript portiert wurden.

Struktur eines MonoBehaviour

Schlüsselfunktionen

Alle Komponenten erben von der MonoBehaviour-Klasse. Es enthält mehrere Standardmethoden, vor allem:

  • void Start () wird aufgerufen, wenn ein Objekt, das das Skript enthält, in der Szene instanziiert wird. Dies ist immer dann nützlich, wenn wir einen Initialisierungscode ausführen möchten, z. Setze die Ausrüstung eines Spielers, nachdem er in einem Match erscheint.
  • void Update (), das für jeden Frame aufgerufen wird. Hier wird der Großteil des Codes mit Benutzereingaben abgelegt und verschiedene Eigenschaften wie die Bewegung des Players in der Szene aktualisiert.

Inspektorvariablen

Oft wollen wir Komponenten so flexibel wie möglich gestalten. Zum Beispiel können alle Waffen einen anderen Schaden, eine andere Feuerrate, eine andere Sicht usw. haben. Obwohl alle Waffen im Wesentlichen dasselbe sind, möchten wir möglicherweise in der Lage sein, schnell verschiedene Variationen über den Unity-Editor zu erstellen.

Ein weiteres Beispiel, in dem wir dies tun möchten, ist das Erstellen einer UI-Komponente, die die Mausbewegungen des Benutzers verfolgt und einen Cursor im Ansichtsfenster platziert. Hier möchten wir möglicherweise die Empfindlichkeit des Cursors für Bewegungen steuern (wenn der Benutzer einen Joystick oder ein Gamepad gegenüber einer Computermaus verwendet hat). Daher wäre es sinnvoll, diese Variablen sowohl im Bearbeitungsmodus zu ändern als auch zur Laufzeit zu experimentieren.

Wir können dies leicht tun, indem wir sie einfach als öffentliche Variablen im Hauptteil der Komponente deklarieren.

Benutzereingaben akzeptieren

Natürlich möchten wir, dass unser Spiel auf Benutzereingaben reagiert. Die gebräuchlichsten Methoden hierfür sind die folgenden Methoden in der Update () - Funktion einer Komponente (oder an einer anderen Stelle, die Sie möchten):

  • Input.GetKey (KeyCode.W) Gibt den True W-Schlüssel zurück, der gedrückt gehalten wird
  • Input.GetKeyDown (KeyCode.W) Gibt True zurück, wenn die W-Taste zum ersten Mal gedrückt wird
  • Input.GetAxis ("Vertikal"), Input.GetAxis ("Horizontal") Gibt zwischen -1,1 Mauseingabebewegungen zurück

Manipulieren von GameObjects

Sobald wir Benutzereingaben haben, möchten wir, dass GameObjects in unserer Szene reagieren. Es gibt verschiedene Arten von Antworten, die wir berücksichtigen können:

  • Übersetzung, Rotation, Skalierung
  • Erstelle neue GameObjects
  • Senden von Nachrichten an vorhandene GameObjects / Komponenten

Transformationen

GameObjects verfügen alle über eine Transformationseigenschaft, mit der verschiedene nützliche Manipulationen am aktuellen Spielobjekt durchgeführt werden können.

Die oben genannten Methoden sind ziemlich selbsterklärend. Beachten Sie jedoch, dass wir gameObject in Kleinbuchstaben verwenden , um auf das GameObject zu verweisen, dem diese bestimmte Instanz der Komponente gehört.

Im Allgemeinen empfiehlt es sich, die lokale [Position, Drehung] anstelle der globalen Position / Drehung eines Objekts zu verwenden. Dies erleichtert normalerweise das Verschieben von Objekten auf sinnvolle Weise, da die lokale Raumachse eher auf das übergeordnete Objekt als auf den Weltursprung und die x-, y- und z-Richtung ausgerichtet und zentriert wird.

Wenn Sie zwischen lokalem und Weltraum konvertieren müssen (was häufig der Fall ist), können Sie Folgendes verwenden:

Wie Sie sich vorstellen können, steckt dahinter eine ziemlich einfache lineare Algebra, die durch das 'Inverse' im Methodennamen angedeutet wird.

Neue GameObjects erstellen

Da GameObjects im Grunde alles in Ihrer Szene sind, möchten Sie sie möglicherweise im laufenden Betrieb generieren können. Wenn Ihr Spieler beispielsweise über eine Art Projektilwerfer verfügt, möchten Sie möglicherweise in der Lage sein, im laufenden Betrieb Projektile zu erstellen, die über eine eigene gekapselte Logik für Flug, Verursachen von Schaden usw. verfügen.

Zuerst müssen wir den Begriff eines Fertighauses einführen . Wir können diese einfach erstellen, indem wir ein beliebiges GameObject in der Szenenhierarchie in den Assets-Ordner ziehen.

Dies speichert im Wesentlichen eine Vorlage des Objekts, das wir gerade in unserer Szene hatten, mit denselben Konfigurationen.

Sobald wir diese vorgefertigten Komponenten haben, können wir sie Inspektorvariablen (wie bereits erwähnt) für jede Komponente in der Szene zuweisen, sodass wir jederzeit neue GameObjects erstellen können, wie vom Fertighaus angegeben.

Wir können dann eine Instanziierung des Fertighauses durchführen und es an der gewünschten Stelle in der Szene manipulieren und die erforderlichen übergeordneten Beziehungen herstellen.

Zugriff auf andere GameObjects und Komponenten

Oft müssen wir mit anderen GameObjects sowie den zugehörigen Komponenten kommunizieren. Sobald Sie einen Verweis auf ein Spielobjekt haben, ist dies ziemlich einfach.

ComponentName comp = some_game_object.GetComponent ();

Danach können Sie auf alle öffentlichen Methoden / Variablen der Komponente zugreifen, um das GameObject zu bearbeiten. Dies ist das unkomplizierte Bit, aber das Erhalten des Verweises auf das GameObject kann auf verschiedene Arten erfolgen…

Zugriff über Inspektorvariable

Dies ist am einfachsten. Erstellen Sie einfach eine öffentliche Variable für das GameObject, wie wir zuvor mit den Prefabs gezeigt haben, und ziehen Sie sie manuell über den Inspektor auf die Komponente. Greifen Sie dann wie oben auf die Variable zu.

Zugriff über Tagging

Wir können GameObjects oder Prefabs über den Inspektor markieren und dann die Funktionen zum Suchen von Spielobjekten verwenden, um Verweise darauf zu finden.

Dies geschieht einfach wie folgt.

GameObject some_game_object = GameObject.FindGameObjectWithTag ("Brick");

Zugriff über Transformation

Wenn wir auf Komponenten in einem übergeordneten Objekt zugreifen möchten, können wir dies einfach über das Transformationsattribut tun.

ComponentName comp = gameObject.transform.parent.GetComponent ();

Zugriff über SendMessage

Wenn wir alternativ eine Nachricht an viele andere Komponenten senden oder ein Objekt senden möchten, das sich weit oben in einer verschachtelten Hierarchie befindet, können wir die Funktionen zum Senden von Nachrichten verwenden, die den Namen der Funktion akzeptieren, gefolgt von den Argumenten.

gameObject.SendMessage ("MethodName", params); // Broadcast messagegameObject.SendMessageUpwards ("MethodName", params); // Nur von Komponenten empfangen, die oben verschachtelt sind.

Raycasting

Sie haben vielleicht schon einmal davon gehört, wenn Leute FPS-Spiele vergleichen, die auf "Physik" oder "Strahl" basieren. Raycasting ist im Wesentlichen wie ein Laserpointer, der bei Kontakt mit einem "Collider" oder "Starrkörper" einen "Treffer" zurückgibt und die Details des Objekts zurückgibt.

Es gibt zwei Szenarien, in denen dies nützlich ist (es gibt wahrscheinlich noch viel mehr):

  1. Wenn Sie ein Waffensystem für ein Spiel entworfen haben, können Sie Raycasting zur Treffererkennung verwenden und sogar die Länge des Strahls so anpassen, dass Nahkampfgegenstände nur auf kurze Distanz "treffen"
  2. Erstellen Sie einen Strahl vom Mauszeiger zu einem Punkt im 3D-Raum, dh wenn Sie möchten, dass der Benutzer in einem Strategiespiel Einheiten mit der Maus auswählen kann.

Wie Sie sehen können, ist der Code dafür etwas komplizierter. Das Wichtigste zu verstehen ist, dass zum Umwerfen eines Strahls auf die Stelle, an der die Maus im 3D-Raum zeigt, die ScreenPointToRay-Transformation erforderlich ist. Der Grund dafür ist, dass die Kamera einen 3D-Bereich als 2D-Ansichtsfenster auf Ihrem Laptop-Bildschirm rendert. Daher ist natürlich eine Projektion erforderlich, um wieder auf 3D zu übertragen.

Kollisionserkennung

Zuvor haben wir die Collider- und Rigidbody-Komponenten erwähnt, die einem Objekt hinzugefügt werden können. Die Regel für Kollisionen lautet, dass ein Objekt in der Kollision einen starren Körper und das andere einen Kollider haben muss (oder beide haben beide Komponenten). Beachten Sie, dass bei Verwendung von Raycasting Strahlen nur mit Objekten interagieren, an denen Collider-Komponenten angebracht sind.

Nach dem Einrichten in einer benutzerdefinierten Komponente, die an das Objekt angehängt ist, können wir die Methoden OnCollisionEnter, OnCollisionStay und OnCollisionExit verwenden, um auf Kollisionen zu reagieren. Sobald wir die Kollisionsinformationen haben, können wir das GameObject verantwortlich machen und das, was wir zuvor gelernt haben, verwenden, um auch mit daran verbundenen Komponenten zu interagieren.

Eine Sache, die zu beachten ist, ist, dass starre Körper Physik wie die Schwerkraft für Objekte bereitstellen. Wenn Sie dies also deaktivieren möchten, müssen Sie die is_kinematic aktivieren .

Erweiterte Funktionen

Wir werden jetzt nicht darauf eingehen, aber vielleicht in einem zukünftigen Artikel - nur um Sie darauf aufmerksam zu machen, dass es sie gibt.

Erstellen von GUIs

Unity verfügt über eine vollwertige UI-Engine zum Erstellen der GUI für Ihr Spiel. Im Allgemeinen funktionieren diese Komponenten ziemlich ähnlich wie der Rest des Motors.

Erweitern des Unity-Editors

Mit Unity können Sie Ihren Inspektoren benutzerdefinierte Schaltflächen hinzufügen, damit Sie die Welt im Bearbeitungsmodus beeinflussen können. Um beispielsweise beim Aufbau der Welt zu helfen, können Sie ein benutzerdefiniertes Werkzeugfenster für den Bau modularer Häuser entwickeln.

Animation

Unity verfügt über ein grafisches Animationssystem, mit dem Sie Animationen auf verschiedenen Objekten mischen und steuern können, z. B. auf Spielern, die ein knochenbasiertes Animationssystem implementieren.

Materialien und Züchterrechte

Unity basiert auf einer physisch basierten Rendering-Engine, die Echtzeitbeleuchtung und realistische Materialien ermöglicht. Die Realität ist, dass Sie entweder zuerst die 3D-Modellierung lernen oder Modelle verwenden müssen, die von jemand anderem erstellt und optimiert wurden, bevor Sie dazu kommen, um Dinge zu erstellen, die tatsächlich gut aussehen.

Beratung für Neulinge

Wenn Sie vorhaben, Ihr erstes Spiel zu schreiben, unterschätzen Sie nicht die Komplexität und Zeit, die erforderlich sind, um selbst die trivialsten Spiele zu schreiben. Denken Sie daran, dass in den meisten Spielen, die auf Steam erscheinen, Teams jahrelang Vollzeit daran arbeiten!

Wählen Sie ein einfaches Konzept und teilen Sie es in kleine erreichbare Meilensteine ​​auf. Es wird dringend empfohlen, Ihr Spiel in möglichst kleine unabhängige Komponenten zu unterteilen, da die Wahrscheinlichkeit, dass Fehler auftreten, sehr viel geringer ist, wenn Sie die Komponenten einfach halten und nicht monolithische Codeblöcke.

Bevor Sie Code für einen Teil Ihres Spiels schreiben, sollten Sie nachforschen, was jemand anderes zuvor getan hat, um das gleiche Problem zu lösen. Wahrscheinlich haben sie eine viel bessere Lösung.

Schöne Ressourcen und Gemeinschaften

Game Design hat eine der besten Communities überhaupt, und es gibt eine Menge hochqualifizierter Profis in der Branche, die Inhalte kostenlos oder für so gut wie nichts bereitstellen. Es ist ein Bereich, der 3D-Modellierer, Konzeptkünstler, Spieledesigner, Programmierer usw. erfordert. Ich habe einige großartige allgemeine Ressourcen verlinkt, die mir für jedes der folgenden Felder begegnet sind:

Konzeptkunst

  • Feng Zhu Design School (Über 90 Stunden lange Konzeptkunst-Tutorials)
  • Tyler Edlin Art (Großartige BST-Kunstgemeinschaft mit Feedback von Profis zu monatlichen Herausforderungen)
  • Art Cafe (Interviews und Workshops mit berühmten Konzeptkünstlern)
  • Trent Kaniuga (Illustrator und 2D-Künstler, der auch sein eigenes Spiel macht)

3D-Modellierung

  • CG Cookie (Beste Grundlagen der Netzmodellierung in Blender aller Zeiten, sie haben jede Menge anderer hervorragender Inhalte für Blender)
  • Tor Frick (Modellierer und Bildhauer für harte Oberflächen im Mixer)
  • Gleb Alexandrov (Kurze, leistungsstarke Rendering-Tutorials in Blender)

Spieldesign

  • DoubleFine Amnesia Fortnight (GameDevs, die einen zweiwöchigen Hackathon absolvieren und ihren gesamten Designprozess aufzeichnen)
  • GameMakers Toolkit (Untersucht die Prinzipien des Spieldesigns)

Programmierung

  • Handmade Hero (Schreiben eines Spiels und einer Engine von Grund auf in C)
  • Jonathan Blow (Indie-Entwickler, der seine Spieleentwicklung live überträgt)
  • Brackeys (Nice Unity Tutorials)

Fazit

Hoffe euch hat dieses Tutorial gefallen! Ich mache ein bisschen Grafikdesign sowie Spiel- und UI-Prototypen, also schau dir mein Portfolio an ! Ich bin auch auf verlinkt .

Portfolio| LinkedIn