【UnityでRPG製作】レベルアップの実装方法
RPGのレベルアップの実装方法について調べると、累計経験値を使った計算式が色々でてきた。けど、これを理解して自分で使おうとするとハードルが高かったので、経験値テーブル(実際にはディクショナリ)を作って、それを使ってレベルアップを実装していこうと思う。
まず、経験値を管理する実装はこんな感じ。
// 経験値ディクショナリ private Dictionary<int, int> needExpDictionary = new Dictionary<int, int> { // Lv、経験値 {2, 6}, {3, 16}, {4, 28}, {5, 48} }; // 引数で渡されたLvに必要な経験値を返す public int GetNeedForLvupExp(int lv) { return needExpDictionary[lv]; }
例えば、Lv2にあがるのに必要な経験値は6ということになる。そこで、モンスターとのバトル終了後に、GetNeedForLvupExpメソッドを呼び出す。このとき引数に渡すのは、現在のLvにプラス1を足した数。Lv1の場合、引数に2を渡してLv2に必要な累計経験値の6を取得する。取得した6と、実際の累計経験値を比較して、累計経験値が6を上回っていたらレベルアップするという実装にした。
// モンスターを倒したときのお金と経験値を取得し、レベルがあがったらtrueを返す public bool EndBattle(MonsterModel monsterModel) { // 経験値とお金を取得 model.exp += monsterModel.exp; model.money += monsterModel.money; // 現在のレベルより一つ上のレベルに必要な経験値を取得 var moreExp = experienceComponent.GetNeedForLvupExp(model.lv + 1); // 現在の経験値の方が高ければレベルアップ if (moreExp <= model.exp) { // レベルをあげる model.lv ++; return true; } return false; }
自分はこの実装方法をとることで感じるメリットは以下の通りです。
- 各レベルごとに必要な経験値がわかりやすい
- モンスターを何匹倒したらレベルアップするか、調整しやすい
- 各ステージごとに現れるモンスターの経験値を設定しやすい
これが最適化といわれればかなり微妙だけど、何かの参考になれば。