Unity(2021.3.4f1)で作った2D脱出ゲームをWebGLで公開する流れ(備忘録)
◆WebGLでビルド
※日本語は絶対に使わない・「File」→「Build Settings」
・「Platform」が「WebGL」になっていなければ「WebGL」に「Switch Platform」
・「Scenes In Build」にゲームに必要なシーンを追加。
・「Player Settings」を押して「Project Settings」を開く。
・「Player」の「Company Name」には作った人「Aza」、「Product Name」にはゲーム名「Escape01」を記入。
・「Settings for WebGL」
「Resolution and Presentation」の「Default Canvas Width/Height」に「Canvas Scaler」の「Reference Resolution」のX「512」とY「368」の値を入れる。
「Publishing Settings」の「Decompression Fallback」をオン
※サーバの「.htaccess」を編集する方法もあるみたい(参考)・「Project Settings」を閉じて、「Build」を押す。
・ビルド用のフォルダ「bEscape01」を作って「フォルダーの選択」、ビルドが完了するまで待つ(ちょっと時間がかかる)
・サーバに「bEscape01」をアップロード。index.htmlを呼び出す。
◆Chromeのローカルサーバで動作確認したら、Unityで再生した時と全然違う。
「文字がぼやける」
・「Text」の「Font Size」を大きくする。
※大きくしすぎるとフォントによってはギザギザが強くなる・「Horizontal Overflow」「Vertical Overflow」を「Overflow」
・「Rect Transform」の「Scale」を小さくする。
「セーブができない」
・WebGLでは「File.WriteAllText(Application.persistentDataPath~)」は使えなくてセーブ失敗。
・素直に「PlayerPrefs」を使う。ゲームを終了するとき(OnApplicationQuit()内)に記述するのが普通らしいけど、ブラウザゲームの終わる時がよくわからないので、セーブボタンを押したらセーブすることにする。
#セーブ
PlayerPrefs.SetInt("currentRoomNo", currentRoomNo);
PlayerPrefs.Save();
#ロード
currentRoomNo = PlayerPrefs.GetInt("currentRoomNo", 0);
WebGLでPlayerPrefsしたデータは「IndexedDB」に保存される。保存先(
参考)
「ゲームオブジェクトの移動速度が遅い」
・speedの値を大きくして「Time.deltaTime」をかけたら直った。
「音がズレる(時がある)」
・直し方がわからない。仕様だと思って諦めることにする。
「エラー:warning: 2 FS.syncfs operations in flight at once, probably just doing extra workが頻繁に出る」
・Chromeの「閲覧履歴データの削除」で「Cookieと他のサイトデータ」にチェックを入れて「データを削除」すると「IndexedDB」フォルダ内がクリア。
・そして再びテスト開始。成功したように思えたが、しばらくすると同じエラーが出た。
・WebGLで「JsonUtility」を使ってるからダメなのかも(
参考)
・「JsonUtility.ToJson」ではなく「string.Join」で文字列にする。「JsonUtility.FromJson」ではなく「文字列.Split」で元に戻す。
・「Array.ConvertAll」を使って、文字列配列を数値配列に一括変換。
・再びテスト。今度こそ成功…ごくごくたまにエラーが出る。もうわからない。諦める。
結論:
Unityの便利な機能に飛びつくのはやめましょう。
その関数は本当にWebGLで使えるの? を調べてから使いましょう。
ある程度完成したらローカルサーバでテストしましょう(Unityでの再生とサーバでの稼働は全然別物!)