unityroom 投稿ふたたび

 またミニゲーム作ったよの巻

unityroom に 2 つ目のゲームを投稿しました。

着陸スペース

相変わらず Unity の物理エンジンに全面的に乗っかったゲームですが、今回は Rigidbody2D を使ってみました。プリミティブの Cube や Cylinder を飛ばしていますが、追加直後は 3D 版の Rigidbody や Collider がアタッチされているので、これを削除して 2D 版のものをアタッチし直す必要があります。これをしておかないと、衝突時せずすり抜けてしまうので注意が必要です。

制作履歴

Mercirual のコミットログと記憶を参考に当時の制作状況を振り返ってみると、こんな風になりました。

2017/11/18Unity 京都スペシャル 2 の後に製作開始
2017/11/2216th ichi-pixel で未完成版を魅せて回る(別記事に書く予定)
2017/12/12初版公開
2017/12/19最終版(効果音付き)公開

unity1week のお題「space」の期間が 2017/11/13 ~ 19 なので...いやはやほぼ 1 ヶ月の大遅刻ですね…いやはや面目ないです orz

動機

Unity には ParticleSystem (Shuriken) という便利なモジュールがありますが、これに対して私は当初エフェクト専用なのかな?という印象を持っていました。しかし、ゲームデザインに関わる処理に使えるかどうか、具体的にはシューティングの弾などに使えるかかどうか知りたかったので、実際に使って確認してみました。結果、OnParticleCollision() というイベントハンドラがあるのでまったく問題ありませんでした。 あとは完全に自分の趣味です。Xbox360 の Xbox Live Indies Game に Superspace というゲームがありましたが、自機からワイヤーを垂らしてブロックを運ぶ、という基本的な挙動はこれのパクリです…。そもそもこの手の慣性操作のアクションシューティング(海外では Cave Flyer というジャンルで呼ばれているらしい)そのものが大好きでして、精密な操作が要求される場面でコントロールし切る自分カッケーと悦にひたりつつも、外部からの何でもない攻撃や障害物が迫ってきて軽くパニックになる緊張感がたまりませんでした。 当初はそういうものを作りたいと思っていたのですが…実際に出来上がってみたものは、激突してブロックが舞い上がった隙間に潜り込む戦略が一番タイムが短縮できるようです...どうしてこうなった。(いや自機の体力を設定せず無敵にしたせいですね…とほほ) 技術的(Unity 的)な動機としては、Unity ゲーム制作で必要とされる要素(タイトル・設定・ランキング等)やアセット(後述)を一通り経験しておきたかった、というものがあります。

雑感

ランキングを実装しているうちに、ゴール時のスクリーンショットを撮ってランキングに掲載してみたくなった、効果音が欲しいとの声に応えて付けたくなった、などの脱線もありましたが、それらも含めてやりたかった事は一通り実現できたので自分としてはとても満足しています。 制作途中の版でも人に見せたことでモチベーションが維持できました。どういうゲームかもわかってもらえない状況で反応が薄いのはしょうがないと思いますが、見せないよりはよっぽどよかったです。あと GPD WIN はデモ機に最高。 製作中の作業は、基本的に寝る前の 1 ~ 2 時間程度(たまに早朝も)で、何かに詰まった時は無理せず睡眠を優先し通勤途中にネットで調べものなど行いました。基本スローペースではありますが、小さなことでも問題が 1 テーマずつ片付いていくのはとても楽しい経験でした。 使用アセット 使用したアセットは以下の通りです。

  • Zenject Dependency Injection IOC Singleton の他、今夏は Factory や MemoryPool(オブジェクトプール) も含めてがっつり使ってみました。Validation (Shift+V) が通るまではエラーがわかりにくくて苦難の道のりですが、それを乗り越えると実感できる [Inject] の手軽さは手放せません。
  • UniRx - Reactive Extensions for Unity 自機やメニューなどほぼ全ての制御はこちらをつかって書きました。強力なイベントフィルタリングや Reactive Property のおかげで if ブロックを使うことなく、すっきり書くことができました。
  • LINQ to GameObject メニューのフェードイン・フェードアウト処理の際に例えば「名前が Button で始まる GameObject の Button コンポーネント」だけを選び出す必要があり、そのような場面でこれを使うと 1 行でかけてとても重宝しました。
  • DOTween (HOTween v2) メニューのフェードイン・フェードアウト処理に使いました。1 行で書けるため多用してしまった…。大玉ドリブルの時は Update() 内で状態変化からの経過時間からアルファ値を求めて毎フレームセットしていた事を考えると、ずいぶんと楽できました。
  • TextMesh Pro (Unity2018.1 以降、PackageManager からインストール形式に変更されました) メニューやランキング・設定・スコア等の全ての文字表示に使いました。当初、項目が増えるたびにテキストファイルからフォントを生成するようにしていましたが、途中で面倒になりこちらの記事のようによく使う文字を全て登録してしまいました。
  • PLAY Animation Importer for Unityとてかん CGPLAY Animation のパーツアセンブラファイルを Unity に取り込む拙作のプラグインです。Cube と Cylinder しか使ってないように見えますが、実は自機のみ角の取れた立方体でして、このプラグインで取り込みました。
  • Recorder 今回も動画撮影に使用しました。uGUI や効果音も録画さえるようになり使い勝手が良くなりました。 この他、以下のソースコードを一部改修して使用させて頂いています。
  • unityroom-tweet unityroom に投稿された作品から結果等をツイートするサンプルです。2017.2 対応を行いました。
  • Leaderboard For Unity WebGL Nifty Cloud Mobile Backend を使ったランキングのサンプルです。2017.2 対応、Zenject 対応、ランキング登録項目にスクリーンショット画像を追加、などの対応を行いました。

Unity に直接関係ありませんが、以下のツールも使用しました。

  • Bfxr chiptune っぽい効果音の作成で重宝しました。ランダム生成で基本で、気に入ったものが出るまでひたすらクリックしてました…。
  • Sound Engine Free 効果音の調整に使用しました。カットしてフェードインまたはフェードアウトするだけでしたが…。

なお、Unity 2017.2 用のプロジェクト一式を github で公開中です。Unity をお持ちの方はよかったらお手元でビルドしてみて下さい。

文責:ともたこ/Tomotaka Ogino Twitter/github/Qiita