WWDC24:Support semantic search with Core Spotlight

日記データとローカルLLMを組み合わせて何かできないか考えているが、Foundation Models の adapter training は日々更新される情報の追加学習には向いていない(し、そもそもユーザー生成データを学習させることもできない)。文書データと相性が良さそうな RAG を iOS でうまいこと活用できないか ChatGPT に壁打ちしていたら、Core Spotlight によるセマンティック検索が有効と教えてくれたので、去年の WWDC セッションビデオを見てみた。

完全一致でなくともある程度文脈を汲み取ったコンテンツ検索ができるようで、さすが Spotlight 技術なのでバッチ更新も可能だし、Core Spotlight でアプリ内から検索処理が行えるのなら、Foundation Models に tool calling 経由で自律的に検索させることができるだろうか?


0:00 – Introduction

  • CoreSpotlight フレームワークでアプリ内に強力な検索体験を構築する新しい API を紹介
  • セマンティック検索により、意味的に類似した検索語でも適切な結果を取得可能
  • 完全にローカルでプライベートな検索インデックスを提供
  • ジャーナルのエントリ検索アプリを例に、検索体験の構築方法を説明

1:37 – Searchable content

  • 検索可能なコンテンツを設計 → 検索インデックスを構築 → Spotlight に提供
  • CSSearchableItemuniqueIdentifier, domainIdentifier, attributeSet を設定
  • CSSearchableAttributeSetcontentType, title, textContent, contentURL を設定し、セマンティック検索に最適化
    • アイテムが画像、動画アセットの場合は、アセットへのパスを contentURL に指定
    • 添付ファイルやWebコンテンツへの参照は、独自のコンテンツタイプと属性をインデクスに提供
    • ソースアイテムとの関係に relateUniqueIdentifier を指定
  • バッチインデックス作成と client state で効率的な Spotlight への提供を実現
  • item.isUpdate を使い、すでにインデックス済みの属性上書きを防ぎ、必要なものに限り提供可能

4:10 – Migration and Recovery

  • 移行と復元:一貫性を維持するために重要
  • なんらかの問題で移行と復元を要する場合、Spotlight がアプリに際インデックス化を要求
  • CoreSpotlight Delegate extension で Spotlight からの再インデックス要求に対応
    • Spotlight はアプリとは別にこの Extension を呼び出すことができる(デバイスがアイドル状態の時にバックグラウンドで再インデックスを実行)
  • mdutil ツールでデバッグとテストが可能

6:56 – Results and suggestions

  • CSUserQueryContext でクエリを設定し、セマンティック検索を有効化
  • ランク付けされた結果とサジェスションを取得、最大結果数も指定可能
  • メタデータ構文でフィルタクエリを構築し、結果をカスタマイズ
    • 検索結果をUIにに合わせる最適な手法(e.g. 画像のみ表示時は画像のみとするようクエリ指定)
  • 検索バーからのクエリ文字列とクエリコンテクストから CSUserQuery を生成
  • 非同期バッチで結果を取得し、compareByRank でソート
    • 候補(CSSuggestion)は入力文字列の補完として返却
  • セマンティック検索はプロセスに必要な学習モデルのダウンロードが必要
    • ロード・アンロードでメモリ容量を節約(CSUserQuery.prepare, .prepareWithProtectionClasses を検索UI表示時に実行)

9:18 – Ranking

  • エンゲージメントと鮮度のシグナルでランキングを改善
  • lastUsedDate プロパティでコンテンツの使用頻度を記録
  • ユーザーの検索行動(閲覧、スクロール、詳細表示)を追跡
  • 適応的なランキング体験でユーザーが最も関心を持つコンテンツを優先表示

10:17 – Wrap-up

  • CoreSpotlight で完全にプライベートなオンデバイス検索インデックスを構築
  • セマンティック検索により、より強力で直感的な検索体験を提供
  • 複数プラットフォームとロケールに対応した多様なコンテンツ検索を実現
  • App Intents や CoreData との統合でさらなる検索機能を拡張

WordPress:テーマをアップデートしたらCSSカスタマイズが消えた

WordPress の 外観>カスタマイズ>追加CSS に書いていたつもりが、一部はサーバー上のCSSを直接上書きしていたっぽく、テーマをアップデートしたらカスタマイズしたはずのデザインが消失してしまった。

