前回の記事では敵AIの作成を行い、行動パターンを増やしました。
前回の記事:
2DRPGの作り方19 Unityで作るターン制戦闘の敵の種類と行動パターンAIを増やす
前回の記事ではターン制戦闘を盛り上げる攻撃エフェクトの付け方を解説しました。 メッセージウィンドウと連動してエフェクトを表示できるようになりましたね。 今回の記事では敵の種類を増やしたり、戦闘AIを実装していきます。 前回までの敵は毎ターン...
今回の記事では戦闘終了後に経験値が入るようにし、レベルアップできるようにしていきます。
ロールプレイングゲームには欠かせないプレイヤーの成長システムを作っていきましょう。
戦闘が終わったら経験値が入るようにする
まず戦闘に勝った時に経験値とお金を取得できるようにしていきます。
「BattleWindow」コンポーネントを次のように修正してください。
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
//BattleWindow.cs 経験値とお金を取得できるようにする //次のものを修正 IEnumerator Turn(TurnInfo turnInfo) { var messageWindow = RPGSceneManager.MessageWindow; turnInfo.ShowMessageWindow(messageWindow); yield return new WaitWhile(() => !messageWindow.IsEndMessage); if (AttackEffect != null) { Object.Destroy(AttackEffect.gameObject); } if (turnInfo.DoneCommand != null) turnInfo.DoneCommand(); yield return new WaitWhile(() => !messageWindow.IsEndMessage); UpdateUI(); if (DoEscape) { yield return new WaitForSeconds(EscapeWaitSecond); Close(); } else { foreach (var enemy in Encounter.Enemies) { var info = enemy.BattleAction(this); info.ShowMessageWindow(messageWindow); yield return new WaitWhile(() => !messageWindow.IsEndMessage); if (info.DoneCommand != null) info.DoneCommand(); yield return new WaitWhile(() => !messageWindow.IsEndMessage); UpdateUI(); } } var player = RPGSceneManager.Player.BattleParameter; if(player.HP <= 0) { messageWindow.StartMessage($"負けてしまった..."); yield return new WaitWhile(() => !messageWindow.IsEndMessage); Close(); } else if(Encounter.Enemies.Count <= 0) { var exp = UseEncounter.Enemies.Sum(_e => _e.Data.Exp); var money = UseEncounter.Enemies.Sum(_e => _e.Data.Money); var msg = $"戦闘に勝った!\n" + $"Exp+{exp}かくとく!\n" + $"お金+${money}かくとく!"; messageWindow.StartMessage(msg); yield return new WaitWhile(() => !messageWindow.IsEndMessage); player.Money += money; var prevLevel = player.Level; if(player.GetExp(exp)) { msg = $"レベルが上がった! {prevLevel} -> {player.Level}\n" + $" MaxHP -> {player.MaxHP}\n" + $" ATK -> {player.AttackPower}\n" + $" DEF -> {player.DefensePower}" ; messageWindow.StartMessage(msg); yield return new WaitWhile(() => !messageWindow.IsEndMessage); } Close(); } TurnEndProcess(); _turnCoroutine = null; } |
上の修正コードでは「BattleParameterBase」クラスに新しく「GetExp()」というメソッドを追加しているので、そちらも実装していきます。
1 2 3 4 5 6 7 |
//BattleParameter.cs 経験値取得用のメソッドを用意する //次のものをBattleParameterBaseクラスに追加 public bool GetExp(int exp) { Exp += exp; return false; } |
ここまでできたら再生して戦闘に勝ってみてください。
倒した敵に応じた経験値が入るようになっています。
また、確認の際は敵のパラメータをわかりやすいものに変更した方がいいので、そちらも適当に変更してください。
まとめ
今回の記事ではレベルアップ処理を実装してきました。
この記事のレベルシステムはとても単純なものなので、まだまだ改良する余地は多くありますが、大枠の流れや基本を抑えています。
また、パラメータを適当に設定すると戦闘が簡単になりすぎたり、難しくなりすぎたりします。
その辺りは戦闘時の攻撃処理の計算方法やレベルアップ時のパラメータ変更方法を改良していくことになります。
パラメータ調節の際はプレイ時の目安(敵を10体倒すとレベルアップするとか、攻撃を3回すると倒せる様にするなど)を想定するとやりやすいでしょう。
今回の内容をまとめると以下のようになります。
- 戦闘終了時に経験値が入るようにした
- 経験値取得時にレベルが上がるようにした
- レベルに応じてパラメータを変更させるようにした。
それでは次の記事に行ってみましょう!
2DRPGの作り方21 Unityでランダムエンカウントによる敵戦闘を実装しよう
前回の記事では戦闘終了後の経験値獲得・レベルアップ処理を実装しました。 前回の記事: 今回の記事ではランダムエンカウントを実装していきます。 ランダムエンカウントとはマップを移動すると敵と遭遇し戦闘シーンに入る機能になります。 この講座では...
コメント