ワールドのログ
動いているワールドを Unity の Console から眺めること。そして落ちた behaviour の姿。
ワールドが Editor を離れた瞬間、Unity の Console は何も見えなくなります。ログが読みやすい最後の場所が Play モードですが、ワールドが壊れるのは Play モードではありません。8 人入っていて、他人の回線で、1 時間前にアップロードしたビルドで壊れます。
Udonite → Open Window → Settings → Logging は、あなたがワールドにいるあいだクライアントのログを読み、あなたの行を Console に戻します。
三つの設定、実際にはひとつ
| 選択 | 転送するもの |
|---|---|
| オフ | 何も |
| Udonite のログ | Log で書かれた行だけ |
| すべてのログ | クライアントが書くものも全部。これがかなりの量です |
初期状態は Udonite のログ です。リスナーは読むだけで書き込みませんし、ワールドが動いてログを出していなければ何も転送しません。
すべてのログ は一度の読み取りにつき 200 行で打ち切り、落とした行数を伝えます。賑わっているワールドは一度に数千行を返してきますし、Console はそれを拒む前に這うような速度になります。
VRChat 側の設定でフルのログ出力を有効にしていないと何も届きません。Console が空のままである原因としては、これがいちばん多いものです。
転送された行は、あなたが書いた行そのもの
[combat] [Scoreboard.Award:14] hit for 3
Play モードで見えるのがこれで、実際のワールドで見えるのもこれです。途中で何も足しません。時刻も、深刻度の語も、色も、絞り込みもありません。
これは手抜きではなく意図です。走った場所によって二通りに読める行は、自分自身と比べられません。そして比べることこそが転送する理由です。時刻も失われてはいません。クライアントは自分のファイルで全行に時刻を打っていますし、Console も自分の時刻を打ちます。
クライアントが複数あるとき
マルチプレイヤーの検証は、1 台のマシンで、ひとつのアカウントで、2 つのクライアントを動かすことになります。表示名はどちらも同じで、どのウィンドウから出た行なのかをワールドは教えてくれません。
クライアント側が黙って解決してくれています。1 つのクライアントにつき 1 つのログファイルが書かれます。ですから 2 つ目の声が届いた時点で、Console は番号を振りはじめます。
[client 1] [Scoreboard.Award:14] hit for 3
[client 2] [Scoreboard.Award:14] hit for 5
話しているクライアントが 1 つだけのあいだは、番号は付きません。 いつも client 1 としか読めない接頭辞は誰にも何も伝えず、その幅をすべての行から奪います。
番号は起動の順ではなく、先にログを出した順です。起動しただけで参加画面に放置されているクライアントは、見ている人にとっての client 1 ではありません。
すでに Console にある行は、2 つ目のクライアントが現れても付け直されません。付け直すことはできませんし、どちらのものだったかを後から推測するのは、そのままにしておくより悪い結果になります。
behaviour が落ちたとき
これは Udon のワールドで起きる最悪の出来事であり、いちばん静かな出来事です。VM が例外を投げ、クライアントがそれを受け止め、一行書いて、その behaviour をセッションの残りのあいだ無効にします。それ以外は何も起きません。扉がただ動かなくなり、世界はその周りで回り続けます。
Console はこれを報告します。
An Udon behaviour faulted and is disabled for the rest of the session.
System.NullReferenceException: Object reference not set to an instance of an object (program counter 812)
プログラムカウンタはコンパイル済みプログラム内のアドレスであって、ソースの行番号ではありません。 これを変換するにはアドレスからソースへの対応表が要りますが、Udonite は今のところそれを出力しません。ですから推測せず、クライアントが書いたまま通しています。メッセージが名指ししている内容だけでも呼び出し元を突き止めるには足りることが多く、周りに置いたあなた自身の Log の行が、behaviour がどこまで進んだかを教えてくれます。
そのあとにクライアントが書く数百行のスタックダンプとヒープダンプは、それがあるべき場所であるファイルの中に置いてきます。