見出し画像

【Unity 2D】無限ループってムズくね? - エンドレスモードを作るにはどうすればいいか🤔

いつも読んでくださりありがとうございます🙇

最近暑すぎて仕事以外はほとんど家に引きこもってゲーム開発に没頭しております。

前々回の記事で軽く紹介しましたが、自分は趣味でUnityを使った2D横スクロールゲームを作っており、おかげさまでタイルマップも含めUnity自体も大体使いこなせるようになったんですが、一点だけ困ったことがありまして、それはエンドレス系のループマップをどうやって再現するか、ということです。

基本的に2Dゲームは仕様上、画面外にある地形、アイテムや敵キャラ等といったいわゆるオブジェクトを3Dゲームのようにアングルを変えて遠くまで見渡すことはできないので、昔の2Dゲームは画面の外で地形やオブジェクトの生成、および削除などといった処理を行い、実際にプレイヤーが移動してるように見せかけていました(舞台劇のような感じで想像していただけると分かりやすいかと思います)。理由は簡単で、これをしないと画面外にある地形やオブジェクトのせいで動作が重くなり、処理落ちしてしまうからです。

ただ、パソコンやハードの性能が上がった今では、よほど大きなマップでない限り、画面外に地形が存在しても処理落ちすることはないので、今のハード環境に合わせてリリースする場合、ロード時などにいったん前もってすべての地形を読み込ませ、アイテムや敵などの一部の動くオブジェクトだけプレイヤーが近くに来た時だけアクティブ化させるといった方法でも特に問題ありません…

が!!

ただ、これがエンドレスタイプのゲームを作りたいとなると話は変わってきます。

プレイヤーが通り去った後の地形をいつまでも残しておくとCPUにどんどん負担がかかってしまうので適度なタイミングで消してやる必要があり、他にもプレイヤーがミスをするまで遊べるように、一定間隔で地形やオブジェクトを出現させてやる必要もあります。

しかしながら、Unityのタイルマップは仕様上、ゲーム中に地形の一部分だけを出現させたり、逆に消したりことは基本的に出来ません(追加Assetを使うことで地形の一部分だけを表示したり、削除することができるようになるかもしれませんが、自分がUnityを触った当時はそんな神Assetはありませんでした)。

つまり、ゲーム中に追加で地形を出現させたい場合は、以下のように前もってエディタ上に配置したタイルマップをプレファブ化し、それをゲーム中に出現させるという手間が必要であり、当然プレイ中にそういったことをするとCPUに負担がかかってしまうため、そこが今回のテーマである無限ループタイプのエンドレスマップを作る際の難所となります。

これは恐らくUnityの3Dのマップの仕様をそのまま2Dに持ってきたためだと思われます(実際に3Dゲームではオープンワールドとかじゃない限り、ロード時にほぼすべての地形を読み込むため)。

前置きが長くなりましたが、この問題はタイルマップを使うのではなく、「Prefab Brush」を使ってマップ(Scene)上にプレファブとして地形を配置することで解決できそうですが、この方法は自分の中でも試作段階なので、今の知識ではまだ憶測としてしか解説することは出来ません。

現にタイルマップを使わない簡単なエンドレスゲームの場合、このプレファブ化した地形を次々に読み込ませる方法が用いられているはずです。
よってマリオのような本格的な横スクロールゲームでも理論上可能だと思いますが、どういったアルゴリズムで1マス毎に地形やオブジェクトを配置するのか考える必要が出てきてしまうのと、それに加えて「Rule Tile」などといったUnity独特の特殊タイルに頼っていた場合、コライダーを使って自分の力で特殊タイルを再現しないといけなかったりとなにかと手間がかかってしまうのも事実です。

以上の手間を考えると、やはり簡単にエンドレスマップを再現する方法は、はじめに紹介したタイルマップを作った後にプレファブ(ユニット)化し、それを一定のマスごとに配置していくといった方法が一番手軽なのではないでしょうか。

ちなみに現在リリースしておりますクソゲー…もといスーパーけんじランのボス戦も、この方法を使ってエンドレスマップを再現しています。

ただし、この方法だと上記で解説した通り、大量のマップデータを一度に読み込むこともあり、CPUに負担がかかってしまうので、万が一500マスごとにマップデータを読み込むアルゴリズムを作りたい場合、マップを読み込む直前に画面をいったん暗転させるなどして休憩をはさみ、その間に次の500マスのマップを読み込むといった方法を使うなどして処理落ちさせないように工夫する必要があります。

しかしながら、緊迫しているボス戦中に画面処理の休憩を挟むなんてもってのほかなので、こちらの方法が使える場面は限られてしまうのも事実です。

ちなみに、けんじランのボス戦では出来るだけ負担がかからないように100マス毎にタイルの生成、及び削除していますが、それでも大量のオブジェクトが置いてあるマップが読み込まれてしまうと、一瞬画面がカクつくことがあるので、将来的には全てのタイルをプレファブ化し、1マス毎に生成できればと思っています。

以上のことを踏まえまして、Unityのタイルマップはエンドレスタイプのゲームと相性が悪いので、初めからそっちをメインで作る場合、タイルマップではなくプレファブで地形を作るようにするといいでしょう(もしこの記事を読んだ方でエンドレスマップに適したタイルマップAssetを知ってる方おられましたらコメントで教えていただけると嬉しいです🙇‍♂️)。

それでは、今回はこのへんで🏃

この記事が気に入ったらサポートをしてみませんか?