本日はApple VisionPro枠です。
〇環境
・Apple VisionPro
〇Apple VisionProのハローワールド
先日Apple VisionProのハローワールドを行いました。
前回の内容ではXCodeで作成したデフォルトの内容を実行しましたがSwiftコードやプロジェクトの構成の理解は端折りワークフローを見ていきました。
今回はプロジェクトを構成する3つのSwiftについてみていきます。

その前にAppleVisionProでの3つの体験概念をおさらいします。
AppleVisionProではWindow、Volume、ImmeseviSpaceの3つの概念が存在します。
それぞれ空間内の2Dウィンドウ、3DCGのように立体的でありながら、ほかのアプリケーションと同時実行できるVolume、排他的完全没入型のImmesiveSpaceです。
HoloLensと異なり、アプリケーション内で任意のタイミングで3つ体験を遷移できます。初期シーンがどの体験であるかを最初に指定することができます。
デフォルトで存在するContentView.swiftとImmersiveView.swiftはそれぞれWindow、ImmersiveSpaceに対応しています。
つまり、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の初期化とシーンの実行を行っています。
今回は浅く触れていきましたが次回以降は編集してアプリ体験を実装していきます。