デジタルコンテンツの制作

nekosuko.jp

RPG レッスン

【18】主人公のコマンドを実行してみる|RPGを作ってみる

更新日:

スキルを監督するスクリプトを作る

スキルの発動処理はスキルを監督するスクリプトでやります。

(ダンジョンのDirectorにアタッチすればダンジョンでもスキルが使えるようになります)

SkillDirectorスクリプトを作成して、バトルシーンのDirectorオブジェクトにアタッチしておきます。

BattleDirectorからSkillDirectorが参照できるように、SkillDirector型のSkillDirectorをメンバ変数に追加してアウトレット接続しておきます。

BattleDirector.cs

public SkillDirector SkillDirector;


スキルを発動する処理

SkillDirectorにスキルを発動するSetSkillメソッドを作成します。

SetSkillメソッドは4つの引数を受け取るようにします。

  • SkillParams型の変数skillParams
  • UnitStatus型の変数userStatus
  • UnitStatus型の変数targetStatus
  • System.Action型の変数action

(Systemを名前空間として宣言しても良いのですが、UnityEngineのRandomクラスと重複します)

メソッドの処理として以下4つを実装します。

  • 使用者の攻撃力とスキルの攻撃率に応じてダメージを計算し、かつ対象者の防御率に応じて対象者のHPを減らす(HPの最小値は0)
  • 使用者の防御率guardにスキルの防御率(guardRate)を足す(最大値は1f)。
  • 使用者の最大HPとスキルの回復率に応じて回復量を計算し、使用者のHPを増やす(HPの最大値は最大HP)
  • スキルの処理が終わったら、Action型のメソッドを呼び出す(コールバック)

(本当はUnitStatus側でやったほうが良い処理もあるのですが、とりあえず今回はSkillDirectorでやってしまいます)

SkillDirector.cs

public void SetSkill(SkillParams skillParams, UnitStatus userStatus, UnitStatus targetStatus, Action action)
{
    int at = userStatus.GetAttack();
    float damage = at * skillParams.AttackRate;
    damage = damage * (1f - targetStatus.Guard);
    targetStatus.HP = targetStatus.HP - (int)damage;
    if (targetStatus.HP < 0)
    {
        targetStatus.HP = 0;
    }

    userStatus.Guard = userStatus.Guard + skillParams.GuardRate;
    if (userStatus.Guard > 1f)
    {
        userStatus.Guard = 1f;
    }

    int maxHP = userStatus.GetMaxHP();
    float recovery = maxHP * skillParams.RecoveryRate;
    userStatus.HP = userStatus.HP + (int)recovery;
    if (userStatus.HP > maxHP)
    {
        userStatus.HP = maxHP;
    }

    if (action != null)
    {
        action();
    }
}

主人公にスキルを持たせておく

主人公にコマンドで使用する3つのスキルIDを持たせておくためのメンバ変数を追加します。

主人公を初期化するときの処理に所有スキルのIDを追加します。

UnitStatus.cs

public string[] Skill;

 

PlayRecord.cs -> InitStatus()

HeroStatus.Skill = new string[] { "ATTACK", "GUARD", "RECOVERY" };

コマンドボタンからスキルを実行する

3つのコマンドボタンに割り当てるメソッドを作成して、コマンドを実行してみます。

3つのコマンドボタンそれぞれにアタッチします。引数は主人公の所有スキルに合わせて0から2にします。

そして引数に合わせて主人公の所有スキルのIDからスキルデータを取得しSkillDirectorのSetSkillメソッドに渡します。

主人公のスキルが実行されたら敵キャラのターンなので、EnemyTurnメソッドをコールバックメソッドとして引数に渡します。

BattleDirector.cs

public void TouchCommand(int skillNo)
{
    battleButton.SetActive(false);
    SkillParams skill = GameManager.instance.skillData.GetSkillHero(heroStatus.Skill[skillNo]);
    skillDirector.SetSkill(skill, heroStatus, enemyStatus, EnemyTurn);
}

 

コマンドボタンにメソッドを割りてて、引数を設定します。


攻撃ボタンを押したら敵キャラのHPが減っているの確認できます。
エフェクトがなにもないのでわかりずらいですが...。

リンク

-RPG, レッスン

Copyright© nekosuko.jp , 2021 All Rights Reserved.