第26回 Unity Editor と Unity PolySpatialで Apple Vision Pro の アプリ開発(Bounded VolumeのアプリにSwiftUIやRealityKitのネイティブコードを組むこむ方法 )  | 技術ブログ | 株式会社OnePlanet 読み込まれました

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 0.6.2

上記の環境で構築しました。

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

お問い合わせ・ご相談

ARでやってみたいことやお困りごとなど
お気軽にお問い合わせください。

お問い合わせ