Unity WebGLのProfilerや実行周りについて
UnityのWebGLではProfilingするときには Development BuildやAutoconnect Profilerにチェックを入れてBuild&Runするというのが基本になります。
何故、こうしないといけないのか?何が起こっているのかを少し紐解いていきたいと思います。
WebServerの立ち上げについて
Build & Runを押したときにはローカルマシン内でWebサーバーが立ち上がって、ブラウザで実行しています。
Webサーバーの立ち上げですが…。
「Unity\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\SimpleWebServer.exe」と言うプロセスを立ち上げて、Webサーバーを簡易的にローカルに立てています
ちなみに、ここで立ち上げたWebServerはProfiler接続とは関係ありません。
単にPlayerを実行するためのWebサーバーです。
そのため、後述する 「websockify.js」さえうまく動いていれば、ローカルマシン上にあるnginxやAppacheでも特に問題なく動作します。
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
※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の裏側を見ていきました。
この記事が気に入ったらサポートをしてみませんか?