テキトウブログ

日々の中で思った事、体験したことを書いていきます

テキトー日記「そうだ、ゲームを作ろう」

お久しぶりです。絶賛就活中のタンクです。


表題の通り、ゲームを作ろうと考え早速作りました。


タイトル「LastStand
ジャンル「ターン制戦術アクションゲーム
対象「カッコつけてニッチなゲームをやりたいと思っている人


今回作ったゲームは「複数の戦車を使って敵戦車をレーダー点滅を頼りに発見、撃破」する
ゲームです。
めちゃくちゃ苦労して制作するのに7カ月(現在進行形)かかりましたが、簡単にプレゼンできる程度は完成しているので私が登録してるサイトなどで発表している次第であります。
このブログでは前半にゲームについての説明、後半に完成までの軌道を説明したいと思います・・・目次をクリックしたらその行に飛ぶ機能が欲しい・・・


目次

ゲーム説明

完成までの軌道



ゲーム説明

(画像のバージョンは古いバージョンです。UI配置が大幅に変更されている箇所があります)


この項ではゲーム説明を行います。ゲームは大まかに分けて「ゲーム以外」のシーンと「ゲーム」シーンの2つに分けられています。



ゲーム以外


ゲーム以外のシーンで最初に表示される画面です。これがタイトルシーンになります。ゲーム以外のシーンは基本的にEnterか画面上で指示されたアクションで行います。




ゲームシーン


ゲームシーンになるとこのような画面になり、画面中央にいる戦車を操作する事が出来ます。基本的な操作はWASDで車体移動JLで砲塔移動です。
画面下部にある緑と黄いろのバーはそれぞれ「HPバー」と「移動制限バー」になります。
HPバー」は攻撃を受けると減少し、0になるとそのキャラは破壊されます。
移動制限バー」は移動すると徐々に値が減少します。



上記の画像を見ると黄色のバーが減少しているのが分かると思います。
戦車によって各種ステータスが違うのでそれについては後に説明します。



画面上には戦車がいないのでQを押して上記画面の様なレーダーを表示します。敵戦車は各戦車に設定された発見距離内に入ると画面上に出現するようになっています。



画面中央奥に見える物が敵戦車です。敵戦車が画面上に出現すると音が鳴り響きます。


戦車を見つけた後に右クリックを押すことでズームモードに入ります。ズームモード中は各種移動速度の半減と一部UIが表示されない制限が課せられます。ズーム中は攻撃と特殊キーを発動する事が出来ます。



特殊キーを押すことで画面左上の値を1消費して画面右上の様なUIが表示されます。Rを押すことで命中精度100%(目のマーク)Fで砲塔照準(歯車マーク)が表示されます。ここで注意してほしいのは画面左上の値は現在の味方ターン全体で使う値のため考えて使いましょう。これにより戦術性がグッと増します。



各戦車にはそれぞれ攻撃回数が設定されています。設定されている攻撃回数を超えて攻撃を行おうとすればこのような警告文が表示されます。


戦車を切り替えたい場合はspaceを押すことでこのようなUIが表示されます。切り替え先の戦車が存在する場合に限り戦車を切り替えを行うことが出来ます。



このように戦車を切り替える事が出来ました。


プレイヤーのターンを終わらせたい場合はEnterをおしてターンエンドボタンを押します。そうする事で敵ターンに入り、敵の行動が終了するとプレイヤーターンになります。この流れを5回行い、5ターン以内に全ての敵を撃破しないとゲームオーバーになります。




完成までの軌道


この項は完成までに行った事について説明していきます。



経緯


・以前紹介した「戦場のヴァルキュリア」(以降「戦ヴァル」)をプレイしていてふと思ったわけです。
「つくりたい!!」
ただマネするのは芸がないと考えた私は戦ヴァルにないオリジナルの要素を考えました。それがレーダーシステムです。レーダーを付ける事で緊迫感を演出することが出来るだろうと簡単に考え事前準備なしにゲームの設計に入りました・・・・後々大変なことになるとは知らずに



開発開始


何も考えずにテキトーに「ターン制アクションゲームつくろー!」なんて考えてプロジェクトを作った瞬間に思いました・・・・・・「どうやって?」


いつものヤツが悪い方に働きましたが自分なりに考えて下記の様な図を作りました。


(直近の図なので当時と違う箇所があります)


GameMangerというスクリプト(コードファイル)を頂点としてすべての挙動を行う作りを考えました。
Unityというゲームエンジンはそれぞれのシーン毎にシーンに存在するスクリプトで挙動を実装します。複数のシーンに一つのスクリプトを移動できる作りが必要になります。そこで私はGameManagerがアタッチされているオブジェクトをシーン遷移の際に切り替えずにそのまま持っていく作りにしました。ついでにそのオブジェクトに「Manegerとついているスクリプト全てアタッチ」しました。・・・・その行いをした数か月前の私を殴りたいです・・

問題

Unityはシーンのスクリプトが初めて呼び出されると「一度だけコードがかかれている部分(Startメソッド)」を実行します。それ以降はアップデートメソッドというマイフレーム毎に呼び出される処理を延々と行います。
今回私は「Managerとついているスクリプト全てアタッチ」と記載しましたが、そのスクリプトにターン管理を行う「ゲーム本編の基盤」となる箇所を入れていました。


ここで目聡いエンジニアの方がこのブログを読んでいるなら気づいていると思います。


「ゲーム本編からタイトル画面に遷移したらマイフレームターン管理の処理が行われる」事に・・・・・・要するにめちゃくちゃ重いゲーム設計を行ってしまったわけです。


とんでもない事態に気づいたのが開発に着手して4カ月後・・・ある程度ゲームが完成している時に気づいたときの絶望感と言ったら脳内に「lemon」の冒頭「夢ならば、どれほどよかったでしょう」というフレーズが脳内ループするほどでした。


解決


先ず新たに各スクリプトの関係図見直すために図として可視化しました。



破壊しないスクリプトはゲーム全体を管理するGamaMangerとフェード機能を行ってくれるSceneFadeManagerだけにしました。それ以外のスクリプトはシーンを管理する各セクションのリーダー的な役割を持つスクリプトとして再構築。ゲーム本編に限りセクションリーダーの配下となるスクリプトを複数配置する図を描きました。


この図を基に現在に至るまで改良を続けており、人に公開できるクオリティになったと自負しています。





終わりに


ゲームを作る際にはゲームの難易度に限らずきちんとした設計を行うようにしよう。テキトーが通じないジャンルだから十分注意して作ろうと思いました・・・・・何度も魂が抜けそうになりました。

×

非ログインユーザーとして返信する