Unity の開発ツールとエンジンは、今日、VR および AR 用のアプリケーションを構築するための最も一般的な方法です。 以前、私たちは、Unity から Web ベースのエクスペリエンスをエクスポートできるようにしました。
HoloLens 2 用の Firefox Reality AR など、多くのプラットフォームや埋め込みシナリオにブラウザ エンジンを移植する作業を基に、Rust 言語で書かれた最新の Web エンジンである Servo をベースにした新しい Unity コンポーネントを構築しています。
Unity エンジンは、非常に適応性の高いマルチプラットフォーム プラグイン システムを備えており、オープンソースとプロプライエタリの両方のサードパーティ製プラグインの健全なエコシステムを有しています。 プラグインシステムにより、OS ネイティブのモジュールを実行し、それらをユニティのスクリプト環境で実行するコンポーネントに直接接続することができます。
実験の目標は、サードパーティが Servo ブラウザ ウィンドウを Unity シーンに組み込むことを可能にする Unity ネイティブ プラグインと Unity C# スクリプト コンポーネントのセットを構築し、オプションで、Unity で構築した VR および AR アプリでブラウザ サーフェイスを使用するためのサポートを提供することでした。 このプロトタイプを試して、フィードバックを提供し、このプロトタイプを使って私たちと一緒に何かを作り上げることを期待しています。 本日リリースしたバージョンは macOS プラットフォームを対象としていますが、Servo がサポートする他のプラットフォームのいくつかをすぐに追加する予定です。
始めるにあたって
プラグインは https://github.com/MozillaReality/servo-unity でオープンソース化されています。 星をクリックしてコードをフォークし、ローカルマシンでチェックアウトして、そのプロジェクトを Unity で開いてください。
開発者のための説明は、リポジトリの README
ファイルにあります。 トップレベルのコンフィグはServoUnityController
オブジェクトにあります。 その他、ServoUnityWindow
、ServoUnityNavbarController
、ServoUnityMousePointer
などのオブジェクトも重要です。
ServoUnityWindow
はUnityのシーン内のどこにでも配置することが可能です。 ここでは、Mozilla のキノコの洞窟 (素晴らしいアーティスト Jasmin Habezai-Fekri による Firefox Reality のユーザーにはおなじみ) に落とし、シーンの周りを移動して、それがブラウザ コンテンツの 3D ビューであることを確認できるカメラ マニピュレーターを提供しました。 ここでは、デプロイされた Unity プレーヤー ビルド内で実行されているサンプル MPEG4 ビデオを表示しています。
カスタマイズ可能な検索は、プラグインに含まれています。 現在のバージョンの Servo では、さまざまな Web コンテンツが表示可能で、Web の互換性を高めるための作業も活発に行われています (詳細は後述します)。
How it works
Architecture
Unity での開発では、コンポーネント ベースのアーキテクチャを使用しており、シーンに整理された GameObject
に接続されたユーザー コードが実行されます。 ユーザーは、Mono ランタイムまたは IL2CPP ahead-of-time コンパイラーを使用して C# 環境で実行されるスクリプトを添付することにより、GameObject
をカスタマイズします。 Unity のイベント ライフサイクルは、Unity C# クラス MonoBehaviour
を継承するユーザー スクリプトからアクセスできます。 ユーザースクリプトは、C#ランタイムのP/Invokeメカニズムを介してプラグイン(これは単なるOSネイティブの動的共有オブジェクトです)内のネイティブコードを呼び出すことができます。 実際、Unity のコア自体は C++ で実装されており、プラグインのネイティブ コードに、いくつかの低レベルのプラグイン タスクを支援するための C/C++ でアクセス可能な 2 つ目のインターフェイスを提供しています。 設計上、ユーザーフレンドリーでない機能のほとんどは、Rust ライブラリ libservo
にコンパイルされています。 このプロジェクトの最初のフェーズでは、libsimpleservo2.
という別の Rust ライブラリにある簡略化された C 互換のインターフェイスを使用します。このライブラリは、ブラウザを制御しその出力を表示するための C 呼び出し可能関数とコールバック フックを公開します。 libsimpleservo2
では、スレッドとレンダリングに関する Unity モデルをカプセル化するネイティブ C++ 抽象化を配置し、Unity から呼び出し可能な一連のインターフェイスを公開して、C# スクリプト コンポーネントによって操作されるようにしました。 Unity の OpenGL レンダラを使用する場合、Texture2D
クラスはネイティブの OpenGL テクスチャによってバックアップされます。OpenGL テクスチャの「名前」(つまり ID)をプラグインに渡すと、Servo から合成された最終テクスチャを受け取るフレームバッファオブジェクトに、このテクスチャをバインドします。
私たちはテクスチャと Unity コンテキストのバインドを制御できないので、このテクスチャを更新するための現在のデザインは、Servo の surfman-chains
API を介してブリット(コピー)を使用しています。 基本的に、Servo の WebRender は 1 つのスレッドで OS 固有の表面バッファに書き込み、この表面バッファは Unity のレンダースレッドに読み取り専用でバインドされ、OpenGL API を使用してテクスチャのコピーが作成されるようになっています。 たとえば、初期の macOS の実装では、表面バッファはスレッド間でゼロコストで移動できる IOSurface
であり、ブラウザ コンポジターが Unity でテクスチャを表示するスレッドとは別のスレッドで書き込むことができる効率的な実装が可能です。
コントロールとページのメタデータは、URL への検索とナビゲーション、ページ タイトルの更新、通常の戻る/進む/停止/ホーム ボタン セットができる一連の API を通じて別々に通信されます。
ブラウザのコンテンツとコントロールはすべて最終的には Unity オブジェクトなので、構築中の Unity アプリケーションでは、これらを好きなように配置、スタイル設定、またはプログラム制御できます。 Unity のスクリプト環境は、レンダリング操作を除いて、大部分がシングルスレッドで実行され、レンダリング操作は別のスレッドで別の周期で行われます。 しかし、Servo では、さまざまなタスクのために何十もの軽量なスレッドが生成される可能性があります。 Servo から戻ってくる作業項目は、Unity の適切なスレッドにマーシャルされるように配慮しました。 Unity のテクスチャを更新するタイミングを決定するための最適化が残っています。 現在は、フレームごとに更新されていますが、より細かい制御ができるように、エンベッディング インターフェイスに API を追加しています。
ブラウザ技術のインキュベーターとして、Servo は新しい技術の開発に注力しています。 Servo から Firefox を動かす Gecko エンジンへ移行した注目すべき技術には、GPU ベースのレンダリング エンジン WebRender や、CSS エンジン Stylo があります。 これらの成功はさておき、完全なウェブ互換性は、Servo がまだ大きな隔たりがある分野です。私たちは主に、ウェブのロングテールにわたるユーザーと特定の体験のための大きな改良に焦点を合わせてきたからです。 Servo コミュニティによる最近の取り組みでは、Servo の Web 互換性が大きく向上したため、Servo でブラウズ可能な Web のサブセットが急速に成長し続けることが期待されます。 多くの人が私たちの Firefox Reality AR for HoloLens 2 アプリを見ており、UWP サポートにより、同じ基礎となるブラウザ エンジンを使用して、HoloLens プラットフォーム用の独自の AR アプリに Servo を組み入れることができます。 リストの上位にあるのは、マルチウィンドウのサポートです。 私たちは現在、アプリケーションが複数のウィンドウ、タブをインスタンス化し、履歴、ブックマークなどの機能を実装できるように、プラグインを libsimpleservo2
インターフェースから新しいインターフェースに卒業することに取り組んでいます。 Servo は WebXR API を通じて没入型 Web もサポートしており、プラグインインターフェイスを通じて WebXR を Unity の XR ハードウェアサポートに接続することを検討しています。 Firefox Reality のユーザーベースから、このブラウザの主要なユースケースであることが分かっているので、まずは 360° 動画の閲覧のサポートから始める予定です。
最後に…
メディア プレーヤー、オープン Web へのゲーム内インターフェイス、ブラウザとしての UI、特定の Web 体験の導入、またはその他の無数の可能性など、開発者が Unity で構築したアプリケーション内で Servo のパワーとパフォーマンスを活用する想像力に富んだ方法を見ていくのが楽しみでなりません。