【Unity】RPGを作るチュートリアルその21 戦闘のフェーズの方針決め

【Unity】RPGを作るチュートリアルその21 戦闘のフェーズの方針決め

シンプルなRPGをUnityで作るチュートリアルシリーズの21回目です。戦闘機能に関しては逐次実装していくと手戻りが多くなりそうだったので、一度全体を実装してからチュートリアルの形に落とし込んでいます。思ったより時間がかかりました……(白目)

第20回ではダメージ計算式を中心とした戦闘に関連する計算を行うクラスを実装しました。

今回は戦闘の流れを作っていくうちの、戦闘のフェーズの定義や、ゲーム全体の状態の定義から行なっていきます。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。

 

チュートリアルの一覧

このシリーズ全体の一覧は以下のページにまとめています。

 

前回の内容

前回はダメージ計算式を中心とした戦闘に関連する計算を行うクラスを実装しました。

 

戦闘のフェーズの方針

戦闘に関して全体を管理するクラスを作って、その中でフェーズに応じて処理を変えていきたいと思います。考えられるフェーズとしては、

  • 非戦闘
  • 敵の表示
  • コマンド入力
  • 魔法やアイテムの選択
  • 行動
  • 戦闘結果

あたりでしょうか。上からコマンド入力までは順番に進んで、決着がつくまではコマンド入力から行動が繰り返されるイメージです。非戦闘の状態の場合は、戦闘関連の処理は行わず、移動関連の処理が行われるようにします。

フェーズに関してはEnumで実装して、項目名で名前が分かるようにしておきます。

 

ゲーム全体の状態

今後のゲーム全体の制御を考えると、

  • キャラクターの移動パート
  • 戦闘パート
  • イベントの処理パート

と大きく3つの状態に分けられます。移動パート中は戦闘が勝手に始まらないように、戦闘中はキャラクターの移動ができないように、それぞれ状態を分けておきたいと思います。本格的に制御していくのはイベントの処理を実装していく段階になるかと思いますが、この段階で用意しちゃいましょう。

操作時の制御を考えてこの3つにしていますが、タイトル画面やセーブファイルのロード画面などを作る際に項目が必要になったら都度追加していきます。現時点では上記3つ以外はNoneで一括りにしておきます。

こちらもEnumで実装します。

 

スクリプトファイルの作成

戦闘のフェーズの定義

まずは戦闘のフェーズの定義を作成していきます。Projectウィンドウから「Assets/Scripts/Enums」のフォルダに移動して、空のスクリプトファイルを作成します。名前は [BattlePhase] にしました。

スクリプトファイルの作成
スクリプトファイルの作成

 

作成した「BattlePhase」の中身については、上の方針に沿って以下のように記載しました。

戦闘中の処理段階に応じて、フェーズを変更していって今どのフェーズなのか分かるようにしておきます。

 

ゲーム全体の状態の定義

続いてゲーム全体の状態の定義を作成していきます。Projectウィンドウから同じく「Assets/Scripts/Enums」のフォルダで、空のスクリプトファイルを作成します。名前は [GameState] にしました。

ゲーム全体の状態の定義を作成
ゲーム全体の状態の定義を作成

 

作成した「GameState」の中身については以下のように記載しました。

ゲーム開始前のタイトル画面やセーブファイル選択画面などは一旦None扱いにしておいて、ユーザがキャラクターを操作する際の制御として使うことを想定しています。

 

ゲーム全体の状態を管理するクラス

作成した定義を使って、状態を保持するクラスも用意しておきます。このクラスでは、

  • 状態を管理する
  • 状態を変更する

の2種類の役割を持たせます。

ゲーム全体に影響するクラスなので、MonoBehaviourでシーン内に配置するのではなく、staticなクラスとして実装しておきます。こうすることで、シーンに依存せずにどこからでも状態を参照できるようになります。

システム関連の機能として用意するため、専用のフォルダを用意します。Projectウィンドウから「Assets/Scripts」に移動し、新規フォルダを作成します。名前は [System] にしました。

フォルダの作成
フォルダの作成

 

作成した「System」フォルダの中に移動し、スクリプトファイルを作成します。名前は [System] にしました。

スクリプトの作成
スクリプトの作成

 

作成したファイルでは以下のように記載しました。

他のクラスから参照できるようにpublicなフィールドとして「CurrentState」を用意しています。直接値を変更できないようにsetterをprivateにしています。

メソッドも状態を変えるだけのシンプルなものになっています。どのクラスからどの状態への変更を呼び出しているのか分かりやすくするため、引数で渡すのではなくメソッド名で区別するようにしています。

 

今回作成したクラスに関しては動作確認はまだできないので、コンパイルエラーがなければOKです。

 

今回のブランチ

 

まとめ

今回は戦闘のフェーズの定義や、ゲーム全体の状態の定義を行いました。戦闘関連機能を作るとは銘打ったものの、その準備として実装しておきたいことがたくさんあるので、しばらくは戦闘の準備を行なっていきます。

次回は戦闘のコマンドを定義していきます。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!