前回の記事ではターン制戦闘を盛り上げる攻撃エフェクトの付け方を解説しました。
メッセージウィンドウと連動してエフェクトを表示できるようになりましたね。
今回の記事では敵の種類を増やしたり、戦闘AIを実装していきます。
前回までの敵は毎ターン攻撃するだけでしたが、「1ターン様子を見てから攻撃」、「プレイヤーのアイテムを盗む」といった行動パターンの敵を実装していきます。
敵の戦闘AIの実装と行動パターンの作成
それでは敵の戦闘AIを実装していきます。
この記事では次の行動パターンを持つ敵を作成します。
- 攻撃だけしてくるもの
- 攻撃と何もしないを繰り返すもの
- 攻撃と回復アイテムを盗むを繰り返すもの
まず、敵の戦闘AIの基底クラスとなる「EnemyAI」クラスを作成していきます。
「EnemyAI」クラスはScriptableObjectとして実装し、「Enemy」クラスなど他のアセットへ設定できるようにします。
保存先はお好みでOKですが、記事ではAssets > Scripts > Enemyフォルダーの中に保存しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//EnemyAI.cs EnemyAIクラスの実装 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyAI : ScriptableObject { public int Turn { get; set; } public virtual EnemyAI Clone() { var clone = ScriptableObject.CreateInstance(GetType()) as EnemyAI; return clone; } public virtual void Init() { Turn = 0; } public TurnInfo BattleAction(Enemy enemy, BattleWindow battleWindow) { Turn++; var info = new TurnInfo(); TurnAI(enemy, battleWindow, info); return info; } protected virtual void TurnAI(Enemy enemy, BattleWindow battleWindow, TurnInfo outTurnInfo) { } } |
また、次のものが必要になるので先に修正してください。
1 2 3 4 |
//BattleWindow.cs 戦闘に必要なメンバを追加 //次のものを追加 public BattleParameterBase Player { get => RPGSceneManager.Player.BattleParameter; } public RPGSceneManager GetRPGSceneManager { get => RPGSceneManager; } |
攻撃だけしてくるAIの実装
それでは実際に色々な敵の戦闘AIを実装していきます。
新しく「EnemyBasicAI.cs」というスクリプトを作成してください。保存先はお好みでOKですが、記事ではAssets > Scripts > Enemyフォルダーの中に保存しています。
「EnemyBasicAI.cs」の内容は次のものにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//EnemyBasicAI.cs EnemyBasicAIクラスの実装 using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName ="Enemy/AI/Basic AI")] public class EnemyBasicAI : EnemyAI { protected override void TurnAI(Enemy enemy, BattleWindow battleWindow, TurnInfo outTurnInfo) { outTurnInfo.Message = $"{enemy.Name}の攻撃!!"; outTurnInfo.DoneCommand = () => { enemy.Data.AttackTo(battleWindow.Player, out BattleParameterBase.AttackResult result); var messageWindow = battleWindow.GetRPGSceneManager.MessageWindow; var resultMsg = $"プレイヤーは{result.Damage}を受けた..."; messageWindow.Params = null; messageWindow.StartMessage(resultMsg); }; } } |
「EnemyBasicAI」クラスはメニューのAssets > Create > Enemy > AI > Basic AIから作成できます。
攻撃と何もしないを繰り返すAIの実装
次に攻撃と何もしないを繰り返すAIを実装していきます。
新しく「EnemyStrongAI.cs」というスクリプトを作成してください。保存先はお好みでOKですが、記事ではAssets > Scripts > Enemyフォルダーの中に保存しています。
「EnemyStrongAI.cs」の内容は次のものにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//EnemyStrongAI.cs EnemyStrongAIクラスの実装 using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "Enemy/AI/Strong AI")] public class EnemyStrongAI : EnemyAI { protected override void TurnAI(Enemy enemy, BattleWindow battleWindow, TurnInfo outTurnInfo) { if(Turn % 2 == 0) { outTurnInfo.Message = $"{enemy.Name}はなまけている..."; outTurnInfo.DoneCommand = () => {}; } else { outTurnInfo.Message = $"{enemy.Name}の攻撃!!"; outTurnInfo.DoneCommand = () => { enemy.Data.AttackTo(battleWindow.Player, out BattleParameterBase.AttackResult result); var messageWindow = battleWindow.GetRPGSceneManager.MessageWindow; var resultMsg = $"プレイヤーは{result.Damage}を受けた..."; messageWindow.Params = null; messageWindow.StartMessage(resultMsg); }; } } } |
「EnemyStrongAI」クラスはメニューのAssets > Create > Enemy > AI > Strong AIから作成できます。
攻撃と回復アイテムを盗むを繰り返すAIの実装
次に攻撃とプレイヤーの回復アイテムを盗むを繰り返すAIを実装していきます。
新しく「EnemyStealAI.cs」というスクリプトを作成してください。保存先はお好みでOKですが、記事ではAssets > Scripts > Enemyフォルダーの中に保存しています。
「EnemyStealAI.cs」の内容は次のものにしてください。
まとめ
今回の記事では敵の種類を増やしたり、戦闘AIを実装していきました。
内容を簡単にまとめると以下のようになります。
- 戦闘AIの基底クラスとなる「EnemyAI」クラスの実装
- 攻撃だけする「EnemyBasicAI」クラスの実装
- 攻撃と何もしないを繰り返す「EnemyStrongAI」クラスの実装
- 攻撃と回復アイテムを盗むを繰り返す「EnemyStealAI」クラスの実装
- 戦闘システムに敵のAIを組み込んだ。
それでは次の記事に行ってみましょう!
コメント