先日のUnity Tips(火曜日にUnityのTipsを#unitytipsタグと一緒にTwitterで紹介する)を眺めていた所、なんか凄いアセットが目につきました。
#unitytips How to stop a pesky infinite loop in 1s with Panic Button. Learn more: http://t.co/ezdJ9nqn4c #gamedev pic.twitter.com/q6weVt4DM0
— William Harel (@willharel) 2015, 9月 22
詳細を確認したところ、かなり面白いアセットでした。
名前はPanic Buttonで、機能は大体こんな感じです。
- Unityエディタで無限ループを起こした際、Shift+Escapeキーで一時停止、
無限ループを中断 - エディタ拡張でも無限ループ中にShift+Escapeで無限ループを中断
- 停止時に実行していたクラスとメソッド名が分かる
- 停止時に無限ループを起こしてたメソッドを持つオブジェクトが分かる
https://www.assetstore.unity3d.com/jp/#!/content/40167
実際に確認したところ、Unity 5.2で完璧に動作しました。
Panic Button by Dezgo http://t.co/pEtgniW13h #unity3d 間違えてUnityエディタで無限ループを決めてもショートカットキーで復帰できる謎のアセット。マジに無限ループから復帰できた… pic.twitter.com/Wqfdm2RY0t
— 椿 (@tsubaki_t1) 2015, 9月 30
エディタ拡張で無限ループかましても復帰出来る超パワー。 pic.twitter.com/i27f9c6Z8A
— 椿 (@tsubaki_t1) 2015, 9月 30
この「強制的に処理を中断出来る」超強力な機能は、実は無限ループだけでなく「単純に重すぎてエディタの応答が返ってこない」ようなケースでも機能します。
これは何らかの理由により負荷が跳ね上がり入力を受け付けなくなったケース、あと個人的にはエディタ拡張を行う時などです。
例えば「プロジェクト内のオブジェクトを全部検証して不必要なアセットをピックアップする」を以前作りましたが、プロジェクトの規模や内容によっては初回計算時30分くらい処理に時間がかかりました(2回目からはキャッシュを使って高速化します)、こういった「一度始まると中々終了できない処理」にキャンセルを付与できる訳です。
まぁ、一時ファイルとか作って使っていた場合はゴミが残る事があるので正しく処理を中断する機能を付けるべきではありますが、少なくとも作っているときはこのキャンセルボタンは非常に有りがたいです。
ちなみに単一で糞重い処理は止められないみたいです。停止出来るのは「処理が終わって次の処理が始まるタイミング」です。
どうやってるのか知りたい場合、Editor/PanicButton/source.zip内にソースコードが含まれているので、それを見るのも面白いです。
通常は既にコンパイルされた状態で提供されています。これはビルド失敗時も動作出来るように、あとコンパイル時間短縮のためと思われます。