【Unity】RPGを作るチュートリアルその49 戦闘中の行動を処理する機能の実装準備

【Unity】RPGを作るチュートリアルその49 戦闘中の行動を処理する機能の実装準備

シンプルなRPGをUnityで作るチュートリアルシリーズの49回目です。

第48回ではメッセージウィンドウ内のUIと、ウィンドウ全体を制御するクラスを作成しました。

今回は選択されたコマンドに応じた、戦闘中の行動を処理する機能について、全体の方針を決めて実装の準備を進めていきます。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はメッセージウィンドウ内のUIと、ウィンドウ全体を制御するクラスを作成しました。

 

戦闘中の行動をどう処理するか

RPGでは戦闘中に選択されたコマンドに応じた行動をとります。攻撃を選べば敵キャラクターを攻撃し、魔法を選んだらその魔法に応じた効果が発揮されます。

今回からこの処理を行なっていく機能を作っていきたいと思います。基本方針としては、コマンドなどに応じて行動を登録して、その行動の優先度に応じて順番に処理していく仕組みを作ります。「BattleManager」からは主人公側のコマンド選択に応じた行動登録、「EnemyCommandSelector」という敵側のコマンドを決定するクラスからも行動登録を行います。登録処理が終わったら、「BattleManager」から「BattleActionProcessor」という行動を処理するクラスに通知を行い、ターン内の行動を順番に処理していきます。コマンドに応じた処理は別のクラスに分けて、個別に管理できるようにしたいと思います。こうしておくことで、コマンドが増えた時にも改修がしやすくなるかと思います。

 

戦闘中の行動処理の概要
戦闘中の行動処理の概要

 

行動の優先度については、値の大きなものから処理していく予定です。なので、行動の登録を行なった際にリストとして項目を保持して、それを優先度で並べ替えてから処理、なんて流れになります。

行動の内容を保持するクラスについても作成しておきます。誰が、誰に対して、どんな優先度でどんな行動を行うのか、情報を持たせることで、処理クラス側で判別できるようにします。今回は敵味方ともに1対1の状況で戦うため、行動の情報もシンプルになるかと思います。

 

行動の内容を保持するクラスの作成

行動の内容として保持したい情報としては、

  • 行動者のID
  • 行動者が味方かどうかのフラグ
  • 対象のID
  • 対象が味方かどうかのフラグ
  • 選択されたコマンド
  • 選択された魔法やアイテムのID
  • 行動者の素早さ
  • 行動の優先度

です。「誰が、誰に対して、どんな優先度でどんな行動を行うのか」といった点を表現するためにこれらの項目を入れておきます。

ここで、「行動者のID」に関しては、味方ならキャラクターIDで判別しますが、敵キャラクターに関しては戦闘中に割り振るIDを使用するようにしたいと思います。これは将来的に戦闘中の敵キャラクターが複数になることを想定しています。ドラクエでいうスライムA、スライムB、といった感じで同じ種類のモンスターでも区別をつけている状態です。これを戦闘中IDとして扱いたいと思います。

Projectウィンドウから「Assets/Scripts/Battle」のフォルダを開き、戦闘中の行動関連のスクリプトファイルを配置するフォルダを作成します。名前は [Action] にしました。

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

 

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

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

 

作成した「BattleAction」の中身は以下のように記載しました。

上で列挙した項目をそのままフィールドとして実装しました。「BattleActionRegister」という行動を登録するクラスからこのクラスに対して情報をセットし、「BattleActionProcessor」という行動を処理するクラスで処理していく流れになります。

 

行動を処理するクラスのインタフェースを作成

行動を処理していくクラスについては、コマンドに対応するクラスを作って、具体的な処理をそちらで行うようにしたいと思います。こうしておくことで、コマンドが増えた場合でも具体的な処理は個別のクラスで管理することになり、修正する箇所も把握しやすくなります。

必要なメソッドを定義するため、インタフェースを使って実装を強制しておきたいと思います。必要なメソッドとしては、

  • 参照を設定するメソッド
  • 行動を処理するメソッド

の2つを用意します。

Projectウィンドウから「Assets/Scripts/Battle/Action」のフォルダを開き、空のスクリプトを作成します。名前は [IBattleActionProcessor] にしました。

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

 

作成した「IBattleActionProcessor」の中身は以下のように記載しました。

上で列挙した2つのメソッドをインタフェースに含めています。SetReferencesの引数で指定している「BattleActionProcessor」についてはまだ作成していないのでコンパイルエラーが出ると思いますが、この後作成していきましょう。

「BattleActionProcessor」では各行動を処理している状態を保持する想定なので、それを個別クラスから参照できるように、自身の参照を渡す想定です。

 

行動を処理するクラスの作成

行動を処理するクラスについてもファイルだけ作成しておきたいと思います。具体的な処理内容についてはまた後続の回で実装予定なので、行動をリストで保持したり、行動を登録する部分だけ作っておきたいと思います。

Projectウィンドウから「Assets/Scripts/Battle/Action」のフォルダを開き、MonoBehaviourのスクリプトを作成します。名前は [BattleActionProcessor] にしました。

名前が似ています
名前が似ています

 

作成した「BattleActionProcessor」の中身は以下のように記載しました。

行動の登録に関する部分を実装しています。これがあればおそらく「BattleActionRegister」を実装する時にも必要なメソッドが用意できている状態になりそうです。

他にも行動順の決定や、各行動を順番に処理していくメソッドを後の回で実装していきましょう。

 

スクリプトのアタッチ

スクリプトを保存したら、ゲームオブジェクトの作成してスクリプトをアタッチしましょう。

Hierarchyウィンドウから「BattleParent」の下にある「Managers」のゲームオブジェクトを選択します。「Managers」の下に、空のゲームオブジェクトを作成しましょう。名前は [BattleActionProcessor] にしました。

ゲームオブジェクトの作成
ゲームオブジェクトの作成

 

Inspectorウィンドウで今回作成した「BattleActionProcessor」をアタッチします。

スクリプトのアタッチ
スクリプトのアタッチ

 

今回はまだ動作確認できる部分がないので、スクリプトをアタッチしたら完了です。

 

今回のブランチ

 

まとめ

今回は選択されたコマンドに応じた、戦闘中の行動を処理する機能について、全体の方針を決めて実装の準備を進めていきました。行動の情報を保持するクラス、行動を処理するクラス向けのインタフェース、行動処理の全体を管理するクラスを作成しています。

次回は選択されたコマンドに応じて行動を登録するためのクラスを作成していきます。

     

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

CTA-IMAGE

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


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


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