Unity as a Library(UaaL)でSwiftUIを使う際のビュー位置ズレ問題の解決法
はじめに
Unity as a Library(UaaL)とSwiftUIの統合は多くの可能性を開きますが、この組み合わせはいくつかの困難ももたらします。この記事では、特にビューの位置がずれるという問題とその解決法に焦点を当てます。
我々がどのような状況でどのような問題にあったのか
UnityをiOSアプリケーションに組み込む際、SwiftUIを用いたレイアウトとの統合が必要でした。しかし、SwiftUIの画面にUnityのビューを埋め込むと、そのビューが画面の上部に徐々にずれていく問題に直面しました。
使用した技術
- Unity as a Library(UaaL)
- SwiftUI
- UIKit
その際のコード
問題が発生したのは、SwiftUIとUnity as a Library(UaaL)を組み合わせたプロジェクトでした。具体的には、SwiftUIのUIViewControllerRepresentable
プロトコルを使って、Unityのビューを表示しています。
SwiftUIのWrapper
まず、SwiftUIでUnityのビューをラップするためのUnityHostingController
を作成しました。
struct UnityHostingController: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
return ViewController()
}
}
AppDelegateでのUnity初期化
次に、AppDelegate
でUnityを初期化しています。
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
Unity.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
return true
}
}
UIKitのViewController
そして、Unityのビューを含むViewController
を以下のように作成しました。
class ViewController: UIViewController {
private let unityView = Unity.shared.view
override func loadView() {
super.loadView()
view.addSubview(unityView)
NSLayoutConstraint.activate([
unityView.topAnchor.constraint(equalTo: view.topAnchor),
unityView.leftAnchor.constraint(equalTo: view.leftAnchor),
unityView.rightAnchor.constraint(equalTo: view.rightAnchor),
unityView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
])
}
}
この設定で、Unityのビューが何らかの理由で徐々に上にずれていく問題が発生しました。
解決方法
問題の根本的な原因は、translatesAutoresizingMaskIntoConstraints
プロパティがデフォルトで true
に設定されていたことでした。このプロパティを false
に設定することで、ビューの位置が正しくなりました。
解決のコード
class ViewController: UIViewController {
private let unityView = Unity.shared.view
override func loadView() {
super.loadView()
unityView.translatesAutoresizingMaskIntoConstraints = false
// ...
}
}
解決方法の解説(正確ではない可能性があります)
translatesAutoresizingMaskIntoConstraints
は、ビューのAuto Layout制約がどのように適用されるかを制御します。このプロパティが true
の場合、ビューのframeが直接設定されると、それがAuto Layout制約として解釈され、期待しないレイアウトになる可能性があります。
まとめ
Unity as a Library(UaaL)とSwiftUIを統合する際にビューの位置がずれる問題は、translatesAutoresizingMaskIntoConstraints
プロパティの設定に注意することで解決可能です。この記事が、同じような問題に直面している開発者の助けになれば幸いです。