見出し画像

visionOS SDKが公開されたので試してみた

WWDC 2023で発表されたvisionOSのSDKが公開されたので、早速インストールしてサンプルコードで触って、個人開発AppをVision Proのシミュレーターで動かしてみた。
WWDC 2023で待望のApple Vision Proが発表されて、空間コンピューティングの時代が来た!と盛り上がり、体験レポートを観れば観るほど欲しくなってくるが、デベロッパーとしてはvisionOSにはどう対応すればいいかが気になる。
セッションを視聴しながらSDKの公開を待っていたが、ついに手元でも触れるようになったので、早速インストールして、Hello Worldというサンプルコードを触ってみた。このサンプルコードでは空間コンピューティングの新しい概念であるWindows / Volumes / Spacesについて一通り触れることができるのでおすすめ!

Windows / Volumes / Spaces

  • Windows

    • SwiftUIで構築された従来のViewやControlのあるコンテンツで、基本的に2Dだが、ウィンドウ内に3Dコンテンツを含めることもできる。Appは1つまたは複数のウィンドウを持つことができる。

  • Volumes

    • 3Dコンテンツを表示するのに適したSwiftUIのシーン。3DコンテンツはRealityKitやUnityで構築することができ、Shared SpaceまたはFull Spaceに配置できる。

  • Spaces

    • Shared Space

      • Macのデスクトップのような複数Appが表示される空間。AppはWindowsやVolumesを使ってコンテンツを表示でき、ユーザーはそれらの配置を変更できる。なお、AppはデフォルトではShared Spaceで起動される。

    • Full Space

      • App専用の空間で、より没入感のある体験を提供できる。

Windows / Volumes / Spaces
Shared Space / Full Space

サンプルコード

Hello WorldのWindowが空間に浮かぶ

“Hello World”を実行すると、Vision Proのシミュレーターが起動し、Living RoomというシーンにWindowが浮かぶ。シミュレーターではLiving Roomの他にKitchenやMuseumのシーンがあり、Day / Nightを切り替えることもできる。また、右下のツールバーでカメラ操作ができる(Ctrl + マウスの方が便利)。

Vision Proのシミュレーター

“Planet Earth”をタップすると詳細画面が表示された。ここでの遷移は馴染みのあるNavigationStackを使っているようだ。さらに”View Globe”をタップすると、地球の3DモデルがVolumeで表示される。このようにShared SpaceにはWindowやVolumeを複数表示でき、それぞれの配置も変更できる。

Volumeで3Dコンテンツを表示

“Objects in Orbit”では、Window内に3Dモデルが埋め込まれていて、直接触って回転させて見ることができる。Volumeではないので、自由に動かすことはできないが、3Dコンテンツを表示して少し見せるくらいがちょうど良いかも。

Window内にも3Dコンテンツを表示できる

そして、”The Solar System”では、Full Spaceに切り替えて没入感のある太陽系を見ることができる。地球と月、太陽の3Dモデルが宇宙を背景とした空間に浮かんでいる。ExitでShared Spaceに戻ることもできる。

Full Spaceへの切り替え
Full Space空間内 / Shared Spaceに戻ることもできる

改めて、”Hello World”はWindows / Volumes / Spacesの基本的な使い方がよくわかるサンプルコードで、visionOS向けのアプリ開発では参考になる部分が多い。ちなみに、App構造体ではWindowGroupやImmersiveSpaceを複数定義していて、それぞれwindowStyleやimmersionStyleを指定していることがわかる。

@main
struct WorldApp: App {
    @State private var model = ViewModel()
    @State private var orbitImmersionStyle: ImmersionStyle = .mixed
    @State private var solarImmersionStyle: ImmersionStyle = .full

    var body: some Scene {
        // The main window that presents the app's modules.
        WindowGroup("Hello, world", id: "modules") {
            Modules()
                .environment(model)
        }
        .windowStyle(.plain)

        // A volume that displays a globe.
        WindowGroup(id: Module.globe.name) {
            Globe()
                .environment(model)
        }
        .windowStyle(.volumetric)
        .defaultSize(width: 0.6, height: 0.6, depth: 0.6, in: .meters)

        // An immersive space that places the Earth with some of its satellites
        // in your surroundings.
        ImmersiveSpace(id: Module.orbit.name) {
            Orbit()
                .environment(model)
        }
        .immersionStyle(selection: $orbitImmersionStyle, in: .mixed)

        // An immersive Space that shows the Earth, Moon, and Sun as seen from
        // Earth orbit.
        ImmersiveSpace(id: Module.solar.name) {
            SolarSystem()
                .environment(model)
        }
        .immersionStyle(selection: $solarImmersionStyle, in: .full)
    }
    ...
}

個人開発AppをVision Proのシミュレーターで動かす

次に個人で開発したSFClockというフリップ時計とカレンダーのアプリをVision Proのシミュレーターで動かしてみた。
SFClockはフルSwiftUIで実装し、ライブラリも使っていなかったので、iOS 17ビルドも問題なく通り、DestinationにApple Visionを追加してビルドするだけでVision Proのシミュレーターで起動できた。なお、Destinationには最初からApple Vision (Designed for iPad)があり、この設定でもVision Proシミュレーターで起動できるが、visionOSに最適化されていないため、UIや機能面で制限があるようだ。

SFClock on Vision Pro Simulator
Windowサイズ変更でレイアウトも変わる
設定画面のUIも自動調整してくれる

最後に

visionOSではWindows / Volumes / Spacesなど空間コンピューティングの新しい概念が出てきて、今までのような2Dではなく、3D空間を意識した設計や開発が必要になる。まだ難しくて手探りなところも多いが、空間コンピューティング時代の幕開けにワクワクしながらやっていきたい!

参考


この記事が気に入ったらサポートをしてみませんか?