作ったのはこちら
Unityroom の1week GameJam 参加してみました!
— GoldenDuck (@Duck2Golden) December 30, 2020
まだまだ完成度は上げられる状態ですが、一週間ではここまででした…
とあるESPの異界録(ラノベ感) | フリーゲーム投稿サイト #unityroom https://t.co/HnCWQKKcVa #unity1week
起こったエラー色々
かなり局所的な内容になりますが。
新Input System でエラー
全然動きません(^ω^)
自分は速攻諦めましたw
おそらくまだ非対応なのでしょう。
Cinemachine 関連でエラー
こちらでも言われていたエラーです。
確かに Cinemachine を削除したら動きました。
ただ単独で動いていたときもあったような…?
Cinemachineを使ったゲームを使っている方もいるようです。
他のエラーも起こったところを鑑みると、初期化周りに問題が起きやすいと思ったほうが良さそうです。
しっかり初期化処理を遅延できるようにコードを組んだほうが良さそう。
OnJointBreak2D が何故か発生してエラー
テスト実行ではなんの問題のなかったが、WebGLビルドして、ブラウザ実行すると発生。
特に何も使ってないイベントが発生しエラーしているようで困った…。
MonoBehaviour の中でもレアすぎるイベント。
怪しいところを探ったところ、UniRxでユーザーのissue で追加されているのを見つけ、
UniRxを外したところ…動いた。
そもそも惰性で書いていた Observele.everyUpdate が既に非推奨になっており、
メンテナンスされてない可能性が高いかなと思っているが…。
ともかく使ってはいけなかったものだった。
ということで、UniRxは使わずに動いています。
rendering without using requestAnimationFrame for the main loop.
ビルドしてみたところ、WebGL側で発生していたエラー
Looks like you are rendering without using requestAnimationFrame for the main loop.
You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!
なるほど。わからん(^ω^)
で、調べてみたところ、以下のようなスレッドが。
https://forum.unity.com/threads/rendering-without-using-requestanimationframe-for-the-main-loop.373331/
『
デフォルトの設定 Application.targetFrameRate = -1 が最適です。
これは、パフォーマンスが適切である限り、60hzの同期アップデートを提供します。
』
確かに、Application.targetFrameRate=60 を指定しているところがあるが…。
試しにコメントアウトしたところ、エラー発生せず…。
なにかしら描画更新に関するエラーのようだ。
で、自分のプロジェクトを見てみると…怪しいやつがいました。
RenderTexture、こいつが怪しいのではないかと目星をつけています。
まあ演出のために、割とめちゃくちゃやってるからね! 仕方ないね!
副次的に、Application.targetFrameRate = -1 が最適。
指定はしない方向で解決するのが良さそう。
突然、RangeError: Maximum call stack size exceeded が出る
これはブラウザのキャッシュの問題でした。
キャシュの削除をして解決。
ただjs自体あまり再帰呼び出しに強くない構造のようなので、ガッツリ再帰呼び出しするようなコードは気をつけたほうが良さそうです。
総じてWebGLする上での教訓
- 新InputSystem は使わない。まだ動かないよ!
- フレームレートは指定しないほうが良いので、レートに依存しないコードを書く(30〜144Hzを考慮して書く。)
- 初期化処理は詰め込まない!Start,Awakeであまり処理を書かない!
今回期日に間に合わせるために雑にコードを書きましたが、それが原因もあるので悩ましいところですね。
Cinemachine 動かなかったのは悔いが残るなぁと。
特に初期化処理周りはエンジニアの領分ですし、ちゃんとこなしたいところですが…。
時間短縮のために ObjectPool 使ってなかったりしたので、あまり良くなかったですね。
(むしろ使ってなくてもまあまあ動いてしまうのが怖いところ)
綺麗にかける時間と設計の時間があればよいのですが、
やはり、期間内に適切なボリュームのものを作ることが大切ですね。