見出し画像

【Unity】3Dローグライクゲームの作り方〜Step13-2〜

前回の記事はこちら
前回はキャラクターを倒して、経験値を得られるようにしました。

経験値が貯まったらレベルアップさせる

今回はレベルアップの実装をしていきたいと思います。
ActorParamsControllerクラスに新たなメソッドを追加し、既存のメソッドを変更して下さい。

// メソッドを追加
/**
* 現在の経験値が貯まっていたらレベルアップする
*/
public void LvUpJudgment()
{
   int exp = parameter.exp;
   int expmax = 0;
   int lv = 1;
   for (int i = 1; i < parameter.lvmax; i++)
   {
       expmax += paramsData[i].exp;
       if (exp >= expmax)
       {
           exp -= expmax;
           lv++;
       }
       else break;
   }
   if (parameter.lv < lv)
   {
       Message.Add(29, actorName);
       Message.Add(30, actorName, lv.ToString());
       parameter = GetParameterFromLv(lv);
       parameter.exp += exp;
   }
}

// メソッドを変更
private void Start()
{
   if (parameter.lv < 1) parameter.lv = 1;
   if (parameter.lv > parameter.lvmax) parameter.lv = parameter.lvmax;
   Reset();
   effect = GetComponentInParent<EffectManager>();
}

private Params GetParameterFromLv(int lv)
{
   Params p = new Params();
   /*   省略   */
   for (int i = 0; i < lv; i++)
   {
       /*   省略   */
       p.exp += paramsData[i].exp + p.exp; // ここを変更
       p.xp += paramsData[i].xp;
   }
   return p;
}

public void GetXp(int xp)
{
   parameter.exp += xp;
   if (xp > 0) LvUpJudgment();
}

テストしてみます。敵を倒したら、レベルアップすることを確認します。
なお、今回の実装では、レベルアップすると体力と満腹度がどちらも最大まで回復します。ただし、レベルアップ後にターンが経過するので、満腹度は少し減少した状態になります。

スクリーンショット 2020-06-15 11.16.41

レベルアップ演出

レベルアップした時の演出を書いていきたいと思います。こちらはEffectManagerクラスを使用しますので、空のオブジェクトを「LvUpEffect」という名前で用意し、その中にレベルアップのエフェクトを入れて、プレハブ化して下さい。
コードを書いていきます。EffectManagerクラスを開き、以下のように変更して下さい。

// ETypeに以下を追加
LvUp,

// パラメーターを追加
public GameObject lvUp;

// メソッドを変更
public void Play(EType type, GameObject target)
{
   switch (type)
   {
       case EType.Recovery:
           playingEffects.Add(Instantiate<GameObject>(recovery, target.transform));
           break;
       // 以下3行を追記
       case EType.LvUp:
           playingEffects.Add(Instantiate<GameObject>(lvUp, target.transform));
           break;
       /*   省略   */
   }
}

次にActorParamsControllerクラスのLvUpJudgmentメソッドに追記します。

public void LvUpJudgment()
{
   /*   省略   */
   if (parameter.lv < lv)
   {
       Message.Add(29, actorName);
       Message.Add(30, actorName, lv.ToString());
       effect.Play(EffectManager.EType.LvUp, gameObject); // これを追加
       /*   省略   */
   }
}

テストしてみます。レベルアップした時に、エフェクトが表示されればOKです。

スクリーンショット 2020-06-15 14.36.03

階数に応じて敵のレベルをランダムに変える

本ステップの最後に、データテーブルに沿って、敵のレベルを設定したいと思います。
まずはActorParamsControllerクラスに新しいメソッドを追加して下さい。

/**
* レベルを設定する
*/
public void SetLv(int lv)
{
   Reset();
   if (lv < 1) lv = 1;
   if (lv > parameter.lvmax) lv = parameter.lvmax;
   parameter.lv = lv;
   parameter = GetParameterFromLv(lv);
}

ついでに以下のメソッドも変更しておきましょう。

private void OnValidate()
{
   if (prevLv != parameter.lv)
   {
       SetLv(parameter.lv);
       prevLv = parameter.lv;
   }
   /*   省略   */
}

private void Start()
{
   SetLv(parameter.lv);
   effect = GetComponentInParent<EffectManager>();
}

次にFieldクラスのSetEnemyメソッドを変更します。

private void SetEnemy(string name, int xgrid, int zgrid)
{
   EActor actorId = EActor.SLIME;
   ExcelAppearData.EnemyAppearData enemyAppear =
           appearDatabase.EnemyAppear.Find(n => n.floor == floorNum);
   if (name.Equals("Random"))
   {
       int maxRate = enemyAppear.rate1;
       int p = Random.Range(1, maxRate + 1);
       maxRate -= enemyAppear.rate1;
       if (maxRate <= 0) actorId = enemyAppear.id1;
   }
   else if (!System.Enum.TryParse(name, out actorId)) return;
   ExcelActorData.ActorData actorData = actorDatabase.Data.Find(n => n.id == actorId);
   if (actorData == null) return;
   int lv = 1;
   if (actorId == enemyAppear.id1) lv = Random.Range(enemyAppear.lvmin1, enemyAppear.lvmax1+1);
   GameObject enemyObj = (GameObject)Resources.Load("Prefabs/" + actorData.prefab);
   GameObject enemy = Instantiate(enemyObj, enemies.transform);
   enemy.GetComponent<ActorMovement>().SetPosition(xgrid, zgrid);
   enemy.GetComponent<ActorParamsController>().SetLv(lv);
   enemy.GetComponent<EnemyOperation>().target = playerMovement;
}

テストしてみます。データテーブルに指定したレベルで敵が出現したでしょうか。

スクリーンショット 2020-06-15 15.38.15

それでは、短いですが、本ステップはこれで終了致します。
(職業選択とスキル実装に関しては、需要があれば新たなステップとして解説するかもしれません)
ここまでお付き合い下さり、ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?