質問: true; } } ```
回答: Unity3Dを触ったことがないので、的外れなことを書いているかもしれませんが、 ``` while(flag == false){ //ブロックが落ちる処理 (略) } } ``` このループはループ内でフラグを変更する箇所がないので、他に非同期でフラグを変えてくれる処理がないと永遠にループし続けることになりませんか? OnCollisionEnter()というイベントハンドラがありますが、提示いただいているコードを見る限り、FallBlock()関数から一旦抜けないとOnCollisionEnter()へ処理が移らないのではないでしょうか? もし、別の場所でTask.Run()している処理があるのであればその処理で発生する他のイベントでフラグを戻している処理がないか確認してみてください(あまり論理的な方法ではないですが、フラグを変化させている箇所にブレークポイントを貼りまくってどこでフラグを戻しているかデバッガで追うのも一つの手です)。 あとはflagの宣言にvolatileをつけて、コンパイラから最適化されないようにすることで、回避できるかもしれません。 while内部でflagが変化する処理がないため、flagのチェック処理がスキップされる場合があります。volatileをつけて宣言すると最適化の際にも常に新しいflagの値をチェックしてくれるようになります。