Last fall, I realized you could compile the Godot game engine to run on the iPad. This presented exciting possibilities, combining two of my loves: the Godot open-source project, and the iPad operating system.
And while Godot can run on the iPad with minimal effort, it remains essentially a desktop application that runs on the iPad, with the downsides that one can expect from it.
The Godot user interface has been optimized and tuned for developers on desktop computers with access to a mouse. It also features a user interface with its own toolkit written entirely in Godot - that is, the Godot Game Designer is built using the same technology you use to develop your own games. In addition to being an incredible achievement, it also incorporates its own design system, with a characteristic look and idioms that work great in that environment. Every single control you see in Godot is entirely drawn by Godot, and every interaction is fully handled by Godot.
The existing Godot Editor User Interface is not a great match for the iPad.
The iPad is primarily a touch interface where the keyboard, tracking device, or even an Apple pencil are optional input systems that are only sometimes present.
I love my iPads, not only because of the device’s capabilities or the operating system but because of the user experience culture around it. Apple’s Human Interface Guidelines are a significant component, as is their guidance for designing and building iPad applications. They complement these guidelines with design resources that anyone can use to blend Apple’s design language with their application needs.
Guidelines and design resources still need to be implemented. This is where Apple’s developer platform comes into play - particularly SwiftUI. While Apple provides the tools for creating any user interface you can dream of, their platform offers defaults and idioms that make it easy to create applications that look and behave similarly to the system applications and work well in the iPad environment and the platform’s constraints.
Godot for iPadOS and VisionOS
In bringing Godot to the iPad, not just as a desktop application that happens to display on an iPad, but as a bonafide iPad application, I aim to adopt the iPad user interface where it makes sense, adjust the Godot user interface to the standard idioms used on the iPad, and use SwiftUI to implement parts of the user interface.
In a world with infinite hours, it would be tempting to rewrite the entire Godot Editor user interface from the ground up using SwiftUI. Still, Godot has some 250,000 lines of code that are actively maintained - and I actually want to get Godot for iPad in the hands of my kids before they move to college, so I will use a hybrid approach that combines the existing Godot UI with some components that will be redone with SwiftUI.
If you embrace SwiftUI as it comes and the design system capabilities that go with it, not only will the application look and feel native on the iPad, but with minimal effort, it can be made to run on MacOS and VisionPro. In fact, our experience tuning La Terminal to run on VisionPro is what made me consider adapting Godot to iPadOS.
My modified Godot for iPadOS and VisionPro is a SwiftUI application embeds Godot as a library. Then, I use my SwiftGodot API bridge to call Godot and receive notifications from Godot.
Here is a taste of one of the native dialogs I have rewritten:
Documenting The Process
I have been working on this for a couple of months, drawing inspiration from my favorite apps on the iPad and coming up with a catalog of changes I want to implement. I will be using this blog to document both the design decisions, the inspiration, and the technical approach I am taking to do this.
I have been meaning to go back to blogging, and this project is the perfect excuse to do it.
In this series:
- Part 2: iGotot: Split View
- Part 3: iGodot ScenePad
- Part 4: Godot with SwiftUI
- Part 5: Making Godot Viable on iPadOS
- Part 6: It's time for some Menu Game Theory.
Sign up for this newsletter to receive the updates directly in your mailbox.