SwiftUI と RealityKit の相互連携に関するアップデート。盛りだくさんすぎた。オブジェクト操作を細かくハンドリングできるのは良い。ポップオーバー表示など自前でやっていたことも実装が楽になりそう。update クロージャーについては、無限ループの危険性を含めてかなり尺を使って解説しており、使いこなすのは難しそう。
CESや「モデル」の意味違いなど、アップデート以外の基礎的なテーマも網羅していて、情報量の多さをフォローする優しさを感じた。
0:00 – Introduction
- SwiftUI と RealityKit の連携強化について紹介
- 3D モデルと UI を組み合わせた新しい体験を実現
1:24 – Model3D enhancements
- visionOS 26 で強化された二つの機能
Model3Dにアニメーション再生Model3Dは SwiftUI ビューとして SwiftUIレイアウトシステムに従うModel3DAssetでアニメーションリソースを読み込み、AnimationPlaybackControllerで制御(再生・停止・シーク)が可能AnimationPlaybackControllerがObservableに(例:timeの変更監視)
ConfigurationCatalogからの読み込みConfigurationCatalogでModel3Dを初期化し、複数の外観やボディタイプを切り替えられる(@Stateで参照)
6:13 – RealityView transition
ParticleEmitterなどのコンポーネント追加にはModel3Dが対応していないのでRealityViewへの切り替えが必要Model3Dが intrinsic size に基づいてレイアウトされるのに対し、SwiftUI の与えたられたスペースをRealityViewがすべて占有し、レイアウト崩れが発生realityViewLayoutBehavior修飾子:.fixedSize,.flexible,.centeredで制御makeクロージャ実装後 1度だけ評価されるRealityViewの原点を再配置するだけ
- RealityKit の Entity に直接アニメーションやエフェクトを追加可能
ParticleEmitterで作成したエフェクトをコンポーネントに適用可能- RealityKit がプリセット値を提供し、Reality Composer Pro で調整可能
- entity-component system
RealityView/Model3Dの使い分け観点
11:52 – Object manipulation
- visionOS 26 で Object Manipulation API が追加され、SwiftUI, RealityKit 双方で 3D オブジェクトの移動 回転 拡大縮小が可能
- SwiftUI では manipulable モディファイア
orientationでサポートする操作intertiaで慣性(重さ)設定
RealityViewではManipulationComponent- メモ:
hoverEffectに.spotolight指定 ManipurationEventsで ユーザー操作の開始終了、ハンドオフ(e.g. 右→左)などに応じた応答を実装可能(サウンド再生)- カスタムサウンド再生は、
manipulationComponent.audioConfiguration = .noneで無効化し、イベントサブクライブ内部で自前実装
- メモ:
- SwiftUI では manipulable モディファイア
15:35 – SwiftUI components
- SwiftUI を RealityKit エンティティに統合するための3つのコンポーネント
ViewAttachmentComponent:SwiftUIビューをエンティティに直接追加GestureComponent:エンティティに通常の SwiftUI ジェスチャをアタッチ、ジェスチャー値はエンティティの座標空間で報告- ジェスチャー対象のエンティティに、
InputTargetComponent,CollisionComponent両方を追加
- ジェスチャー対象のエンティティに、
PresentationComponent:RealityKit シーン内から SwiftUI ビューを popover のように表示
19:08 – Information flow
- visionOS 26 で
EntityがObservableになり、SwiftUI との双方向データ連携が可能 Entityの位置、拡大縮小、回転など状態変化を SwiftUI View で監視し、UI に反映できる(withObservationTrackingブロック or SwiftUI 組み込みの監視)- SwiftUI と RealityKit の双方向連携
- 従来:SwiftUI →
updateクロージャ → RealityKit - 逆方向も可能:RealityKit →
Observable→ SwiftUI updateクロージャの無限ループ回避策や、状態管理のベストプラクティス:updateクロージャで 監視対象のステートを更新しないこと- 更新する必要がある場合は、同値チェックを挟むこと
- システムの更新関数(SwiftUIビュー本体評価外)から更新すること:e.g.
gestureクロージャ - などなど
- そもそも
updateクロージャを使わなければ避けられる
- 従来:SwiftUI →
24:56 – Unified coordinate conversion
- 新しい
CoordinateSpace3Dプロトコルで SwiftUI, RealityKit 間の座標変換が容易に(抽象座標空間) GeometryProxy3D,Entity,SceneなどがCoordinateSpace3Dに準拠し、異なる空間間での距離計算や位置変換が可能- これにより 3D UI と 3D オブジェクトの連携がより直感的に
27:01 – Animation
- SwiftUI のアニメーション API で RealityKit のコンポーネント(
Transform,Audio,Model,Lightなど)を暗黙的にアニメーション可能 realityViewContent.animate()やEntity.animate()で状態変化に応じたアニメーションを実装- Object Manipulation API と組み合わせてカスタムリリース挙動やバウンス効果も実現
- 例:
manipulation.releaseBehavior = .stayで無効化し、ManipulationEventsのイベント捕捉でアニメーションを自前実装
- 例: