おはよう。もしあなたがUnityについて、
エディターではきちんと動くが、ビルド後にプレイするとヌルリファエラーを起こす。
ならぜひ読んでいってほしい。あまりにも単純な解決だった。
なぜ参照してくれないのか
#unity ビルドして再生ボタンを押して、起動せずに試行錯誤。エディターではうまくいくのにビルドではうまくいかない仕組み、謎すぎる。何が原因でビルド後ではうまくいかないのか、調べてもわからぬ。SEは左画像のようにして、やっと入る。なんでゲームを出す前にこんなエラーが続くんや… pic.twitter.com/zLgMYaLJr3
— せんけん (@megabi0) December 8, 2023
自分がてんてこまいだったオブジェクトはGameManagerだった。
エディターではきちんと働くのに、ビルドになると一切働かない。
音は出ないし、フェードも働かない。どうしたものか……。
エディターにあるのにビルドだと参照エラー
NullReferenceException: Object reference not set to an instance of an object
at StartManager.Start () [0x0000d] in D:\KiramekiUnity\sample\Kirameki4\Assets\Script\GManager\StartManager.cs:105(Filename: D:/KiramekiUnity/sample/Kirameki4/Assets/Script/GManager/StartManager.cs Line: 105)
DirectoryNotFoundException: Could not find a part of the path “D:\KiramekiUnity\kansei\Kirameki4_Data\Save\LoadStart.json”.
at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x00164] in <a3b02d6f9b494355b946095ea1f25c54>:0
Unityビルドのやり方は簡単だ。
ファイル>ビルドを開き「開発ビルド」にチェックマークをつければいい。
※英語だとDevelopment Build
加えてスクリプトデバッグにもチェックしておけばいい。
ビルド後のゲームをプレイすると、エラーが出たとき下に赤く表示される。
open Logをクリックするとメモ帳が開くので、すぐさま「名前を付けて保存」し、
デスクトップやダウンロードフォルダに保存すべき。
保存した一部のエラーが上にある。二つのエラーを太文字にした。
ゲームマネージャーも全てが働かないのでなく、一部が働く。
だからこそ悩んだ。色々スクリプトも変えた。
検索もしたが、一つも効果がなかったし、答えも出てこなかった。
本当に必要な情報(切羽詰まった悩み)ほど、検索に一切出てこない。
エラー状況をそのままメモしてたら…
#unity ビルドの件、別フォルダにあるゲームオブジェクトから参照させたいが、どうもビルドだとできないみたいだ。これを参照させるようにしたい。どうしたらいいのだろう。何をすればいいのだろう。 pic.twitter.com/xcNAkKFwcE
— せんけん (@megabi0) December 8, 2023
検索しても出てこないので、自力で解決する以外ない。
今日、エラー状態をメモしているときだ。
nullエラーはエディターモードでは起こらない。ビルド後のみに起きる。
エディターではきちんと参照元があるのに、
ビルドすると「なぜか消える・消される・存在が初めからない」に変わる。
二つの間でどんなやりとりがなされているのか。
ゲームマネージャーオブジェクトには
- フェードイン/アウトオブジェクト
- BGM/SEオブジェクト
- セーブ全般処理
- その他
色々重要なものが詰まっている。
ゲームマネージャーオブジェクトにすべて包んでおり、
ヒエラルキーだと「canvas」が二つある。
ゲームマネージャー内に含まれたオブジェクトを、
上記ツイートのような形で親子関係にすれば普通に働く。
だからこそ問題の本質は一つ。
エディターで働くのにビルドだと消える
原因が特定できたところで、何をしたらいいかわからない。
調べても出てこないのだから。
と、ゲームマネージャーオブジェクトを見ていたら、ある言葉が気になった。
タグ「EditorOnly」
私はタグでいろいろ分類するため、ゲームマネージャーはEditorOnlyに設定していた。
タグわけであり、特に意味はない。
EditorOnlyタグをUntaggedに変えたところ、普通に起動した。
ゲームマネージャーオブジェクトも消えず、普通に働いた。
自分が「ジャンル別」に分けただけのタグによって2日間悩む原因を作ったわけだ。
エディタータグの働き
参照先を調べたところ、エディターオンリータグはビルド時、削除されると。
だから最初から存在がなかったのかと納得できた。
私のやることは一つ。
「プレハブを開き、タグがeditorOnlyになっていないか確認」だ。
いくつかなっていたので、アンタグに変えた。
追記:DirectoryNotFoundException対策
DirectoryNotFoundException: Could not find a part of the path “D:\KiramekiUnity\kansei\Kirameki4_Data\Save\LoadStart.json”.
at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x00164] in <a3b02d6f9b494355b946095ea1f25c54>:0
at System.IO.FileStream..ctor
DirectoryNotFoundExceptionエラーについても書こう。
nullエラーと同じで「参照先がない」が原因だ。
解決はとても単純。
Could not find a part of the path “D:\KiramekiUnity\kansei(ビルド時に決めた、適当な名前)\Kirameki4_Data\Save\LoadStart.json”.
〇〇_Dataはビルド後に必ず出るフォルダだ。
下記フォルダにSave以降のフォルダ・ファイルがないよと示してる。
Assetフォルダ内にあるSaveフォルダを〇〇_Dataを開けた先に入れればいい。
ただしこのやり方はWindows,Macとスタンドアロンでしか効果がない。
WebGLだと普通にエラーを起こす。
追記2:FPSが原因でビルド後のゲームだと座標移動が遅い
#unity #プログラミング fps、スマホとPCそしてwebで結局30と60に統一した。これをやるだけで1日かけたでや。微調整ほど時間を取るなりね。 pic.twitter.com/dyHrChWliA
— せんけん (@megabi0) December 20, 2023
強制スクロールステージをやっているとき、
エディターに比べてビルド時の座標移動速度が遅いと分かった。
私のツイートのように、FPSをこちらで設定し、
座標移動を分けてあげなければならぬ。
スマートフォンは30FPS(カクカクする)に設定した。
60でもいいが、60だとスマホが熱くなり壊れやすくなる。
※原神は60FPS固定であり、専門のクーラーをつけて遊ぶ人が多い
ぜひ参考にしてほしい。
自分は少しカクカクしてもいいから、あまり熱を持たせないよう配慮した。
とはいえ、まだスマホで出していないが……。
※またエラーなど報告があったら追加する。