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 で無効化し、イベントサブクライブ内部で自前実装
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 クロージャを使わなければ避けられる
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 のイベント捕捉でアニメーションを自前実装