
いわゆる「弾幕系シューティング」は、デバイスに多大な処理負荷を与えてしまいます。
これが高性能のPCや最新のハイエンドスマホならともかく、既に旧式化したスマホでプレイするとしたらどうでしょうか? 映像がカクカクになり、ロクに遊べないという事態も起こり得ます。
しかし現実問題、数年前に買ったスマホを今でも大事にしているという人は少なくないはず。そんな人でも手軽に遊べる弾幕系シューティングの作り方、という内容のショートセッションがCEDEC 2023で催されました。解説するのは株式会社ポケラボ ゲーム事業本部エンジニアの野口高志氏です。
Unityを使った低スペックスマホ向け弾幕系シューティング制作

さて、この講演「低スペックスマホでも快適に遊べる! 弾幕系シューティングの処理負荷を抑えるテクニックとは?」はどちらかと言えば技術解説寄りの内容で、その全てを書くとすれば記事の尺が長くなってしまいます。
従って、この記事では「Unityを使った低スペックスマホ向け弾幕系シューティング制作まで」を簡潔に、そして「技術的には可能」ということをお伝えしたいと思います。
弾幕系シューティングを低スペックスマホで遊べるようにする。それは処理負荷を極力軽減させるという意味でもあります。講演の冒頭、Unityで制作した見下ろし型2Dシューティングゲームの動画が披露されました。これは何とiPhone7で動いているとか。

「こういうゲームの特徴は、やはり“オブジェクトが膨大に発生する”という点です。いくつかの対応を行うことにより、ゲーム終盤に大量のオブジェクトが発生しても概ね45~50FPSを維持するような動作を実現しました。使用端末はiPhone7です」
スマホゲームで50FPSは、カジュアルプレイには十分なレベルと言えます。正直、これが本当に7年前の機種で動いているゲームなのか!? と疑ってしまうほど。
このような快適動作を実現するためのテクニックは、以下の5つ。
マルチスレッドの活用
物理演算の自作
衝突判定の最適化
オブジェクト生成の最適化
レンダリングの最適化
この記事では①と③と④に絞って簡単に書き起こしたいと思います。
マルチスレッドの活用
弾幕系シューティングに登場する様々なオブジェクト、即ちプレイヤーキャラやエネミーキャラ、アイテム、弾丸などを処理するのは、Unityでは「GameObject」です。ここでオブジェクトの生成/破棄、更新/移動/物理演算、衝突判定等を取り扱います。それはメインスレッドでの駆動を意味します。

「ですので、今回は方針を変えてGameObjectに代わる規定クラスを自作します。自作クラスのbaseObjectの中で、オブジェクトの生成や破棄等をさらに自作します。そうすることで、マルチスレッドで駆動するという方針を目指しました」
その上で、ゲーム内の動くオブジェクトを担うMoveObjectも用意。こちらは速度、重さ等の物理演算や衝突判定には欠かせない要素です。

「このMoveObjectを継承する形で、様々なオブジェクトを実装していく流れになります」
衝突判定の最適化
次に③衝突判定の最適化について。