読者です 読者をやめる 読者になる 読者になる

AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

coroutineを動かしたままDestroyするとしばらくしてフリーズする

Unity5.3.1fの話ですが、
当たり前と言えば当たり前かもしれないけど、
coroutineを動かしたままDestroyするとフリーズする現象がおきました。
ヌルポエラーも出ないし、すぐ起きるわけではなく、動かして25秒とか55秒に発生してました。
すぐ起きないし、エラーが出ないので、すごく不可解な現象でした。
はじめ、なにが原因かわからなかったので、coroutineを無くして、一晩中動かし続けたら、197面まで動き続けてました(2つのマップを順繰りに貼ることでゼビウス16面まで再現できるようになりました。地面だけですけど)
(ちなみに敵機を生成するGMは内部でStartCoroutineを使ってますが、GMは永続するので問題が出なかった)

DestroyするまえにStopCoroutineしてもだめで、厳密には、実際にストップしたのを確認してからDestroyしないとダメと思います。

if( transform.position.y < min.y)
{
	StopCoroutine ("Shoot");
	Destroy(gameObject);
}

おそらく呼び出した親がDestroyされることで、coroutineが無限ループになることが、ある確率で発生するんだと思います。

Coroutineに関しては、
StartCoroutine( Func() );
StopCoroutine( "Func" );
では止まらずに
StartCoroutine( "Func" );
StopCoroutine( "Func" );
こう書く必要があるというのは別にあるようですが、今回は後者でフリーズした。

[Unity] スクリプトの有効/無効状態にコルーチンを連動させる | ftvlog

IEnumerator Shoot() {
	while(true){ ..... }
}

を、内部から止めようと思って

IEnumerator Shoot() {
	while(this){ ..... }
}

と書いてもダメですね。明示的にStopCoroutineを確認する方法ってあるのかな?