ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
はじめてのイマーシブなアプリの開発
XcodeとReality Composer Proを使用して、visionOS用アプリを作成する方法を紹介します。新規visionOSプロジェクトを開始する方法、SwiftUI開発にXcode Previewsを使用する方法、RealityKitとRealityViewを活用して3Dコンテンツをレンダリングする方法を紹介します。
関連する章
- 0:00 - Introduction
- 1:06 - Create an Xcode project
- 8:57 - Simulator
- 12:12 - Xcode Previews
- 13:34 - Reality Composer Pro
- 20:18 - Create an immersive scene
- 25:28 - Target gestures to entities
- 30:16 - Wrap-up
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪ ♪ こんにちは Peterです AppleのRealityKit Tools チームに所属しています 今日は 初めての方むけに イマーシブなアプリの開発について解説します 空間コンピューティングは まったく新しい方法で コンテンツを表示したり より深いレベルの没入感を アプリに提供します プラットフォーム自体は新しいものの アプリを構築する方法は すでに馴染みのある ワークフローを使用します このセッションでは まず Xcodeで新しいアプリ プロジェクトを作成します Simulatorを使用して シミュレートしたシーンで アプリを体験する方法と Xcode Previewsを使って 迅速にコードを記述する方法を解説します アプリのための空間コンテンツの準備と プレビューを支援する新しいツール Reality Composer Proを紹介します 最後に イマーシブなシーンを作成し RealityKitのエンティティを対象に SwiftUIジェスチャーを使用してみます 何百万人ものデベロッパが毎日Xcodeを使って アプリを作成 プレビュー デバッグ プロファイル そして配信の準備を行っています Xcodeは 皆さんが初めて アプリを作るための最適な場所です Xcodeのプロジェクト作成プロセスを通じて このプラットフォームの 新機能を確認しましょう Xcodeで新しいプロジェクトを作成すると 新しいプロジェクト アシスタントが表示されます プラットフォームやプロジェクトの種類で テンプレートが整理されています アプリのプロジェクトテンプレートは 「Platform」タブの「Application」 セクションで使用できます 新しいプロジェクトでは プラットフォームサポートが インストールされていない場合 ダウンロードを求められることがあります 新しいプロジェクトアシスタントには いくつかのオプションがあり そのうち2つは このプラットフォームでは新しいものです この新しいオプションを 詳しく見てみましょう 1つ目の新しいオプション Initial Sceneでは アプリに自動的に含まれる初期シーンの タイプを指定することができます 新しいプロジェクトアシスタントは常に ここで選択したタイプのシーンを含む スタートポイントを作成します デベロッパは 後からシーンを追加できます これは 初期シーンと 同じタイプにもできますし まったく別のシーンタイプにもできます このテンプレートでは ウィンドウとボリュームの 2つの初期シーンが用意されています この2つの違いを見ていきましょう ウィンドウは 主に2次元のコンテンツを 表示するようデザインされています 平面的なサイズは変更可能ですが 奥行きは固定されています ウィンドウは 一般的に他の実行中の アプリと一緒に表示されます ウィンドウシーンタイプの詳細と SwiftUIへの追加要素と変更点については “Meet SwiftUI for spatial computing”をご覧ください ボリュームは 主に3Dコンテンツの 表示用にデザインされています 3次元の大きさは アプリでコントロールできますが アプリのユーザーが 調節することはできません ウィンドウと同様に ボリュームは一般的に 他の実行中のアプリと一緒に表示されます “Take SwiftUI to the next dimension”セッションで ボリュームシーンタイプについて 詳しく解説しています 2番目のオプションの Immersive Spaceでは 皆さんのアプリにイマーシブなコンテンツの スタートポイントを提供します Immersive Spaceシーンタイプを アプリに追加すると それを使って 無限のキャンバス上の任意の場所に 好きなコンテンツを表示できます アプリがこのシーンタイプを アクティブ化すると Shared SpaceからFull Spaceに移動します Full Spaceでは 他の実行中のアプリが 邪魔にならないように隠されます アプリは専用のレンダリングリソースに アクセスすることもでき ハンドトラッキングのような ARKit機能を有効にする許可を 要求することもできます アプリで没入型エクスペリエンスを 作成する場合 SwiftUIは3つの 異なるスタイルを提供します Mixed Immersion Progressive Immersion Full Immersionの3種類です Mixed Immersionスタイルでは Full Spaceに自由な 仮想コンテンツを配置しながら パススルーで周囲とのつながりを 保つことができます Progressive Immersionスタイルでは 人々を周囲から完全に排除することなく より没入感のあるエクスペリエンスを 提供するポータルを開けます ポータルが開くと 約180度の視野で 没入感のあるコンテンツを見ることができ Digital Crownで ポータルのサイズを調整できます Full Immersionスタイルは パススルーを完全に隠し 人々はアプリの環境に包まれ 新しい場所へと移動します Immersive Spacesについては 後ほど詳しく説明します より深く掘り下げるには “Go beyond the window with SwiftUI”をご覧ください デフォルトでは アプリに Immersive Spaceは追加されません これは オプションで Noneを選択した時の動作です しかし Immersive Spaceオプションの いずれかを選ぶと テンプレートは自動的に選択された Immersive Spaceスタイルで 2番目のSwiftUIシーンを追加します デフォルトでは 誰かがイマーシブなコンテンツを 開くことができるように ウィンドウシーンにも SwiftUIボタンが提供されます 一般的に このプラットフォームでは アプリは常にウィンドウで起動し コンテンツに没入する タイミングを決められる 明確な出入り口を 提供するようおすすめします 人々が気づかないうちに イマーシブエクスペリエンスに 移動することが無いようにしましょう このセッション用の プロジェクトを設定しましょう まず 初期シーンはボリューム Immersive Space無しで始めます いつも通りプロジェクトを作成します 名前を付け Xcodeに保存場所を指定し終了します 作成が終わると 新規プロジェクトが開きます 左側にXcodeの Project Navigatorが表示されます 最初のファイルは MyFirstImmersiveApp.swiftです アプリが初期ボリュームを提供する WindowGroupを宣言します WindowGroupはiOSで見たのと 同じ構成要素で アプリが提供する トップレベルのSwiftUIビューを指定します 2つ目のファイルはContentView.swiftです この初期ボリュームで表示されるビューです プロジェクトは メインエディタに ContentView.swiftが 表示された状態で開きます Xcodeでは プロジェクトに自動的に含まれる RealityKitコンテンツパッケージの 内容をロードする ContentViewのプレビューも表示されます 新規プロジェクトのコードの ほとんどはContentViewにあります ContentViewは いくつかの 新しいプラットフォーム固有の 機能を使用しています 詳しく見てみましょう ContentViewは ボリュームによって 提供されるSwiftUIビューの名称です シンプルなエフェクトを提供する “enlarge”という 単一のSwiftUI State プロパティを定義しています SwiftUIビューとして コンテンツは bodyプロパティによって 提供されます bodyはVStackに入れ子になっている 2つのビューで構成されます VStackは ネストされたビューを 垂直にスタックします 最初のネストされたビューは RealityViewです RealityViewは新たに登場しました これについては後ほど説明します 2つ目のネストされたビューは 別のVStackに埋め込まれた 標準的なSwiftUIトグルビューです トグルビューは 拡大プロパティの値を 切り替えます VStackはボタンが見やすく 操作しやすいように glassBackgroundEffectを提供しています SwiftUIを使ったことがあるなら おそらくすでにToggleビューを ご存知でしょう 他のプラットフォームで すでにサポートされている SwiftUIコントロールのほとんどは 期待通りに動作します 後ほど 拡大プロパティを切り替える ジェスチャーの使用方法を見てみます しかしその前に RealityViewを 詳しく見てみましょう RealityViewでは Realityコンテンツを SwiftUIビュー階層に配置できます ContentViewで使用される RealityViewイニシャライザは パラメータとして makeクロージャと updateクロージャの2つを使用します makeクロージャは 初期RealityKitコンテンツを ビューに追加します RealityKitコンテンツパッケージの 内容を読み込みます 成功すれば content.addで読み込んだ コンテンツをビューに追加します また 初期コンテンツを 手続き的に生成したり 手続き型とロード型コンテンツを 組み合わせて使用することもできます updateクロージャはオプションですが 使用した場合 SwiftUIの状態が 変化するたびに呼び出されます makeクロージャで追加された 最初のエンティティを 最初にcontent.entitesから取得します そして SwiftUIの拡大プロパティの 値に基づいてuniformScaleの ファクターを選択し エンティティにこのスケールを適用します RealityViewのupdateクロージャは レンダリング更新ループではなく すべてのフレームで 呼び出されるわけではありません 代わりに updateクロージャは SwiftUIの状態が変化した時のみ 呼び出されます 最後に RealityViewに gestureを追加します RealityKitコンテンツをタップすると 拡大プロパティの値が切り替わり 先ほど取り上げたToggleビューを タップするのと同じ効果を生み出します RealityViewとジェスチャーについては “Build spatial experiences with RealityKit”をご覧ください ContentViewについて見ましたので 次にSimulatorを紹介します シミュレートされたシーンで 実行されているアプリを 操作してみましょう その後 Simulatorでアプリが どう見えるかを確認しましょう Simulatorは 他のプラットフォームで 使ったことのある方には おなじみのウィンドウで表示されます 最初に起動すると アプリケーションランチャーが表示されます Simulatorはデバイスを装着して 見える風景を再現します デフォルトでは ポインターで 見ているものを操作します マウスやトラックパッドのクリックは タップを クリックの長押しでピンチを再現します 空間コンピューティングの大きな特徴は 周囲を見たり移動できることです Simulatorはそれを実現するための 操作を提供します Simulatorウィンドウの右下には シミュレートされたデバイスを 操作するボタンがあります マウスやトラックパッドを 長押ししながら動かすと 周囲を見渡したり… …平行移動したり… …回転したり… …前後に移動できます これらのボタンを長押ししたまま 操作することで コンテンツの 操作を素早く切り替え 見まわしたり移動できます また これらのボタンをクリックすると マウスボタンを押し続ける必要なく 各操作モードに切り替えることができます 例えば このパンボタンをクリックして ビューをドラッグすると ビューが移動します 左端のボタンをクリックすると ルック&タップの操作に切り替わります Simulatorには 様々な部屋や照明条件で アプリの動作を確認できる シミュレーションシーンが用意されています ツールバーの 「Simulated Scenes」メニューで 切り替えることができます
Simulatorの詳しい使用方法については developer.apple.comの ドキュメントをご覧ください Simulatorに慣れたところで 新しいアプリを動かしてみましょう いつものように Xcodeから ProductメニューのRunをクリックして アプリを起動します アプリが起動すると RealityKitの コンテンツパッケージの中身を示す ボリュームが表示されます RealityViewの コンテンツ拡大ボタンをタップすると コンテンツが拡大され 再度タップすると 元の大きさに戻ります 球体をタップしても RealityViewの ジェスチャーの効果により拡大されます
球体をタップすると ボタンのハイライトが変化します タップジェスチャーにより SwiftUIの状態が更新され RealityViewとToggleビューの両方が 状態の変化に反応します Xcode Previewsでは アプリのビューの 見た目と動作に焦点を当てた 記述が可能です SwiftUIプレビュープロバイダを含む ソースファイルを編集している間 Xcodeはプレビューキャンバスを 自動で開きます Simulatorと同様に Xcode Previewsは シミュレートされたデバイスの ビューを表示します プレビューウィンドウは Simulatorと同じ方法で操作できます コントロールを使って 少しコンテンツに近づいてみます また 右下のコントロールを使って シミュレートするシーンや カメラアングルを変更できます SwiftUIのコードに変更を加え プレビューの変化を リアルタイムで確認できます では トグルスイッチのテキストを “Change Size”に変更してみましょう テキストを変更すると プレビューも更新されました また ボタンは Xcode Previewsで引き続き機能しています これを利用して RealityViewクロージャの 内容も反復作業が可能です Xcode Previewsには アプリの境界を越えて広がる コンテンツを発見できる オブジェクトモードや カスタムカメラアングルなど 高度な機能がたくさんあります Xcode Previewsの詳細については デベロッパ向けドキュメントをご覧ください RealityKitコンテンツパッケージの 作業を支援する新しいツールを用意しました Reality Composer Proはアプリのための 空間コンテンツを準備し プレビューするのに最適な場所です アプリのContentViewは RealityViewを使用して RealityKitコンテンツパッケージから コンテンツをロードします テンプレートによって作成された コンテンツパッケージは Xcodeプロジェクトの Packagesグループに配置されています このプロジェクトでは RealityKitContentが選択されています RealityKitコンテンツパッケージは RealityKitコンテンツを含む Swiftパッケージです ビルド時に処理され コンテンツを ランタイム用に最適化します RealityContentのDisclosure Indicatorをクリックすると コンテンツパッケージの中身が表示されます 立方体のPackageをクリックすると コンテンツパッケージ内の 1つのシーンのプレビューが表示されます コンテンツパッケージを編集するには 右上のReality Composer Proで開く ボタンをクリックします すると Reality Composer Proが起動します Reality Composer Proが起動すると ContentViewによって読み込まれた 3Dコンテンツが表示されます Xcodeがソースファイルやアプリの リソースの編集を 主な目的としているのに対し Reality Composer Proは 3Dコンテンツが中心になっています メインビューは3Dビューポートで Simulatorと同様の コントロールを使ってナビゲートできます Reality Composer Proはコンテンツを シーンごとに整理します プロジェクトテンプレートに含まれる コンテンツパッケージは 1つのシーンから始まります プロジェクトを強化するために Immersive Space用のコンテンツを含む シーンを作成しましょう Reality Composer ProのFileメニューから New&Sceneを選択し 名前を付けます ここではImmersiveSceneにします そしてSaveをクリックします シーンを作成すると 自動的に開き ウィンドウ下部のプロジェクトブラウザに 空のシーンのサムネイルが表示されます シーンの切り替えは ウィンドウ上部の シーンの名前をクリックするか プロジェクトブラウザでシーンを ダブルクリックして行います これで 新しいシーンに イマーシブなコンテンツを 追加する準備が出来ました Xcodeプロジェクトを構成した際に SwiftUIのImmersiveSpaceを使って 周囲の好きな場所にコンテンツを 表示できるとすでに説明しましたが このシーンタイプには さらに2つの 重要なポイントがあります まず ウィンドウやボリューム シーンタイプと異なり ImmersiveSpaceでは コンテンツの基準点として 足の位置を使用します この座標システムでは 正のX軸はあなたの右側 正のY軸はあなたの上 負のZ軸はあなたの正面を示しています 次に アプリがフルスペースで動作する場合 手の正確な位置や向きなど 追加のデータへのアクセスを 要求することが可能です データの中には プライバシーへの 配慮が必要となものもあります アプリがプライバシーへの配慮が 必要なデータを要求する場合 アプリを使用するユーザーは この要求を承認するよう促されます 共有スペースにある アプリでは使用できません Immersive Spaceを使用するアプリで 利用できる追加データや プライバシーへの配慮については “Meet ARKit for spatial computing”の セッションをご覧ください 没入感あるエクスペリエンスを 作成する方法が分かったところで ImmersiveSpaceで うまく動作する コンテンツを作ってみましょう USDZクラウドモデルがあるので それを使って イマーシブエクスペリエンス向け コンテンツを作ってみます USDZモデルをReality Composer Pro シーンに追加するには Fileメニューを開き Importをクリックします そしてファイルを選択します プロジェクトブラウザに USDZモデルが表示されています ビューポートにドラッグして シーンに追加します また Finderウィンドウから USDZファイルを ビューポートに ドラッグアンドドロップするだけで インポートとシーンへの 追加を同時に行えます では 雲を没入感あるシーンに 配置してみましょう オブジェクトを選択し 表示されるハンドルを使って 移動させることができます 右側のInspectorパネルで 値を手動で設定することもできます このシーンタイプでは 足の位置が 基準となるため すぐ目に入る場所に 雲が現れるように 配置する必要があります 今回は 正面から見て 少し右側 目の高さよりやや上に配置します この雲を少し右に出現させます 正のX軸が右側になるので Xを50に設定します この変更を行うと 雲がビューポイントの外に移動しました 再び焦点を合わせるには 左側のシーン階層で 雲をダブルクリックします 雲が見えるようになったので Y座標を考えてみましょう 雲を上に表示したいので 高さ200センチに配置します 床からおよそ6.5フィートの高さです 雲がまた外に行きました 再び視界内に戻します 真上を見ないですむように 雲をやや奥に配置します 遠ざける方向は負のZ軸ですので Z座標を-200センチに設定します 再びシーン階層で ダブルクリックし 中央に表示させます シーン内の雲は小さいので 大きくする方法を見てみましょう 大きくするには 円を外側にドラッグします インポートした時の 5倍ぐらいの大きさにします 最後に 2つ目の雲を 今度は左に追加します EditメニューからDuplicateコマンドを使い 最初の雲のコピーを作成します コピーを左に配置するために X座標を-50に設定します
すべてのコンテンツを視界に入れるため 階層内のRootをダブルクリックします これで没入感あるコンテンツの シーンが出来ました Xcodeに戻る前に File&Save Allで変更内容を保存します Reality Composer Proは 空間コンテンツを準備し プレビューし アプリに統合できる強力なツールです より詳しい内容については “Meet Reality Composer Pro”の セッションをご覧ください “Work with Reality Composer Pro content in Xcode”では 1つ目のセッションをベースに RealityKitコンテンツパッケージの コンテンツをアプリと緊密に 統合する方法を紹介しています 次に 作成したイマーシブなコンテンツを アプリに導入しましょう アプリで表示するシーンは プロジェクト名が先頭についたファイル App.swiftに入っています 詳しく見てみましょう なぜ作成したアプリが ContentViewで表示できるのでしょうか このアプリは ボリュームのコンテンツとして 単一のWindowGroupを使って ContentViewで表示しています WindowGroupは1つまたは複数の ウィンドウまたはボリュームを作成し 任意のビューを表示します bodyプロパティの最初のシーンは アプリが起動したときに表示され 最初のシーンの後に 追加することで アプリにシーンを追加できます Reality Composer Proで 作成したコンテンツを アプリで表示して 没入感のある空間を表現します この空間にImmersiveViewという 新しいビューをアプリに追加し 表示します 空間にIDを割り当てます 文字列“ImmersiveSpace”をIDにします 後ほど空間を開く時に使用します このコードをApp.swift ソースファイルに追加し Reality Composer Proで作成した 新しいシーンを読み込むための コードをImmersiveViewに追加します Xcodeの SwiftUI Viewテンプレートを使って すでにImmersiveView.swiftを プロジェクトに追加してあります プロジェクトのApp.swiftに ImmersiveSpaceを追加します そして ImmersiveView.swiftの先頭で RealityKitContentをインポートして RealityKitコンテンツパッケージを 使えるようにします また RealityViewを使うために RealityKitをインポートします ImmersiveViewの デフォルトのコンテンツは ただのテキストボックスです これを コンテンツパッケージに追加した 新しいシーンから コンテンツをロードする RealityViewに置き換えます 左側のプロジェクト階層で ContentViewをダブルクリックし RealityViewのコードを 最初のクロージャと一緒に 選択してコピーします ファイルタブを使って ImmersiveViewに戻り テキストビューを選択し ペーストして RealityViewの コードと置き換えます RealityViewの updateクロージャをコピーしていませんが これはSwiftUIの 状態の変化に応じて ビューの内容を更新する必要が無いからです 最後に 作成した Immersive Sceneの コンテンツを読み込むため シーンの名前を“Scene”から “ImmersiveScene”に変更します
プレビューがImmersiveSceneの シーンを読み込みましたが プレビューキャンバスに表示されません ImmersiveViewを作成した時は Xcode Previewが自動的に作成されました 詳しく見てみましょう ImmersiveView.swiftの下部を見ると Xcodeにプレビューを表示するよう コードが書かれています #Previewで始まるコードのブロックです デフォルトでは プレビューは デフォルトのシーン境界でクリップされます 境界の外にコンテンツを ロードするビューを表示する場合 コンテンツは表示されません 境界の外にある没入型コンテンツの プレビューを有効にするには 準備中のビューを .previewLayout(.sizeThatFits)に 変更します やってみましょう ImmersiveViewのプレビューに .previewLayout(.sizeThatFits)を 追加すると プレビューが更新され コンテンツが表示されます
最後に アプリがImmersive Spaceを 開くようにしましょう iOSでマルチシーン SwiftUIアプリを扱ったことがあれば 追加シーンをSwiftUIのコードから 開く方法はすでにご存知かもしれません まずは ビューのSwiftUI環境から クロージャをキャプチャし ボタンを押すなどのイベントに 応答して呼び出すようにします Immersive Spaceの表示は 新しいプラットフォームの SwiftUIでも 同じように動作しますが キャプチャするクロージャは “openImmersiveSpace”と呼ばれ 非同期であるため Immersive Spaceを 表示したことをコードで検知します ContentViewに戻り SwiftUI環境から openImmersiveSpace クロージャをキャプチャし それを呼び出すボタンを追加します
これで イマーシブなコンテンツを 表示するための変更が完了しました Simulatorでコンテンツを体験できますが デバイスを使うとより没入感を感じられます 試してみましょう 新しいボタンが表示され これを押すと ImmersiveSpaceのコンテンツとして 雲が表示されます 前方に2つの雲が見えます 左と右に1つずつあります Immersive Spaceは 最初のシーンから独立しています 最初のシーンを移動しても ImmersiveSpaceのコンテンツは 同じ場所に固定されています アプリの初期ボリュームは 自由に動かせるのに対し ImmersiveSpaceは 開いた時点で決まった場所に配置されます Immersive Spaceを動かすのではなく Immersive Spaceの中を 移動することになります Immersive Spaceを使って 頭上に雲を表示する シンプルなアプリができました アプリを雲との インタラクションに反応させるには どうすれば良いでしょうか? 簡単に言えば 雲をタップすると 雲が上空を漂うイメージです これを実現してみましょう SwiftUIビューを入力に反応させるため ジェスチャーを追加します この例では シンプルな テキストビューを用意します このビューにTapGestureを追加して ビューをタップした時に 反応するようにします ジェスチャーをビューに追加すると ジェスチャーを認識した時に 呼び出されるクロージャが追加されます RealityViewはSwiftUIビューなので 同じようにジェスチャーに反応します しかし RealityViewは 複数のエンティティをもつ RealityKitコンテンツを 含むことができます 例えば 私たちのアプリは雲のモデルを含む RealityViewコンテンツを ImmersiveSpaceに表示します 雲をタップすると SwiftUIは RealityView上でTapGestureを呼び出します しかし どの雲がタップされたかを 知るにはどうすれば良いでしょうか? ここでentity targetingが登場します targetedToAnyEntity修飾子は どのエンティティに対して RealityViewに追加されたジェスチャーが 行われたかを判別します エンティティをターゲットにする 方法は他にもあります 特定のエンティティを対象にしたり クエリに一致するすべての エンティティを対象にもできます 詳しくは developer.apple.comの ドキュメントをご覧ください onEndedなどのジェスチャーの ハンドラに渡される値には RealityViewの中で エンティティとの接触を示す entityプロパティが存在します なお RealityKitのエンティティで ターゲティングが機能するためには そのエンティティに CollisionComponentと InputTargetComponentの両方が必要です RealityKitエンティティに これらのコンポーネントを要求することで RealityView内のコンテンツの 選択された部分のみに インタラクションを制限することができます これらのコンポーネントは Reality Composer Proで エンティティに追加することもできますし アプリのプログラムで 追加することも可能です entity targetingについての 解説は以上です では 雲へのタップを 検出してみましょう このやり取りが発生すると RealityKitのアニメーションが始まります まず Reality Composer Proで 必要なコンポーネントを追加しましょう RealityKitコンテンツパッケージでは Command-clickで ビュー階層から 両方の雲を一度に選択できます そして Inspectorパネルの下にある “Add Component”をクリックし Collisionを選択します
Inspectorパネルで 雲にCollisionComponentが 追加されているのが分かります Reality Composer Proは 適切なコリジョンシェイプを 自動的に選択して モデルの CollisionComponentを作成します コリジョンシェイプは必要に応じて 変更できます InputTargetComponentについても 同様に行います 再びAdd Componentボタンをクリックし 今度はInput Targetを選択します
File&Save Allで変更を保存します 実際に雲を空で動かすには 雲をタップした時に呼び出される ジェスチャーハンドラで RealityKitのアニメーションを使います まず 雲の変化の現在の値を 可変値として取得して translationにオフセットを追加し 奥と右に100センチずつ移動させます そして雲のエンティティに.moveを呼び出し RealityKitのアニメーションを適用します Xcodeに戻り アプリを完成させます ImmersiveViewは RealityViewにイマーシブなコンテンツを 表示させるためのソースファイルです RealityViewにTapGestureを追加して entity targetingを使用する コードを追加します そして タップを検出したら アニメーションを実行します ではSimulatorで動かしてみましょう ボタンをタップすると 先ほどと同様に ImmersiveSpaceが開きます 雲をタップすると 今度は雲が空中で移動します Entity targetingによって SwiftUIのインタラクションが RealityKitのコンテンツにつながりました 今回の例では タップに反応する 雲の簡単なアニメーションを 実行しました より複雑なアプリでは entity targetingを使用して 追加ビューの表示 オーディオの再生 アニメーションの開始など より高度なアクションを トリガーすることが可能です 今日は 多くのトピックに触れたので まとめます Xcodeの新しいアシスタントを使用して 初めてのイマーシブなアプリを作りました 次に 新しいプラットフォーム用の Simulatorを紹介し Xcode Previewsでアプリのコンテンツを 簡単に再現できることを説明しました Reality Composer Proを紹介し RealityKitのコンテンツの 準備とプレビューが 簡単に行えることを説明しました 最後に ImmersiveSpaceを開き entity targetingを使用して イマーシブなコンテンツとの インタラクションを プログラムで可能にしました お楽しみいただけたでしょうか 新しいSwiftUIやRealityKitのAPI Reality Composer Proの より高度な使用例など その他の数多くのセッションも ぜひご覧ください ありがとうございました ♪
-
-
6:54 - Glass background effect
VStack { Toggle("Enlarge RealityView Content", isOn: $enlarge) .toggleStyle(.button) } .padding() .glassBackgroundEffect()
-
7:28 - RealityView
RealityView { content in // Add the initial RealityKit content if let scene = try? await Entity(named: "Scene", in: realityKitContentBundle) { content.add(scene) } } update: { content in // Update the RealityKit content when SwiftUI state changes if let scene = content.entities.first { let uniformScale: Float = enlarge ? 1.4 : 1.0 scene.transform.scale = [uniformScale, uniformScale, uniformScale] } } .gesture(TapGesture().targetedToAnyEntity().onEnded { _ in enlarge.toggle() })
-
20:31 - ImmersiveView
// MyFirstImmersiveApp.swift @main struct MyFirstImmersiveApp: App { var body: some Scene { WindowGroup { ContentView() }.windowStyle(.volumetric) ImmersiveSpace(id: "ImmersiveSpace") { ImmersiveView() } } }
-
22:58 - Size that fits
#Preview { ImmersiveView() .previewLayout(.sizeThatFits) }
-
23:48 - openImmersiveSpace
struct ContentView: View { @Environment(\.openImmersiveSpace) var openImmersiveSpace var body: some View { Button("Open") { Task { await openImmersiveSpace(id: "ImmersiveSpace") } } } }
-
25:48 - Entity targeting
import SwiftUI import RealityKit struct ContentView: View { var body: some View { RealityView { content in // For entity targeting to work, entities must have a CollisionComponent // and an InputTargetComponent! } .gesture(TapGesture().targetedToAnyEntity().onEnded { value in print("Tapped entity \(value.entity)!") }) } }
-
28:56 - Move animation
.gesture(TapGesture().targetedToAnyEntity().onEnded { value in var transform = value.entity.transform transform.translation += SIMD3(0.1, 0, -0.1) value.entity.move( to: transform, relativeTo: nil, duration: 3, timingFunction: .easeInOut ) })
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。