WWDC Quick Look 💓 By SwiftGGTeam
Build great games for spatial computing

Build great games for spatial computing

元の動画を見る

ハイライト

visionOS は Shared Space の 2D ウィンドウから完全没入体験まで、没入の全スペクトラムにわたるゲームをサポートします。RealityKit、Unity、Metal、標準ゲームコントローラーがすべて開発パスとして利用できます。

主要内容

iOS ゲームを作ったことがあるなら、VR ゲームもかもしれません。visionOS はその中間の可能性を提供します。ゲームはデスク上に浮かぶボードにも、部屋全体を占めるアクションゲームにも、現実を置き換える完全没入の世界にもなれます。どの形態を選ぶかは、プレイヤーの注意をどれだけ奪いたいかによります。

4 つの没入レベル

すべてのアプリとゲームは Shared Space から始まります。このモードでは、ゲームは他のアプリ、システム UI、現実環境と共存します。仮想ボードは本物のテーブルに、仮想ペットは本物の床に座ります。プレイヤーは自由にインタラクション対象を選べます。

01:45)Full Space に入ると他のウィンドウとボリュームが閉じ、コンテンツに完全にフォーカスします。プレイヤーはパススルーで周囲を見続けます。壁の穴から宇宙船が飛び出すようなアクションゲームに適しています。

02:08)Fully Immersive 体験はプレイヤーの視野を完全に置き換えます。現実世界が消え、仮想環境に取って代わられます。これは従来の VR 体験モードです。

02:18)従来の 2D ゲームも visionOS で動作します。プレイヤーはウィンドウをデスクに置いたり、壁に掛けたり、目の前に巨大スクリーンとして配置できます。ウィンドウには実際の奥行きがあり、視差効果のためにレイヤー化されたコンテンツをレンダリングしたり、煙や火花などの要素を平面から飛び出させたりできます。

レンダリング機能

visionOS のレンダリングは従来のプラットフォームと異なります。すべてのピクセルをレンダリングするのではなく、シーン(モデル、テクスチャ、シェーダー)を記述し、デバイスが各目用に自動レンダリングします。

04:36)システムは動的フォベーションを自動適用し、プレイヤーが注視する領域でより高い解像度を使用します。開発者の介入は不要です。

05:07)RealityKit はデフォルトで実際の部屋の照明をサンプリングし、仮想オブジェクトに適用してリアリズムを得ます。カスタム IBL や MaterialX シェーダーで幻想的なスタイルにすることもできます。

05:55)システムはいくつかのシステム全体の効果を自動適用します。深度緩和(現実の物体に遮られるとコンテンツが透明になる)、近接ビネット(近すぎるとフェードアウト)、ブレークスルー(実在の人が近づくと仮想コンテンツが透過)、グラウンドシャドウ(仮想物体が現実の表面に近いと影を落とす)です。

オーディオ

07:57)visionOS は Spatial Audio でプレイヤーの空間内に音を配置します。AVAudioEngine などの標準 iOS オーディオ API では、音はアプリウィンドウに対して相対的に配置されます。シーン内の異なるオブジェクトから音を出したい場合は、RealityKit で特定のエンティティ上で再生します。

入力方式

08:52)システムは注視+タップの標準ジェスチャを提供します。3D オブジェクトでジェスチャを機能させるには、CollisionComponent(衝突形状)と InputTargetComponent(インタラクティブとしてマーク)の両方が必要です。

09:19)visionOS は Bluetooth ゲームコントローラー、キーボード、マウス、トラックパッドをサポートします。高速または同時入力が必要なゲームではコントローラーが適しています。Info.plist で GCSupportsControllerUserInteraction を宣言し、Game Controller capability を追加します。

09:53)より非伝統的な入力にはボディトラッキングがあります。ARKit のハンドトラッキングデータで仮想オブジェクトを掴ませたり、指差しや空手チョップなどのカスタムジェスチャを実装できます。注意:手はカメラの視野内でのみトラッキングされ、高速動作は追跡が困難です。

シーン理解

10:25)Full Space ではシーン理解をリクエストし、部屋のメッシュ、平面検出(水平・垂直面)、表面マテリアル(カーペットや木材)を取得できます。部屋自体がゲーム入力の一部になります。ハンドトラッキングと同様、ユーザー認可が必要です。

開発フレームワークの選択

12:15)ゲームタイプに応じてフレームワークを選択します。

  • 2D ゲーム:SwiftUI または SpriteKit
  • 既存の Unity ゲーム:Unity は visionOS をサポートし、パススルー、高解像度レンダリング、ネイティブジェスチャにアクセス可能
  • ネイティブ 3D ゲーム:RealityKit(ECS、物理、アニメーション、パーティクル、オーディオ)
  • 独自エンジン:CompositorServices API + Metal + ARKit

