hildsoftの裏庭

メインでは書かない種類の雑記です

unity1week第六回お題「Space」に参加したので開発まとめ

unity1weekとは

Unity 1週間ゲームジャム | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

月曜0時開始、日曜20時締切の1週間ゲームジャムです。

毎回お題が発表されるので、それに沿った(拡大解釈可)ゲームを作ります。

時間配分などは各自に任されているので、有給取るなどして1週間ガチでやるも良し、毎日少しずつ作って週末ブーストするも良し、ネタに走って短時間で片づけてもokなお祭りです。

日曜提出なので、自分の技術力やリソースとも相談しながらあまり複雑にならないようなゲームを作るというバランスも求められます。

時間オーバーしても提出できるみたいですが、この辺はルールなので極力守りたいところ。

今回は1日以上遅れてしまいました。

どうしても風呂敷を広げがちで収めきれない、今後の課題です。

参加の記録

今回の目標

今回で3回目の参加になります。まだまだ期間内で満足のいく仕様に収めて完成させることができてないですね。反省です。

今回の目標は

  • UnityでWebGLを使ったら弾幕系シューティングゲームって作れるかを調べること
  • ネットランキング、SNS対応

を設定しました。

前回までと違い、少し時間をかけてでも今後のスマートフォンアプリなどで使えるよう、そろそろマネタイズを意識した動きになりました。


今回作成したもの

f:id:hildsoft:20171121060905p:plain

https://unityroom.com/games/survivalspace

迫りくる弾幕を制限時間まで避けるだけのゲームです。

敵を倒したり、ボムを使って弾をかき消すなどはありません。

1発被弾で即死というものではなく、シールド値を削りきられたらゲームオーバーです。


事前準備など

今回はシューティングゲームかローグライクゲームを作ろうとゲームジャムの前から考えていました。

実際に作業を開始したのはお題が発表されてからですが、どちらかのジャンルに結び付けられれば開発、そうでなければ簡単なもので済ませる予定でした。


ジャンル決定と方針

Spaceというお題から、シューティング系や宇宙系はかなり被るだろうなぁと感じました。

ゲームジャムですしネタ被りは問題ないのですが、個人的に避けたいのです。

グラフィック素材での差別化が難しいので、アイディアか技術面で何か独自色を出せないかなと思っていたところ、昔LibGDXを使って弾幕シューティングを作ろうとしてGCの壁に跳ね返されたのを思い出し、Unityで再挑戦することにしました。

当時はスマートフォンもCPU性能が低く、メモリも少なかったので結局諦めたのでした。


まずは調査

WebGLでは今までも痛い目を見ているので、特に処理負荷の面で心配だったので最初にどのくらいの弾数を出せるか実験してみました。

f:id:hildsoft:20171121064318p:plain

f:id:hildsoft:20171121064554p:plain

Unityでのオーソドックスな手法で弾を出してみたところ、案の定GC発生して等間隔で打ち出していた弾がズレました。

弾幕ゲームは弾幕の形状が曲線で綺麗に表示されるのが好ましいので、完全には無理だとしても違和感がない状態までに抑えないといけないことと、操作時にカクつきを感じないくらいまで処理を高速化or弾数を制限しなければいけません。


GC対策

GC回避の特効薬はオブジェクトプールを利用することですが、メモリを解放しないのでメモリ管理の知識は要求されます。
今の時代ある程度メモリには余裕があるので、結構雑にメモリを確保しても大丈夫だと考えて大きめにプールを確保することにしました。

f:id:hildsoft:20171121065106p:plain

オブジェクトプールを使って、表示だけしたところです。

当たり判定は実装していませんでしたが、GCが発生していたときの4倍くらいの量(2500程度)の画像を表示しても問題なく動くようになりました。

この状態で一度WebGLに書き出して試したところ、Unityエディタ上ほどの性能は出ませんが十分動くことが確認できました。

一般的な弾幕ゲームでは1500くらい弾数を出せれば十分なので、このまま進めることにしました。


ゲームエンジンを使う意義

直接DirectXやOpenGLを触ったことのある方ならわかると思いますが、オブジェクトがどこに行ったか分からなくなるんですよね。

カメラとは別でゲーム内の空間を自由に見ることができるだけでも、ゲームエンジンを使うメリットは十分あると感じています。

性能だけを追求したいのであればC++でネイティブのコンパイラを使えばいいのでしょうが、やはり複数プラットフォーム展開、開発効率を考えたらUnityなどのエンジンを工夫して使う方が効率的だと感じました。


アセット

前回からArbor2を使用しているのですが、今回のメイン処理は高速化が求められるので、残念ながらモック作成用に序盤と最終的に画面遷移などの外枠での使用にとどまりました。

便利なアセットなので、最適化が必須となる環境では使用が制限されるのが残念です。
利便性を取るか性能を取るか、バランスを考慮する必要があります。


以下は今回使用したアセットです。

少しずつの利用でしたが、自分で作成するよりは良い物ができました。

製作者の方にこの場を借りてお礼申し上げます。

総括

やりたいことを絞れなかったため色々と未消化な部分があります。

前回できなかったSNS対応は、1日遅れたこともあり一応達成することができました。

UnityではIL2CPPの恩恵が得られるので、それほど専門的な知識がなくても実装次第では弾幕ゲームを作れる事が分かったことは収穫でした。

今回のノウハウはスマホゲームを作る上での経験値になったと思います。

もう少しソースコードを整理してスマホゲームのプロトタイプができたら、デザイナーさんを誘ってマネタイズできるようなゲームとして出してみたいですね。