はじめに
SwiftUI で Unity as a Library(以下 UaaL)を使う方法についてです。実際のアプリに組み込むにはもう少し工夫が必要かもしれませんが、とりあえずは表示までできました。
UaaL とはネイティブアプリで Unity の View を表示できたりするやつです(たぶん)。
完成品はこんな感じ。
私はSwiftUIとUnity as a Libraryが使えます🤥 pic.twitter.com/6DoRagcBpb
— am10 (@am103141592) July 3, 2023
手順
手順は下記です。
- Unity で iOS ビルド
- UnityFramework.framework 作成
- iOS アプリに UnityFramework.framework 追加
- iOS アプリに UnityFramework.framework の呼び出し処理追加
こちらの記事を参考にしました。
Unity で iOS ビルド
適当な Unity プロジェクトをビルドします。
UnityFramework.framework 作成
- Unity-iPhone.xcodeproj を Xcode で開く。
- 公式サンプルから NativeCallProxy.h と NativeCallProxy.mm をコピー。
- Libraries/Plugins/iOS に上記ファイルを配置(Unity プロジェクト側にもとから追加していてもいいです)。
- Data の Target Membership の UnityFramework にチェック。
- NativeCallProxy.h の Target Membership の UnityFramework を Public に変更。
- 実機を選んで UnityFramework をビルド。
- Products 配下に UnityFramework.framework が作成される(Full Path の矢印をクリックすれば Finder で開けます)。
iOS アプリに UnityFramework.framework 追加
- 適当な iOS アプリのプロジェクトに上記で作成した UnityFramework.framework を追加。
- Targets > General > Frameworks, Libraries, and Embedded Content の + から UnityFramework.framework を追加(Add Files... から追加できます)。
iOS アプリに UnityFramework.framework の呼び出し処理追加
- Bridging-Header ファイルを追加(Objective-C ファイルを追加すれば自動で作成されます)。
-
Bridging-Header に下記記載。
12#include <UnityFramework/UnityFramework.h>#include <UnityFramework/NativeCallProxy.h> - 下記のクラス追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
class Unity: NSObject, UnityFrameworkListener, NativeCallsProtocol { static let shared = Unity() private let unityFramework: UnityFramework override init() { let bundlePath = Bundle.main.bundlePath let frameworkPath = bundlePath + "/Frameworks/UnityFramework.framework" let bundle = Bundle(path: frameworkPath)! if !bundle.isLoaded { bundle.load() } let frameworkClass = bundle.principalClass as! UnityFramework.Type let framework = frameworkClass.getInstance()! if framework.appController() == nil { var header = _mh_execute_header framework.setExecuteHeader(&header) } unityFramework = framework super.init() } func start() { unityFramework.register(self) FrameworkLibAPI.registerAPIforNativeCalls(self) unityFramework.setDataBundleId("com.unity3d.framework") unityFramework.runEmbedded(withArgc: CommandLine.argc, argv: CommandLine.unsafeArgv, appLaunchOpts: nil) } var view: UIView { unityFramework.appController()!.rootView! } func showHostMainWindow(_ color: String!) { } } |
こちらの記事の処理とほぼ同じです。
[Swift] Unity as a LibraryをSwiftから呼ぶ
iOS アプリに UnityFramework.framework の呼び出し処理追加
-
App に下記処理追加。
123init() {Unity.shared.start()} -
UnityView 追加。
1234567891011import SwiftUIstruct UnityView: UIViewRepresentable {func makeUIView(context: Context) -> UIView {return Unity.shared.view}func updateUIView(_ view: UIView, context: Context) {}} -
ContentView に表示処理追加.
123456789struct ContentView: View {var body: some View {NavigationStack {NavigationLink("Unity") {UnityView()}}}}
これで完成!と思いきやこれでビルドすると LaunchScreen.storyboard がないよというエラーが出ます。
- LaunchScreen.storyboard を追加。
- TARGETS > Info > Custom iOS Target Properties から Launch Screen 削除。
- 上記に Launch screen interface file base name を追加(value は LaunchScreen にする)。
これで完成!
おわりに
なんか周りに余白ができていますが SwiftUI を使って Unity の画面を表示することができました🎉
コメント
[…] SwiftUIでUnity as a Libraryを使う最小実装 […]