見出し画像

突然原因不明で全くゲームが動かなくなったときの対処方法

ゲームプロジェクトって突然何もしてないのに壊れることありますよね。

え?そんなことありえないって?何かしてるはずだって?

……

いいえ、何もしてないのに壊れます。


・原因不明のアサートが出て直らない。
・ある日プロジェクトを起動したら(同上)
・いつの間にビルドがコケるようになった。
・一ヶ月前はできたのに(同上)
・iOS 版で動作確認していたらいつの間にAndroid版が(同上)
・三ヶ月前に実装していた箇所がいつの間に死んでいた。

あるある。


そんなあなたのための、
突然原因不明で全くゲームが動かなくなったときの対処方法。
(初級~中級者向けです)


0. 前提条件

 今回は「原因不明」と銘打ってるので、次の前提条件は満たしているとします。
・エラー内容を読んでも内容がよくわからない。
・エラー内容をググってもそれっぽいものが出てこない。
 まあ、「なんにも出てこない」ということはほぼ無いですが、「Unity Forum の issue がヒットするけど、どうもシチュエーション違うっぽいな~~」も後者に該当します。

 あ、Script Execution Order も確認してください。エディタ上で上手くいくのにビルドすると止まる、みたいなケースは大体スクリプトの実行順です。


1. 再起動してみる

画像1

 これ本当に大事ですよ。新しいアセットを入れた、新しい箇所を実装した、プラグインのバージョンをアップデートした。
 すると、突然 Unity が壊れることがあります。プレイボタンを押しても動かない。存在しない Syntax error が出る。エラー内容をググってもロクな解決方法が出てこない。

 そういう時は、Unity エディタを再起動しましょう。魔法のように直ることがあります。直らなければPCも再起動してみましょう。魔法のように(略)。

 前者はわかるんですが、後者(PCの再起動)でたまに直ることがある理由は、謎です


2. キャッシュを消してみる

 Unity エディタを一旦閉じた状態で、プロジェクト内にある Library フォルダを消してみましょう。プロジェクトを弄っている過程で生成された変なキャッシュが削除されます。

 プラグイン周りのエラーの場合は Package Manager の manifest を再構築すると直ることも……あります。(壊れたことのほうが多いのでバックアップはお忘れなく)

2.5.スクリプトを再コンパイルして実行してみる

 Library フォルダを消すだけでもしかしたら解決するかもしれませんが、ビルドのみコケる場合、スクリプトを適当に編集+保存し、再コンパイルした上でエディタの PLAY ボタンを押して実行すると、DLL がおかしくなっているようなケースは回復することがあります。

3. 一つ前のリビジョンに戻してみる。

画像2

「ふーん、よくわからないけどさ、動くリビジョンまで戻したらいいんじゃないの? ほれポチーっと」
 それが出来たら苦労しないんよ

・戻していった結果二ヶ月くらい巻き戻ってどれが原因か全然わからない
・最初期まで戻しても何故か直らない(ローカル環境起因)
・あと三時間でイベント展示が始まるんだよオォォ~!!
・前回サブミットしたのいつだっけ……
・リビ……ジョン? ジョブ・ジョン?

 大丈夫、勝負はこれからだ。バージョン管理を怠ったキミも、バージョン管理なんてそもそも知らないキミも、ここからスタートしよう。


4. もう一度だけエラー内容を良く見てみる。

 Unity のエラーは正直見にくいので、一回テキストファイルに全部コピペして、もう一度見比べてみる。ググって見つからない=ググった部分がそもそも本質でないということも。
 例えば、このエラーの原因はなんでしょう。

画像4

 正解は簡単。.keystore のパスワードが違う です。

画像5

 おわかりいただけただろうか。
 (しかも、実際は同時に4つ出てくるエラーのうちスクリーンショットにある一つだけが当たり)


 ……というように、エラーメッセージがそもそもわかりやすく出ているとは限らないので、隅々まで細かく見渡して見る必要があります。
 まあ、エラーメッセージすら出ないこともありますけどね


