【Unity】RPGを作るチュートリアルその52 敵キャラクターの行動選択を行うクラス

【Unity】RPGを作るチュートリアルその52 敵キャラクターの行動選択を行うクラス

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

第51回では敵キャラクターの行動を決定するにあたって、敵キャラクターの戦闘中のステータスを保持するクラスを作成しました。

今回は敵キャラクターの行動を決定するクラスを作成していきます。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回は敵キャラクターの行動を決定するにあたって、敵キャラクターの戦闘中のステータスを保持するクラスを作成しました。

 

敵キャラクターの行動選択を行うクラス

キャラクターと同様に、敵キャラクターについても戦闘中の行動を選択するようにしたいと思います。敵キャラクターの場合は、定義データで決めた行動の中から、優先度に応じて選択するようにします。

優先度や条件など、それぞれ計算を行なって、ターン内に選択されるものを決めていきたいと思います。

まず最初に計算するのは優先度で、優先度の高い行動順にリストを並べ替えてループを回します。そこからそれぞれの項目で条件を確認して、合致するものを選択していきます。合致するものがなければ通常攻撃を選択するようにしておきます。

今回のチュートリアルでは条件としてターン数、敵キャラクターの現在HPを実装していますが、他にも色々と条件にできるものがあるので、拡張していく際にはRPGの雰囲気や敵キャラクターの性格などを加味して行動を決めていくのも良いかと思います。

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

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

 

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

行動選択の完了を通知するために「BattleManager」への参照、現在のHP/MPや戦闘中IDを確認するために「EnemyStatusManager」への参照、行動を登録するために「BattleActionRegister」への参照をそれぞれ保持するようにして、SetReferences()のメソッドで渡しています。

敵キャラクターの行動選択が必要になったタイミングでSelectEnemyCommand()が外部から呼ばれ、「EnemyStatusManager」のリストに登録されている敵キャラクターのうち、撃破フラグ、逃走フラグが共にfalseのキャラクターについて行動を決めていきます。

どの行動を選択するかは、SelectActionFromRecords()のメソッドの中で決めていきます。優先度に応じて並べ替えた後、CheckCondition()のメソッドを呼んで条件を確認していきます。このメソッド内ではさらに条件の種類に応じて処理を分けています。

CheckTurnCondition()ではターン数の条件を比較し、CheckHpRateCondition()ではHP残量(割合)の条件を比較しています。また、行動選択で魔法が選ばれた時にも、CanUseMagic()のメソッドで消費MPと現在MPを比較して使用できるかどうかを確認しています。

CompareValues()のメソッドは比較用のメソッドです。int型での比較、float型での比較ができるようにオーバーロードを用意しています。

 

既存のクラスの修正

新しく作ったクラスと繋ぎ合わせるため、既存のクラスも修正していきます。対象は、

  • BattleManager

です。

 

BattleManagerの修正

「BattleManager」では参照用のフィールドを追加するのと、初期化処理、コールバック用メソッドの追加を行います。

前回追加した「_enemyStatusManager」の下に追加しましょう。また、行動を登録するためのクラスへの参照もここで追加しちゃいましょう。

 

次にStartBattle()の中で初期化処理を追加します。参照をここでアサインするようにしましょう。

 

ファイルの末尾、以前作成したOnFinishedShowMessage()の下に、PostCommandSelect()とOnEnemyCommandSelected()の2つのメソッドを追加します。

PostCommandSelect()は味方キャラクターの行動が選択された後に呼ばれる想定のメソッドです。味方の行動を登録する部分は、行動処理のクラスが実装できてから作っていきましょう。

OnEnemyCommandSelected()のメソッドは、今回作成した「EnemyCommandSelector」から完了を通知してもらうためのメソッドです。敵味方の行動が決まったら、実際に処理していく流れになります。

 

スクリプトのアタッチ

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

 

EnemyCommandSelectorのアタッチ

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

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

 

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

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

 

BattleManagerへのアサイン

続いて、「BattleManager」に「EnemyCommandSelector」と「BattleActionRegister」への参照をアサインします。

参照のアサイン
参照のアサイン

 

動作確認

今回も戦闘を開始してエラーがないことだけ確かめておきましょう。

 

今回のブランチ

 

まとめ

今回は敵キャラクターの行動を決定するクラスを作成しました。今回のチュートリアルでは行動の条件を少なくしていますが、チュートリアル後に作りたいRPGに応じて拡張していくのも良いかと思います。

次回は行動選択を行うクラスを実装していきます。全体の処理を管理するクラスについては作成済みのため、登録以外の処理について実装していきます。その後、個別の行動を処理するクラスの作成に進みたいと思います。

     

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

CTA-IMAGE

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


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


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