ニュース

【Unite Japan 2014】ブラウザで動くUnity。魔術的WebGL対応の技術が明らかに!

「Unity Web Player」はいずれ消滅?HTML5で完璧なブラウザインテグレーションを目指す

4月7日~4月8日開催

会場:ホテル日航東京

“UnityとWebデプロイメントの未来”を講演したUnity TechnologiesのJonas Echterhoff氏

 Unityはマルチプラットフォームのゲームエンジンであり、とにかく多数のハードウェア環境で動作することが基本的な特徴のひとつだ。中でも最大の動作環境となっているのがWindows/Mac用のブラウザプラグイン、「Unity Web Player」だ。Facebookとのインテグレーションを経てインストール数は世界で3億5千万に迫り、多くの人がUnityのゲームにアクセスできる基板を作り出している。

 しかし弱点もある。「Unity Web Player」は非標準のブラウザプラグインであるため初回のインストール作業が必要になることと、HTML5の普及に伴い、各ブラウザがプラグインアーキテクチャを廃止していく方向に向かっていることだ。そこでUnityでは将来のブラウザで「Unity Web Player」のような仕組みが使えなくなる可能性を見越し、新たな方法でUnityをブラウザ上で動作させる技術をMozillaと共同で開発、Unity 5に組み込もうとしている。その基板となるのはHTML5の標準であるJavaScriptとWebGLだ。

 4月7日から8日にかけて開催されたUnityゲーム開発者のためのカンファレンス「Unite Japan 2014」にて、その仕組みの詳細と将来の展望が語られた。特にUnityのエンジンコードおよびゲームコードをHTML5の枠内で動作させる技術は、魔術的とも言えるほどの技術で成り立っていて興味深い。Unity 5にて早期アクセスが始められる予定のWebGL版Unityについて詳しく見ていこう。

【Mozilla and Unity Bring Unity Game Engine to WebGL】

魔法か! 多重コード変換によるUnityエンジン&ゲームコードのWebGL対応

Unity社内のHackWeekイベントで取り組みが始まった
C/C++で書かれたエンジンと、C#/UnityScriptで書かれたゲームコードの双方を、JavaScript化する
emscripten。C/C++をJavaScriptに変換
asm.js。JavaScript上に静的な変数型や固定ヒープを持ち込み高速化
IL2CPP。C#/UnityScriptをC++化するUnity謹製ツール

 UnityのWebGL対応について紹介されたセッション、“UnityとWebデプロイメントの未来”を講演したのは、Unity Technologiesのプログラマー、Jonas Echterhoff氏だ。

 UnityのWebGL版の切っ掛けは2年前。Unity社内で開催された、とあるHackWeek(新技術へのチャレンジを楽しむ週末イベント)にMozillaのエンジニアチームが参加し、まだホヤホヤの技術だったWebGLのポテンシャルを一緒になって調べ始めた。初めからうまくいったわけではないものの、数度のHackWeekを通じて研究を続けていくうちに可能性に気づき、UnityをWebGLで動かすための本格的開発が始まったのだという。

 UnityをWebGLで動かすということは、つまりエンジンコードとゲームコードはHTML5標準のJavaScriptで動作させなければならない。しかしエンジンを人の手でJavaScriptに書き直すのは、可能であったとしてもその後のバージョン同期を難しくさせてしまう。それに、ゲームコードはUnity利用者がそれぞれにC#やUnityScriptで書くプログラムだ。どちらも自動的に変換できるようにする必要があった。

 そこで、複数のオープンソースのコード変換技術を採用。エンジンコードの変換には、まずC/C++の中間コード(LLVMビットコード)をClangで出力。そこからemscripten(LLVM→JavaScript変換ソフトェア)を使い、ローレベルで高速なJavaScriptサブセットであるasm.js向けにエンジンコードを出力する。これにより、エンジン部分をJavaScript化し、十分なパフォーマンスで動作させることが可能になった。

 Unity上で動作するC#/UnityScriptのゲームコードについてはもっと複雑だ。WebGL版開発に向けた2年間で、UnityのスクリプトエンジンチームはIL2CPPというコード変換システムを開発。これはC#/UnityScriptのコンパイル後の中間言語である.NET CILバイトコードを、同等のC++コードに変換するものだ。これを使ってC++に変換されたゲームコードは、上記のエンジンコードと同様にClang→emscriptenを経由して、asm.jsを用いる高速なJavaScriptコードに変換される。

 その変換の様子も紹介された。可読性の高いUnityのゲームコードがまず従来のコンパイラでCILバイトコードに変換され、それがIL2CPPでそっくりC++になり、次いでClangでLLVMビットコード化され、最後にemscriptenによって極限までコード表記が最適化された(そして可読性ゼロの)JavaScriptになる。まさにコード変換の魔術だ。

 こうして生成されたJavaScript版のUnityは、環境や処理内容にもよるが、ネイティブコードの50%程度のパフォーマンスを発揮するという。会場ではモバイル/PCで展開しているFPS「DeadTrigger 2」のWebGL版が披露されたが、Macbook上で一見ネイティブ版と変わらない様子で動いているように見えた。実行環境の性能が十分に高ければ、十分に実用になる状態にあると見ていいだろう。

