public virtual bool OnHurt(DamageData damageData) { // qte状态下不受伤 add by TangJian 2019/3/21 14:00 if (IsQte) { return(false); } // 无敌状态 add by TangJian 2018/12/8 15:04 if (IsInvincible) { return(false); } // 不攻击自己 add by TangJian 2018/12/8 15:05 if (damageData.owner == gameObject) { return(false); } // 判断动画状态, 如果死亡, 则不执行受击 add by TangJian 2018/12/8 15:06 if (_animator.GetBool("isDead")) { return(false); } HurtPart hurtPart = HurtModeController.GetHurtPart(damageData.hitTarget.name); damageData.HurtPart = hurtPart; return(HurtByPart(damageData, hurtPart)); }
public bool Hurt(DamageData damageData, HurtPart hurtPart) { IObjectController ownerObjectController = damageData.owner.GetComponent<IObjectController>(); // 强制位移 add by TangJian 2019/4/30 10:29 Vector3 forcedOffset = Vector3.zero; if(damageData.useForcedOffset && ownerObjectController != null && ObjectController is RoleController) { forcedOffset = CalcOffset(ownerObjectController, ObjectController, damageData.forcedOffset); // 如果是角色则执行移动 add by TangJian 2019/5/10 17:54 (ObjectController as RoleController)?.DoMoveBy(forcedOffset, damageData.forcedOffsetDuration).SetEase(Ease.OutSine); } // 播放特效 if (damageData is HitAble selfHitAble && ObjectController is HurtAble hurtAble) { Vector3 rendererOffset = Vector3.zero; if (damageData.effectOrientation.z > 0) { rendererOffset.z += 0.1f; } else { rendererOffset.z -= 0.1f; } Vector3 worldPos; if (TryGetHitPos(out worldPos)) { // 打击特效 BothAnimManager.Instance.PlayHurtEffect(selfHitAble.GetHitEffectType(), hurtPart.MatType, worldPos + rendererOffset + forcedOffset, damageData.direction.x > 0 ? Direction.Right : Direction.Left, 0, damageData.targetMoveBy); } else { // 打击特效 BothAnimManager.Instance.PlayHurtEffect(selfHitAble.GetHitEffectType(), hurtPart.MatType, damageData.collidePoint + rendererOffset + forcedOffset, damageData.direction.x > 0 ? Direction.Right : Direction.Left, 0, damageData.targetMoveBy); } AudioManager.Instance.PlayEffect(selfHitAble.GetHitEffectType(), hurtPart.MatType, worldPos + rendererOffset + forcedOffset); } return true; }
public bool HurtByPart(DamageData damageData, HurtPart hurtPart) { Direction oldDirection = GetDirection(); if (hurtPart == null) { return(false); } // return Hurt(damageData); // 扣血 add by TangJian 2017/07/14 18:02:17 if (IsDefending && damageData.ignoreShield == false // 不无视防御 add by TangJian 2019/4/3 17:16 ) { //方向判断 AnimationSwitch(damageData, false, true); //体力判断 { // 伤害计算和扣血 add by TangJian 2019/4/2 16:44 float HurtNum = this.DoLoseHp(damageData.atk, hurtPart.HurtRatio, false); //百分比减伤 LessenHurt_Ratio(HurtNum); // 自身动画状态设置 add by TangJian 2019/4/2 16:44 { if (animatorParams.ContainsKey("NoDefence")) { _animator.SetBool("NoDefence", true); } _animator.SetInteger("Defence_hurt_type", 3); AnimManager.Instance.WeaponCremaShake(FrameEventInfo.CameraShakeType.mediumshape); if (RoleData.Hp <= 0) { WeaponByDieAni(damageData.WeapondeadType, HurtNum); } else { _animator.SetTrigger("hurt"); } } // 额外效果 add by TangJian 2019/4/2 16:44 { float angle = damageData.SpecialEffectRotation; Bounds bounds = new Bounds(transform.position + RoleData.DefendBoundcenter, RoleData.DefendBoundsize); Vector3 localPos = transform.InverseTransformPoint(damageData.collideBounds.center); Vector3 posse = transform.position + localPos; Vector3 overpos = bounds.ClosestPoint(posse); Vector3 moveOrientation = Quaternion.AngleAxis(angle, Vector3.forward) * Vector3.right; moveOrientation.y = Mathf.Abs(moveOrientation.y); } } } else { // 伤害计算和扣血 add by TangJian 2019/4/2 16:44 float HurtNum = this.DoLoseHp(damageData.atk, hurtPart.HurtRatio); #region //2019.3.29// 动画状态机设置 { // 设置无视防御状态 add by TangJian 2019/4/3 17:50 if (damageData.ignoreShield) { RoleAnimator.SetTrigger("ignore_shield"); } if (RoleData.Hp <= 0) { WeaponByDieAni(damageData.WeapondeadType, HurtNum); } //地面血迹 2019.3.29 AnimManager.Instance.PlayAnimEffect("BloodSubface", transform.position, 0, damageData.direction.x < 0, Vector3.right, transform); //判断是否需要转身 2019.4.4 bool IsneedTurnback = RoleData.NeedTurnBack; if (IsneedTurnback) { if (damageData.hitType != (int)HitType.Fly) { IsneedTurnback = false; } } AnimationSwitch(damageData, IsneedTurnback); } #endregion // 播放掉血动画 if (HurtNum > 0) { this.PlayLoseHpAnim(HurtNum, damageData.isCritical); } // 使用代理实现受伤 add by TangJian 2019/5/10 17:56 _hitAndHurtDelegate.Hurt(damageData, hurtPart); } // 霸体状态处理 add by TangJian 2018/12/8 14:56 if (RoleData.IsSuperArmor) { SetDirection(oldDirection); // 霸体被攻击不转面 add by TangJian 2019/3/25 10:54 _animator.SetBool("hurt", false); } else { OnHurtEvent?.Invoke(damageData); } //击退 add by TangJian 2018/12/8 14:55 if (damageData.targetMoveBy.magnitude > 0.01f) { Speed = (damageData.targetMoveBy * (1f - (IsDefending ? RoleData.DefenseRepellingResistance : RoleData.RepellingResistance))).MoveByToSpeed(); } // 触发受伤事件 add by TangJian 2018/05/14 20:09:38 BuffController.TriggerBuffEvent(BuffEventType.OnHurt); return(true); }