また何かあった時のために残しておく。CSS 詳しくないのと、動けばいい程度のノリなので適当。ちなみに今使っているテーマは WordPress が提供する Twenty Sixteen

div.entry-content, aside {
  font-family: Montserrat, "Helvetica Neue", sans-serif;
}

blockquote {
  font-size: 1rem;
}

code {
  background-color: #eeeeee;
  border-radius: 4px;
}

@media screen and (min-width: 61.5625em) {
  body:not(.search-results) article:not(.type-page) img.below-entry-meta,
  body:not(.search-results) article:not(.type-page) figure.below-entry-meta,
  body:not(.search-results) article:not(.type-page) .wp-block-image figcaption.below-entry-meta 
{
  margin-left: auto;
  max-width: 100%;
}

聴講メモ:集まれSwift好き!Swift愛好会 vol.94 @ ウェルスナビ株式会社

Swift 愛好会に現地参加。

コーディングエージェントでの開発に関するテーマが半分。codelynx さんの発表は月初のMOSAでも聴いていたが開発事例が増えていて、スピード感がすごい。GitHub Copilot for Xcode、仕事で使っているが、エージェントモードは使ってなかったし、画像アップロードに対応しているのは知らなかった。実用性高そう。

Icon Composer は iOS 26 対応では一番取り組みやすい&効果が見えやすい部分なので、落とし穴が聞けてよかった。ユニットテストでの小数点の扱い、Apple がテストライブラリでの対応を放棄しているのが悲しい、、笑

イベントページ:https://love-swift.connpass.com/event/361053/


Icon Composer のいろいろ

Megabits_mzq さん

  • レンズをモチーフにしたアイコンを Icon Composer で再現した時に発生した課題
  • レイヤーに分ける必要がある:アートボードを分割した
  • Composer にインポートする際の問題
    • ガラス効果が見えない:svgファイルにキャンバスサイズと同じ四角が存在した、Composer がこの外周をエッジと認定
      • 解決策:svgでなくPNGで書き出すこと
      • PNGはぼやけるのでsvgがよいが、、
    • Mono モード、なんか暗い?:元の緑色の明度が暗かった
      • 解決策:Composer 上で Mono モード専用に色を調整できる
    • レイヤーが多すぎるという警告:4レイヤーのみ
      • 解決策:デザイン調整するしかない、背景は Composer で設定でき、自分でレイヤー用意する必要ないので節約できる
    • 下半分をぼかす視覚効果:iOS 26 では無理そう
      • 解決策:ぼかしをなくす
  • .icn を Assets の隣におけば表示される
  • 新しいSDKでコンパイルすれば古いOSでもこのバージョンが使われる
    • → コンパイル途中で画像に変換される(多分)

Claude Code で創る世界と壊れる世界

codelynx さん

“聴講メモ:集まれSwift好き!Swift愛好会 vol.94 @ ウェルスナビ株式会社” の続きを読む

音楽:トランスクライブのすすめ

ある YouTube 動画を見て、そういえばと思ったこと。

先日、コンボジャズでは5年ぶり?に人前で演奏した(ドラム)。反省は多々あれど、手前味噌ながら自分の成長をおおきく感じたステージでもあった。そしてその成長の根底にあると実感しているのが、トランスクライブだ。


トランスクライブの効果として感じることは

  • 音符の羅列としてしか捉えられなかったフレーズの数々が、ジャズやビバップのボキャブラリとして認識できるようになる(必然性に気がつける)
    • ルーディメンツや基礎練習への意欲向上
    • 意外と名ドラマーも同じフレーズ「使い回してる」んだなあ、などの発見
  • ミュージシャンそれぞれのスタイルが分かるようになる、自分の好きなスタイルが知れる
  • 自分の好きなドラマーのフレージングなので、自信を持って本番演奏で繰り出せる(成功せずともチャレンジはできる)
  • 自分で題材を決めてトランスクライブすることで、日々の練習やレッスンに対して課題感を持って挑める

などなど、、挙げ出したらキリがない。が、多くのプロミュージシャンがオススメするとおり効果が絶大なのは間違いないので、筆者と同じジャズ学習者にはすすめている。

しかし、ひとりで取り組むには限界があるので、可能なら講師など誰かに見てもらうべきだと思う。


筆者の場合、2022年末から月1でドラムの先生にレッスンしてもらっているのだが、去年からは自分で決めた課題曲を譜面に起こして見てもらっている。はじめて持っていった(先生にLINEで送った)のが、2024年5月のコレ。

Larry Vuckovich Trio – Srreet Scene から、”Blue Bohemia Suite”, “News for Lulu” Tana Akira のソロパート

まともに譜面なんて書いたことなく、それまでレッスンでもらった譜面を見よう見まねで採譜したので、はじめは譜面の書き方からの指導だった。以降、平均して 2ヶ月〜3ヶ月に1曲くらいのペースで持っていっている。

一番最近はこんな感じ(↑の譜面からちょうど1年後)。

Freddie Redd – Lonely City から、”Emily Reno” Ben Riley のソロパート

筆者の先生は、LINEで送った譜面写真やPDFファイルをそのまま紙にプリントアウトしてくるので、Notes.app の書類スキャン機能と PDF のマークアップ機能を使い、

  • コントラスト比の高いPDFファイルにする
  • 曲名や各段の秒を書き入れる
  • 音符だけでなく手順(左右や強弱)も書き入れる

ことで、レッスン中のコミュニケーションがスムーズになるよう心がけている。

これを題材に、内容(聞き取ったこと)の是非、違った場合はなぜそうなのか?を、手順(ルーディメンツ)的背景を交えて教えてもらう。こればかりは無知な自分が独学するには効率が悪すぎるため、先生についてもらう醍醐味だと毎度感じている。

レッスンを重ねながら育てていくと、譜面はこうなる。


本当はこのブログを始めた際、トランスクライブした譜面もアップロードしていきたいと思っていたが、清書するのが大変でできていなかった。そろそろ、いろんな譜面に埋もれて自分がどの曲をトランスクライブしたかが把握できなくなってきたので、形式はわからないがデジタルで一覧できるようにアーカイブしていきたい。

WWDC25:Meet SwiftUI spatial layout

SwiftUI による 3D レイアウトについて。


0:00 – Introduction

  • visionOS 26 で SwiftUI の新しい Spatial Layout 機能について紹介
  • 既存の 2D レイアウトツールとアイデアを使って 3D アプリケーションを構築可能
  • アニメーション、リサイズ、状態管理の組み込みサポートを活用

2:47 – 3D views

  • visionOS では全ての View が 3D になり、width, height に加えて depth, Z position も計算される
  • カスタムの debugBorder3D modifier を用いて解説
  • Model3DImage と同様に固定の width, height, depth を持つ
  • Image, Color, Text などは depth が 0 で iOS と同様の動作
  • RealityViewGeometryReader3D は利用可能な depth を全て使用
    • 従来の SwiftUI と同じレイアウトシステム
  • scaledToFit3D モディファイアでアスペクト比を維持しながら 3D 空間にフィット可能
    • Window では width-height のアスペクト比はユーザー操作によって代わるが、奥行きの提案はウインドウで固定されている
    • Volume は深さもサイズ変更可能
  • ZStack の挙動

7:18 – Depth alignments

  • visionOS 26 で DepthAlignments が追加され、既存の Layout タイプを 3D View に適応
    • VStackLayout などで depthAlignment モディファイアを適用して深度方向の配置を制御 (e.g. VStackLayout().depthAlignment(.center)  {…)
    • front, center, back の標準的な depth alignment を提供
  • Custom Depth Alignment で DepthAlignmentID プロトコルに準拠した独自の配置を定義可能
    • e.g. .alignmentGuide(.customAlignment) { $0[DepthAlignment.center] }

11:41 – Rotation layout

  • rotation3DLayout モディファイアで View の回転をレイアウトシステムに反映
    • 従来の rotation3DEffect は視覚効果のみでレイアウトには影響しなかったが、rotation3DLayout はレイアウトも変更
  • 任意の角度と軸での回転をサポート
  • 例:カスタム実装の RadialLayout と組み合わせて 3D カルーセルを構築可能
  • 複数の rotation3DEffect を組み合わせて複雑な 3D 配置を実現

16:28 – Spatial containers

  • SpatialContainer で複数の View を同じ 3D 空間に配置(入れ子人形方式)
  • 3D alignment(bottomFront, topTrailingBack など)で配置を制御
  • 選択状態の表示や UI 要素の重ね合わせに活用
  • spatialOverlay で単一の View を別の View と同じ 3D 空間に重ねる
  • debugBorder3D modifier の実装方法
    • spatialOverlay で実装

WWDC25:Enhance your app’s audio recording capabilities

Vision Pro 用にオーディオを扱うアプリを開発しているのでチェック。実はオーディオ周りはほぼ体系的な理解なしに、つぎはぎで作ってきた経緯あり、ちゃんと勉強しようと思っている。

オーディオの記録とその編集や視覚化を同時に行えるのは魅力的。これまでオーディオファイルをローカルに保存し、その後ファイルを読み込んで波形表示するよう実装していた。このため、録音→UI反映に時間差が発生してしまっていた。ここで紹介されたアップデートで解決できるのかも。


0:00 – Introduction

  • iOS 26 で追加された音声録音機能の強化について紹介
  • 入力デバイス選択、音声キャプチャ、再生の API 更新を説明

1:02 – Input route selection

  • iOS 26 で AVInputPickerInteraction が追加され、アプリ内から音声入力デバイスを選択可能に
  • システム設定を開かずに、アプリ内で直接デバイス切り替えができる

3:06 – Recording with AirPods

  • iOS 26 で AirPods の高品質録音モード(bluetoothHighQualityRecording)が追加
  • コンテンツクリエイター向けのメディアチューニングで、音声と背景音のバランスを最適化
  • AVAudioSessionAVCaptureSession の両方でサポート
  • AirPods のステムボタンで録音開始・停止も可能

5:11 – Spatial Audio capturing

  • Spatial Audio の仕組み
    • マイク配列から3Dシーンを録音
    • ambisonics と呼ぶ形式に変換
    • 1次 ambisonics(FOB: First Order Ambisonics)として保存
      • 4つの9面調和関数コンポーネント(omni-component, x/y/z方向の垂直双極子)
  • 空間オーディオ再生だけでなく、オーディオミックスエフェクト用のAPIにより前景背景のバランス調整が容易に
  • iOS 26 で AVAssetWriter を使った Spatial Audio 録音が可能に
  • 新しい QuickTime Audio(.qta)形式で音声のみの Spatial Audio ファイルを保存可能
    • 複数のオーディオトラックをサポート
    • 2 つの音声トラック(ステレオ + Spatial Audio)と再生用情報のメタデータトラックで構成
      • ステレオは空間非対応デバイスでの互換性担保のため
  • MovieFileOutput でない独自ファイルを AVAssetWriter で構築する方法
  • AVCaptureSessionMovieFileOutputAudioDataOutput の同時動作もサポート
    • AudioDataOutput はサンプルバッファへのアクセスを提供、エフェクトや波形描画が可能
    • 同時動作をサポートすることで、ファイル書き込みとサンプルへの処理や視覚化を同時に行える

11:04 – Audio Mix

  • iOS 26 と macOS 26 で Cinematic Framework に Audio Mix 効果の制御機能が追加
  • 前景音(音声)と背景音(環境音)のバランスを調整可能
  • ミックスモードは Cinematic, Studio, In-Frame の 3 つの基本モードと 6 つの追加モードを提供
  • AVPlayer では CNAssetSpatialAudioInfoAVAudioMix で実装
  • AVPlayer を使わず AUAudioMix で直接処理も可能(AU: Audio Unit)
    • e.g. 話し声と環境音の分離
    • AU を使用し多くの設定が自動で行われる
    • AUAudioMix の使い方、SpatialAudioMixMetadata
    • 録音停止時に自動生成されるメタデータでチューニングパラメータを適用

WWDC セッション動画の要約方法

細々とWWDC25のセッション動画要約を続けていたのが、いつの間にか30本になっていた。全体で120本近くあるようなので4分の1。興味があるものから順に手をつけているが、まったく興味がないものもあるので、すべてを要約するつもりはない。50本を目処で終わりにしようと思っている。

ところで、要約を始めたきっかけだが、キャッチアップの形跡を残し続けることで、学習意欲や発信のモチベーションにつながるのと、継続した結果が後から振り返って形としてわかりやすいと思ったからだ。

例年は2倍速再生で1日に何本も「消化」する方法をとっていたが、ただ量をこなすだけで、結局あとから思い返しても、何を見て/見ていないかすら曖昧になってしまっていた。

今年は、すでにこうして1ヶ月近く続けられるので、継続できて嬉しい限り。さらに、要約した内容はある程度は記憶に残せているので、無駄にはなっていなさそう。検索してさかのぼりやすいという副次的な効果も実感できている。他にも、勉強会での会話のネタを増やしてくれたり、Recap系イベントで発表する準備を省略できたのもよかった。


ところで、こうした要約をどのように行なっているかというと、当然すべてを手作業でやっているわけではなく、がっつり AI に頼っている(Cursor)。

ありがたいことに、Apple はすべてのセッションビデオに対して文字起こしを提供してくれているので、これをフル活用している。AI に丸投げするだけでは意味がなく、映像としての情報量も大事なので、以下のステップを踏み、自らもビデオを見るようにしている。

  1. セッションビデオのトランスクリプトを Cursor に与えて要約してもらう
    • 特別なプロンプトは与えていないが、セッションの概要(About)に示された関連する章(Chapters)を合わせて提供すると、これに沿って構造化してくれるので追いやすくなる。
      e.g.
      0:00 - Introduction
      1:02 - Input route selection
      3:06 - Recording with AirPods
      5:11 - Spatial Audio capturing
      11:04 - Audio Mix
  2. 要約を一読してから、セッションビデオを見る(1.5〜2倍速)
  3. 要約を自分なりに再整理したり、理解を追記する
    • 要約を Markdown 形式で出力してもらい、Markdown エディタ上で編集

真面目に見て理解するため、1本まとめるのになんだかんだ30分か、それ以上は掛かっているが、内容を先読みできる分、ゼロイチでまとめるよりもはるかに時間は短縮できている。

あと、トランスクリプトや要約のファイルが蓄積するので、過去見た内容について AI に質問することもできる。(このポストの最後)

WWDC25:Set the scene with SwiftUI in visionOS

シーン復元や物理空間との連携について。Clipping Margins でボリュームの領域外部にコンテンツを描画できるようになったのはありがたい。システム許容のマージン領域としてどんな値が取れるのか(たとえば床より下、天井より上、壁より向こうは許容されない?)が気になっている。

ユーザーの視点移動に応じたコンテンツの変化(onVolumeViewpointChange)も具体的にどのような情報の取れ方や、コンテンツへの活かし方が可能か実験してみたい。


0:00 – Introduction

  • visionOS 26 で追加された新しいシーン機能の概要を紹介
  • Window, Volume, Immersive Space の シーンタイプに追加されたAPI の解説

2:11 – Launching and locking

  • シーンのロックと復元(locking, restoration)API が追加され、物理空間の特定の部屋にウインドウやボリュームを固定できる(イマーシブ空間は復元されない)
    • ほとんどのユーザーが復元できることを望むため、シーン復元を優先するべき
    • 一時的、コンテンツ依存なUI、ワンタイムアクションなどには .restorationBehavior(.disabled) で復元を無効化可能
  • defaultLaunchBehavior でアプリ起動時に表示するウインドウを柔軟に制御できる
    • e.g. ウェルカム画面の表示
    • Info.plist Preferred Default Scene Session Role と起動ウィンドウの役割との一致が必要
      • e.g. Window Application Session Role 指定はボリュームが無視される
    • .defaultLaunchBehavior(.supressed)でアプリ再起動時の再表示を抑制
  • Unique Window で重複しないウインドウを作成可能
    • WindowGroupWindow

8:15 – Volumetric enhancements

  • surface snapping(物理環境へのスナップ)の対応
    • ウインドウは壁など垂直面に
    • ボリュームは机など水平面に
    • ウィジェットは垂直水平どちらも
    • surfaceSnappingInfo environment でスナップ状態を取得可能
      • isSnapped
      • ARKit によるスナップ表面の分類情報を取得可能
        • ユーザー許可が必要:Info.plist に設定
  • onVolumeViewpointChange modifier で、視点の切り替えに表示を追従
    • 例:視点を遮る壁を非表示にする
  • Presentations(popover, menu, sheet など)が Volume, RealityView, RealityKit でも利用可能に
    • presentationBreakthroughEffect で 3D コンテンツとの重なり方を制御
  • Clipping Margins API の追加
    • preferredWindowClippingMargins で、シーン境界外にビジュアル表現を拡張できる
    • 視覚のみでインタラクティブではない
    • windowClippingMargins environment で、システムによって許可されたマージンを取得

15:58 – Immersive space

  • Immersive Space で world recentering イベントや immersion style のカスタマイズが可能に
  • .onWorldRecenter でリセンタリングを検知(位置の再計算)
  • Progressive immersion style でのポータルのアスペクト比や範囲を調整可能に
    • .landscape, に加え .portrait
    • .portrait は iOS ゲームや多くの動きが含まれる体験に有効
  • Mixed immersion style で周囲環境に溶け込む
    • システム環境(e.g. 月)との共存も実現 .immersiveEnvironmentBehavior(.coexist)
  • Remote immersive space で macOS から Vision Pro へ Metal レンダリングを転送し、即時プレビューが可能
    • CompositorContentCompositorLayer に SwiftUI の環境変数やモディファイアを適用可能

22:16 – Scene bridging

  • UIKit アプリでもシーンブリッジングにより SwiftUI の Volume, Immersive Space を統合可能
    • Safari なども Spatial Browsing でこの仕組みを活用
  • UIHostingSceneDelegate を使い SwiftUI シーンを UIKit/macOS アプリに追加できる
  • configurationForConnectiong でホスティングデリゲートクラスを設定し外部イベントにも対応可能

登壇メモ:potatotips #92 iOS/Android開発Tips共有会

potatotips で登壇してきたので感想。

イベントページ:https://potatotips.connpass.com/event/358217/

前回は Recap イベントというのもあり個人で発表したのだが、今回は仕事で得た知見を発表したかったので会社で初登壇。HealthKit で睡眠ログを集計するのに試行錯誤があったのでその内容を共有した。

といっても、持ち時間5分ということですべてをつぶさに話すわけにもいかないので、挿絵をふんだんに使いかなりざっくりとしたアルゴリズムの解説になった。聞いている側からすると恐らく(伝わっていればだが)単純すぎて意外性がなかったかもしれない。が、実際はさまざまなデータパターンをもとに、ヘルスケアアプリの統計とすべてにおいて一致できるように何度も修正を重ねてたどり着いたものだった。

発表の反響に関して、如何せんニッチなテーマなので需要はないかも、と思いつつも挑んだのだが、懇親会で HealthKit から睡眠統計を取ろうとしている方とお話しでき、今回の発表内容が刺さったと言っていただけた。とても嬉しく思うと共に、ささやかであっても誰かの需要に応えられたことで安心もした。まずは発信してみるものだ。

また、会場提供の REALITY 様(GREE様)には、大変豪華な食事を提供いただいたり、社員の方から、Unity 開発に関することや、VR/AR での体験作りなど、興味深い話をたくさん聞かせていただき、とても充実した時間だった。


今回紹介した機能実装について。HealthKit との連携からデータの集計まで含めて、ベース部分は ChatGPT に作ってもらったので初速は早かったし、アルゴリズム実装も要件さえ決まれば正直あとは作るだけなので、そこも ChatGPT に土台を作ってもらったので、データとと都合させての調整に専念することができた。

HealthKit を使って何ができる/できないの技術検証も ChatGPT を使って10分レベルで終えられた部分もあり、AI様さまだった。

WWDC25:Better together: SwiftUI and RealityKit

SwiftUI と RealityKit の相互連携に関するアップデート。盛りだくさんすぎた。オブジェクト操作を細かくハンドリングできるのは良い。ポップオーバー表示など自前でやっていたことも実装が楽になりそう。update クロージャーについては、無限ループの危険性を含めてかなり尺を使って解説しており、使いこなすのは難しそう。

CESや「モデル」の意味違いなど、アップデート以外の基礎的なテーマも網羅していて、情報量の多さをフォローする優しさを感じた。


0:00 – Introduction

  • SwiftUI と RealityKit の連携強化について紹介
  • 3D モデルと UI を組み合わせた新しい体験を実現

1:24 – Model3D enhancements

  • visionOS 26 で強化された二つの機能
    • Model3D にアニメーション再生
      • Model3D は SwiftUI ビューとして SwiftUIレイアウトシステムに従う
      • Model3DAsset でアニメーションリソースを読み込み、AnimationPlaybackController で制御(再生・停止・シーク)が可能
        • AnimationPlaybackControllerObservable に(例:time の変更監視)
    • ConfigurationCatalog からの読み込み
      • ConfigurationCatalogModel3D を初期化し、複数の外観やボディタイプを切り替えられる(@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 で EntityObservable になり、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 のイベント捕捉でアニメーションを自前実装

This website stores cookies on your computer. These cookies are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to to opt-out of any future tracking, a cookie will be setup in your browser to remember this choice for one year.

Accept or Deny