元のC#ゲームコード
CILバイトコードにコンパイル
C++に変換
LLVMビットコード化
asm.js向けにJavaScript化
最適化でコードサイズ縮小

Unity 5にて提供開始。制限はあるもののブラウザの進化とともに完全な形へ

「Dead Trigger 2」のような高品質FPSも移植できている
Unity 5で提供されるWebGL版出力のイメージ
現時点ではできないことも多い
Unity 5.xのライフサイクル中に完全なものに近づく見込み

 こうして実現されたUnityのWebGL向け出力機能は、次期バージョンUnity 5のアドオンとして早期アクセス版が提供される。ただし現状の機能は不完全だ。例えばビデオの再生、実行時のSubstanceテクスチャ生成、ソケットネットワーク機能、マイクやウェブカメラの制御機能は利用できない。

 また複数の中間言語を通し、最終的にJavaScriptとして実行されることから、言語仕様の制限によりゲームコードのデバッグ機能や、マルチスレッドが利用できないなどUnity側の努力ではどうしようもない点もある。が、プラグイン版で動作するアプリケーションを作り、その後WebGL版を出力して動作環境を広げる用途には現状でも十分であるようだ。

 Echterhoff氏によれば、WebGL版の開発はUnity 5のアップデートに応じてさらに推し進め、いずれUnity機能のすべてをサポートできるようになれば正式版の提供をする予定。また近い将来、より多くのブラウザがWebGLを正式サポートするようになることで、動作環境も広がっていく見込みだ。

 もちろん、WebGL版を発展させつつつも、当面はプラグイン版の提供もこれまで通りに継続するという。ただし長い目で見れば、いずれ各ブラウザはネイティブプラグインのサポートを終了させる方向であるため、Echterhoff氏は「いずれUnity Web Playerは時代遅れになる」との認識を示した。

 とはいえ、いまだHTML5の標準を完全サポートできていないブラウザもチラホラあり、ネイティブプラグインの需要は高く、基板となるJavaScriptはマルチスレッド化の議論が開始されたばかりという状況なので、今後しばらくはUnityのWeb出力がWebGL版の1本に絞られることはないだろう。少なくともUnity 5.xのライフサイクル中は「Unity Web Player」も継続される。

 その一方で、HTML5+WebGLの組み合わせはPCだけでなくタブレットやスマートフォンにも広がりつつあり、ゲーム開発者にとってはゲームのアクセス性をさらに広げる手段として有効だ。カジュアル系のゲームや小規模アプリケーションのようにマシンパワーをフルに引き出すまでもないコンテンツであれば、Unity 5リリースの瞬間からUnity×WebGLの活用が始まることになりそうだ。

当面はプラグイン版とWebGL版両方の提供が続く。ブラウザ側の進化と、プラグインアーキテクチャの廃止に伴い、WebGL版1本に移行していくのだろう。すぐではなく、数年先の話にはなりそうだ

(佐藤カフジ)