Apple visionOSアプリ開発
Apple Vision Pro実機接続
Apple Vision Pro
- 設定→プライバシーとセキュリティ→「デベロッパモード」をオン
- 設定→一般→「リモートデバイス」画面を開いておく
Xcode
- Devices and Simulators (⌘⇧2)を開く
- Discoveredに表示されているApple Vision Proを選択してペアリング
Xcodeで新規プロジェクト作成
- File -> New -> Project (⌘⇧N)
- visionOS -> App
- Optionを選択
Initial Scene
Window (2D), Volume (3D)から選択できる。
まず「画面」を表示するならデフォルトのWindow、いきなり3Dを表示したいならVolumeを選択するのが良さそう。
Immersive Space Renderer
None, RealityKit, Metalから選択できる。
後からReality Composer Proを使ったプロジェクトをインポートしたりできるようなので、最初はNoneでも大丈夫そう。
Hello World!
Apple Vision Pro実機接続
エラーで実機プレビューできず。
エラーログを見てみると、Provisioning Profileの文字が…!
あ、実機登録してなかったからかと気づき、Signingから"Register Device" !
エラーが解決しなかったので、一度ビルドすると起動し、そのあとは実機プレビューも正常にできるように🙌
Mac仮想ディスプレイと縦あるいは横に並べて開発できるので良さそう🚀
visionOSについて学ぶ
で動画を視聴してvisionOSについて学んでいこう👀
空間コンピューティング向けのアプリ構築のための準備
Elements
ユーザーにとって何が最適かを考えて、Windows/Volumes/Spacesを選択する。
Windows
- SwiftUIが使用できる
- 2D UIと3Dコンテンツを混在して表示できる
Volumes
- Windowの延長線上にあり、同様の機能が使え、Windowと共存できる
- 例えばチェス盤や地球儀
- SwiftUIでレイアウト
- WindowGroup {}.windowStyle(.volumetric)
- RealityKit
- Model3Dで3Dコンテンツを表示
- RealityView
- Shared Space向けに作られているため、コンテンツはVolumeの境界内に収める必要がある
Spaces
- Shared Space
- 1つまたは複数のウィンドウを表示できる
- Full Space
- 特定のアプリだけが見える
- Windows, Volumesなどのコンテンツを好きな位置に配置できる
- SwiftUIのScene
- ARKitのAPIを活用できる
- Immersion Style
- Passthrough (.mixed)
- パススルーの上にアプリのコンテンツを重ねる
- ImmersiveSpace(id:)
- Fully Immersive (.full)
- パススルーを隠してコンテンツのみを表示する
- ImmersiveSpace(id:){}.immersiveStyle(selection:in: .full)
- Passthrough (.mixed)
- .progressive
- Mixed, Fullを組み合わせたスタイル
- ある程度のパススルーが表示されるが、ユーザーはDigital Crownで体験レベルをFullまで変更できる
Interactions
ユーザーのインタラクション。
- SwiftUIのジェスチャAPIが使える
- Skeletal hand tracking
- SwiftUI/RealityKitエンティティともシームレスに動作
- SharePlayで共同作業が行える
Reality Composer Pro
- アプリの3Dコンテンツを準備、プレビューする
- シーンにオーディオを追加してオブジェクトと紐付けられる
空間デザインの原則
Familiar(アプリを親しみのあるものにする方法)
- サイドバー、タブ、検索フィールドを使用する
- アプリのインターフェースは単一ウィンドウが理想。
- スケールできるようにポイントを使ったサイジングを行う
Human-centered(人間中心)
- 重要なコンテンツは、見るのが簡単な中心に配置する。
- 視野は横に広いのでランドスケープレイアウトを使用する。
- 人の後ろや高すぎたり低すぎたりする位置は避けて正面に配置する(イマージブを除く)
- コンテンツを人の視界に固定せず、空間に固定する
- アプリのコア体験でなければ、誰もが・どこでも使いやすいように、ユーザーの動きは最小限にする。静止した体験を推奨。
- 感動的な体験をするには、生命を感じさせること
- 湖の水面など、アニメーションを入れることで場面に活気が生まれる
- 空間オーディオで雰囲気を作る
- 大きく速い動きは避け、フェードアウトを使う
Dimensional(空間を活用する次元の使い方)
- 人の動ける物理的空間は限られているので、使える場所を限定しない
- 奥行きによってアプリに次元が与えられる
- 遠くのコンテンツは大きくすることで、ユーザーは遠くから関われる
- 近くのものはインタラクションを促す
- Windowは影を落とす。アプリのカスタムオブジェクトも影を落とすべき
- 奥行きはさりげない方が好まれる。インターフェースの要素はフラットにする
- 小さな物体は親しみを感じ、大きな物体は印象に残る
- 実物大が合うこともある。小さくしたり大きくしたり、試してみよう
Immersive
- Windowを超えて周囲の世界を変えていく
- 調光を使用してコンテンツに集中させる
- 重要な体験に焦点が当たるように誘導する
アクセシブルな空間体験の実現
VoiceOver
SwitUIに備わっている
RealityViewで対応する場合はAccessibilityComponent()を使用する。
VoiceOverがONになっていると手の入力を受け付けないようになっている
Visual accessibility
Dynamic Typeの最大サイズに対応する
Motion
目眩を避けるために、高速に動かしたり、波のような動きを伴うモーションの使用は避ける。
accessibilityReduceMotionでユーザーの設定を取得できる。代替手段を提供する。
何から対処した方が良いか分からない場合は、設定を有効化して試してみるのが良い。
はじめてのイマーシブなアプリの開発
Xcode - Create new project
Xcodeの付属機能の使い方の概要解説動画。
- シミュレーター
- Xcode Previews
- Reality Composer Pro
- 3Dコンテンツを配置してSceneを作る
アプリの初期Volumeは自由に動かせるのに対し、追加したImmersiveSpaceは開いた時点で決まった場所に配置される。
ImmersiveSpaceを動かすのではなく、ImmersiveSpaceの中を移動する。
RealityViewに.gesture(TapGesuture() でタップジェスチャーを追加できるが、RealityView内のどのEntityが対象なのかを知るためには、 TapGesture().targetedToAnyEntity()
を使用する。
ただし、Reality Composer Proを使用してEntityにCollisionComponent(衝突), InputTargetComponentの両方を追加しておく必要がある
空間コンピューティング向けのゲーム開発
レンダリング
- Windowsはユーザーが大きさを決められるので、コンテンツはそれに適合しなければならない。ウィンドウがコンテンツより小さい場合は、コンテンツの一部が見切れてしまう
- Volumesはユーザーがどこにでも置けるが、大きさ高さ奥行きは変更できない。十分な大きさのボックスにコンテンツを収められるのでコンテンツが見切れることはない
- Spacesプレイヤーの周りの実世界にコンテンツをレンダリングできる
- Anchors
- horizontal/vertical surface anchorで壁や机などにEntityを貼り付けられる
- hand anchorでユーザーの手に取り付けられる
- Portalsは、実世界に穴を開けて空想的現実を作り出せる
- 例えば壁にポータルを設置し穴を開けて中にオブジェクトを設置したり取り出したりできる
コンテンツの準備
- RealityKitでUSDファイルを読み込んでレンダリングできる
- Reality Composer Proを使えばUSDファイルが自動でデバイスに最適化される