【メモリリークに気を付けろ!】Unityでゲーム開発をするにあたって処理落ち問題をどう解決するか📝
ついに念願のゲームが完成!したと思いきや、最後の最後で色々と問題が発生し、先日巣鴨に住んでらっしゃる同じUnity開発者さん(自分の中では大先生)のところへ相談に行き色々と教えていただきました。
以前にエンドレスモードを作る記事を投稿させていただいた際に軽く紹介したかもしれませんが、エンドレスモードの仕組みとして一定の距離までたどり着いたらエリアクリアとなり一旦画面をフェードさせ、その間に以前のコースは削除し新たにコースやオブジェクトを生成するやり方で作っております。
ゲームプレイ中にコースを生成してしまうと、オブジェクトの生成タイミングでどうしても処理落ちしてしまい、ゲームプレイの妨げになってしまうため、大量のオブジェクトを配置する場合は一旦ユーザー側の操作を受け付けないようにし、その間に生成するようにしましょう。
ただ、自分のようにロクに知識を持たないまま、ゲームオブジェクトを出したり消したりを繰り返してしまうと、いずれはメモリリークを起こしてしまい、だんだんと処理落ちして最終的にゲームが動かなくなってしまいます(ちーん😇)
ちなみに処理落ち問題に関してはシーン間を移動すると基本的に解消されるため、マリオのようなステージクリア➪マップ画面に戻るとかならそこまで気にすることはないかと思いますが、同じシーン内でひたすらプレイする、いわゆるエンドレスタイプのゲームの場合はやられるまで永遠と続くわけですから、バトロワタイプのような同じフィールドで戦うゲームの場合も処理落ちしないようにコードを書く必要が出てくるかと思います。
話を戻します。
んで、そのエンドレスモードで遊んでたら「重くなるから何とかしてくれー!」と例の知り合いの家に押しかけて相談したらオブジェクトプールはちゃんと使ってる?と聞かれ🤪❓となってしまったというわけです(本日の2度目のちーん😇)
知り合いから話を聞いた上で調べたところ、Unityでは不要になったオブジェクトをDestroyし、きちんと削除したとしてもエディタ上からは消えてるだけで、実は残りカスのような物が内部に存在しており、それが溜まっていくことによって処理落ちを起こしてしまうとのことなので、マリオで例えるところのコインやクリボー等といったアイテムや敵キャラは一回きりとして使うのではなく、何度も使い回すのが鉄則とのこと(知り合いから教えてもらって軽く調べただけなので間違っていたらスミマセン🙇)。
てか、完全に自分の無知が原因であるものの、一通り完成してからこんなことを知ってしまって、今はその処理に追われているというわけなのですが、普通はDestroyしたらメモリもその都度解放されると思うじゃないですかって話なんですよね(見苦しい言い訳ですが…)
オブジェクトを削除しても実は「内部では参照し続けてるワナが潜んでるなんて普通は思わないでしょ」と叫びたくなりました実際に部屋の中で全裸になって叫びましたが、知り合いも含むUnity開発者ならほとんどの方が知っておられると思うので、本当に自分の勉強不足だと改めて思いました。
メモリリークの対処方法として、シーン間を移動することでそういった残りカス的なものも含め全てのメモリが解放されることは間違いなく、対処法をネットで調べたところ、同じシーンを再度読み込むのも一つの手段みたいなので、とりあえずはエリアクリアのタイミング毎にシーンをリセットするような感じで作っていこうと思います。
ちなみに、シーン間を移動することによるデメリットとしてスコアやプレイヤーの状態などといったPrivateで保持した変数がリセットされてしまうため、受け渡し作業が必要なのと再度エンドレスゲームが始まってしまわないようにフラグを使ってゲームの状態を管理する必要もある為、現在手直し中ですが、BGMに関しては「DontDestroyOnLoad」を使うことでシーンをリセットしても途切れないように対処出来るので、時間はかかるもののフラグ管理さえミスらなければ何とか対処できそうな感じです。
一応今回のエリアクリア毎にシーンをリセットする方法を使った上で、やられないようにプレイヤーをはるか上空に飛ばして、スコアがカンスト(流石にそこまでやり込む物好きはいないと思いますが…)するまで放置しましたが、特に問題なく動いてくれたのでこの方法で作っていくことに決めました!
いくら無料で遊べるとはいえ貴重な時間を使っていだだくわけですので、バグの存在を知った上でほったらかしにするのは自分の中ではタブーな行為ですので、出来るだけ快適に遊べるように最善を尽くしたいと思いますので、リリース後に不具合を見つけられましたらどんどんクレーム下さい🙃
以上、処理落ちはつらいよ~ということでした。
いつもながらあんまり役に立たない内容でしたが、自分のように後から犠牲者が出ないよう急遽更新させていただきましたので、皆様も是非気を付けてくださいませ。
作り始めて間もない内ならまだしも、それこそ自分のようにゲームが完成間際になってから作り変えると無茶苦茶大変です(修正によって新たなバグが生まれる危険性もある)ので、こういうことは早いうちから知っておくに越したことはありません。
今回の件で自分は既に2回死んでしまいましたが、まだ💗が1つ残ってるので、最後の力を振り絞って頑張りたいと思います😫
引き続き応援宜しくです🙇