2023/11/18
第26回 Unity Editor と Unity PolySpatialで Apple Vision Pro の アプリ開発(Bounded VolumeのアプリにSwiftUIやRealityKitのネイティブコードを組むこむ方法 )
はじめに

Unity PolySpatialでビルドしたBounded VolumeのvisionOSアプリにSwiftUIやRealityKitなどのネイティブコードを組むこむ方法について説明します。
Apple Vision Pro について
Apple Vision Pro について、以下の記事にまとめてます。

開発環境について
Apple シリコンMac
Unity 2022 LTS (2022.3.11f1以上) (iOS Build Support とvisionOS Build Support はインストールしておくこと。)
Xcode 15.1 beta 1
visionOS beta 4 (21N5259k) - SDK
上記の環境で構築しました。
Unity PolySpatial の Hello Cube の構築
以下の記事を参考に構築します。
https://1planet.co.jp/tech-blog/applevisionpro-unitypolyspatial-serial-24
Xcodeプロジェクト

Unity-VisionOSプロジェクトのMainAppグループ(フォルダ)配下にあるUnityVisionOSSettings.swiftを開きます。
UnityPolySpatialApp の mainScene
extension の UnityPolySpatialApp にある mainScene が UnityPolySpatialがビルドしたApple Vision Pro アプリの Sceneになります。Sceneでは、WindowGroupやImmersiveSpaceを定義しています。今回はBounded Volumeのアプリに対してネイティブコードを実装します。
UnityPolySpatialApp
// GENERATED BY BUILD
import Foundation
import SwiftUI
import PolySpatialRealityKit
extension UnityPolySpatialApp {
func initialWindowName() -> String { return "Unbounded" }
@SceneBuilder
var mainScene: some Scene {
ImmersiveSpace(id: "Unbounded", for: UUID.self) { uuid in
PolySpatialContentViewWrapper()
.environment(\.pslWindow, PolySpatialWindow(uuid.wrappedValue, "Unbounded", .init(1.000, 1.000, 1.000)))
} defaultValue: { UUID() }
WindowGroup(id: "Bounded-1.000x1.000x1.000", for: UUID.self) { uuid in
ZStack(alignment: .bottom) {
PolySpatialContentViewWrapper()
.environment(\.pslWindow, PolySpatialWindow(uuid.wrappedValue, "Bounded-1.000x1.000x1.000", .init(1.000, 1.000, 1.000))).padding3D(.front, 200)
OnePlanetView()
}
} defaultValue: { UUID() } .windowStyle(.volumetric).defaultSize(width: 1.000, height: 1.000, depth: 1.000, in: .meters)
ImmersiveSpace(id: "Unbounded", for: UUID.self) { uuid in
PolySpatialContentViewWrapper()
.environment(\.pslWindow, PolySpatialWindow(uuid.wrappedValue, "Unbounded", .init(1.000, 1.000, 1.000)))
} defaultValue: { UUID() }
}
}
WindowGroup の PolySpatialContentViewWrapper は Bounded VolumeのViewを担ってます。今回はZStackを独自に実装してます。 PolySpatialContentViewWrapper の下にSwiftUIのボタンとTextを持つViewを持つようにしています。
OnePlanetView.swift
import SwiftUI
struct OnePlanetView: View {
@State private var count = 0
var body: some View {
VStack {
Text("\(count)").font(.system(size: 64))
Button(action: {
count = count + 1
}) {
Text("SwiftUI Button").frame(width: 300, height: 60)
}
}
}
}
#Preview {
OnePlanetView()
}
実行
visionOSシミュレーター上でUnity PolySpatialの3DモデルとSwiftUIのボタンとテキストが組み合わさった形で表示します。Unity PolySpatialの3DモデルやSwiftUIのボタンのタッチジェスチャーも機能します。
まとめ
正式にサポートしていないため、機能によっては正常に動作しない可能性があります。(SwiftUIのアラートが正常に機能しないことは確認済み。)Unityだけで実現できない機能をネイティブで補いたい場合などに活用できると思います。
Unity PolySpatial の 他の記事は コチラ にあります。
XR エンジニア
徳山 禎男
SIerとして金融や飲料系など様々な大規模プロジェクトに参画後、2020年にOnePlanetに入社。ARグラスを中心とした最先端のAR技術のR&Dや、法人顧客への技術提供を担当。過去にMagic Leap 公式アンバサダーを歴任。
View More