前回の記事でダンジョンマップにアイテム取得用の宝箱イベントを置けるようになりました。
前回の記事:
今回の記事では、RPGのクライマックスを飾るボス戦を作ります。まずはボス戦イベントをダンジョンマップに追加していきます。
通常のランダムエンカウントではなく、ダンジョンマップで可視化されたボス戦イベントを作成し、プレイヤーが近づいたらボス戦が始まるようにします。
戦闘に関するスクリプトや敵グループの作成法などは通常戦闘と同じなので過去スクリプトやアセット構造を使いまわしていきます。
ボス戦イベントの作成
それではボス戦イベントの作成・プレハブ設定・ダンジョンマップに配置していきます。
ボスを表すイベントクラスの作成
まず最初に「BossEvent」クラスを実装していきます。
新しく「BossEvent.cs」というスクリプトを作成してください。保存先はお好みでOKですが、記事ではAssets > Scripts > MassEventフォルダーに保存しています。
「BossEvent.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 30 31 32 33 34 35 36 37 38 39 40 |
//BossEvent.cs BossEventクラスの実装 using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "MassEvent/Boss Event")] public class BossEvent : MassEvent { public EncounterEnemies EncounterEnemies; public override void Exec(RPGSceneManager manager) { var pos = manager.MassEventPos; var Boss = manager.ActiveMap.GetCharacter(pos) as Boss; if (Boss == null) return; manager.StartCoroutine(Battle(manager)); } IEnumerator Battle(RPGSceneManager manager) { var pos = manager.MassEventPos; var Boss = manager.ActiveMap.GetCharacter(pos) as Boss; var battleWindow = manager.BattleWindow; battleWindow.SetUseEncounter(EncounterEnemies); battleWindow.Open(); yield return new WaitWhile(() => battleWindow.DoOpen); if(manager.Player.BattleParameter.HP <= 0) { Debug.Log("Fail Boss Battle..."); } else { Boss.Kill(); } } } |
実装できましたら、メニューのAssets > Create > MassEvent > Boss Eventから「BossEvent」を作成してください。
設定内容は以下のようにしてください。
また、後で必要になるのでボス用の「Enemy」アセットと「EnemyAI」アセット、「EncounterEnemies」アセットを追加で作成してください。設定パラメータはお好みで。
(ボス戦で逃げられなくしたい場合は、ボス用の「EncounterEnemies」アセットの「EscapeSuccess」を調節すればOKです)
1 2 3 4 5 |
//マップに配置するボス用イベントの設定内容 ## BossEvent.asset EncounterEnemies : ボス用の「EncounterEnemies」アセットを設定 設定する「EncounterEnemies」アセットの内容はお好みでOKです。 |
ボス用のスクリプトを追加
次にボス用のコンポーネントを追加します。
「Boss.cs」というスクリプトを新しく作成してください。保存先はお好みでOKですが、記事ではAssets > Scriptsフォルダーに保存しています。
「Boss.cs」の内容は次の内容にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 |
//Boss.cs Bossコンポーネントの実装 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Boss : CharacterBase { public void Kill() { Object.Destroy(gameObject); } } |
「Boss」コンポーネントは「CharacterBase」コンポーネントを継承したクラスになります。
「MassEvent」フィールドにボスの内容を表す「BossEvent」クラスを設定します。
また、イベント発生時に戦闘シーンに入り、倒したらマップ上から削除する処理も「BossEvent」クラスと組み合わせて実装してます。
ボスのプレハブの作成
次にボスのプレハブを作成していきます。
次の手順でGameObjectを作成してください。
- 「CharacterPrefab」をシーンに配置し名前を「Boss」に変更してください。
作成した「Boss」はプレハブ化してください。
プレハブ化の際は「TODO」のPrefab Variantとして作成してください。
また、シーンにある「Boss」は削除してください。
「Boss」プレハブの設定内容は次のものにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Bossプレハブの設定内容 ## ルートGameObject - Boxコンポーネント <- 追加 Event : 「BossEvent」アセット ## ルートGameObject > Image - Transformコンポーネント 設定するスプライトに合わせてマス目に収まるように設定 基本的にマップチップと同じサイズでスプライト画像がマス中央にあるなら初期状態でOK サイズが大きかった場合はスケールを小さくしたり、 ピボットの位置が異なる場合は位置を変更してください。 基本的に「Boss」コンポーネントおよび「CharacterBase」コンポーネントの「Pos」フィールドがマップ上の位置として処理しています。 - SpriteRendererコンポーネント Sprite : 以下の画像のものからどれか一つを設定する。SortingOrderLayerでEventを選択。 |
使用する画像は次のものです(敵の画像と同じです)。インポート後に適切に分割してください。戦闘用とダンジョン配置用ではpivotが異なることに注意(ダンジョン用はBottom Centerになるはず)。
ここまででボスを配置する準備ができましたので次はダンジョンマップに実際に配置していきます。
ダンジョンマップに配置する
それでは「DungeonMap」プレハブに「Boss」プレハブを配置していきます。
記事では次の画像のように配置しました。
配置ができましたら再生し、動作を確認してください。
ボスに移動しようとしたら戦闘シーンに切り替わり、ボスと戦闘するようになっていればOKです。
また、ボスを倒した後にマップ上のボスが削除されていればOKです。
ちなみに戦闘に負けた際はそのままマップシーンに戻りますが、これらの処理は後ほどの記事でゲームオーバー処理を作って整えていくので今はこのままでOKです。
まとめ
今回の記事ではボスをマップに配置できるようにしてきました。
ボスも村人や回復屋などと同じ感じで追加できましたね。一度作っておいたスクリプトや設定を再利用できる形にしておくことで後半の開発が楽になってきました。オブジェクト指向開発のいいところですね。
この記事で作成したボスや一度開いた宝箱はダンジョンマップから出てまた入った時に復活するようになっています。
このあたりの調整はセーブ機能の実装時に改良していきます。しばらくはこの状態でいきます。
今回の内容をまとめると以下のようになります。
- ボス用の「MassEvent」クラスを追加
- ボス用のコンポーネントの実装
- ボス用のプレハブを作成
- ダンジョンマップにボスを配置した。
- ボスを倒したらマップ上から消すようにした。
それでは次の記事に行ってみましょう!
コメント