Wie man Apples RealityKit zur Spieleentwicklung nutzt
Augmented Reality eignet sich auch für Games. Mit einem Praxisbeispiel zeigen wir, wie man mit Apples Code-Frameworks RealityKit ein kleines Spiel programmiert.
- Gero Gerber
Ziel des Spiels ist es, einen virtuellen Basketball in einem ebenso wenig realen Korb zu versenken, den wir auf dem Boden in der echten Umgebung platzieren. Als Spielekonsole kommt ein iPhone oder iPad zum Einsatz, im Idealfall eines mit LiDAR-Scanner. Ob hochkant oder quer gehalten, bestimmt der Spieler. Mit einem Tap auf den Screen wirft der Spieler den Ball in Blickrichtung der Kamera. Trifft er den Korb, bestätigt ein Post-Effekt auf dem Bildschirm den Erfolg. Nach einer Weile verschwinden die herumliegenden Bälle mithilfe von Custom Shaders. Den vollständigen Code stellen wir Ihnen zum Download bereit.
RealityKit mit SwiftUI
Da SwiftUI in der App-Entwicklung zunehmend an Bedeutung gewinnt, nutzen wir dieses Framework auch für das Spiel. Der von RealityKit bereitgestellte ARView
ist zwar noch nicht SwiftUI-ready; Sie können aber UIKit-Views in SwiftUI einbinden.
- Eigene Surface Shader ermöglichen die Anpassung von Materialien.
- Mit Geometry Modifier kann man Vertices mittels Metal Shader auf der GPU modifizieren.
- Eigene Post-Processing-Effekte lassen sich via Core Image, Metal Performance Shaders oder SpriteKit implementieren.
- Anhand eigener Systeme im Entity Component System (ECS) kann man die Spiellogik in separate Module unterteilen.
struct GameView: UIViewRepresentable {
...
func makeUIView(context: Context) -> ARView {
...
let view = ARView()
view.environment.sceneUnderstanding.options.insert([.physics, .occlusion, .receivesLighting])
...
coachingOverlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
coachingOverlay.session = view.session
coachingOverlay.goal = .horizontalPlane
view.addSubview(coachingOverlay)
return view
}
}
Mit UIViewRepresentable
existiert ein Protokoll, das UIKit-Views bei Bedarf kapselt, um sie in SwiftUI nutzen zu können. Das Struct GameView
implementiert das Protokoll UIViewRepresentable
und erzeugt den ARView
in der Methode makeUIView(context:)
. Nach dem Erzeugen wird die ARView
-Instanz entsprechend konfiguriert und anschließend als Return-Value zurückgegeben. Zusätzlich existiert in GameView
die Klasse Coordinator
, die Änderungen am ARView
nach SwiftUI weiterleitet. Der Coordinator
implementiert häufig auch Delegate-Protokolle des gekapselten UIViews und konfiguriert den erzeugten ARView
dahingehend, dass die mit dem (falls vorhandenen) LiDAR-Scanner erkannte reale Umgebung sowohl physikalisch mit den virtuellen Objekten interagiert als auch virtuelle Objekte via Occlusion verdeckt. Zusätzlich erhält der ARView
noch einen ARCoachingOverlayView
Subview, der den Benutzer mit On-Screen-Hinweisen dabei unterstützt, eine horizontale Ebene in der Umgebung zu erkennen.