以下の内容はhttps://redhologerbera.hatenablog.com/entry/2024/07/25/222836より取得しました。


Apple VisionProのハローワールドの構成を理解する

本日はApple VisionPro枠です。

〇環境

Mac mini

Apple VisionPro

Apple VisionProのハローワールド

先日Apple VisionProのハローワールドを行いました。

redhologerbera.hatenablog.com

前回の内容ではXCodeで作成したデフォルトの内容を実行しましたがSwiftコードやプロジェクトの構成の理解は端折りワークフローを見ていきました。

今回はプロジェクトを構成する3つのSwiftについてみていきます。

その前にAppleVisionProでの3つの体験概念をおさらいします。

AppleVisionProではWindowVolumeImmeseviSpaceの3つの概念が存在します。

developer.apple.com

 それぞれ空間内の2Dウィンドウ、3DCGのように立体的でありながら、ほかのアプリケーションと同時実行できるVolume、排他的完全没入型のImmesiveSpaceです。

 HoloLensと異なり、アプリケーション内で任意のタイミングで3つ体験を遷移できます。初期シーンがどの体験であるかを最初に指定することができます。

 デフォルトで存在するContentView.swiftImmersiveView.swiftはそれぞれWindowImmersiveSpaceに対応しています。

 つまり、ContentView.swiftがWindow体験時のアプリ構築、ImmersiveView.swiftがImmersiveSpace体験時のアプリ構築を記述します。

〇(プロジェクト名).swift

このファイルはアプリの起動時に必要なコードが含まれています。アプリが起動するときに何かを作成し、それをアプリのライフサイクル全体で生き続けさせる場合、そのコードはここに配置されます。

import SwiftUI

@main
struct _stAppApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }

        ImmersiveSpace(id: "ImmersiveSpace") {
            ImmersiveView()
        }
    }
}

〇ContentView.swift

Windowの体験を構築する画面デザインと動作・処理を記述します。

import SwiftUI
import RealityKit
import RealityKitContent

struct ContentView: View {

    @State private var showImmersiveSpace = false
    @State private var immersiveSpaceIsShown = false

    @Environment(\.openImmersiveSpace) var openImmersiveSpace
    @Environment(\.dismissImmersiveSpace) var dismissImmersiveSpace

    var body: some View {
        VStack {
            Model3D(named: "Scene", bundle: realityKitContentBundle)
                .padding(.bottom, 50)

           //表示される文字
            Text("Hello, world!")
             //トグルとオンになった際に実行されるID
            Toggle("Show ImmersiveSpace", isOn: $showImmersiveSpace)
                .font(.title)
                .frame(width: 360)
                .padding(24)
                .glassBackgroundEffect()
        }
        .padding()
        .onChange(of: showImmersiveSpace) { _, newValue in
            Task {
                if newValue {
                    switch await openImmersiveSpace(id: "ImmersiveSpace") {
                    case .opened:
                        immersiveSpaceIsShown = true
                    case .error, .userCancelled:
                        fallthrough
                    @unknown default:
                        immersiveSpaceIsShown = false
                        showImmersiveSpace = false
                    }
                } else if immersiveSpaceIsShown {
                    await dismissImmersiveSpace()
                    immersiveSpaceIsShown = false
                }
            }
        }
    }
}

#Preview(windowStyle: .automatic) {
    ContentView()
}

コメントにきじゅつしていますがこちらの文字を変えることでハローワールド、トグルを実行したときのイベントを変えることができます。

〇ImmersiveView.swift

VisionOSで使用されるImmersiveSpaceの体験を記述するSwiftコードです。

import SwiftUI
import RealityKit
import RealityKitContent

struct ImmersiveView: View {
    var body: some View {
        RealityView { content in
            // Add the initial RealityKit content
            if let scene = try? await Entity(named: "Immersive", in: realityKitContentBundle) {
                content.add(scene)
            }
        }
    }
}

#Preview(immersionStyle: .mixed) {
    ImmersiveView()
}

ここではRealityKitの初期化とシーンの実行を行っています。

今回は浅く触れていきましたが次回以降は編集してアプリ体験を実装していきます。

〇参考

zenn.dev




以上の内容はhttps://redhologerbera.hatenablog.com/entry/2024/07/25/222836より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14