/// <summary> /// 造成伤害 /// </summary> /// <param name="attackHurtStruct"></param> public override CalculateHurt.Result GiveAttackHurtStruct(AttackHurtStruct attackHurtStruct) { MonsterControl monsterControl = GetComponent <MonsterControl>(); if (monsterControl != null && monsterControl.monsterDataInfo != null && monsterControl.monsterDataInfo.MonsterBaseAttribute != null) { PhysicDefenseFactor physicDefenseFactor = monsterControl.monsterDataInfo.PhysicDefenseFactor; //物理防御系数 MagicDefenseFactor magicDefenseFactor = monsterControl.monsterDataInfo.MagicDefenseFactor; //魔法防御系数 CalculateHurt.Result result = CalculateHurt.Calculate(attackHurtStruct, monsterControl.thisAttribute, physicDefenseFactor, magicDefenseFactor); monsterControl.GiveHit(); //显示伤害 base.ShowHurt(result, gameObject); //显示怪物的血条 iGameState.ShowMonsterHP = new MonsterHPUIStruct() { monsterName = monsterControl.monsterDataInfo.monsterPrefabName, maxHP = monsterControl.thisAttribute.MaxHP, nowHP = monsterControl.thisAttribute.HP, monsterObj = gameObject }; return(result); } return(default(CalculateHurt.Result)); }
/// <summary> /// 造成伤害 /// </summary> /// <param name="attackHurtStruct"></param> public override CalculateHurt.Result GiveAttackHurtStruct(AttackHurtStruct attackHurtStruct) { IPlayerState iPlayerState = GameState.Instance.GetEntity <IPlayerState>(); IAttributeState playerAttribute = iPlayerState.GetResultAttribute(); PhysicDefenseFactor physicDefenseFactor = new PhysicDefenseFactor()//物理防御系数 { CoefficientRatioReducingDamageFactor = iPlayerState.SelfRoleOfRaceInfoStruct.physicDefenseToHurtRateRatio, ImmunityInjury = iPlayerState.SelfRoleOfRaceInfoStruct.physicQuickToHurtExemptRatio }; MagicDefenseFactor magicDefenseFactor = new MagicDefenseFactor() //魔法防御系数 { CoefficientRatioReducingDamageFactor = iPlayerState.SelfRoleOfRaceInfoStruct.magicDefenseToHurtRateRatio }; CalculateHurt.Result calculateHurtResult = CalculateHurt.Calculate(attackHurtStruct, playerAttribute, physicDefenseFactor, magicDefenseFactor); if (calculateHurtResult.hurt >= 0) { if (calculateHurtResult.hurt != 0) { //减血(因为这里是整合的属性,必须在外部将自身血量减去) iPlayerState.HP -= calculateHurtResult.hurt; //终端咏唱 ISkillState iSkillState = GameState.Instance.GetEntity <ISkillState>(); iSkillState.GetHitToSkillState(); //手柄震动 iPlayerState.SetVibration(0.1f, 0.7f, 0.7f); } //显示伤害 base.ShowHurt(calculateHurtResult, iPlayerState.PlayerObj); } return(calculateHurtResult); }
public void Init() { RoleOfRaceData roleOfRaceData = DataCenter.Instance.GetMetaData <RoleOfRaceData>(); RoleOfRaceInfoStruct roleOfRaceInfoStruct = roleOfRaceData[roleOfRace]; if (roleOfRaceInfoStruct != null) { //重置属性 IAttributeState tempAdditional = new AttributeStateAdditional();// MonsterBaseAttribute.Clone();//赋值出来一份用来计算种族成长 tempAdditional.SetRoleOfRaceAddition(roleOfRaceInfoStruct); tempAdditional.Power = MonsterBaseAttribute.Power; tempAdditional.Mental = MonsterBaseAttribute.Mental; tempAdditional.Quick = MonsterBaseAttribute.Quick; MonsterBaseAttribute = (AttributeStateAdditional)(MonsterBaseAttribute + tempAdditional); MonsterBaseAttribute.Power /= 2; MonsterBaseAttribute.Quick /= 2; MonsterBaseAttribute.Mental /= 2; //系数 PhysicAttackFactor = new PhysicAttackFactor() { IncreaseRatioInjuryFactor = roleOfRaceInfoStruct.physicAttackToDamageRateRatio, MinimumDamageFactor = roleOfRaceInfoStruct.physicQuickToMinDamageRatio }; PhysicDefenseFactor = new PhysicDefenseFactor() { CoefficientRatioReducingDamageFactor = roleOfRaceInfoStruct.physicDefenseToHurtRateRatio, ImmunityInjury = roleOfRaceInfoStruct.physicQuickToHurtExemptRatio }; MagicAttackFactor = new MagicAttackFactor() { IncreaseRatioInjuryFactor = roleOfRaceInfoStruct.magicAttackToDamageRateRatio }; MagicDefenseFactor = new MagicDefenseFactor() { CoefficientRatioReducingDamageFactor = roleOfRaceInfoStruct.magicDefenseToHurtRateRatio }; } }
/// <summary> /// 具体的计算 /// </summary> /// <param name="from">伤害来自于</param> /// <param name="to">伤害指向</param> /// <param name="physicDefenseFactor">物理防御系数</param> /// <param name="magicDefenseFactor">魔法防御系数</param> public static Result Calculate(AttackHurtStruct from, IAttributeState to, PhysicDefenseFactor physicDefenseFactor, MagicDefenseFactor magicDefenseFactor) { //计算本次伤害造成的结果 Result calculateHurtResult; calculateHurtResult.IsCrit = false; float maxHP = to.MaxHP; //先判断是否命中 float isHitRate = from.attributeState.HitRate - to.EvadeRate; //本次攻击是否命中的概率(0-?(1)) if (isHitRate < 1 && Random.Range(0, 1) > isHitRate) //如果本次攻击有几率命中且本次攻击没有命中则返回 { return(default(Result)); } isHitRate = 1; float baseDamage = 0; //根据攻击防御计算初步的基础伤害 switch (from.hurtType) { case EnumHurtType.Magic: { float hurtRate = 1 + from.attributeState.MagicAttacking * from.MagicAttackFactor.IncreaseRatioInjuryFactor; //伤害倍率 float defenceRate = 1 / (1 + to.MagicResistance * magicDefenseFactor.CoefficientRatioReducingDamageFactor); //减伤倍率 float baseHurt = from.thisUsedMana * from.attributeState.BaseMagicDamage / 25; float otherHurt = (from.attributeState.MagicAttacking - to.MagicResistance) * 0.1f; otherHurt = Mathf.Clamp(otherHurt, 0, float.MaxValue); baseDamage = (baseHurt * defenceRate + otherHurt) * hurtRate; //如果是信仰系魔法还要计算信仰差值..... //暂时空 } break; case EnumHurtType.PhysicSkill: case EnumHurtType.NormalAction: { float hurtExempt = to.Quick * physicDefenseFactor.ImmunityInjury; //额外豁免=敏捷*额外豁免系数 float baseHurt = from.attributeState.BasePhysicDamage - to.BasePhysicDefense - hurtExempt; //基础伤害值= 装备基础伤害-装备基础护甲-额外豁免 baseHurt = Mathf.Clamp(baseHurt, 0, float.MaxValue); //如果小于0则取制为0 float minHurt = from.attributeState.Quick * from.PhysicAttackFactor.MinimumDamageFactor; //最低伤害=敏捷*最低伤害系数 float baseDefHurtRate = 1 / (1 + physicDefenseFactor.CoefficientRatioReducingDamageFactor * to.PhysicsResistance); //受到伤害倍率= 1/(1+减伤倍率系数*防御力) float baseHurtRate = 1 + from.attributeState.PhysicsAttacking * from.PhysicAttackFactor.IncreaseRatioInjuryFactor; //伤害倍率=1+物理攻击力*增伤倍率系数 baseDamage = (baseHurt * baseDefHurtRate + minHurt) * baseHurtRate; //根据公式计算出的最初伤害 = (伤害基础值*受伤害倍率+最低伤害值)*伤害倍率 } break; } //计算暴击 float isCrit = from.attributeState.CritRate; if (from.hurtType != EnumHurtType.Magic && isHitRate >= 1 && Random.Range(0f, 1f) < isCrit)//如果命中并且本次攻击随机到了暴击概率阶段 { calculateHurtResult.IsCrit = true; float critDamageRatio = from.attributeState.CritDamageRatio - to.CriticalDef; critDamageRatio = Mathf.Clamp(critDamageRatio, 0.2f, 10);//将暴击倍率倍率范围限定在0.2到10之间,也就是有可能暴击伤害可能会更低 baseDamage *= critDamageRatio; } //计算格挡 float isEquipBlock = to.EquipBlock; if (isHitRate >= 1 && Random.Range(0f, 1f) < isEquipBlock)//如果命中并且本次随机到了格挡概率阶段 { baseDamage *= 0.7f; } //计算浮动之 float hurtDrift = Random.Range(1f, 1.15f); baseDamage *= hurtDrift; //附加或倍率等处理 //....... to.HP -= baseDamage; calculateHurtResult.hurtRate = baseDamage / maxHP; calculateHurtResult.hurt = baseDamage; if (from.statusLevelDataInfos != null && from.statusLevelDataInfos.Length > 0) { float specialRate = from.attributeState.EffectAffine - to.AbnormalStateResistance; List <StatusDataInfo.StatusLevelDataInfo> tempStatusLevelDataInfos = new List <StatusDataInfo.StatusLevelDataInfo>(); foreach (StatusDataInfo.StatusLevelDataInfo tempStatusLevelDataInfo in from.statusLevelDataInfos) { float tempSpecialRate = Random.Range(0, 100); if (tempSpecialRate < specialRate) { tempStatusLevelDataInfos.Add(tempStatusLevelDataInfo); } } calculateHurtResult.statusDatas = tempStatusLevelDataInfos.ToArray(); } else { calculateHurtResult.statusDatas = new StatusDataInfo.StatusLevelDataInfo[0]; } return(calculateHurtResult); }