Carsten Seifert, Jan Wislaug
Spiele entwickeln mit Unity 5
2D- und 3D-Games mit Unity und C# für Desktop, Web & Mobile. Für Unity 5.6
Inhalt
5
Vorwort
20
1 Einleitung
22
1.1 Multiplattform-Publishing
22
1.2 Das kann Unity (nicht)
23
1.3 Lizenzmodelle
23
1.4 Aufbau und Ziel des Buches
24
1.5 Weiterentwicklung von Unity
25
1.6 Online-Zusatzmaterial
26
2 Grundlagen
28
2.1 Installation
28
2.2 Oberfläche
28
2.2.1 Hauptmenü
30
2.2.2 Scene View
31
2.2.3 Game View
33
2.2.4 Toolbar
35
2.2.5 Hierarchy
37
2.2.6 Inspector
38
2.2.7 Project Browser
42
2.2.8 Console
44
2.3 Das Unity-Projekt
44
2.3.1 Neues Projekt anlegen
45
2.3.2 Bestehendes Projekt öffnen
46
2.3.3 Projektdateien
47
2.3.4 Szene
47
2.3.5 Game Objects
48
2.3.6 Tags
50
2.3.7 Layer
51
2.3.8 Assets
52
2.3.9 Frames
55
2.4 Das erste Übungsprojekt
55
3 C# und Unity
58
3.1 Die Sprache C#
58
3.2 Syntax
59
3.3 Kommentare
60
3.4 Variablen
60
3.4.1 Namenskonventionen
60
3.4.2 Datentypen
61
3.4.3 Schlüsselwort var
62
3.4.4 Datenfelder/Array
62
3.5 Konstanten
64
3.5.1 Enumeration
64
3.6 Typkonvertierung
65
3.7 Rechnen
65
3.8 Verzweigungen
66
3.8.1 if-Anweisungen
67
3.8.2 switch-Anweisung
69
3.9 Schleifen
70
3.9.1 for-Schleife
70
3.9.2 Foreach-Schleife
71
3.9.3 while-Schleife
71
3.9.4 do-Schleife
72
3.10 Klassen
72
3.10.1 Komponenten per Code zuweisen
73
3.10.2 Instanziierung von Nichtkomponenten
73
3.10.3 Werttypen und Referenztypen
75
3.10.4 Überladene Methoden
76
3.11 Der Konstruktor
76
3.11.1 Konstruktoren in Unity
77
3.12 Lokale und globale Variablen
77
3.12.1 Namensverwechslung verhindern mit this
77
3.13 Zugriff und Sichtbarkeit
78
3.14 Statische Klassen und Klassenmember
78
3.15 Parametermodifizierer out/ref
79
3.16 Array-Übergabe mit params
80
3.17 Eigenschaften und Eigenschaftsmethoden
81
3.18 Vererbung
82
3.18.1 Basisklasse und abgeleitete Klassen
83
3.18.2 Vererbung und die Sichtbarkeit
83
3.18.3 Geerbte Methode überschreiben
84
3.18.4 Zugriff auf die Basisklasse
84
3.18.5 Klassen versiegeln
85
3.19 Polymorphie
85
3.20 Schnittstellen
86
3.20.1 Schnittstelle definieren
86
3.20.2 Schnittstellen implementieren
86
3.20.3 Zugriff über eine Schnittstelle
87
3.21 Namespaces
88
3.21.1 Eigene Namespaces definieren
89
3.22 Generische Klassen und Methoden
90
3.22.1 List
90
3.22.2 Dictionary
91
4 Skript-Programmierung
94
4.1 MonoDevelop
94
4.1.1 Hilfe in MonoDevelop
95
4.1.2 Syntaxfehler
95
4.2 Nutzbare Programmiersprachen
96
4.2.1 Warum C#?
97
4.3 Unitys Vererbungsstruktur
97
4.3.1 Object
98
4.3.2 GameObject
98
4.3.3 ScriptableObject
98
4.3.4 Component
98
4.3.5 Transform
99
4.3.6 Behaviour
99
4.3.7 MonoBehaviour
99
4.4 Skripte erstellen
99
4.4.1 Skripte umbenennen
100
4.5 Das Skript-Grundgerüst
101
4.6 Unitys Event-Methoden
101
4.6.1 Update
102
4.6.2 FixedUpdate
102
4.6.3 Awake
103
4.6.4 Start
103
4.6.5 OnGUI
103
4.6.6 LateUpdate
104
4.6.7 Aufruf-Reihenfolge
104
4.7 Komponentenprogrammierung
105
4.7.1 Auf GameObjects zugreifen
105
4.7.2 GameObjects aktivieren und deaktivieren
107
4.7.3 GameObjects zerstören
107
4.7.4 GameObjects erstellen
107
4.7.5 Auf Components zugreifen
108
4.7.6 Components hinzufügen
110
4.7.7 Components entfernen
110
4.7.8 Components aktivieren und deaktivieren
110
4.7.9 Attribute
111
4.8 Zufallswerte
112
4.9 Parallel Code ausführen
113
4.9.1 WaitForSeconds
114
4.10 Verzögerte und wiederholende Funktionsaufrufe mit Invoke
115
4.10.1 Invoke
115
4.10.2 InvokeRepeating, IsInvoking und CancelInvoke
115
4.11 Daten speichern und laden
116
4.11.1 PlayerPrefs-Voreinstellungen
116
4.11.2 Daten speichern
117
4.11.3 Daten laden
118
4.11.4 Key überprüfen
118
4.11.5 Löschen
118
4.11.6 Save
118
4.12 Szeneübergreifende Daten
119
4.12.1 Werteübergabe mit PlayerPrefs
119
4.12.2 Zerstörung unterbinden
121
4.13 Debug-Klasse
123
4.14 Kompilierungsreihenfolge
123
4.14.1 Programmsprachen mischen und der sprachübergreifende Zugriff
124
4.15 Ausführungsreihenfolge
124
4.16 Plattformabhängig Code kompilieren
125
4.17 Eigene Assets mit ScriptableObject
126
4.17.1 Neue ScriptableObject-Subklasse erstellen
126
4.17.2 Instanzen eines ScriptableObjects erstellen
127
5 Objekte in der zweiten und dritten Dimension
130
5.1 Das 3D-Koordinatensystem
130
5.2 Vektoren
131
5.2.1 Ort, Winkel und Länge
132
5.2.2 Normalisieren
133
5.3 Das Mesh
134
5.3.1 Normalenvektor
135
5.3.2 MeshFilter und MeshRenderer
136
5.4 Transform
138
5.4.1 Kontextmenü der Transform-Komponente
138
5.4.2 Objekthierarchien
139
5.4.3 Scripting mit Transform
140
5.4.4 Quaternion
140
5.5 Shader und Materials
141
5.5.1 Der Standard-Shader
142
5.5.2 Texturen
159
5.5.3 UV Mapping
162
5.6 3D-Modelle einer Szene zufügen
163
5.6.1 Primitives
163
5.6.2 3D-Modelle importieren
165
5.6.3 In Unity modellieren
166
5.6.4 Prozedurale Mesh-Generierung
167
5.6.5 Level Of Detail
167
5.7 2D in Unity
169
5.7.1 Sprites
170
5.7.2 SpriteRenderer
175
5.7.3 Parallax Scrolling
178
6 Kameras, die Augen des Spielers
182
6.1 Die Kamera
182
6.1.1 Komponenten eines Kamera-Objektes
184
6.1.2 HDR – High Dynamic Range-Rendering
184
6.1.3 Linearer- und Gamma-Farbraum
187
6.2 Kamerasteuerung
190
6.2.1 Statische Kamera
190
6.2.2 Parenting-Kamera
191
6.2.3 Kamera-Skripte
191
6.3 ScreenPointToRay
193
6.4 Mehrere Kameras
194
6.4.1 Kamerawechsel
194
6.4.2 Split-Screen
195
6.4.3 Einfache Minimap
196
6.4.4 Render Texture
198
6.5 Image Effects
200
6.5.1 Beispiel: Haus bei Nacht
200
6.6 Skybox
202
6.6.1 Mehrere Skyboxen gleichzeitig einsetzen
203
6.6.2 Skybox selber erstellen
204
6.7 Occlusion Culling
205
6.7.1 Occluder Static und Occludee Static
207
6.7.2 Occlusion Culling erstellen
207
7 Licht und Schatten
210
7.1 Environment Lighting
210
7.2 Lichtarten
212
7.2.1 Directional Light
213
7.2.2 Point Light
214
7.2.3 Spot Light
215
7.2.4 Area Light
216
7.3 Schatten
217
7.3.1 Einfluss des MeshRenderers auf Schatten
218
7.4 Light Cookies
219
7.4.1 Import Settings eines Light Cookies
219
7.4.2 Light Cookies und Point Lights
220
7.5 Light Halos
221
7.5.1 Unabhängige Halos
222
7.6 Lens Flares
222
7.6.1 Eigene Lens Flares
223
7.7 Projector
223
7.7.1 Standard Projectors
223
7.8 Lightmapping
225
7.8.1 Light Probes
228
7.9 Rendering Paths
230
7.9.1 Forward Rendering
231
7.9.2 Vertex Lit
232
7.9.3 Deferred Lighting
233
7.10 Global Illumination
234
7.10.1 Baked GI
235
7.10.2 Realtime Lighting
236
7.10.3 Lightmapping Settings
237
7.11 Light Explorer
238
7.12 Reflexionen (Spiegelungen)
239
7.12.1 Reflection Probes
240
7.13 Qualitätseinstellungen
243
7.13.1 Quality Settings
243
7.13.2 Qualitätsstufen per Code festlegen
243
8 Physik in Unity
246
8.1 Physikberechnung
246
8.2 Rigidbodies
247
8.2.1 Rigidbodies kennenlernen
248
8.2.2 Masseschwerpunkt
249
8.2.3 Kräfte und Drehmomente zufügen
250
8.3 Kollisionen
253
8.3.1 Collider
253
8.3.2 Trigger
257
8.3.3 Static Collider
259
8.3.4 Kollisionen mit schnellen Objekten
259
8.3.5 Terrain Collider
260
8.3.6 Layer-basierende Kollisionserkennung
260
8.3.7 Mit Layer-Masken arbeiten
261
8.4 Wheel Collider
263
8.4.1 Wheel Friction Curve
264
8.4.2 Entwicklung einer Fahrzeugsteuerung
266
8.4.3 Autokonfiguration
273
8.4.4 Fahrzeugstabilität
275
8.5 Physic Materials
275
8.6 Joints
276
8.6.1 Fixed Joint
276
8.6.2 Spring Joint
277
8.6.3 Hinge Joint
277
8.7 Raycasting
277
8.8 Character Controller
279
8.8.1 SimpleMove
279
8.8.2 Move
280
8.8.3 Kräfte zufügen
281
8.8.4 Einfacher First Person Controller
282
8.9 2D-Physik
284
8.9.1 OnCollision2D- und OnTrigger2D-Methoden
286
8.9.2 2D Physic Effectors
287
9 Maus, Tastatur, Touch
290
9.1 Virtuelle Achsen und Tasten
290
9.1.1 Der Input-Manager
290
9.1.2 Virtuelle Achsen
292
9.1.3 Virtuelle Tasten
292
9.1.4 Steuern mit Mauseingaben
293
9.1.5 Joystick-Inputs
293
9.1.6 Anlegen neuer Inputs
294
9.2 Achsen- und Tasteneingaben auswerten
294
9.2.1 GetAxis
294
9.2.2 GetButton
295
9.3 Tastatureingaben auswerten
296
9.3.1 GetKey
296
9.3.2 anyKey
296
9.4 Mauseingaben auswerten
297
9.4.1 GetMouseButton
297
9.4.2 Mauseingaben auf Objekten per Event
298
9.4.3 mousePosition
298
9.4.4 Mauszeiger ändern
299
9.5 Touch-Eingaben auswerten
301
9.5.1 Der Touch-Typ
301
9.5.2 Input.touches
302
9.5.3 TouchCount
302
9.5.4 GetTouch
302
9.5.5 CrossPlatformInput
303
9.6 Beschleunigungssensor auswerten
304
9.6.1 Input.acceleration
305
9.6.2 Tiefpass-Filter
306
9.7 Steuerungen bei Mehrspieler-Games
307
9.7.1 Split-Screen-Steuerung
307
9.7.2 Netzwerkspiele
308
10 Audio
310
10.1 AudioListener
310
10.2 AudioSource
311
10.2.1 Durch Mauern hören verhindern
313
10.2.2 Sound starten und stoppen
315
10.2.3 Temporäre AudioSource
316
10.3 AudioClip
317
10.3.1 Länge ermitteln
317
10.4 Reverb Zone
317
10.5 Filter
319
10.6 Audio Mixer
319
10.6.1 Das Audio Mixer-Fenster
319
10.6.2 Audiosignalwege
323
10.6.3 Mit Snapshots arbeiten
327
10.6.4 Views erstellen
328
10.6.5 Parameter per Skript bearbeiten
328
11 Partikeleffekte mit Shuriken
332
11.1 Editor-Fenster
333
11.2 Particle Effect Control
334
11.3 Numerische Parametervarianten
334
11.4 Farbparameter-Varianten
335
11.5 Default-Modul
335
11.6 Effekt-Module
337
11.6.1 Emission
337
11.6.2 Shape
337
11.6.3 Velocity over Lifetime
339
11.6.4 Limit Velocity over Lifetime
339
11.6.5 Inherit Velocity
340
11.6.6 Force over Lifetime
340
11.6.7 Color over Lifetime
340
11.6.8 Color by Speed
341
11.6.9 Size over Lifetime
341
11.6.10 Size by Speed
341
11.6.11 Rotation over Lifetime
341
11.6.12 Rotation by Speed
342
11.6.13 External Forces
342
11.6.14 Noise
342
11.6.15 Collision
343
11.6.16 Triggers
344
11.6.17 Sub Emitter
346
11.6.18 Texture-Sheet-Animation
346
11.6.19 Lights
347
11.6.20 Trails
347
11.6.21 Renderer
348
11.7 Partikelemission starten, stoppen und unterbrechen
350
11.7.1 Play
351
11.7.2 Stop
351
11.7.3 Pause
351
11.7.4 enableEmission
351
11.8 OnParticleCollision
352
11.8.1 GetCollisionEvents
352
11.9 Feuer erstellen
353
11.9.1 Materials erstellen
353
11.9.2 Feuer-Partikelsystem
354
11.9.3 Rauch-Partikelsystem
357
11.10 Wassertropfen erstellen
361
11.10.1 Tropfen-Material erstellen
361
11.10.2 Wassertropfen-Partikelsystem
362
11.10.3 Kollisionspartikelsystem
364
11.10.4 Kollisionssound
366
12 Landschaften gestalten
368
12.1 Was Terrains können und wo die Grenzen liegen
369
12.2 Terrainhöhe verändern
369
12.2.1 Pinsel
370
12.2.2 Oberflächen anheben und senken
370
12.2.3 Plateaus und Schluchten erstellen
371
12.2.4 Oberflächen weicher machen
372
12.2.5 Heightmaps
372
12.3 Terrain texturieren
374
12.3.1 Textur-Pinsel
375
12.3.2 Texturen verwalten
375
12.4 Bäume und Sträucher
377
12.4.1 Bedienung des Place Tree-Tools
378
12.4.2 Wälder erstellen
378
12.4.3 Mit Bäumen kollidieren
378
12.5 Gräser und Details hinzufügen
379
12.5.1 Detail-Meshs
380
12.5.2 Gräser
381
12.5.3 Quelldaten nachladen
381
12.6 Terrain-Einstellungen
382
12.6.1 Base Terrain
382
12.6.2 Resolution
382
12.6.3 Tree & Details Objects
383
12.6.4 Wind Settings
383
12.6.5 Zur Laufzeit Terrain-Eigenschaften verändern
384
12.7 Der Weg zum perfekten Terrain
385
12.8 Gewässer
386
13 Wind Zones
388
13.1 Spherical vs. Directional
389
13.2 Wind Zone – Eigenschaften
390
13.3 Frische Brise
391
13.4 Turbine
391
14 GUI
392
14.1 Das UI-System uGUI
393
14.1.1 Canvas
393
14.1.2 RectTransform
397
14.1.3 UI-Sprite Import
401
14.1.4 Grafische Controls
402
14.1.5 Interaktive Controls
406
14.1.6 Controls designen
413
14.1.7 Animationen in uGUI
414
14.1.8 Event Trigger
415
14.2 Screen-Klasse
416
14.2.1 Schriftgröße dem Bildschirm anpassen
416
14.3 OnGUI-Programmierung
417
14.3.1 GUI
418
14.3.2 GUILayout
420
14.3.3 GUIStyle und GUISkin
421
15 Prefabs
424
15.1 Prefabs erstellen und nutzen
424
15.2 Prefab-Instanzen erzeugen
424
15.2.1 Instanzen per Code erstellen
425
15.2.2 Instanzen weiter bearbeiten
426
15.3 Prefabs ersetzen und zurücksetzen
426
15.4 Prefab-Verbindungen auflösen
427
16 Internet und Datenbanken
428
16.1 Die WWW-Klasse
428
16.1.1 Rückgabewert-Formate
429
16.1.2 Parameter übergeben
430
16.2 Datenbank-Kommunikation
431
16.2.1 Daten in einer Datenbank speichern
431
16.2.2 Daten von einer Datenbank abfragen
432
16.2.3 Rückgabewerte parsen
434
16.2.4 Datenhaltung in eigenen Datentypen
435
16.2.5 HighscoreCommunication.cs
437
16.2.6 Datenbankverbindung in PHP
438
17 Animationen
440
17.1 Allgemeiner Animation-Workflow
441
17.2 Animationen erstellen
441
17.2.1 Animation View
442
17.2.2 Curves vs. Dope Sheet
443
17.2.3 Animationsaufnahme
443
17.2.4 Beispiel Fallgatter-Animation
448
17.3 Animationen importieren
449
17.3.1 Rig
450
17.3.2 Animationen
452
17.4 Animationen einbinden
455
17.4.1 Animator Controller
456
17.4.2 Animator-Komponente
471
17.4.3 Beispiel Fallgatter: Animator Controller
472
17.5 Controller-Skripte
474
17.5.1 Parameter des Animator Controllers setzen
475
17.5.2 Animation States abfragen
475
17.5.3 Beispiel Fallgatter Controller-Skript
476
17.6 Animation Events
478
17.7 Das „alte“ Animationssystem
479
18 Künstliche Intelligenz
482
18.1 NavMeshAgent
483
18.1.1 Eigenschaften der Navigationskomponente
484
18.1.2 Zielpunkt zuweisen
485
18.1.3 Pfadsuche unterbrechen und fortsetzen
485
18.2 Navigation-Fenster
486
18.2.1 Agents Tab
487
18.2.2 Object Tab
488
18.2.3 Bake Tab
488
18.2.4 Areas Tab
489
18.3 NavMeshObstacle
490
18.4 Off-Mesh Link
491
18.4.1 Automatische Off-Mesh Links
491
18.4.2 Manuelle Off-Mesh Links
492
18.5 Point & Click-Steuerung für Maus und Touch
493
19 Fehlersuche und Performance
496
19.1 Fehlersuche
496
19.1.1 Breakpoints
497
19.1.2 Variablen beobachten
498
19.1.3 Console Tab nutzen
499
19.1.4 GUI- und GUILayout nutzen
499
19.1.5 Fehlersuche bei mobilen Plattformen
500
19.2 Performance
502
19.2.1 Rendering-Statistik
503
19.2.2 Batching-Verfahren
504
19.2.3 Analyse mit dem Profiler
505
19.2.4 Echtzeit-Analyse auf Endgeräten
507
20 Spiele erstellen und publizieren
510
20.1 Der Build-Prozess
510
20.1.1 Szenen des Spiels
511
20.1.2 Plattformen
512
20.1.3 Notwendige SDKs
512
20.1.4 Plattformspezifische Optionen
513
20.1.5 Developer Builds
513
20.2 Publizieren
514
20.2.1 App
515
20.2.2 Browser-Game
515
20.2.3 Desktop-Anwendung
516
21 Erstes Beispiel-Game: 2D-Touch-Game
518
21.1 Projekt und Szene
518
21.1.1 Die Kamera
520
21.1.2 Texturen importieren und Sprites definieren
521
21.2 Gespenster und Hintergrund
523
21.2.1 Gespenster animieren
526
21.2.2 Gespenster laufen lassen
530
21.2.3 Gespenster-Prefab erstellen
532
21.3 Der GameController
533
21.3.1 Der Spawner
533
21.3.2 Level-Anzeige
535
21.3.3 Der Input-Controller
536
21.3.4 Game Over-UI
538
21.3.5 Hintergrundmusik
545
21.4 Punkte zählen
546
21.5 Spielende
547
21.6 Spiel erstellen
548
22 Zweites Beispiel-Game: 3D Dungeon Crawler
550
22.1 Level-Design
551
22.1.1 Modellimport
552
22.1.2 Materials konfigurieren
553
22.1.3 Prefabs erstellen
554
22.1.4 Dungeon erstellen
556
22.1.5 Dekoration erstellen
561
22.2 Inventarsystem erstellen
563
22.2.1 Verwaltungslogik
563
22.2.2 Oberfläche des Inventarsystems
571
22.2.3 Inventar-Items
574
22.3 Game Controller
581
22.4 Spieler erstellen
581
22.4.1 Lebensverwaltung
583
22.4.2 Spielersteuerung
594
22.4.3 Wurfstein entwickeln
602
22.4.4 Lautstärke steuern
608
22.5 Quest erstellen
609
22.5.1 Erfahrungspunkte verwalten
609
22.5.2 Questgeber erstellen
611
22.5.3 Sub-Quest erstellen
620
22.6 Gegner erstellen
625
22.6.1 Model-, Rig- und Animationsimport
625
22.6.2 Komponenten und Prefab konfigurieren
626
22.6.3 Animator Controller erstellen
628
22.6.4 NavMesh erstellen
630
22.6.5 Umgebung und Feinde erkennen
631
22.6.6 Gesundheitszustand verwalten
634
22.6.7 Künstliche Intelligenz entwickeln
638
22.7 Eröffnungsszene
647
22.7.1 Szene erstellen
647
22.7.2 Startmenü-Logik erstellen
648
22.7.3 Menü-GUI erstellen
650
22.8 WebGL-Anpassungen
652
22.8.1 WebGL-Input ändern
652
22.8.2 Quit-Methode in WebGL abfangen
653
22.9 Finale Einstellungen
654
22.10 So könnte es weitergehen
657
23 Der Produktionsprozess in der Spieleentwicklung
658
23.1 Die Produktionsphasen
658
23.1.1 Ideen- und Konzeptionsphase
659
23.1.2 Planungsphase
659
23.1.3 Entwicklungsphase
659
23.1.4 Testphase
660
23.1.5 Veröffentlichung und Postproduktion
660
23.2 Das Game-Design-Dokument
660
24 Schlusswort
662
Index
664
© 2009-2024 ciando GmbH