public void GetCaught(HurtType hurtType, Rigidbody2D targetRigidBody) { isJumping = isDoubleJump = isHeadBlocked = isCrouching = isAttacking = isHanging = isClimbing = isHooked = false; this.hurtType = hurtType; this.targetRigidBody = targetRigidBody; isHurt = true; }
public void SetShuxing(HurtType hurtType) { switch (hurtType) { case HurtType.Fire: shuxingIcon.spriteName = "shuxing_huo"; break; case HurtType.Water: shuxingIcon.spriteName = "shuxing_shui"; break; case HurtType.Earth: shuxingIcon.spriteName = "shuxing_tu"; break; case HurtType.Light: shuxingIcon.spriteName = "shuxing_guong"; break; case HurtType.Dark: shuxingIcon.spriteName = "shuxing_fa"; break; default: shuxingIcon.enabled = false; break; } }
/// <summary> /// 初始化 /// </summary> /// <param name="gameObj"></param> /// <param name="totalHp"></param> /// <param name="currentHp"></param> /// <param name="changeValue"></param> /// <param name="hurtType"></param> /// <param name="objType"></param> public HealthChangePacker(GameObject gameObj, float totalHp, float currentHp, float changeValue, HurtType hurtType, ObjectID.ObjectType objType) { GameObj = gameObj; TotalHp = totalHp; CurrentHp = currentHp; ChangeValue = changeValue; HurtType = hurtType; ObjType = objType; }
public void Repulse(Vector2 repulseDistantion, float dazedTime) { isJumping = isDoubleJump = isHeadBlocked = isCrouching = isAttacking = isHanging = isClimbing = isHooked = false; rigidBody.bodyType = RigidbodyType2D.Dynamic; rigidBody.velocity = Vector2.zero; isHurt = true; hurtType = HurtType.Repulsion; rigidBody.AddForce(repulseDistantion, ForceMode2D.Impulse); curDazedTime = dazedTime + Time.time; }
/// <summary> /// 计算护盾吸收伤害 /// </summary> public static int CaculateHudun(int hurtNum, FightUnit target, HurtType hurtType) { for (int i = target.OnHudunList.Count - 1; i >= 0; i--) { if (target.OnHudunList[i] != null) { hurtNum = target.OnHudunList[i](hurtNum, hurtType); } } return(hurtNum); }
/// <summary> /// buff造成伤害 /// </summary> public static void BuffAttackDamage(Buff buff, HurtType hurtType) { if (buff.target.isInvincible) { return; } FightUnit target = buff.target; int hurtNum = 0; if (hurtType == HurtType.True) { hurtNum = Mathf.RoundToInt(buff.buffValue * (1 - target.fightAttribute.allDefenseRate)); } else { float elementDefenseFactor = 0; switch (hurtType) { case HurtType.Fire: elementDefenseFactor = target.fightAttribute.fireDefenseRate; break; case HurtType.Water: elementDefenseFactor = target.fightAttribute.waterDefenseRate; break; case HurtType.Earth: elementDefenseFactor = target.fightAttribute.eathDefenseRate; break; case HurtType.Light: elementDefenseFactor = target.fightAttribute.lightDefeneseRate; break; case HurtType.Dark: elementDefenseFactor = target.fightAttribute.darkDefenseRate; break; } hurtNum = Mathf.RoundToInt(buff.buffValue * (1 - target.fightAttribute.allDefenseRate) * (1 - elementDefenseFactor)); } hurtNum = Mathf.Max(0, hurtNum); //护盾计算 hurtNum = CaculateHudun(hurtNum, target, hurtType); //伤血 HealthUIManager.instance.DisplayHurtNum(target, hurtNum.ToString(), true, false); target.health -= hurtNum; if (target.health == 0) { FightManager.GetInstance().UnitDead(buff.source, target); } }
void OnFantan(params object[] objs) { int hurtNum = (int)objs[0]; Skill skill = (Skill)objs[1]; HurtType damangeType = (HurtType)objs[2]; if (damangeType != hurtType || skill == null) { return; } int fantanNum = Mathf.Max(1, Mathf.RoundToInt(hurtNum * buffValue)); FightRule.FantanDamage(fantanNum, target, skill.mineUnit); }
/// <summary> /// 受到伤害并播放伤害文字动画 /// </summary> /// <param name="hurt">Hurt.</param> /// <param name="type">Type.</param> /// <param name="specialAttack">Special attack.</param> public void AddHurtAndShow(int hurt, HurtType type, MyTowards textTowards) { // 至少有1点伤害值 if (hurt == 0) { hurt = 1; } string hurtString = string.Empty; agent.health -= hurt; string colorText = string.Empty; // 根据伤害类型添加颜色富文本 switch (type) { case HurtType.Physical: if (this is BattlePlayerController) { colorText = "red"; } else { colorText = "white"; } hurtString = string.Format("<color={0}>{1}</color>", colorText, hurt); break; case HurtType.Magical: if (this is BattlePlayerController) { colorText = "cyan"; } else { colorText = "lightblue"; } hurtString = string.Format("<color={0}>{1}</color>", colorText, hurt); break; } // 加入到伤害文本队列 AddHurtTextToQueue(hurtString, textTowards); }
/// <summary> /// Damage with catching /// </summary> public int TakeDamage(int damage, HurtType hurtType, Transform anchorPoint, Rigidbody2D rigidBody, Element element) { if (isInvulnerable) { return(0); } if (damage > 0 || element.value > 0) { health -= damage + element.value; timeOfLastTakenDamage = Time.time; statusBar.HealthChange(health); //Decrease energy //float _percentageConversionToEnergy = .05f; //Energy -= (damage + element.value) * _percentageConversionToEnergy; DamageText(damage, element); } if (health <= 0) { movement.isDead = true; isInvulnerable = true; movement.bodyCollider.sharedMaterial = null; AudioManager.PlayDeathAudio(); return(damage + element.value); } else { movement.transform.position = anchorPoint.position; movement.GetCaught(hurtType, rigidBody); AudioManager.PlayHurtAudio(); } //Camera shake float _maxAmplitude = 8f; float _shakeAmplitude = (damage + element.value) / (float)maxHealth * _maxAmplitude; cameraShake.Shake(_shakeAmplitude, 1f, .25f); return(damage + element.value); }
/// <summary> /// Damage with stun /// </summary> public int TakeDamage(int damage, HurtType hurtType, float dazedTime, Element element) { if (isInvulnerable) { return(0); } if (damage > 0 || element.value > 0) { health -= damage + element.value; timeOfLastTakenDamage = Time.time; statusBar.HealthChange(health); DamageText(damage, element); //Decrease energy //float _percentageConversionToEnergy = .05f; //Energy -= (damage + element.value) * _percentageConversionToEnergy; } if (health <= 0) { movement.isDead = true; isInvulnerable = true; movement.bodyCollider.sharedMaterial = null; AudioManager.PlayDeathAudio(); return(damage + element.value); } else { AudioManager.PlayHurtAudio(); } movement.hurtType = hurtType; movement.Stunned(dazedTime); //Camera shake float _maxAmplitude = 8f; float _shakeAmplitude = (damage + element.value) / (float)maxHealth * _maxAmplitude; cameraShake.Shake(_shakeAmplitude, 1f, .25f); return(damage + element.value); }
int OnHudun(params object[] objs) { int hurtNum = (int)objs[0]; HurtType damageType = (HurtType)objs[1]; if (damageType != hurtType || hurtNum == 0) { return(hurtNum); } healthHudun -= hurtNum; if (healthHudun <= 0) { Clear(); return(-healthHudun); } else { return(0); } }
private HurtType GetHurtTypeWithString(string str) { HurtType type = HurtType.None; switch (str) { case "": type = HurtType.None; break; case "物理": type = HurtType.Physical; break; case "魔法": type = HurtType.Magical; break; } return(type); }
/// <summary> /// Effect damage /// </summary> public int TakeDamage(int damage, HurtType hurtType, Effect effect) { if (movement.isDead) { return(0); } if (damage > 0) { health -= damage; statusBar.HealthChange(health); //Decrease energy //float _percentageConversionToEnergy = .05f; //Energy -= damage * _percentageConversionToEnergy; DamageText(damage, effect); } if (health <= 0) { movement.isDead = true; isInvulnerable = true; movement.bodyCollider.sharedMaterial = null; //Delete collider material for turn on friction AudioManager.PlayDeathAudio(); return(damage); } else { AudioManager.PlayHurtAudio(); } //Camera shake float _maxAmplitude = 8f; float _shakeAmplitude = damage / (float)maxHealth * _maxAmplitude; cameraShake.Shake(_shakeAmplitude, 1f, .25f); return(damage); }
void Hurt() { if (curDazedTime != 0f && curDazedTime <= Time.time) { canFlip = true; curDazedTime = 0f; isHurt = false; hurtType = HurtType.None; targetRigidBody = null; bodyCollider.sharedMaterial = physicMaterial; if (rigidBody.gravityScale == 0f) { rigidBody.gravityScale = 1f; } } else { SpellCastEnd(); bodyCollider.sharedMaterial = null; canFlip = false; if (isHealing) { HealingEnd(); } //Follow for catch source if (hurtType == HurtType.Catch) { rigidBody.velocity = targetRigidBody.velocity; } else if (hurtType == HurtType.Stun) { rigidBody.velocity = Vector2.zero; rigidBody.gravityScale = 0f; } } }
public static Buff AddNewBuff(FightUnit target, FightUnit source, BuffData buffData, float buffValue, float lastTime, HurtType hurtType) { BuffLogicType type = (BuffLogicType)buffData.effectType; Buff buff = null; switch (type) { case BuffLogicType.Yunxuan: buff = NGUITools.AddChild <YunxuanBuff>(target.gameObject); break; case BuffLogicType.Jiansu: buff = NGUITools.AddChild <JiansuBuff>(target.gameObject); break; case BuffLogicType.Jinzu: buff = NGUITools.AddChild <JinzuBuff>(target.gameObject); break; case BuffLogicType.Chenmo: buff = NGUITools.AddChild <ChenmoBuff>(target.gameObject); break; case BuffLogicType.Hunluan: buff = NGUITools.AddChild <HunluanBuff>(target.gameObject); break; case BuffLogicType.Meihuo: buff = NGUITools.AddChild <MeihuoBuff>(target.gameObject); break; case BuffLogicType.Bingdong: buff = NGUITools.AddChild <BingdongBuff>(target.gameObject); break; case BuffLogicType.Mabi: buff = NGUITools.AddChild <MabiBuff>(target.gameObject); break; case BuffLogicType.Shihua: buff = NGUITools.AddChild <ShihuaBuff>(target.gameObject); break; case BuffLogicType.Zhongdu: buff = NGUITools.AddChild <ZhongduBuff>(target.gameObject); break; case BuffLogicType.Xchixu: buff = NGUITools.AddChild <XchixuBuff>(target.gameObject); break; case BuffLogicType.Huifu: buff = NGUITools.AddChild <HuifuBuff>(target.gameObject); break; case BuffLogicType.Falihuifu: buff = NGUITools.AddChild <FalihuifuBuff>(target.gameObject); break; case BuffLogicType.Faliranshao: buff = NGUITools.AddChild <FaliranshaoBuff>(target.gameObject); break; case BuffLogicType.Cuozhi: buff = NGUITools.AddChild <Cuozhibuff>(target.gameObject); break; case BuffLogicType.Kuangbao: buff = NGUITools.AddChild <KuangbaoBuff>(target.gameObject); break; case BuffLogicType.Xjianmian: buff = NGUITools.AddChild <XjianmianBuff>(target.gameObject); break; case BuffLogicType.Xfantan: buff = NGUITools.AddChild <XfantanBuff>(target.gameObject); break; case BuffLogicType.Xixue: buff = NGUITools.AddChild <XixueBuff>(target.gameObject); break; case BuffLogicType.Zuzhou: buff = NGUITools.AddChild <ZuzhouBuff>(target.gameObject); break; case BuffLogicType.Zhufu: buff = NGUITools.AddChild <ZhufuBuff>(target.gameObject); break; case BuffLogicType.Xhudun: buff = NGUITools.AddChild <XhudunBuff>(target.gameObject); break; case BuffLogicType.Kuangye: buff = NGUITools.AddChild <KuangyeBuff>(target.gameObject); break; case BuffLogicType.Shanbi: buff = NGUITools.AddChild <ShanbiBuff>(target.gameObject); break; case BuffLogicType.Canbao: buff = NGUITools.AddChild <CanbaoBuff>(target.gameObject); break; case BuffLogicType.Yingyong: buff = NGUITools.AddChild <YingyongBuff>(target.gameObject); break; case BuffLogicType.Chihuan: buff = NGUITools.AddChild <ChihuanBuff>(target.gameObject); break; case BuffLogicType.Zhimang: buff = NGUITools.AddChild <ZhimangBuff>(target.gameObject); break; case BuffLogicType.Wudi: buff = NGUITools.AddChild <WudiBuff>(target.gameObject); break; case BuffLogicType.Mianyikongzhi: buff = NGUITools.AddChild <MianyikongzhiBuff>(target.gameObject); break; case BuffLogicType.Xyishang: buff = NGUITools.AddChild <XyishangBuff>(target.gameObject); break; case BuffLogicType.Pojia: buff = NGUITools.AddChild <PojiaBuff>(target.gameObject); break; default: buff = NGUITools.AddChild <Buff>(target.gameObject); break; } buff.target = target; buff.source = source; buff.buffData = buffData; buff.buffValue = buffValue; buff.lastTime = lastTime; buff.id = (int)buffData.id; buff.hurtType = hurtType; return(buff); }
///// <summary> ///// 获取排头兵位置 ///// </summary> ///// <param name="camp">阵营</param> ///// <returns>排头兵位置</returns> //public Vector3 GetFirstSoldierPos(int camp) //{ // Vector3 result = Vector3.zero; //} // ----------------------战斗抛事件相关---------------------- /// <summary> /// 伤害类型 /// </summary> /// <param name="obj">被变更单位</param> /// <param name="currentHp">当前血量</param> /// <param name="changeValue">变更血量</param> /// <param name="type">生命变更类型</param> /// <param name="totalHp">总血量</param> /// <param name="objType">单位类型</param> public void DoHealthChangeAction(GameObject obj, float totalHp, float currentHp, float changeValue, HurtType type, ObjectID.ObjectType objType) { if (healthChangeAction != null) { healthChangeAction(new HealthChangePacker(obj, totalHp, currentHp, changeValue, type, objType)); } }
/// <summary> /// 普通攻击伤害 /// 普通攻击伤害=攻击方最终攻击*防御效果*攻击方伤害加成效果系数*防御方对应属性免伤系数*防御方全免伤系数*属性相克系数*暴击伤害系数*random(0.95,1.05) /// 防御效果=1/(1+防御系数*防御方最终防御) /// 防御效果必须介于20%和100%之间,这两个参数由策划配置 /// 防御常数为常量,由策划配置,下同 /// 普通攻击的属性和单位自身的属性相同 /// </summary> public static void NormalAttackDamage(FightUnit attacker, FightUnit target, NormalAttack skill, SpecialEffect hitEffect) { if (target == null || attacker == null || target.isInvincible) { return; } //判断命中 if (IsMiss(attacker, target)) { HealthUIManager.instance.DisplayHurtNum(target, "Miss", true, false); //触发闪避事件 if (target.OnDodge != null) { target.OnDodge(); } return; } //判断无敌 if (target.isInvincible) { HealthUIManager.instance.DisplayHurtNum(target, "Invincible", true, false); return; } //判断暴击 bool isCrit = false; float critScale = 1f; if (IsCritical(attacker, target)) { isCrit = true; critScale = Const.CONST_BASIC_CRIT_DMG + attacker.fightAttribute.criticalImprove; //当普通攻击暴击时 if (attacker.OnNormalAttackCritil != null) { attacker.OnNormalAttackCritil(target); } //当被暴击时 if (target.OnGotCritil != null) { attacker.OnGotCritil(); } } //受击特效 skill.StartCoroutine(skill.DisplayHitEffect(target, hitEffect)); //计算数值 float defense = (float)1 / (1 + Const.CONST_DEF_FACTOR * target.fightAttribute.Defence);//防御效果 defense = Mathf.Clamp(defense, Const.CONST_MIN_DEF_EFFECT, Const.CONST_MAX_DEF_EFFECT); float elementDefenseFactor = 0; HurtType hurtType = (HurtType)attacker.fightAttribute.elementType; switch (hurtType) { case HurtType.Fire: elementDefenseFactor = target.fightAttribute.fireDefenseRate; break; case HurtType.Water: elementDefenseFactor = target.fightAttribute.waterDefenseRate; break; case HurtType.Earth: elementDefenseFactor = target.fightAttribute.eathDefenseRate; break; case HurtType.Light: elementDefenseFactor = target.fightAttribute.lightDefeneseRate; break; case HurtType.Dark: elementDefenseFactor = target.fightAttribute.darkDefenseRate; break; } float elementFactor = ElementFactorDic[(int)attacker.fightAttribute.elementType * 10 + (int)target.fightAttribute.elementType].factor; int hurtNum = Mathf.RoundToInt(attacker.fightAttribute.attack * defense * (1 + attacker.fightAttribute.allDamageRate) * (1 - elementDefenseFactor) * (1 - target.fightAttribute.allDefenseRate) * elementFactor * critScale * Random.Range(0.95f, 1.05f)); hurtNum = Mathf.Max(0, hurtNum); //触发普通攻击命中事件 if (attacker.OnNoramlAttackHit != null) { attacker.OnNoramlAttackHit(hurtNum); } //触发反弹事件 if (target.OnFantan != null) { target.OnFantan(hurtNum, skill, hurtType); } //护盾计算 hurtNum = CaculateHudun(hurtNum, target, hurtType); //伤血 if (hurtNum == 0) { return; } HealthUIManager.instance.DisplayHurtNum(target, hurtNum.ToString(), true, isCrit); target.health -= hurtNum; if (target.health == 0) { FightManager.GetInstance().UnitDead(attacker, target); } }
/// <summary> /// 技能附加buff /// </summary> public static void SkillAttachBuff(FightUnit attacker, FightUnit target, List <Skill.buffConfig> buffConfigList, HurtType hurtType) { if (buffConfigList.Count == 0) { return; } for (int i = 0; i < buffConfigList.Count; i++) { ActiveSkill.buffConfig buffConfig = buffConfigList[i]; BuffData buffData = BuffDataDic[buffConfig.id]; //判断免疫 if (!IsBuffAttachable(target, buffData)) { continue; } //判断控制buff的命中 if (buffData.controlDebuff == 1 && Random.value > 1 - Mathf.Max(0, (target.fightAttribute.level - buffConfig.level)) * Const.CONST_RESIST_FACTOR) { continue; } float buffValue = Mathf.RoundToInt(attacker.fightAttribute.attack * buffConfig.percent) + buffConfig.value; Buff buff = Buff.AddNewBuff(target, attacker, buffData, buffValue, buffConfig.time, hurtType); buff.bindSkill = buffConfig.bindSkill; } }
public static void UniqueSkillDamage(FightUnit attacker, FightUnit target, UniqueSkill skill) { if (target == null || attacker == null || target.isInvincible) { return; } //判断命中 if (IsMiss(attacker, target)) { HealthUIManager.instance.DisplayHurtNum(target, "Miss", true, false); //当闪避攻击时 if (target.OnDodge != null) { target.OnDodge(); } return; } //判断无敌 if (target.isInvincible) { HealthUIManager.instance.DisplayHurtNum(target, "Invincible", true, false); return; } //判断暴击 bool isCrit = false; float critScale = 1f; if (IsCritical(attacker, target)) { isCrit = true; critScale = Const.CONST_BASIC_CRIT_DMG + attacker.fightAttribute.criticalImprove; //当被暴击时 if (target.OnGotCritil != null) { target.OnGotCritil(); } } float defense = (float)1 / (1 + Const.CONST_DEF_FACTOR * target.fightAttribute.Defence);//防御效果 defense = Mathf.Clamp(defense, Const.CONST_MIN_DEF_EFFECT, Const.CONST_MAX_DEF_EFFECT); int hurtNum = 1; HurtType hurtType = (HurtType)skill.specialSkill.attackAttribute; if (hurtType != HurtType.True) { float elementFactor = ElementFactorDic[skill.specialSkill.attackAttribute * 10 + (int)target.fightAttribute.elementType].factor;//属性伤害系数 float elementDefenseFactor = 0; switch (hurtType) { case HurtType.Fire: elementDefenseFactor = target.fightAttribute.fireDefenseRate; break; case HurtType.Water: elementDefenseFactor = target.fightAttribute.waterDefenseRate; break; case HurtType.Earth: elementDefenseFactor = target.fightAttribute.eathDefenseRate; break; case HurtType.Light: elementDefenseFactor = target.fightAttribute.lightDefeneseRate; break; case HurtType.Dark: elementDefenseFactor = target.fightAttribute.darkDefenseRate; break; } hurtNum = Mathf.RoundToInt((float)(attacker.fightAttribute.attack * skill.specialSkillLvUp.percent + skill.specialSkillLvUp.additional) * defense * (1 + attacker.fightAttribute.allDamageRate) * (1 - elementDefenseFactor) * (1 - target.fightAttribute.allDefenseRate) * elementFactor * critScale * Random.Range(0.95f, 1.05f)); } else { hurtNum = Mathf.RoundToInt((float)(attacker.fightAttribute.attack * skill.specialSkillLvUp.percent + skill.specialSkillLvUp.additional) * (1 + attacker.fightAttribute.allDamageRate) * (1 - target.fightAttribute.allDefenseRate) * critScale * Random.Range(0.95f, 1.05f)); } hurtNum = Mathf.Max(0, hurtNum); //受击特效 skill.StartCoroutine(skill.DisplayHitEffect(target)); //触发技能命中事件 if (attacker.OnSkillHit != null) { attacker.OnSkillHit(hurtNum); } //触发反弹事件 if (target.OnFantan != null) { target.OnFantan(hurtNum, skill, hurtType); } //护盾计算 hurtNum = CaculateHudun(hurtNum, target, hurtType); //附加buff SkillAttachBuff(attacker, target, skill.buffConfigList, (HurtType)skill.specialSkill.attackAttribute); //附加效果 AttachExtension(attacker, target, hurtNum, skill.attachExtension, skill.attachExtensionParam); //伤血 if (hurtNum == 0) { return; } HealthUIManager.instance.DisplayHurtNum(target, hurtNum.ToString(), true, isCrit); target.health -= hurtNum; if (target.health == 0) { FightManager.GetInstance().UnitDead(attacker, target); } }