【Unity】RPGを作るチュートリアルその14 敵の行動パターン定義の作成
- 2025.01.22
- RPGチュートリアル
- RPG, Unity, ゲーム開発, チュートリアル
シンプルなRPGをUnityで作るチュートリアルシリーズの14回目です。
第13回ではRPG内で使用する定義データのうち、魔法に関する定義データを作成しました。魔法の種別や効果範囲を判別できるようにそれぞれの定義をEnumで作成しました。
今回は魔法のデータができたので、敵キャラクターの行動パターンの定義を作っていきます。
制作環境
MacBook Pro 2023 Apple M2 Max
Unity6 (6000.0.30f1) Silicon
作業内容と順序
シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。
チュートリアルの一覧
このシリーズ全体の一覧は以下のページにまとめています。
前回の内容
前回は魔法に関する定義データを実装しました。
敵キャラクターの行動パターンをどう作ろう
敵キャラクターがどう動くか、行動パターンを定義しておくと戦闘時に戦略性が生まれます。雑魚敵なら通常攻撃をずっと続けるとか、ボスなら特定ターンで強い魔法を使うなど、敵キャラの定義データと紐付けておくと良いでしょう。
行動を変える条件としては、ターン数、行動回数、HP残量、MP残量、ステータス異常などなど、さまざまなものが使えます。戦闘中の行動決定の処理時に条件を確認して、合致していればその行動をとり、そうでなければ通常攻撃を行う、なんて感じで定義できると良いかと思います。また、複数の条件が重なることもあるので、行動ごとの優先度を定義できるようにしておくと、より制御しやすくなるかと思います。
HP残量の条件を入れる場合、ターン開始時のHPを参照するのか、敵が行動するタイミングでのHPを参照するのかによっても動きが変わります。個人的には行動するタイミングでのHPを参照させたいので、今回のチュートリアルでも行動時に優先度を計算してどの動きにするのか決めたいと思います。
今回のチュートリアルでは、ボスキャラのゴブリンがHP残量50%以下の時に魔法を使うようにしたいと思います。実装する条件としてはHP残量だけで良いのですが、よく使いそうなターン数の条件も入れておきましょうか。
必要なクラス
データの構造としては、敵キャラの定義データの中に行動のリストがあり、個々の行動に対して条件のリストが複数あるイメージにします。定義データと行動は1対n、行動と条件も1対n、になります。定義データであまり入れ子にしたくはないとは思いつつ、今回はこれで実装してみたいと思います。必要に応じて後で調整するかもしれません。
追加で作成したいクラスは、行動を定義するクラス、条件を定義するクラスです。条件についても、基準値とイコールなのか、以下なのか、といった比較用の演算子をプルダウンで選べるようにしたいので、Enumも用意しておきましょう。条件のカテゴリについてもEnumで選択できると良いので、こちらも追加ですね。攻撃や防御、魔法など、行動のカテゴリについてもEnumで選びたいところ。というわけで合計5つのファイルを追加します。
追加が完了したら、既存の敵キャラクターの定義データに行動のリストのフィールドを追加していきます。
行動パターンの実装
それぞれ実装を進めていきます。
比較用の演算子のEnum
まずは条件を比較するためのEnumを作成します。Projectウィンドウから「Assets/Scripts/Enums」のフォルダに移動し、空のスクリプトファイルを作成します。名前は [ComparisonOperator] にしました。
追加したい比較用の演算子は以下の6つです。
- 同じ(=)
- 同じじゃない(≠)
- より大きい(>)
- 以上(>=)
- より小さい(<)
- 以下(<=)
上記の6つをEnumの項目として実装します。
比較する条件のEnum
続いて何を比較するのか、比較する条件のEnumを作成します。Projectウィンドウから「Assets/Scripts/Enums」のフォルダに移動し、空のスクリプトファイルを作成します。名前は [ConditionCategory] にしました。
追加したいカテゴリは以下の2つです。
- ターン数
- HP残量
上記の2つをEnumの項目として実装します。
HP残量に関しては「HpRate」として割合で比較する点をカテゴリの時点で分かるようにしました。
行動の種類のEnum
敵キャラの行動の種類に関するEnumも作成します。Projectウィンドウから「Assets/Scripts/Enums」のフォルダに移動し、空のスクリプトファイルを作成します。名前は [EnemyActionCategory] にしました。
追加したいカテゴリは以下の3つです。
- 通常攻撃
- 防御
- 魔法
行動リストを確認して、どの条件にも合致しない時には通常攻撃をするように仕様として決めちゃいます。リストの中身が0の場合もデフォルトで通常攻撃をするようにします。もしリスト内の行動条件を満たしていても、敵キャラの行動として通常攻撃をさせたいパターンもあるかと思いますので、カテゴリとして作っておきたいと思います。
今回の実装では上の3つですが、他にも「何もしない」とか、「イベント用のフラグをtrueにする」といった行動を入れるのも良いかもしれません。
行動の条件定義用クラス
行動の条件を設定できるクラスを作成します。自前のエディタがある場合は、基底クラスを作った後に、条件のカテゴリごとに派生クラスを作ってそれぞれのフィールドを表示するようにするのが良いかと思います。今回はInspectorウィンドウ内でデフォルトの表示で完結させたいため、別のカテゴリのフィールドも表示されますが、対応するフィールドに値を入れていく感じにしましょう。
Projectウィンドウから「Assets/Scripts/Data」のフォルダに移動し、空のスクリプトファイルを作成します。名前は [EnemyConditionRecord] にしました。
必要なフィールドは以下の4つです。
- 条件カテゴリの選択
- 条件の比較演算子
- ターン数の基準値
- HP残量の割合の基準値
カテゴリに応じて使うフィールドを分けるので、その旨をHeaderの属性で記載しておきます。開発後半になると、頭の中で思い浮かべていた使い方も吹き飛んじゃうんですよね(1敗)
作成した「EnemyConditionRecord」のクラスでは以下のように記載しました。
条件の基準値のフィールドについては[Header]の属性をつけて説明を入れています。また、HP残量の割合に関しては、%で入力するため、[Range]の属性をつけて範囲を指定しています。
このクラスで設定した内容が保存されるように、[Serializable]の属性を忘れずにつけておきましょう。
行動の定義用クラス
敵キャラの行動を定義するクラスを作成します。敵キャラクターの定義データ内では、行動の定義データをリスト形式で保持します。リストの条件に合致しない時にはデフォルトで通常攻撃が選択される仕様にするので、通常攻撃だけさせたい敵キャラについては行動の設定は不要になります。
Projectウィンドウから「Assets/Scripts/Data」のフォルダで、空のスクリプトファイルを作成します。名前は [EnemyActionRecord] にしました。似たような名前が続くのは若干気になりますが、コメントなどのヒントで見分けていきましょう。
必要なフィールドは以下の4つです。
- 行動のカテゴリ
- 条件のリスト
- 魔法の定義データへの参照
- 優先度
カテゴリを選択後、追加で情報が必要になるのは魔法なので、その定義データへの参照フィールドを用意しています。Addressablesで定義データ類のScriptableObjectを持たせることを考えると、パッケージを分ける意味でも直接参照させない方が良かったりします。ただ、今回はまずRPGを完成させる観点で、Addressablesに関しては全部同じパッケージに入れるつもりでいるので、敵キャラの定義データから直接参照させます。パッケージを分けるなら魔法のIDを使って指定して、実行時にIDを使って魔法データをロードすると良いかと思います。
優先度は0から100の間で指定して、大きい方がより優先されるようにします。その旨もHeaderに書いておきます。
こちらも設定した内容が保存されるように、[Serializable]の属性を忘れずにつけておきましょう。
敵キャラクターの定義データの更新
行動パターンに関するクラスが作成できたら、敵キャラクターの定義データのクラスも更新していきます。クラス側の変更はフィールドをひとつ追加するだけなので手間は少ないかと思います。
既存のフィールドの下、コード内では一番下にリストのフィールドを追加しました。Listを使うので、「using System.Collections.Generic;」も入れています。
スクリプトを保存したら、定義データのアセットも変更を加えます。今回行動パターンを追加したいのはID3のボスゴブリンのみです。Projectウィンドウから「Assets/Data/Enemies」のフォルダに移動し、「EnemyData_0003」のデータを選択します。Inspectorウィンドウでは追加した「Enemy Action Records」のフィールドが表示されるので、折りたたみを開いてリストを表示し、 [+] ボタンから要素をひとつ追加します。
追加した行動パターンでは以下のように設定を行います。
行動のカテゴリは [Magic] 、「Enemy Condition Records」でも要素を追加して、「Condition Category」の項目は [Hp Rate] を選択、「Comparison Operator」の項目は [Less Or Equal] を選択します。HP残量については [50] を設定します。
使用する魔法として「MagicData_0001」をアサインして、行動の優先度は [50] を設定します。
フィールド名や説明が表示しきれないので、必要に応じてInspectorウィンドウの横幅を広げると作業がしやすくなるかもしれません。
この設定を行うことで、戦闘時にHPが50%以下になったらヒールの魔法を使うようになります。設定しているMPは3なので、ヒール1回でMPがなくなる想定です。MPが0になると該当の行動が取れなくなるので、合致する条件がないときと同様に通常攻撃するようにします。この部分は戦闘時の行動決定処理を実装する際にやっていきましょう。
データの入力を行なった後は、一度Unityを再起動して設定したデータが保持されることを確認しておきましょう。リストで参照するクラスに関しては[Serializable]をつけているので、忘れていないか確認しておくのがおすすめです。
これで定義データの作成に関しては一旦完了になります。必要に応じて後から追加していくとして、次回からは戦闘画面の作成に入ります。ここがかなり大変になりそうですが、頑張りましょう。
今回のブランチ
まとめ
今回は敵キャラクターの定義データに、行動パターンを設定する項目を追加しました。行動パターンの決め方は色々とありますが、今回は条件に応じた優先度を使う形で実装しました。ゲームによっては敵キャラの行動が毎ターン決まっていて、それをループさせるなどの方法も取られていたりします。
定義データに関しては動作確認の範囲で必要そうな部分の実装が完了しました。
次回は戦闘画面の作成に入っていきます。ここからひとつ目の山である戦闘関連の機能実装が始まります(白目)
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RPGを作るチュートリアルその13 魔法関連の定義データの作成 2025.01.21
-
次の記事
記事がありません
コメントを書く