Unity5.3以降の場合はこちら
5.3以前の場合は以下の記事をどうぞ(5.3以降でも理屈は同様です。理屈を知りたい場合はどうぞ)
例えばUnityエディタで無限ループを行う処理を書いている場合、Unityはクラッシュします。その際、シーンを保存していなければ作業中の内容は失われる事になります。
そうならない為に、一定時間ごとにバックアップを取ってくれるAutoSave等のアセットがあれば安心ではあるのですが、入れていないケースもあります。
Unityに自動セーブ機能を追加してみた - テラシュールブログ
さて、このクラッシュ、状況が「ゲーム再生時に発生した」で「エディタで再度開いていない」のであれば、実は復旧出来る可能性があります。
クラッシュ時に失われたシーン情報を復活させる
クラッシュした際のシーン復旧手順は以下のとおりです。
ただし一度でもクラッシュ後にUnityでクラッシュしたプロジェクトを開いてしまうと、復旧出来ません。クラッシュ直後でUnityを開いていないことが重要です。
- クラッシュした際の「Temp/__EditModeScene」をAssets以下に移動させます。
- 名前を「__EditModeScene.unity」とかにします。
- 「__EditModeScene.unity」を開きます
開くと最後に開いていたシーンが表示されるはずです。後はオブジェクトをコピー&ペーストで本来のシーンへ移動するなり。もしくは、既存のシーンを__EditModeSceneファイルで上書きするのも良いかもしれません。
原理
実は__EditModeSceneにはシーン再生直前のシーン情報が格納されています。何故そんな事をしているかと言えば単純で、「シーンの再生を停止させた時に戻す」為です。
たとえばシーン再生中に__EditModeSceneを違うファイルで上書きすると、再生終了時に全く違うシーンに戻ります。この事から、この__EditModeSceneを元シーンに上書きもしくは開いてやる事で、クラッシュする直前のシーンを開く事が出来る訳です。
ここで問題となるのは、TempフォルダはUnityエディタを起動した際に一旦全削除される事です。再三エディタ開く前と言ってるのはこのためです。もしUnityエディタを開き__EditModeSceneを失った場合は、もう戻せません。
なので、この機能は最後の手段として、やっぱり定期的にシーンをセーブすることが安定かなと思います。シーンは復旧出来てもプレハブはバックアップされてないので…。
ちなみにプレハブやAnimatorの情報は保存はFile>Save Projectで出来るみたいです。
AutoSaveエディタ拡張、この原理を利用したバージョンに修正中です。Unityモジュールとして(Assets以下を汚す事なく)クラッシュ時にもボタン一発で復旧出来るような感じにできないか調整中