2D迷路アクションゲーム 【幽霊が出る洞窟からの脱出】 個人Unityゲーム開発
福岡工業大学 工学部 電子情報工学科 辻󠄀塚 悠斗 初代 ゲーム作品
ゲームプレイ(UnityRoom)URL :
https://unityroom.com/games/cave_escape
プレイ動画(YouTube)URL:
https://youtu.be/eyVTCcVmb5g
GitHub URL :
https://github.com/Tsu-0831/GhostE
<製作期間>
2023年2月1日 ~ 現在
<使用環境>
ゲームエンジン : Unity
言語 : C#
<概要>
■本ゲームのジャンルとタイトルの選定の理由
(1)前提条件・目的
まずはどういったものを作りたいのかを明確化するために前提条件を定めました。
・Unityを使ったゲーム開発の能力が成長できる
・コーディング力も向上させたい
・エンターテインメント性に富んだものを作る
(2) 条件を考慮した結果...
・プレイヤーに爽快感や達成感を与えやすいアクションゲーム
・なつかしさを感じるドット絵
以上の点から本ゲームの内容は、迷路のように入り組んだ洞窟と定期的にスポーンと強化を繰り返す幽霊を、プレイヤーが魔法を駆使して攻略するゲームに決定しました。
アクションゲームを採用することで、様々な機能を採用でき、個人のゲーム開発力を高める効果を期待しています。
<工夫した点>
■UI
(1) 操作方法
ユーザーが操作方法が分からず調べる手間をなくすために、プレイ前に表示しました。また、キーボードや矢印、マウスクリックのイラストを使用することでユーザーが一目で分かるようなデザインを心がけました。(素材元のサイトのURLは一番下に表記)
(2) プレイヤーミッション
プレイヤーがステージに放り出されたときの画面(以下プレイ画面)、何をすべきか困惑することを防ぐため、プレイ画面の下方にプレイヤーミッション(何をするか)を常に表記しました。
クリア条件を満たすと、プレイヤーミッションの表記も変わります。
※クリア条件の詳細は後述
(3) その他表記
・画面遷移方法を必ず記述
画面遷移が必要な画面には必ず遷移方法である[スペース]キーを押すことを表記しています。
・HPとMPのバー表示
ユーザーのパラメータの状況を一目でわかるようにバー表示にしました。
■ゲーム性
(1) 敵のパワーアップ
敵は、20秒に1回パワーアップされるような設定になっています。
これにはプレイヤーに焦燥感と臨場感を味わっていただく目的があります。
また、パワーアップ内容が同じでデジャブにならないようにパワーアップ内容はランダム性を持たせました。
パワーアップ内容は2通りあり、「敵の攻撃力アップ」、「敵の移動速度アップ」です。
(2) 結果のスコアとランク判定
ゲームのクリア後、クリア画面に遷移するとスコアとそれに応じたランクが表記されます。ランクはS~Cまであります。さらにスコアの内訳も表記しているため、スコアを上げるための考察も必要になってきます。
これにはプレイヤーに一喜一憂していただく目的があります。
スコアもそれに応じたランクも低ければ、さらに高くしようと挑戦意欲が湧いて何回もプレイしていただけると考えています。
(3) プレイヤーの攻撃方法
攻撃方法は左クリックでMPゲージを貯めることができ、右クリックを押すと貯めた分の回数分太陽型の弾をクリックした方向に打ちます。
当初はスペースを押すと向いている方向に弾を打つ方式でした。しかし移動方向が上下左右の4方向であるため、同じく弾を打つ方向も4方向で制限されている感覚になっていました。これを解消するための考えがあり、今の攻撃方法となっています。
(4) ゲームのクリア条件
脱出するための出口にはオブジェクトがあり通れません。オブジェクトを消すには敵がスポーンする魔法陣をすべて踏む必要があります。これがクリア条件です。
これには私の作成した洞窟のマップを満遍なく楽しんでいただく目的があります。
※洞窟マップをプロシージャル生成を用いて自動生成する機能を検討中
■ソースコード
以下では、C#のソースコードについて触れます。ソースコードの全容は以下のGitHubURLの実行ファイルの"Assets/Script/"内にあります。
(1)クリア条件
ソースファイル名 : ClearCondition.cs
クリア条件を1つのスクリプトにまとめ、後にクリア条件を追加できるようにしました。クリア条件に関連することであれば他オブジェクトにも参照できるため、このスクリプト1つでクリア条件を制御できます。
(2) キャラクターのパラメータ
ソースファイル名 : UnitManage.cs
敵キャラクターの名前、衝突時のHP処理に使用する攻撃力、移動スピードのパラメータをそれぞれの配列名の同じ番地に格納することでパラメータを管理しています。
データベースでの利用も考えたのですが、時間との制約によりこれ以上スコープを拡大するわけにはいきませんでした。この点を解消するために、疑似的なデータベースを作ろうと工夫したのが以下のスクリプトです。
データベースの利用は後々実装予定です。
UnitManage.csの一部
例えば敵キャラクターにぶつかった時は、別のソースコード内(PlayerControll.cs)で敵キャラクターの攻撃力分HPを減らす処理をしていますが、その攻撃力の値はUnitManage.csの"charpower"変数を参照して計算しています。
PlayerControll.csの一部
後の敵キャラクターの追加を配列に追加するだけで可能としています。
(3) 弾を打つ方向の取得
ソースファイル名 : PlayerControll.cs, AttackController.cs
マウスクリックした方向に弾を打ち出す処理は、プレイヤーの現在座標とマウスクリックした座標のX、Y座標それぞれの差によるベクトルを算出し正規化した後、弾の座標(初期値はプレイヤーの座標)に加算することで実現しました。正規化した理由は、プレイヤーの座標とマウスクリックした座標との差の大きさによる弾のスピードの変化をなくすためです。
PlayerControll.csの一部
上のソースコードの1行目はBulletオブジェクト変数に弾のプレハブをインスタンス(生成)しています。
次にAttackController.cs内にあるベクトルを算出する関数getVect関数を呼び出しています。関数の引数は、プレイヤーの座標とマウスクリックした座標です。
AttackController.csのgetVect関数
AttackController.csのUpdate(更新し続ける)関数
(3) 設定値
本ゲームには、設定値(敵のパワーアップまでの時間(20秒), パワーアップ量, 敵キャラクターのパラメータ等)が存在します。その設定は少しずつ値を変えながら細かく調整していく必要があります。なのでそういった値は、変数宣言の前に"[SerializeField]"を記述することで、ソースコードを開いて代入処理をするのではなくエディター上で調整できるようにしました。
PlayerControll.csの一部
<今後の開発>
別ゲームの開発を行いながらではありますが、日々改良していき私の初ゲーム作品を最高の作品に仕上げていきたいと考えています。
■現在実装を考えているもの
- スコアのランキング:データベース利用
- 暗闇モード:スリル感を増したい。開発タイムラインが比較的短いため、優先実装!!
- 操作キャラ・敵キャラの種類の追加:バリエーションのなさがあるため
- ステージ生成方法:プロシージャル生成か機械学習
<プレイ動画>
<学習に使用したツール>
・Unity アセット Lego Microgame
まずは、Unityに慣れるために、このチュートリアルを行いました。1週間程度で終了し、Unityでのオブジェクトの扱い方等、色々学習できました。
・Unity アセット 2D Game Kit
2Dゲームの開発に役立つ知識が満載でした。