private void Start() { damage = GetComponent <DamageResource>(); stamina = GetComponent <StaminaResource>(); health = GetComponent <HealthResource>(); player = GameObject.FindGameObjectWithTag("Player"); }
/// <summary> /// 伤害阶段(伤害计算函数) /// </summary> /// <param name="OrgDamage">初始伤害值</param> /// <param name="damageResource">直接伤害/间接伤害</param> /// <param name="damageType">伤害类型</param> /// <param name="elementType">伤害所属元素类型</param> /// <param name="source">发起伤害角色</param> /// <param name="target">承受伤害角色</param> public void TakeDamage(float OrgDamage, DamageResource damageResource, DamageType damageType, ElementType elementType, FightHero source, FightHero target) { float damage = OrgDamage; List <BuffCode> source_bufflist = new List <BuffCode>(); List <BuffCode> target_bufflist = new List <BuffCode>(); source_bufflist.AddRange(source.BuffDict.Keys); target_bufflist.AddRange(target.BuffDict.Keys); //直接伤害前被动执行 if (damageResource == DamageResource.DirectDamage) { source.Hero_Card.Prossive_skill_function(FightPhase.BeforeDemage, source, target); target.Hero_Card.Prossive_skill_function(FightPhase.BeforeHit, target, source); } //buff伤害阶段前执行 string data = string.Format("{0}|{1}|{2}|{3}", damage.ToString(), damageResource.ToString(), damageType.ToString(), elementType.ToString()); foreach (BuffCode key in source_bufflist) { if (source.BuffDict.ContainsKey(key)) { source.BuffDict[key].DamagePhase(FightPhase.BeforeDemage, target, source, data); } } foreach (BuffCode key in target_bufflist) { if (target.BuffDict.ContainsKey(key)) { target.BuffDict[key].HitPhase(FightPhase.BeforeHit, source, target, data); } } //判断目标是否无敌 if (target.IsInvincible) { return; } //判断目标是否闪避 Random r = new Random(); float i = r.Next(1, 100) / 100f; if (i < target.Dodge) { return; } //真实伤害 if (damageType == DamageType.Real) { damage = OrgDamage; } //元素伤害 if (damageType == DamageType.Element && elementType != ElementType.Chaos) { float sourceAttribute = source.GetAttributeByEnum(elementType); float targetAttribute = target.GetAttributeByEnum(elementType); float sourceAttributeDamage = source.GetAttributeDamageByEnum(elementType); float targetAttributeDamage = target.GetAttributeDamageByEnum(elementType); float sourceAttributeDefense = source.GetAttributeDefenseByEnum(elementType); float targetAttributeDefense = target.GetAttributeDefenseByEnum(elementType); damage = ((1 - source.Pass_through) * (OrgDamage + source.Increase_Damage) * ((sourceAttribute / 150) * (sourceAttribute / 150) + 0.4f) * ((1000 - targetAttribute - target.Defense) / (1000 + targetAttribute + target.Defense)) * sourceAttributeDamage * source.All_Element_Damage / targetAttributeDefense / target.All_Element_Defense + source.Pass_through * (OrgDamage + source.Increase_Damage) * ((sourceAttribute / 150) * (sourceAttribute / 150) + 0.4f) * ((1000 - targetAttribute - target.Defense) / (1000 + targetAttribute + target.Defense)) * sourceAttributeDamage * source.All_Element_Damage / targetAttributeDefense / target.All_Element_Defense - target.Parry) * source.Final_Damage / target.Final_Defense; } //普通伤害 if (damageType == DamageType.Normal || elementType == ElementType.Chaos) { damage = (OrgDamage + source.Increase_Damage - source.Parry) * source.Final_Damage / target.Final_Defense; } //判断伤害是否暴击 float i1 = r.Next(1, 100) / 100f; if (i1 < source.Crit && damageType != DamageType.Real) { damage *= source.Crit_Damage; } //向上取整 if (damage % 1 != 0) { damage = (int)damage + 1; } //扣除护盾抵挡,并设置剩余护盾值 damage -= target.Shield; if (damage <= 0) { target.Shield = -damage; damage = 0; } else { target.Shield = 0; } //直接伤害 if (damageResource == DamageResource.DirectDamage) { //直接伤害时被动执行 source.Hero_Card.Prossive_skill_function(FightPhase.InDemage, source, target); target.Hero_Card.Prossive_skill_function(FightPhase.InHit, target, source); //buff伤害阶段时执行 data = string.Format("{0}|{1}|{2}|{3}", damage.ToString(), damageResource.ToString(), damageType.ToString(), elementType.ToString()); foreach (BuffCode key in source_bufflist) { if (source.BuffDict.ContainsKey(key)) { source.BuffDict[key].DamagePhase(FightPhase.InDemage, target, source, data); } } foreach (BuffCode key in target_bufflist) { if (target.BuffDict.ContainsKey(key)) { target.BuffDict[key].HitPhase(FightPhase.InHit, source, target, data); } } target.Hp -= damage; target.DamageCaculation.Clear(); target.DamageCaculation.Add(elementType, damage); Console.WriteLine("扣血:" + damage); Console.WriteLine("剩余血量" + target.Hp); source.Hero_Card.Prossive_skill_function(FightPhase.AfterDemage, source, target); target.Hero_Card.Prossive_skill_function(FightPhase.AfterHit, target, source); foreach (BuffCode key in source_bufflist) { if (source.BuffDict.ContainsKey(key)) { source.BuffDict[key].DamagePhase(FightPhase.AfterDemage, target, source, data); } } foreach (BuffCode key in target_bufflist) { if (target.BuffDict.ContainsKey(key)) { target.BuffDict[key].HitPhase(FightPhase.AfterHit, source, target, data); } } } //间接伤害 if (damageResource == DamageResource.CollateralDamage) { target.Hp -= damage; } //吸血 if (source.SuckBlood > 0 && damage > 0) { AddHp(damage * source.SuckBlood, source, source); } }