14:38)visionOS の Xcode テンプレートは RealityView 付き SwiftUI ウィンドウを提供します。ウィンドウを超えるには Volume(サイズを指定、プレイヤーが配置)または Space(プレイヤー周囲にコンテンツをレンダリング)を使用します。Anchor でコンテンツを現実世界の表面や手に固定できます。Portal で壁に「穴」を開き、内部の仮想世界を表示できます。

詳細

3D オブジェクトをジェスチャ入力に応答させる

システムジェスチャを RealityKit エンティティで機能させるには、2 つのコンポーネントを追加します。

// インタラクティブな 3D オブジェクトを作成
let entity = Entity(named: "game_piece")

// 衝突形状を提供:ジェスチャ検出の基礎
entity.components.set(CollisionComponent(shapes: [.generateSphere(radius: 0.1)]))

// インタラクティブな対象としてマーク
entity.components.set(InputTargetComponent())

キーポイント:

  • CollisionComponent はジェスチャ検出の物理境界を定義します
  • InputTargetComponent はこのエンティティが入力イベントを受け取れることをシステムに伝えます
  • 両方がないと、注視+タップジェスチャはそのオブジェクトで発火しません
  • 衝突形状はビジュアルモデルと異なってもよい — パフォーマンスのためにより単純なジオメトリを使用できます

ゲームコントローラーサポートの宣言

Info.plist に追加します。

<key>GCSupportsControllerUserInteraction</key>
<true/>

Xcode の Signing & Capabilities で Game Controller capability を追加します。

キーポイント:

  • 宣言後、App Store 製品ページにコントローラーサポートバッジが表示されます
  • visionOS は Xbox、PlayStation、その他 MFi コントローラーをサポートします
  • Bluetooth キーボードとマウスもサポートされます
  • プレイヤーはパススルーで物理コントローラーを見られます

シーン理解のリクエスト

import ARKit

// Full Space でシーン理解を要求
let session = ARKitSession()
let planeDetection = PlaneDetectionProvider(alignments: [.horizontal, .vertical])
let sceneReconstruction = SceneReconstructionProvider()

try await session.run([planeDetection, sceneReconstruction])

// 検出された平面を処理
for await update in planeDetection.anchorUpdates {
    switch update.event {
    case .added, .updated:
        let plane = update.anchor
        // plane.originFromAnchorTransform で位置を取得
        // plane.extent で平面サイズを取得
    case .removed:
        break
    }
}

キーポイント:

  • シーン理解は Full Space でのみ利用可能です
  • 位置情報/マイク権限と同様、ユーザー認可が必要です
  • PlaneDetectionProvider は水平・垂直面を検出します
  • SceneReconstructionProvider は部屋のメッシュを提供します
  • 表面マテリアル情報(carpet、wood など)を取得できます

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

Window と異なり、Volume のサイズは開発者が指定し、プレイヤーは位置のみ変更でき、サイズは変更できません。

@main
struct MyGameApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .windowStyle(.volumetric)  // ボリュームウィンドウスタイルを使用
        .defaultSize(width: 1.5, height: 1.0, depth: 1.0, in: .meters)
    }
}

キーポイント:

  • .windowStyle(.volumetric) でウィンドウをボリュームに変換します
  • .defaultSize で幅・高さ・深さをメートル単位で指定します
  • コンテンツはボリューム境界でクリップされます
  • プレイヤーはボリュームを任意の位置にドラッグできますが、サイズは固定です

重要ポイント

1. デスクトップボードゲームを設計する

Shared Space のFeatureを活用し、本物のテーブル上に仮想ボードゲームを設計し、駒に 3D の奥行きを持たせます。プレイヤーは注視+タップで駒を動かし、Bluetooth コントローラーで操作を高速化できます。入口:RealityKit + CollisionComponent/InputTargetComponent + SwiftUI ウィンドウ。

2. 部屋スケールのアクションゲームを作る

Full Space + シーン理解で、ゲームコンテンツが現実の部屋と連動します。敵は本物の壁の後ろから現れ、プレイヤーは本物の家具を避けます。入口:ARKit の SceneReconstructionProvider + PlaneDetectionProvider と RealityKit のエンティティ配置。

3. 既存 iOS ゲームに 3D 要素を追加する

ゲームがすでに 2D(パズル、カード、ストラテジー)なら書き直しは不要です。SwiftUI ウィンドウに RealityKit ボリュームコンテンツを追加 — カードを出すときの 3D アニメーションや、視差のあるシーン深度など。入口:既存 SwiftUI ビューに RealityView を埋め込む。

4. ジェスチャ制御の体感ゲームを実装する

ARKit ハンドトラッキングでカスタムジェスチャをゲーム入力に — 空手チョップで飛んでくる物体を切るゲームなど。入口:HandTrackingProvider + カスタムジェスチャ認識 + CollisionComponent で衝突検出。

関連セッション

コメント

GitHub Issues · utterances