SwiftのプロジェクトにUnityのビューを載せて、さらにその上にSwiftUIのビューを表示するというのが正しいかもしれません。
現在のところUnity製アプリにSwiftUI固有のビューを表示するには上記の記事の方法しか無いようです。
環境
Xcode14.1
Unity2021.3.16
AdmobやFireBaseも載っています。
この環境で実機ビルドが通っているのを前提とします。
まずDavidPeichoさんのサンプルコードをDLしてその中のUnityappフォルダの中から以下のファイルを自分のUnityにコピーする。場所は必ずサンプルと同じ場所に。
Assetes > Editorには
AutoBuilder.cs
Assetes > Plugin > iOS には
API.swift
NativeCallProxy.h
NativeCallProxy.mm
UnityCommunicationProtocol.swift
UnityFramework.modulemap
Assetes > Scripts には
API.cs
をそれぞれ配置する。
これでiOS実機ビルドが成功しているプロジェクトにAppend。それを実機ビルドするとおそらく起動直後に以下のようなエラーが出る。
objc[4928]: Class CLSUserDefaults is implemented in both /System/Library/Frameworks/ClassKit.framework/xxxxxxxxxxxxx/UnityFramework.framework/UnityFramework (0x1110f0290). One of the two will be used. Which one is undefined.
objc[4928]: Class FrameworkLibAPI is implemented in both /private/var/containers/Bundle/Application/xxxxxxxxxxxxx/Frameworks/UnityFramework.framework/UnityFramework (0x1110c1698) and /private/var/containers/Bundle/Application/B7654130-918B-4201-B814-A2FE3D95D98C/xxxxxxxxxxxxx. One of the two will be used. Which one is undefined.
これはXcodeの
Product > Scheme > Edit Scheme... > Run で以下のチェックを外すことで解消できる(はず)
ここからこのUnityのビューをSwiftに載せていきます。ここまでで詰まったときはトップの記事の原文もしっかり読むことをお勧めします。
DavidPeichoさんのサンプルコードからsandboxフォルダをコピーしておく
Xcodeで File > New > Workspace を作り、ここでは名前をUnitySwiftUIとする
これを先ほど吐き出したiOSプロジェクト、sandboxフォルダと同じ場所に保存する
UnitySwiftUI.xcworkspaceを開いて以下の左カラムに以下のファイルをドラッグで追加する
sandbox.xcodeproj
Unity-iPhone.xcodeproj(iosプロジェクトの中)
Pods.xcodeproj(iosプロジェクト > Pods の中)
これでsandboxをビルドすると、SwiftUIの上にUnityのビューが載っているという形になるのだが、ビルドを通すまでにいろいろエラーが出る。
sandboxの Minimum deployment をUnity-iPhoneと同じにそろえる
Bundle identitifierもUnity-iPhoneと同じにそろえる
Xcode左カラムの sandbox > Frameworks > UnityFrameWorkを一旦削除して、自分のプロジェクトのものに差し替える。
TARGET > sandbox > BuildPhases > Link Binary With Libraries から追加。
info.plist関連のエラーを無くすために、sandboxの中のinfo.plistをUnity-iPhoneの中のinfo.plistで置き換える。
このままだと
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no storyboard/xib was provided.'
というエラーが出るのでstoryboardの名前をsandboxの中のものに変更する
ここでもProduct > Scheme > Edit Scheme... > Run で以下のチェックを外します
これで実機ビルドして、アプリの画面中央にカラーピッカーボタンが表示されていれば成功です。
ただし、このままではAdmobは表示されませんし、アプリを閉じたり開いたりした時のデリゲートも通っていません。
ここからは以下のサンプルコードも非常に参考になります。
追加2023/11/29
AdmobのSwiftUI版の実装で広告の表示には成功したがインターステシャル、リワードの全画面広告で閉じるボタンを押下しても広告が閉じるまでに4秒の遅延が発生するという致命的な不具合が発生。3日費やしたが改善せず。結局ApplovinのSDKで実装してみると遅延が発生せずに広告を閉じることを発見した。
現在はApplovinのMAXのメディエーションを通してAdmobインターステシャル、リワードを表示。Admobの単独でバナー、起動時広告を表示している。どちらもSwiftUI側に実装しないと表示されないのでご注意を。