using System.Collections.Generic; using UnityEngine; using System; using System.Linq; public class DirectlyDamageSkill : SkillBase { public DirectlyDamageSkill(BattleObject _caster, SkillConfig _skillCfg, H0604_tagUseSkillAttack vNetData, BattleField _battleField) : base(_caster, _skillCfg, vNetData, _battleField) { } public override void Run() { base.Run(); } protected override void OnTriggerEvent(int triggerIndex, int triggerFrame) { if (0 == triggerIndex) { List targetList = GetTargetList(); // 子类实现具体的技能逻辑 SkillEffect effect = SkillEffectFactory.CreateSkillEffect(caster, skillConfig, tagUseSkillAttack); if (null != effect) { // 如果是子弹类型的 effect.Play((hitIndex, hurList) => { for (int i = 0; i < hurList.Count; i++) { var hurt = hurList[i]; BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID); List damageList = new List(); // 计算伤害 分段的话 if (hitIndex >= skillConfig.DamageDivide.Length) { Debug.LogError("DamageDivide有问题 需要检查 只显示一段伤害 取triggerFrames的"); long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx) / (skillConfig.TriggerFrames.Length == 0 ? 1 : skillConfig.TriggerFrames.Length); damageList.Add(totalDamage); } else { long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx); if (hitIndex >= skillConfig.DamageDivide.Length) { int[] tenKDamagePercentArray = skillConfig.DamageDivide[hitIndex]; long factDamage = totalDamage; for (int j = 0; j < tenKDamagePercentArray.Length; j++) { long damage = (long)(Mathf.Round(factDamage * tenKDamagePercentArray[j] / 10000.0f)); damageList.Add(damage); } } } target.Hurt(damageList, hurt.AttackType); } }); } } } protected override void DoSkillLogic(Action _onComplete = null) { // 开始记录帧数 startCounting = true; } #if UNITY_EDITOR_STOP_USING // 伤害列表理应由服务器发给客户端 这边只做粗浅模拟 public override List>> GetDamageList(BattleField battleField) { List>> damageList = new List>>(); List affectList = GetTargetList(battleField); Dictionary> oneRoundDamage = new Dictionary>(); for (int j = 0; j < affectList.Count; j++) { BattleObject obj = affectList[j]; List tryDmgList = caster.TryAttack(obj, skillConfig); oneRoundDamage.Add(obj.ObjID, tryDmgList); } damageList.Add(oneRoundDamage); return damageList; } #endif }