本日の内容は「無限ループ」
長いプログラムなんか作っていると良く出会うのかな?って思います。
自分も最近作成しているパズルゲームでよく発生。で、そのたびにunityを強制終了してましたが強制終了は嫌なのでしない方法を検討してみました。(本当はもっと簡単な無限ループを終了させる方法があるかもしれませんが・・・)
基本的に無限ループは繰り返し処理で発生なので繰り返し処理の直後に
①ループした回数を取得するメソッドを呼び出して(カウント1するだけ)
②規定回数が来たら強制終了させる
という感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void Update () { for (int i = 0; i < 3; ) { //無限ループ回避用 Mugen(); if (mugen_cnt == 10) { Debug.Log("無限ループ"); return; } if (mugen_cnt >= 10) { Debug.Log("test"); Application.Quit(); } } } void Mugen() { mugen_cnt = mugen_cnt + 1; Debug.Log(mugen_cnt); } |
で実行すると、
最初にreturnを使ってみましたが終わらなかったので、
application.Quitもやって入れてみました。
でも・・・ダメ。
終わらない
自分の知る限り(経験浅い・・・)の終わる処理を入れてみましたがダメでした。
処理を追って確認しても10になればそこに入っていて、Application.Quit()した後もmugen_cntは順調に値が増えているので終わってないんですね。
うーん。よくわからないけどこの方法はあきらめました。
1 2 3 4 5 6 |
for (int i = 0; i < 3; ) { //無限ループ回避用 Mugen(); if (mugen_cnt == 10) { Debug.Log("無限ループ"); i = 99999; } |
しょうがないので↑のようにループが終わる条件に変更「i = 99999」
これだとforの終わる条件(変数)を毎回変えなきゃいけないから定型文として使うにはちょっと手間かなと思っていたのでやりたくなかったですがしょうがないからやりました・・・
でも・・・
終わらない((+_+))
嘘でしょ。ってiの値を確認してもしっかりと99999になっているので終わると思ったのですが終わらないんです。
あっ!
という感じでひらめき(凡ミスですが・・・)再度調べてみると
ループは抜けているけど再度updateロジックを繰り返しているだけでした・・・(すみませんって感じですね)
ただ、Application.Quit();やreturn;で終わらないとなるとどうしようかな??
ってちょっと思いましたが↓に気づけました!!
1 2 3 4 5 6 7 8 9 10 11 |
for (int i = 0; i < 3;) { //無限ループ回避用*start************************************* mugen_cnt = mugen_cnt + 1; if (mugen_cnt > 100) { SceneManager.LoadScene("99mugen"); //無限ループの時に違う画面に飛ばす i = 99999; //forのループは終わらせないとダメ! } //無限ループ回避用*end*************************************** } |
ふう。ひと段落
最後にはまったのは「i = 99999」の部分。forが終了しないと画面遷移しないようなので注意。
結構ハマりましたが最終的には比較的短いロジックで回避できそうでよかったです。当分はこれでいけそうですが、もっといい方法があれば紹介いただきたいです!
皆様宜しくお願い致します。