スキルを監督するスクリプトを作る
スキルの発動処理はスキルを監督するスクリプトでやります。
(ダンジョンの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が減っているの確認できます。
エフェクトがなにもないのでわかりずらいですが...。