5. Unity をアップデートしてみる

 運悪く Unity のバグを引いてしまっている可能性が結構あるため、アップデートすると直ることがあります。

 まずはマイナーバージョンアップで解決するか見てみましょう。しかし、往々にして「2020では直ったよ!でも2019LTSではまだだよ!」みたいなケースがあるので、メジャーバージョンアップしないと直らないかもしれません。バックアップはお忘れなく。

 ちなみに、LTS の最新バージョンでバグを引くこともままあります。ので、良かれと思ってマイナーバージョンを最新にしておくのは避けておいたほうがいいかもしれません。ダウングレードはまた別のバグを産みます。


6. プラグインを全部入れ直してみる

 プラグインとかパッケージに起因する原因不明のエラーは多いです。一旦プラグインとパッケージを全部まっさらにして1から入れ直してみましょう。その道中で prefab がぶっ壊れたりシーンが滅茶苦茶になっても泣かない。

 とりあえず、プロジェクト全体をバックアップし、一旦全通りガチャガチャやって当該のエラーが消えるかどうか見てみましょう。その後、元のプロジェクトで原因と思わしきプラグインを入れ直し、直るかどうか見てみましょう。

 そういえば、昔は AndroidManifest がかち合うと途端に戦争が始まったんですが、最近はうまい具合に Unity がマージしてくれるようになったので、いい時代になりましたね……。


7. 丸ごと別のPCに移してみる

画像3

 なぜかは全く分かりませんがローカル起因であることもたまーにあります。Unity Editor 本体がおかしくなっているのかもしれません。プロジェクトを丸ごと圧縮するか、Collaborate などを利用して別の PC で問題が解決するか見てみましょう。

 まあ、これで上手くいったせいで OS ごと入れ直すハメになった人を知っていますが……。


8. 丸ごと新規プロジェクトに移してみる

 Unity 3.5 の頃はたまにプロジェクトが破壊され新規プロジェクトの作成を余儀なくされていましたが、最近はあまりありません。ともあれ、新しくプロジェクトを作り直すことでプロジェクトの深層に刻まれていたなんらかのキャッシュか設定がクリアされ問題が解決する可能性もゼロではありません。

 逆にプロジェクトを作り直したせいで今まで上手く行っていた部分が上手くいかなくなったりすることもあるんですが……。(怪談話)


最終手段. まっさらな状態からN分木探索してみる

 結局ここにたどり着くことも多いんですが。
 まっさらなプロジェクトは動きます。当たり前ですよね。ここ動かなかったらPCを捨ててください。で、原因になりそうにないリソース部分やベーシックなスクリプトを全部入れてください。

 動いた場合、ここで一旦バックアップを取ります。動かない場合、今入れたもののどれかが原因です。バックアップを取ったら危うい感じのプラグインとかスクリプトを入れていきます。一つずつだと時間が掛かるので、いくつかまとめて放り込むといいと思います。一回一回ビルドして、プラットフォームに因っては実機での確認が必要なので結構大変な作業です。

 しかし、プロジェクトのモジュール化 / カプセル化が上手くできていないと、ここで本当に苦労するんですよね。クリーンアーキテクチャとか最近流行りですが、こういう時に強いです。依存関係で宇宙の果てまで繋がっているスパゲッティプロジェクトはしばしばここで永遠の眠りに就きます

 原因を無事特定できたら、それを投げ捨てましょう。経験上、「なんでこれがあると上手くいかないんだ……?」という疑問が解決することはあまりありません謎です。何かが悪さしているのです。諦めて。


終わりに

 6 以降はかなーりしんどいので、願わくば5までで解決することを祈っています。

 でも、大丈夫。最悪でもリソースは全部残ってますし、ソースコードもあるので、1からプロジェクト作り直せば多分動きますから。え? Inspector や Scriptable Object に大半のデータを残してきた?
 それは……気の毒に……。
 (自分は Unity をあまり信用してないのでマスターデータはスプレッドシートとかで持っています)

 なにはともあれ、最悪でもこれだけ手段があるので、安心して(?)ゲーム作りに励みましょう。グッドラック!(よくわからない〆)



#ゲームの作り方

この記事が参加している募集

ゲームの作り方

この記事が気に入ったらサポートをしてみませんか?