
-
SceneKitプロジェクトのRealityKitへの移行
SceneKitのサポート終了と、Appleが推奨する高度な3DエンジンであるRealityKitに3Dプロジェクトを移行する方法について解説します。SceneKitのサポート終了によるプロジェクトへの影響を説明し、SceneKitとRealityKitの主な概念を比較したうえで、SceneKitのサンプルゲームをRealityKitにポーティングするデモを行います。また、サポート対象のすべてのプラットフォームにおいてRealityKitがもたらす、アプリやゲームで卓越した3D体験を構築するうえでの可能性についても検討します。
関連する章
- 0:00 - スタート
- 5:03 - 主な相違点
- 8:59 - アセットの変換
- 11:57 - シーンの合成
- 15:21 - アニメーション
- 16:58 - 照明
- 18:37 - オーディオ
- 21:19 - 視覚エフェクト
リソース
関連ビデオ
WWDC25
WWDC24
WWDC23
-
このビデオを検索
こんにちは このセッションへようこそ Appleのソフトウェアエンジニア Max Cobbです セッションの始めに 過去のことを少し振り返ってみましょう SceneKitデベロッパの方なら とても楽しくて刺激的なサンプルゲームを 何年も前にAppleが公開したことを ご存知かもしれません このプロジェクトでは Maxという レッサーパンダが火山のシーンを走り回り 友達を救うためにパズルを解きながら 敵と戦います このサンプルはSceneKitフレームワークを 使用して構築されており これにより デベロッパはネイティブ 3Dアプリを作成することができ サードパーティ製のゲームエンジン全体を 組み込む必要はありませんでした SceneKitは長年にわたり使用されてきました 正確にはOS X Mountain Lion 以降ですから13年前のことです それ以来 Appleデベロッパエコシステム には多くの変化がありました 新しいコーディングパラダイム 新しいハードウェア 新しいプラットフォーム 言い換えれば 大きな変化が アプリの構築方法やインタラクションの 方法にもたらされました SceneKitは当時 非常に理にかなった アーキテクチャで設計されていました しかし エコシステムが進化するにつれて SceneKitをアップデートし続ける ことが非常に困難になりました 既存の3Dアプリに破壊的変更を加えずに 対応することが課題となってきました そこで 今年 Appleは すべてのプラットフォームで SceneKitを正式に非推奨とします
既存のプロジェクトには どういう意味がありますか? アプリは引き続き機能しますか? アプリを書き直す必要がありますか? 代替ツールは何ですか? SceneKitデベロッパにとってこの非推奨の 決定が持つ意味を詳しく見ていきましょう まず 明確にしておきたいのは アプリを 書き直す必要はないということです これはソフトな非推奨であり SceneKitを使用している既存のアプリは 引き続き機能します ただし 新しいアプリや大幅なアップデートを 計画している場合 SceneKitは推奨されません
2つ目に SceneKitは 現在メンテナンスモードに入っています Appleは重大なバグのみを修正しており 今後新しい機能や最適化は 期待しないでください 現時点では SceneKitを ハードな非推奨にする予定はなく もしこれが変更される場合には Appleは デベロッパに十分な通知を行います
ただし Appleの最先端技術と 業界をリードする ハードウェアとソフトウェアの 組み合わせを利用する場合は 最適な選択肢はRealityKitです
RealityKitは 最新の 汎用高レベル3Dエンジンです 高性能でありながらで親しみやすく 業界標準へのアクセスを提供します これにより 美しくリアルな レンダリングを実現し 多くの高度な機能によって アプリを さらに魅力的にすることができます このテクノロジーは 多くの サードパーティ製アプリに加え Macのクイックルックなどの システム機能でも使用されています このアプリでは ボタンをタップするだけで 3Dモデルをプレビューできます iOS 26の新しいApp Storeタグは アプリを見つけやすくするための 大きな変更の1つです App Storeタグの3Dアイコンは RealityKitでレンダリングされます この例では App Storeが 優れた3Dグラフィックスのゲームとしてタグ 付けされたゲームのリストを表示しています また iOSの新機能である Swift ChartsはRealityKitを使用して データの視覚化に 3Dを提供しています
また RealityKitは visionOSで使用されるだけでなく このプラットフォームの バックボーンとなっています visionOSのすべての要素は RealityKitを活用しており アプリ内のボタンやとそれらを 保持するウインドウもその一例です RealityKitによって アプリのコンテンツが現実世界の環境で 本当にそこにあるように感じられます
RealityKitは SwiftUIにも 重要な役割を持たせているため SwiftUIデベロッパは スムーズに開発を進められます RealityKitは visionOS、iOS、 macOS、iPadOSでサポートされています そして今年 RealityKitは新たに tvOSプラットフォームにも対応し RealityKitで構築されたアプリやその他の コンテンツの新たな展開先となっています このフレームワークには 今年も高度で エキサイティングな新機能が満載です 詳しくは 「What's New in RealityKit」 セッションをご覧ください 同僚のLawrence Wongが 解説しています 本日のセッションでは RealityKitの仕組みを SceneKitと比較しながら解説し 相違点や新しい可能性 さらに SceneKitから 移行する際の作業方法を説明します 私のゲームも現代的に進化させて 新機能や新しいプラットフォームに 対応できるようにしたいと考えています そこで このセッションでは 私の経験を踏まえて このSceneKitゲームをRealityKitに 展開したときの主な手順を説明します このプロジェクトの完全なサンプルコードは ダウンロードして確認できます こちらがアジェンダです まず これら2つのレンダリングエンジンの 概念的な違いと それぞれのインタラクションの 方法について説明します 次に クールなアセットなしでは 3Dゲームは成り立ちません 既存のSceneKitアセットを RealityKitに適したフォーマットに 変換する方法を探ります RealityKitシーンを作成するために 使用できるツールを紹介し SceneKitとRealityKitを並べて 機能の比較を開始します まずはアニメーションです ダイナミックライトを追加してシーンに スタイリッシュな外観を与え イマーシブ感や個性 カスタムオーディオを追加します パーティクルポストプロセッシングなどの 視覚効果で仕上げます ゲームをSceneKitからRealityKitに 移行するために必要なすべてを紹介します では始めましょう コンセプトに関しては 4つの重要な分野に焦点を当てます アーキテクチャ、座標系 アセット、ビューです まず アーキテクチャに関して言うと SceneKitはノードベースです つまり シーン内のすべての オブジェクトはノードであり これらのノードには プロパティとして 事前定義された動作があります
各ノードには 機能のプロパティがあり ジオメトリ、アニメーション、オーディオ 物理演算、ライトの情報が設定されています
例えば 空のノードを作成すると ジオメトリも特別なプロパティもなく 親ノードの原点に配置されます
私のゲームでMaxをレンダリングしたいとき ノードのジオメトリプロパティに モデルを割り当てることができます
Maxがシーン内を歩き回るときは アプリは アニメーションプレーヤーを ノードに割り当てて再生します
聞こえてくる足音は オーディオプレーヤーで再生されており これも同じノードに割り当てられています
これがノードベースの アーキテクチャの仕組みです すべてはノードとそのプロパティを 中心に展開されます 対照的に RealityKitは デザインパターンを使用します これは エンティティコンポーネント システム 略してECSと呼ばれます つまり シーン内の各オブジェクトは エンティティであり その動作を変更するには エンティティに コンポーネントをアタッチします RealityKitでのすべての動作は コンポーネントです
その変換から物理演算やパーティクル ポータルなどの高度な動作まで含まれます コンポーネントのリストはRealityKitの 進化に伴って増え続けています 今年の新しいコンポーネントには画像表示や ジェスチャーコンポーネントが含まれます このようなアーキテクチャの違いを 意識しながら SceneKitアプリをRealityKitに 移行する必要があります 次は簡単なものです 新しいレンダリングエンジンに関しては 座標系を理解しないことには 何もできません
座標系は SceneKitとRealityKitの間で 簡単に変換できます 同じ座標系であるからです どちらの座標系でもx軸は右向きで y軸は上向き z軸はカメラの方に向いています
アセットに関しては SceneKitは 様々なモデル形式に柔軟に対応しており エンジンはそれらをSCNファイルに シリアル化します これは便利ですが 業界全体の 統一規格ではありません これらの形式の多くは独自規格であり 対応する機能が異なるため アセットパイプラインに 複雑さをもたらします
一方 RealityKitは オープンな業界標準である Universal Scene Description(USD)に 基づいて設計されています
この形式は 2012年に ピクサーが導入したもので アセット制作パイプラインにおける課題を 解決することを目的としており データ交換とコラボレーションの 問題にも対応しています これは Appleがすべてのプラットフォームで 採用している標準規格です 私のゲームもSCNファイルを USD形式に変換する必要があるので 後ほど これについて詳細を解説します その前に 核心的な違いの 最後の要素として強調したいのはビューです ビューはアプリの基本的な構成要素であり ユーザーインターフェイスの 一部を表します SceneKitとRealityKitの いずれの場合も ビューは 3Dコンテンツを レンダリングするためのビューポートです
SceneKitでは SCNViewでコンテンツを レンダリングできます SwiftUIを使用している場合は SceneViewも使用できます また ARSCNViewによって ARKitで バーチャルオブジェクトを 現実世界にレンダリングできます RealityKitでは コンテンツはシンプルに RealityViewによってレンダリングされます これはゼロから設計されたビューで SwiftUIの利便性を活かすように 工夫されています 完全にバーチャルなシーンを描画することや 現実世界にオブジェクトを配置することが この1つのビューで可能です 同じコンテンツが サポート対象のすべての Appleプラットフォームに展開され適応します visionOSではステレオスコピック(立体視) レンダリングが自動的に実行され コードの変更は必要ありません 以上が RealityKitに移行する際に 注意が必要な基本的な概念である アーキテクチャ、座標系 アセットのサポート、ビューです 次に すべての優れたゲームには いくつかの優れたアセットが必要です 私のゲームで現在使用しているものを 見てみましょう アートアセットカタログの中には 3Dモデルのコレクションがあります これらのモデルは SCNファイルフォーマットです これは SceneKitプロジェクトには 最適ですが RealityKitで使用するには すべてのアセットを USDに変換する必要があります いくつかの選択肢を紹介しましょう 元の形式のモデルがある場合は それが最良の選択肢です 使用しているデジタルコンテンツ作成ツール (DCC)が USDの優れたサポートを提供している 可能性があります 私はBlenderを使用しているので アセットを すぐにこの形式にエクスポートできます
ただし 元のファイルがない場合でも いくつかの方法で 既存のSCNアセットを 直接USDに変換できます おそらく最も簡単な方法の1つは Xcodeに組み込まれています これを行うには アセットを選択します ここでは enemy1を選びます 次に 、を選択し で を選択します これは zip圧縮された USDファイルタイプです
この方法でエクスポートした結果は アセットごとに異なる場合がありますが 私のゲームで使用しているほとんどの モデルは この方法で問題ありませんでした アニメーションが別のSCNファイルに 分かれていることもありますが これは SceneKitでの一般的なパターンです 例えば 私のSceneKitゲームでは メインキャラクターの歩く、ジャンプする 回転するなどのアニメーションは それぞれがジオメトリのない 個別のファイルに分かれています アニメーションをUSDにエクスポートして ジオメトリに適用し直す方法が必要です 幸い AppleはXcode 26に同梱されている SCNツールというCLIを更新して この変換プロセスをサポートしています その使い方をお見せします SCNツールを起動するには 「xcrun scntool」と入力します
これにより 使用可能なオプションの リストが表示されます 変換するには 「xcrun scntool --convert」と入力し max.scnファイルを指定しています また 出力タイプとして「--format usdz」 を指定します これだけで SCNファイルが USDに変換されます 先ほどXcodeで行った処理と同じです アニメーションを追加するには 「--append-animation」を エクスポートする SCNアニメーションファイルごとに使用 します ここではmax_spinを指定します
そして デスクトップに保存します
変換されたファイルを見てみましょう
すばらしい ジオメトリにUSD形式の アニメーション情報が含まれています すべてのアセットに対してこれを行い 私の好みのワークフローに最適な方法で それらを整理しました これで ゲームをつなぎ合わせる 準備ができました 次のトピックである シーンの構成に進みましょう SceneKitバージョンでは XcodeのSceneKitエディタを使用して すべての要素を組み合わせていました RealityKitにもこれを行うための ツールがあり Reality Composer Proと呼ばれています Reality Composer Proは Xcodeと BlenderやMayaなどのDCCの間に 位置するツールです このツールを使用して シーンの構成 エンティティへのコンポーネントの追加 シェーダの作成と変更を行い Xcode用のシーンを準備できます 新たに作成したすべての USDアセットを取り込んで 再びゲームの構築を開始しましょう Reality Composer ProはXcodeに 付属しています 開いてみましょう
PyroPandaという名前で プロジェクトを作成します
コンテンツが含まれていない デフォルトのシーンが表示されます 次に 新しく変換されたすべてのアセットを プロジェクトにドラッグできます
これらのアセットをシーンに追加するには 右クリックしてを 選択するか
Maxなどのアセットを プロジェクトブラウザからビューポートに 直接ドラッグします
取り込んでしまえば エンティティの 再配置は簡単です このギズモを使用して Maxをゲームの スタート地点に配置できます このあたりにしましょう Reality Composer Proは シーンを 視覚的に構成できる優れたツールで マテリアル、シェーダ、パーティクル ライトなどを編集できます 先ほども述べたように Reality Composer Proは デジタルコンテンツ作成ツールとXcodeの 間に位置するツールです そこで今度は コンテンツをアプリに 取り込む必要があります それが次の作業です Reality Composer Proプロジェクトは Swiftパッケージです Xcodeでローカルの 依存関係として追加するには プロジェクトの に移動して をクリックし
ターゲットとしてアプリを選択します
次に コンテンツビューのSwiftファイルで RealityKitと新しいパッケージの PyroPandaをこの一番上で インポートする必要があります
ContentView内に RealityViewを追加します
次に シーンをエンティティとして ロードする必要があります そのパッケージのバンドルから ロードすることを指定します
最後に 新しいエンティティを RealityViewコンテンツに追加します
また 結果を確認できるように カメラコントロールも追加します
事前に少し時間をとって Reality Composer Proで シーンを構築しておきました 完全に構成された結果がこちらです 残りのモデルを追加し テクスチャを割り当てています また 溶岩、植物、敵の1人に 動的シェーダを作成することで 火山環境に個性を追加しています 完全なサンプルコードを確認して このシーンの各部分がどのように 構築されているかを調べることができます Reality Composer Proでできることは 数多くあります 詳細については 過去のWWDCで発表された この2つのセッションの いずれかをご覧ください 徐々に形になってきました 今度は アニメーションを追加して Maxに命を吹き込みます 先ほどMaxを変換したときに アニメーションも追加しました USDファイルにアニメーションが 含まれている場合 RealityKitは それらを AnimationLibraryComponentで公開します これにより エンティティのアニメーションに 簡単にアクセスして再生できます "Max"という1つのUSDファイルから すべての異なるアニメーションを参照します
Reality Composer Proでは すべてのアニメーションへの参照は このインスペクターで確認できます
プロジェクト内の各アニメーションを ここで指定した名前でトリガーできます
このゲームのSceneKitバージョンでは これがスピンアニメーションの再生方法です まず シーン内のMax_rootNodeを見つけ spinAnimationを個別にロードしました 次に アニメーションシーンを確認し SCNアニメーションプレーヤーを見つけて その参照を保存しました 次に animationPlayerをMaxに追加し その際 参照"spin"を使用し ノードでアニメーションを再生しました RealityKitのアニメーションへのアクセスは AnimationLibraryComponentを介するため 非常に便利です まず Maxエンティティを名前で検索します この場合は単に「Max」です そこから AnimationLibraryComponentを Maxのコンポーネントセットから取得し 目的のアニメーションを名前で選択します 最後に エンティティで再生します Maxがシーンを移動すると 完成したアプリは 動きを表す 様々なアニメーションを再生します アプリのソースコードを確認すると これらが どのようにつながっているかがわかります どんなシーンにもリアリズムとムードの 要素を加えるのがライティングです うまく適用すると 結果はまるで別物になります アプリのライティングはReality Composer Proで完全に実現できます 追加のコードは不要です 表示を確認してみましょう ライトを追加するには エンティティ階層の一番下にある 挿入アイコンをタップし ディレクショナルライトを選択します
これは ディレクショナルライトのみを 含む空のエンティティです このライトタイプでは 方向のみがシーン内の他のエンティティの 照らし方を変更します
視覚的にわかりやすくするために ここに配置して x軸を中心に回転させます
ライトは良さそうですが 何かが足りません 影がありません コンポーネントリストで このチェック ボックスを選択することで ディレクショナルライトの シャドウコンポーネントも追加できます
スタート地点から 地形とMaxがシーン全体に どのように影を落としているかが 確認できるようになりました 同じことはコードでも ほぼ同じ手順で実現できます SceneKitでは SCNLightを作成し typeをdirectionalに設定して castShadowをtrueに設定します 次に 新しいノードを作成し ライトを ノードのlightプロパティに割り当てます
RealityKitでは 2つのコンポーネントを持つ エンティティを作成します ディレクショナル ライトコンポーネントとディレクショナル ライトシャドウコンポーネントです ディレクショナルライトは RealityKitで 使用できるライトオプションの1つです 他には ポイントライト、スポットライト イメージベースのライトなどがあり これらはテクスチャを使用して シーンを照らします ゲームが視覚的に少しダイナミックに なってきたので 次に 聴覚的な要素を追加して もう少しエンゲージメントを高めましょう 環境オーディオトラックを 見てみましょう これはシーンの中で常にループしています SceneKitプロジェクトでは 環境オーディオ ファイルをソースとして読み込みます そのオーディオソースのプロパティを 変更することで 再生方法を変更できます この場合 ループ再生させたいのですが シーン内で位置に依存したり 空間的な音にしたくありません つまり オーディオの再生音量を メインカメラとソースノードの 距離によって変えないようにしています 最後に オーディオプレーヤーを terrainノードに追加して 再生を開始します RealityKitでオーディオファイルに アクセスする方法はアニメーションと同様で コンポーネントを介して行います 今回のコンポーネントは AudioLibraryComponentと呼ばれます オーディオ再生は完全に Reality Composer Proで設定できるため アプリの実行時にすべてを 処理する必要はありません どのように設定するか確認してみましょう すでに AudioLibraryComponentを 環境オーディオファイルへの参照を使って terrainエンティティにアタッチしています 再生音が特定の音源から 聞こえるようにしたくないので 同じエンティティに環境オーディオ コンポーネントを追加できます
このオーディオリソースはかなり長いため RealityKitのデフォルトの動作では 実行時にトラック全体を メモリにプリロードします 代わりに 再生中にオーディオリソースを ストリーミングするよう変更できます
トラックが 終了したら 再び最初から 再生されるようにするために チェックボックスを選択します
すべての設定が完了し RealityKitで オーディオを再生する準備ができました これには2つの方法があります 1つ目はAudioLibraryComponentによる 方法です
まず AudioLibraryComponentを terrainのコンポーネントセットから取得し 環境オーディオ用のaudioResourceを 名前で参照して 同じterrainエンティティで 再生します RealityKitは Reality Composer Proで 追加した設定を認識するため オーディオを自動的にループ再生し 環境トラックとしてストリーミングします あるいは PlayAudioActionという 組み込みのエンティティアクションを 使う方法もあります
この方法では PlayAudioActionが ターゲットエンティティの AudioLibraryComponentを自動的に参照し 指定されたオーディオファイルを 見つけます
そのアクションをアニメーションに変換し 同じterrainエンティティで再生します
エンティティアクションは アプリ内の実際のコードを 最小限に抑えるのに非常に役立ちます
私はこのアクションと他のアクションを ゲーム内の様々なイベントに使用しています 例えば メインキャラクターが ジャンプや攻撃をしたときです
このセッションで説明する 最後のステップとして 私のゲームに含まれている 視覚効果を見てみましょう 視覚効果は 正確であるだけの3Dシーンを 本当に感動的な体験に変えます まずパーティクルから始めましょう オリジナルのゲーム用に作成した 本当に素晴らしいパーティクル エフェクトがいくつかあります これは XcodeのSceneKitエディタ内で 作成したものです これらのパーティクルはSCNパーティクル ファイルとして保存されています これらのファイルを RealityKit互換の形式に 直接変換するツールはありませんが Reality Composer Proによって 非常によく似た設定で パーティクルエフェクトを作成できます Reality Composer Proを開いて パーティクルの編集について 確認しましょう パーティクルを別々のUSDファイルとして 保持したいと考えているので Reality Composer Proで ここを クリックして新しいファイルを追加できます volcano_smokeと名付けます
Particle Emitterコンポーネントをこの ファイルのルートエンティティに追加できます
そこからコンポーネントの上にある 再生ボタンを押すと デフォルトのパーティクルの 表示が開始されます
私のお気に入りの1つであるImpactを含め 選択できるプリセットがいくつかあります
このパーティクルプリセットには 煙に適したテクスチャが使用されていて この効果の出発点として最適です SceneKitを利用したことがあれば これらの 設定には見覚えがあるかもしれませんが いくつか細かい違いがあります
Reality Composer Proの設定を 元のゲームで使用していた SceneKitのパーティクルの 設定と比較して SceneKitバージョンに近い RealityKitのVolcano Smoke効果が 完成しました
効果が完成したので それをメインシーンにドラッグし 他のモデルと共に表示されたときに どのように見えるか確認しましょう
すばらしい これはまさに 私が目指していたものです 最後のステップは後処理です これは アプリに表示される前の レンダリング出力に対して 仕上げの調整を追加できる最終的な工程です
元のゲームでは カメラの ブルーム効果が強く 明るい光をシーンの残りの部分に にじませることで 柔らかく輝く光彩を追加することで ゲームの異世界感を高めていました
これは シーンのアクティブカメラで プロパティを変更することで実現しています この機能は多くの利便性をもたらしますが デベロッパ 特にゲームデベロッパは 多くの場合 このような効果に対して 非常に細かい制御を好みます パフォーマンスや芸術面での こだわりがあるからです
一方 RealityKitではどうでしょうか
この効果を生み出す シンプルなプロパティは 意図的にRealityKitでは 提供されていませんが 今年から 代わりに RealityViewsに後処理効果を追加できる ようになりました 対象は iOS、iPadOS macOS、tvOSです
これにはいくつかの設定が必要ですが すべてのMetalシェーダをゼロから 記述することが必要というわけでは ありません Appleには高度に最適化された Metalパフォーマンスシェーダがいくつかあり すぐに使い始めることができます 後処理APIを使用して ブルームエフェクトを作成し ゲームに追加します 私のゲームの元の テクスチャから始めて ハイライトを抽出して それらを別のテクスチャに書き込みます ぼかしてエッジを柔らかくし 最後に ぼかしたテクスチャを 元のテクスチャの上に合成して ブルーム効果を作成します
アプリでこれを行うには まず BloomPostProcess型を定義し これはPostProcessEffectに 準拠している必要があります
postProcessメソッド内で 一時的なMetalテクスチャを作成し ブルーム効果に必要なデータの一部を 書き込みます 次に パフォーマンスシェーダを使用して 画像の最も明るい部分だけを 抽出します それがブルーム効果の 必要な場所です ガウスぼかしを使用してその領域をぼかします 最後に ぼかした画像を 元のテクスチャの上に配置します これらの手順の完全なコードは ダウンロードで入手できます
この効果をRealityViewに適用するには 新しいBloomPostProcessクラスの インスタンスを作成し それをレンダリング効果に適用します
これによって ゲームは とても魅力的に仕上がりました 環境全体がより活気に満ちて プレイしていて本当に 驚くような体験になりました RealityKitによってアプリ全体が 本当によくまとまりました iOS、iPadOS、macOS、tvOSの いずれでもまったく同じように動作します 1つのコアコードベースと 1つのRealityKitシーンで これらすべてのプラットフォームで アプリをすぐに起動できるようになりました プレイしてみましょう 環境は RealityKitの最新プラットフォーム であるtvOSで コントローラ対応です
これで 自宅のApple TVで RealityKitゲームをプレイできます
visionOSでは さらに特別な機能を 利用できます シーンを段階的イマーシブビュー内に 配置することで PyroPandaの世界への ポータルを追加し 目の前に完全な3Dを レンダリングできます
このような体験は RealityKitと visionOSでのみ実現できます
それでは 今日の内容を 振り返ってみましょう SceneKitは非推奨になりました 重要なことですが 既存のSceneKitアプリについて すぐに心配する必要があるという 意味ではありません これからの最適な選択肢は RealityKitであり 新たな可能性を アプリやゲームにもたらします 概念や利用可能なツールの 主な違いについて RealityKitデベロッパ向けに解説し SceneKitからRealityKitへ ゲームを移行する際に 私が取った手順についても紹介しました
これらのセッションをぜひ確認して RealityKitを使って すばらしいアプリや ゲームを作る際の参考にしてください あわせて 過去のセッションや RealityKitのドキュメントもご参照ください このサンプルアプリのダウンロードには 今日のセッションで説明できなかった内容の 詳細も含まれています 例えば カメラの動き、キャラクターの 移動制御、ゲームコントローラなどです テクノロジーは常に進化しています Appleは SceneKitの非推奨を デベロッパの皆さんにとって 円滑になるように進めていきます 私たちは RealityKitの未来に 期待しており SceneKitデベロッパの皆さんの 今後のご活躍を楽しみにしています ありがとうございました 他のセッションもお楽しみください
-
-
16:33 - Animations in RealityKit
// RealityKit guard let max = scene.findEntity(named: "Max") else { return } guard let library = max.components[AnimationLibraryComponent.self], let spinAnimation = library.animations["spin"] else { return } max.playAnimation(spinAnimation)
-
18:18 - Directional Light Component in RealityKit
// RealityKit let lightEntity = Entity(components: DirectionalLightComponent(), DirectionalLightComponent.Shadow() )
-
24:37 - Create Bloom effect using RealityKit Post processing API
final class BloomPostProcess: PostProcessEffect { let bloomThreshold: Float = 0.5 let bloomBlurRadius: Float = 15.0 func postProcess(context: borrowing PostProcessEffectContext<any MTLCommandBuffer>) { // Create metal texture of the same format as 'context.sourceColorTexture'. var bloomTexture = ... // Write brightest parts of 'context.sourceColorTexture' to 'bloomTexture' // using 'MPSImageThresholdToZero'. // Blur 'bloomTexture' in-place using 'MPSImageGaussianBlur'. // Combine original 'context.sourceColorTexture' and 'bloomTexture' // using 'MPSImageAdd', and write to 'context.targetColorTexture'. } } // RealityKit content.renderingEffects.customPostProcessing = .effect( BloomPostProcess() )
-