2014】ブラウザで動くUnity。2014】ブラウザで動くUnity。Echterhoff氏Unityはマルチプラットフォームのゲームエンジンであり、とにかく多数のハードウェア環境で動作することが基本的な特徴のひとつだ。Facebookとのインテグレーションを経てインストール数は世界で3億5千万に迫り、多くの人がUnityのゲームにアクセスできる基板を作り出している。Player」は非標準のブラウザプラグインであるため初回のインストール作業が必要になることと、HTML5の普及に伴い、各ブラウザがプラグインアーキテクチャを廃止していく方向に向かっていることだ。5に組み込もうとしている。その基板となるのはHTML5の標準であるJavaScriptとWebGLだ。2014」にて、その仕組みの詳細と将来の展望が語られた。UnityのエンジンコードおよびゲームコードをHTML5の枠内で動作させる技術は、魔術的とも言えるほどの技術で成り立っていて興味深い。5にて早期アクセスが始められる予定のWebGL版Unityについて詳しく見ていこう。多重コード変換によるUnityエンジン&ゲームコードのWebGL対応Unity社内のHackWeekイベントで取り組みが始まったC/C++で書かれたエンジンと、C#/UnityScriptで書かれたゲームコードの双方を、JavaScript化するemscripten。C/C++をJavaScriptに変換asm.js。JavaScript上に静的な変数型や固定ヒープを持ち込み高速化IL2CPP。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というコード変換システムを開発。CILバイトコードを、同等のC++コードに変換するものだ。これを使ってC++に変換されたゲームコードは、上記のエンジンコードと同様にClang→emscriptenを経由して、asm.jsを用いる高速なJavaScriptコードに変換される。その変換の様子も紹介された。可読性の高いUnityのゲームコードがまず従来のコンパイラでCILバイトコードに変換され、それがIL2CPPでそっくりC++になり、次いでClangでLLVMビットコード化され、最後にemscriptenによって極限までコード表記が最適化された(そして可読性ゼロの)JavaScriptになる。して生成されたJavaScript版のUnityは、環境や処理内容にもよるが、ネイティブコードの50%程度のパフォーマンスを発揮するという。2」のWebGL版が披露されたが、Macbook上で一見ネイティブ版と変わらない様子で動いているように見えた。実行環境の性能が十分に高ければ、十分に実用になる状態にあると見ていいだろう。5のアドオンとして早期アクセス版が提供される。現状の機能は不完全だ。ビデオの再生、実行時のSubstanceテクスチャ生成、ソケットネットワーク機能、マイクやウェブカメラの制御機能は利用できない。複数の中間言語を通し、最終的にJavaScriptとして実行されることから、言語仕様の制限によりゲームコードのデバッグ機能や、マルチスレッドが利用できないなどUnity側の努力ではどうしようもない点もある。プラグイン版で動作するアプリケーションを作り、その後WebGL版を出力して動作環境を広げる用途には現状でも十分であるようだ。5のアップデートに応じてさらに推し進め、いずれUnity機能のすべてをサポートできるようになれば正式版の提供をする予定。近い将来、より多くのブラウザがWebGLを正式サポートするようになることで、動作環境も広がっていく見込みだ。WebGL版を発展させつつつも、当面はプラグイン版の提供もこれまで通りに継続するという。Playerは時代遅れになる」との認識を示した。いえ、いまだHTML5の標準を完全サポートできていないブラウザもチラホラあり、ネイティブプラグインの需要は高く、基板となるJavaScriptはマルチスレッド化の議論が開始されたばかりという状況なので、今後しばらくはUnityのWeb出力がWebGL版の1本に絞られることはないだろう。Player」も継続される。その一方で、HTML5+WebGLの組み合わせはPCだけでなくタブレットやスマートフォンにも広がりつつあり、ゲーム開発者にとってはゲームのアクセス性をさらに広げる手段として有効だ。5リリースの瞬間からUnity×WebGLの活用が始まることになりそうだ。当面はプラグイン版とWebGL版両方の提供が続く。ブラウザ側の進化と、プラグインアーキテクチャの廃止に伴い、WebGL版1本に移行していくのだろう。