見出し画像

Unity WebGLのProfilerや実行周りについて

UnityのWebGLではProfilingするときには Development BuildやAutoconnect Profilerにチェックを入れてBuild&Runするというのが基本になります。

Autoconnect Profilerを有効にしてBuild & Run

何故、こうしないといけないのか?何が起こっているのかを少し紐解いていきたいと思います。

WebServerの立ち上げについて

Build & Runを押したときにはローカルマシン内でWebサーバーが立ち上がって、ブラウザで実行しています。

Webサーバーの立ち上げですが…。
「Unity\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\SimpleWebServer.exe」と言うプロセスを立ち上げて、Webサーバーを簡易的にローカルに立てています

TaskManager内にもSimpleWebServerが立ち上がっているのを確認できます

ちなみに、ここで立ち上げたWebServerはProfiler接続とは関係ありません。
単にPlayerを実行するためのWebサーバーです。
そのため、後述する 「websockify.js」さえうまく動いていれば、ローカルマシン上にあるnginxAppacheでも特に問題なく動作します。

Profiler接続について

接続方式がプラットフォーム・ビルド方法によって異なります。

Unityではプラットフォームやビルド方法によって、RuntimeプレイヤーとEditor間での接続方法が異なります。

Profiler接続の仕方として大きく下記の二つに分類されます。
・Editor ⇒ Runtimeプレイヤーという形でEditorがクライアントとなって接続する方法
・Runtimeプレイヤー⇒Editorと言う形で Runtimeプレイヤーがクライアントとなって接続する方法

この接続方法は 、BuildPipeline.GetPlayerConnectionInitiateMode というAPIを利用する事で、どちらのパターン化を確認する事が可能です。

多くの場合 Editor⇒Runtimeプレイヤーという接続の形なのですが…。
WebGLでは Runtimeプレイヤー側がサーバーになることが出来ないため、Runtimeプレイヤー⇒Editorのみの接続となります。

そのため、Autoconnect ProfilerにしてPlayerから能動的に接続をさせる必要があります。

WebGLではTCP/IPソケットを直接叩けないので、websockifyを経由します

Unity Editorは TCP/IPポートを開けて Profiler接続を待っていますが、WebGLでは、その制約によって TCP/IPを直接叩く事が出来ません。
そのためWebGLのRuntimeプレイヤーでは、WebSocketでEditor側につなごうとします。

EditorはTCP/IP、WebGLのRuntimeプレイヤーはWebSocketという形でちぐはぐになってしまっています。
そこで登場するのがwebsockifyです。websockifyはWebSocketの通信をTCP/IPに置き換えてくれます。

Build & Runをすると下記のようなコマンドが叩かれます。

"[UnityDirectory]/Editor/Data/PlaybackEngines/WebGLSupport\BuildTools\Emscripten\node\node.exe" "[UnityDirectory]/Editor/Data/PlaybackEngines/WebGLSupport\BuildTools/websockify/websockify.js" 54998 localhost:34999
また、タスク上にwebsockify.jsがいることを確認できます

※1.WebSocketは54998固定です
※2.TCP/IPはUnityEditorInternal.ProfilerDriver.directConnectionPort のポートとなります

このwebsockify.jsによってWebGLから来たWebSocket通信を TCP/IPの通信に置き換えられる事となります。
これがWebGLプレイヤーから EditorにProfiler接続のため必要な手続きで、Build&Runするとコレが自動的に立ち上げられるのです。

毎回Build &Runしてそれぞれ立ち上げるの面倒…

と言う事で、Build &Runの裏側がわかりましたが…
毎回接続しに行くのは面倒ですよね…。

実はSimpleWebServer立ち上げも、websockifyの立ち上げも実はInternalなクラスで行っています。
Reflection経由で直接叩く事が出来ますので、ここにコードを置いておきます。

うっかりAutoconnect Profilerのチェックを外してビルドしてしまった…

うっかり Autoconnect Profilerのチェックがない状態でビルドしてしまった等の場合、「 [Build名].framework.js 」を一部書き換えることで実はAutoconnect Profilerと同じことが出来ます。

コード内にある下記を探してきます。

var arguments_ = [];

それを下記のように書き換える事で無理やりProfilerへの接続が可能になってきます。

var arguments_ = ["-profiler-enable","1","-player-connection-ip","127.0.0.1"];

※ここでは Playerの引数を設定している箇所で、無理やりセットしています。

このような感じで Unity WebGLのBuild &Runの裏側を見ていきました。

この記事が気に入ったらサポートをしてみませんか?