【unity】ゲーム開発の記録Vol.16【名も無きゲーム開発】

はじめに

ゲーム制作の進捗ブログの第16回となります。
今回はポーズ機能の実装について。

制作も終盤で公開できる画像が少ないため、しばらくは地味めなお話を…

「CorgiEngine(コーギーエンジン)」
自分はUnityを始めた頃から利用しているアセットなので、これなしでは開発ができません。ソースコードを分析することで勉強にもなっています。
2Dアクションをつくるなら超絶おすすめです!!

前回のブログは↓こちらです

※初回のブログは↓こちらです

春から夏にかけての進捗2

ポーズ機能実装

ゲームに不可欠なポーズ機能。
昔のファミコン初期の頃はゲームを停めて、一休みできればそれでオッケーだったけど、最近ではポーズ機能だけではなく、ポーズすると同時に設定画面やアイテム選択画面、マップ画面を表示するのが当たり前だ。

自分のゲームではこの辺りは極力単純にするつもりだが、画面を止めるだけのポーズ機能だけではなく、簡単なコンフィグ画面やゲームをリタイアする機能くらいは実装したい。

とりあえず調べたところ、Unityでは一番簡単な方法として、時間を止めれば良いらしい。
具体的には下記の様にタイムスケールを0にすれば良い。

Time.timeScale = 0f;

しかし時間を停めてしまうとアニメーションも止まってしまうため、設定変更などの操作を行うことが難しくなってしまう。

スマホ対応のみで制作していた段階では、タッチ操作が中心のため、時間を止める実装でも問題なかったが、Steamでのリリースを含めゲームパッドでも遊べる様に対応させようとすると、時間を止めるだけでは問題が起きる。

単純なところで、選択、実行をするためのカーソルなどの操作ができない…

「時間を止める」以外の方法でポーズ機能を実装しようとすると、突然ハードルが上がる。
※気がする

先人たちの処理方法を調べてみると、ポーズで止めたいオブジェクトをタグで分けて、ポーズのたびに制御する実装が多い様だ。

コーギーエンジンでもその様な実装ができるように専用のクラスなどが用意されていたので、テストシーンで確認してみたが、ポーズ中に操作ができてしまったり、フリーズしたり動作が不安定だったので、今回は自分で実装することにした。
※実際のところは使用方法がよくわからなかった。

できるだけ単純に実装したいので、ポーズで止めたいオブジェクトをフォルダに突っ込んでいっぺんに無効にしてしまう方法を考えた。

この方法は動作が単純なザコキャラには有効だが、ボスキャラや複数の動作を持つ様なキャラでは、動作とアニメがづれてしまったり、明らかに挙動がおかしくなるため使えず。

思考をこねくり回しました結果、やっぱり「時間を止める」方法に戻って実装を進めました。

数々の問題が自分を苦しめましたが一つ一つ解決。

・オブジェクト選択時のカーソル操作
予めセットされたオブジェクトの表示、非表示で対応。
・ポーズの瞬間にプレーヤーが死んでしまった場合問題。
ポーズの瞬間にプレイヤーオブジェクトを無効にする。
・画面上の設定ボタン、キーボード、コントローラーのポーズボタンの同時押し問題。
ポーズ無効フラグや設定ボタンのマスキング。
・リザルト画面や、死んだ時の画面が表示された時のポーズ機能の排他処理。
他の画面表示時にポーズ無効フラグを立てる。
・ボタン連打の防止処理。
指定秒数ボタンを押せなくする。
・リタイアした際のデータ補完処理。
がんばった。

結果できあがったポーズ画面がこちら。

何の変哲もなく、みどころもないポーズ画面ですが、
このような作業の積み重ねがゲーム制作なんだなあとしみじみ。

最後に…

初めて制作したゲーム「DRAGON’S TOWER(ドラゴンズタワー)」はAppStore、Google Playにて、無料で配信中です。気になったら遊んで頂ければ幸いです!

「DRAGON’S TOWER(ドラゴンズタワー)」

Google Play で手に入れよう

タイトルとURLをコピーしました