【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();
}
テストしてみます。敵を倒したら、レベルアップすることを確認します。
なお、今回の実装では、レベルアップすると体力と満腹度がどちらも最大まで回復します。ただし、レベルアップ後にターンが経過するので、満腹度は少し減少した状態になります。
レベルアップ演出
レベルアップした時の演出を書いていきたいと思います。こちらは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です。
階数に応じて敵のレベルをランダムに変える
本ステップの最後に、データテーブルに沿って、敵のレベルを設定したいと思います。
まずは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;
}
テストしてみます。データテーブルに指定したレベルで敵が出現したでしょうか。
それでは、短いですが、本ステップはこれで終了致します。
(職業選択とスキル実装に関しては、需要があれば新たなステップとして解説するかもしれません)
ここまでお付き合い下さり、ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?