bool OnHurt(DamageData damageData) { switch (animator.GetInteger("state")) { case 0: // playDamageEffectAnim(damageData.damageEffectType, damageData.collideBounds.center, MathUtils.SpeedToDirection(damageData.force)); playEffectAnim("daji1", damageData.collideBounds.center, MathUtils.SpeedToDirection(damageData.force)); animator.SetInteger("state", 1); drop(); break; case 1: break; } return(true); }
bool OnHurt(DamageData damageData) { if (damageData.teamId != GetComponentInParent <RoleController>().RoleData.TeamId) { float angle = damageData.SpecialEffectRotation; Vector3 moveOrientation = Quaternion.AngleAxis(angle, Vector3.forward) * Vector3.right; DebugManager.Instance.AddDrawGizmos("rolehurthammer" + gameObject.GetInstanceID(), () => { Gizmos.DrawSphere(damageData.collidePoint, 0.5f); }); AnimManager.Instance.PlayAnimEffect("RoleHurtEffect", new Vector3(damageData.collidePoint.x, damageData.collidePoint.y, transform.position.z - 0.1f), 0, damageData.direction.x < 0, moveOrientation, transform); return(true); } else { return(false); } }
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 static async void ExecuteRoleAction(RoleController roleController, ActionData actionData) { if (actionData.chance >= Random.Range(0, 101)) { switch (actionData.type) { case ActionType.AddAttr: { roleController.AddAttr((AttrType)actionData.int1, actionData.float1); // roleController.AddAttr(actionData.string1, actionData.float1); } break; case ActionType.AddAnim: { var animGameObject = AnimManager.Instance.PlayAnim(actionData.type + actionData.string1, actionData.string1, actionData.bool1, roleController.CharacterController.bounds.center + new Vector3(0, 0, -0.5f), 1, 1, actionData.float1, roleController.transform); } break; case ActionType.RemoveAnim: { AnimManager.Instance.removeAnim(actionData.type + actionData.string1); } break; case ActionType.SetColor: // 变红 roleController.SkeletonAnimator.skeleton.DoColorTo(new Color(actionData.float1, actionData.float2, actionData.float3), 0.2f).OnComplete(() => { roleController.SkeletonAnimator.skeleton.DoColorTo(Color.white, 0.2f); }); break; case ActionType.CreateDamage: var triggerObject = GameObject.Instantiate(await AssetManager.LoadAssetAsync <GameObject>("Assets/Resources_moved/Prefabs/Trigger/TriggerCube.prefab")); triggerObject.tag = "Damage"; triggerObject.layer = LayerMask.NameToLayer("Interaction"); float destroyDelayTime = 0.1f; Tools.RemoveComponent <TriggerController>(triggerObject); var damageController = triggerObject.AddComponent <DamageController>(); // 不渲染 add by TangJian 2017/07/07 22:40:39 { var meshRenderer = triggerObject.GetComponent <MeshRenderer>(); if (DebugManager.Instance.debugData.debug) { meshRenderer.enabled = true; destroyDelayTime = 1; } else { meshRenderer.enabled = false; } } // 设置大小 add by TangJian 2017/07/07 22:40:40 { var boxCollider = triggerObject.GetComponent <BoxCollider>(); triggerObject.transform.localScale = new Vector3(actionData.vector3_2.x, actionData.vector3_2.y, actionData.vector3_2.z); } // 设置位置 add by TangJian 2017/07/07 22:34:48 { triggerObject.transform.parent = roleController.gameObject.transform.parent; // var a = direction; var x = roleController.gameObject.transform.localPosition.x + actionData.vector3_1.x * roleController.GetDirectionInt(); var y = roleController.gameObject.transform.localPosition.y + actionData.vector3_1.y; var z = roleController.gameObject.transform.localPosition.z + actionData.vector3_1.z; triggerObject.transform.localPosition = new Vector3(x, y, z); } var damageData = new DamageData(); damageController.damageData = damageData; // 设置持有者 add by TangJian 2017/07/27 20:26:44 damageData.teamId = roleController.RoleData.TeamId; damageData.owner = roleController.gameObject; damageData.itriggerDelegate = roleController; // 力度 add by TangJian 2017/07/24 15:16:23 { damageData.force = new Vector3(roleController.GetDirectionInt() * actionData.vector3_3.x, actionData.vector3_3.y, actionData.vector3_3.z); } // 攻击方向 add by TangJian 2017/07/24 15:17:37 { damageData.direction = new Vector3(roleController.GetDirectionInt() * (int)actionData.int2, 0, 0); } // 攻击类别 add by TangJian 2017/07/24 15:17:35 { damageData.hitType = (int)actionData.int1; } // 攻击击退 add by TangJian 2017/08/29 22:18:55 // { // damageData.targetMoveBy = new Vector3(roleController.getDirectionInt() * roleAtkFrameEventData.targetMoveBy.x, roleAtkFrameEventData.targetMoveBy.y, roleAtkFrameEventData.targetMoveBy.z); // } // 伤害效果类型 add by TangJian 2017/08/16 15:33:01 // { // var mainHandWeapon = RoleData.EquipData.getMainHand<WeaponData>(); // if (mainHandWeapon != null) // { // damageData.damageEffectType = mainHandWeapon.damageEffectType; // } // } // 攻击力 add by TangJian 2017/07/24 15:17:22 // damageData.atk = roleData.Atk * roleAtkFrameEventData.atk; // 暴击 add by TangJian 2017/12/20 21:50:30 // if (roleData.FinalCriticalRate >= UnityEngine.Random.Range(0.0f, 1.0f)) // { // //damageData.isCritical = true; // //damageData.atk *= roleData.CriticalDamage; // } triggerObject.DestoryChildren(); Tools.Destroy(triggerObject, destroyDelayTime); break; } } }
public override bool OnHit(DamageData damageData) { return(base.OnHit(damageData)); }
public virtual bool OnHit(DamageData damageData) { // 事件分发 if (OnHitEvent != null) { OnHitEvent(damageData); } // buff刷新 BuffController.TriggerBuffEvent(BuffEventType.OnHit, damageData); // 代理执行击中 add by TangJian 2019/5/10 17:20 _hitAndHurtDelegate.Hit(damageData); // 空中击中对象, 自己浮空 if (isGrounded == false) { if (damageData.itriggerDelegate is HurtAble && damageData.itriggerDelegate is IObjectController objectController) { //击退 add by TangJian 2018/12/8 14:55 if (damageData.targetMoveBy.magnitude > 0.01f) { speed.y = (damageData.targetMoveBy * (1f - (objectController.IsDefending ? objectController.DefenseRepellingResistance : objectController.RepellingResistance)) ).MoveByToSpeed().y; } } } // 添加碰撞伤害 // if (damageData.hitType == (int) HitType.Fly) // { // this.DelayToDo(0.1f, () => // { // if (damageData.hitGameObject.GetComponent<RoleController>() is IObjectController otherObjController) // { // var damageSize = new Vector3(1, 1, 1); // HitType hittype = HitType.Fly; // // string damageControllerId = Tools.getOnlyId().ToString(); // string damageId = Tools.getOnlyId().ToString(); // // var damageController = FrameEventMethods.RoleAtk((ITriggerDelegate) otherObjController, damageControllerId, damageId, // _roleData.TeamId, FrameEventInfo.ParentType.Transform // , PrimitiveType.Cube // , Vector3.zero // , damageSize // , new Vector3(GetDirectionInt(), 0, 0) // , hittype // , Vector3.zero // , DamageDirectionType.UseSpeed // , DamageEffectType.Strike // , AtkPropertyType.physicalDamage // , 1 // , 1); // // damageController.SetId(damageControllerId); // // // 设计击飞攻击效果为其他 // damageController.damageData.HitEffectType = HitEffectType.Other; // // // 绑定到攻击对象的身上 // damageController.bindType = FrameEventInfo.RoleAtkFrameEventData.BindType.BindObjectController; // damageController.ObjectController = otherObjController; // // damageController.NeedRemoveSelf = () => otherObjController.Speed.y <= 0 && otherObjController.IsGrounded(); // } // // }); // } return(true); }
public override bool OnHit(DamageData damageData) { PlayJoinAnim(true); return(base.OnHit(damageData)); }
// 受伤 add by TangJian 2018/12/8 1:54 public virtual bool Hurt(DamageData damageData) { Direction oldDirection = GetDirection(); // 扣血 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); // 自身动画状态设置 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); #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); } // 霸体状态处理 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 { if (OnHurtEvent != null) { OnHurtEvent(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); }
public virtual void AnimationSwitch(DamageData damageData, bool needTurnBack, bool NoSetHurt = false) { // 设置力度 _animator.SetFloat("hurt_force_value", damageData.forceValue); bool mode = false; if (RoleData.DamageTargetNameList != null) { if (RoleData.DamageTargetNameList.Count != 0) { if (RoleData.DamageTargetNameList.Contains(damageData.hitTarget.name)) { mode = true; } } } if (mode) { if (animatorParams.ContainsKey("hurt_type")) { int sd = RoleData.DamageTargetNameList.IndexOf(damageData.hitTarget.name); _animator.SetInteger("hurt_type", sd); _animator.SetFloat("hurt_type", sd); } if (RoleData.Hp <= 0) { _animator.SetBool("isDead", true); } else { if (NoSetHurt) { } else { switch (damageData.forceType) { case DamageForceType.light: if (RoleData.Atklightforcetype == false) { _animator.SetBool("hurt", true); _animator.SetTrigger("hurt"); } break; case DamageForceType.moderate: if (RoleData.Atkmoderateforcetype == false) { _animator.SetBool("hurt", true); _animator.SetTrigger("hurt"); } break; case DamageForceType.heavy: if (RoleData.Atkheavyforcetype == false) { _animator.SetBool("hurt", true); _animator.SetTrigger("hurt"); } break; default: break; } } } } else { if (GetDirectionInt() > 0) { if (damageData.direction.x > 0) { _animator.SetInteger("hurt_direction", -1); _animator.SetFloat("hurt_direction", -1); if (needTurnBack) { _animator.SetInteger("hurt_direction", 1); _animator.SetFloat("hurt_direction", 1); SetDirection(GetDirection().Reverse()); } } else { _animator.SetInteger("hurt_direction", 1); _animator.SetFloat("hurt_direction", 1); } } else { if (damageData.direction.x < 0) { _animator.SetInteger("hurt_direction", -1); _animator.SetFloat("hurt_direction", -1); if (needTurnBack) { _animator.SetInteger("hurt_direction", 1); _animator.SetFloat("hurt_direction", 1); SetDirection(GetDirection().Reverse()); } } else { _animator.SetInteger("hurt_direction", 1); _animator.SetFloat("hurt_direction", 1); } } // 攻击部位体现 add by TangJian 2017/07/10 20:59:29 _animator.SetInteger("hurt_type", damageData.hitType); _animator.SetFloat("hurt_type", damageData.hitType); // 设置攻击状态 add by TangJian 2017/07/14 18:06:02 if (RoleData.Hp <= 0) { _animator.SetBool("isDead", true); } else { if (NoSetHurt) { } else { switch (damageData.forceType) { case DamageForceType.light: if (RoleData.Atklightforcetype == false) { _animator.SetBool("hurt", true); _animator.SetTrigger("hurt"); } break; case DamageForceType.moderate: if (RoleData.Atkmoderateforcetype == false) { _animator.SetBool("hurt", true); _animator.SetTrigger("hurt"); } break; case DamageForceType.heavy: if (RoleData.Atkheavyforcetype == false) { _animator.SetBool("hurt", true); _animator.SetTrigger("hurt"); } break; default: break; } } //animator.SetBool("hurt", true); } } }
// 受击 add by TangJian 2019/5/10 18:28 public override bool OnHurt(DamageData damageData) { switch (Placementdata.hporCount) { case tian.HporCount.None: Explode(damageData.targetMoveBy); Drop(); Destroy(gameObject); break; case tian.HporCount.count: if (CurrAtkCount < Placementdata.atkcount - 1) { State = 1; HitAndHurtDelegate.Hurt(damageData); CurrAtkCount++; } else { Explode(damageData.targetMoveBy); Destroy(gameObject); } break; case tian.HporCount.Hp: float damage = 0; switch (damageData.atkPropertyType) { case AtkPropertyType.physicalDamage: damage = damageData.atk; break; case AtkPropertyType.magicalDamage: damage = damageData.magical; break; case AtkPropertyType.mixDamage: damage = damageData.atk + damageData.magical; break; default: break; } CurrHp -= damage; if (CurrHp > 0) { } else { Explode(damageData.targetMoveBy); Drop(); Destroy(gameObject); } break; default: break; } return(true); }
public bool Hit(DamageData damageData) { var speed = ObjectController.Speed; // 强制位移 Vector3 forcedOffset = Vector3.zero; // 击退 var selfObjectController = ObjectController; var selfHitAndMat = selfObjectController as HitAble; var otherObjectController = damageData.hitGameObject.GetComponent<IObjectController>(); var otherHurtAble = damageData.hitGameObject.GetComponent<HurtAble>(); if (otherObjectController != null && otherObjectController.CanRebound) { if (otherObjectController.IsDefending) { Vector3 moveBySpeed = (damageData.targetMoveBy * (-otherObjectController.DefenseRepellingResistance)).MoveByToSpeed(); if (ObjectController.Speed.magnitude < moveBySpeed.magnitude) { // 去除y方向的反弹效果 add by TangJian 2019/1/26 17:19 speed.x = moveBySpeed.x; speed.z = moveBySpeed.z; } } else { Vector3 moveBySpeed = (damageData.targetMoveBy * (-otherObjectController.RepellingResistance)).MoveByToSpeed(); if (speed.magnitude < moveBySpeed.magnitude) { // 去除y方向的反弹效果 add by TangJian 2019/1/26 17:19 speed.x = moveBySpeed.x; speed.z = moveBySpeed.z; } } // 强制位移 add by TangJian 2019/4/30 10:29 if(damageData.useForcedOffset && otherObjectController is RoleController) { forcedOffset = CalcOffset(selfObjectController, otherObjectController, damageData.forcedOffset); } } if (otherObjectController.IsGrounded()) { } if (otherHurtAble != null && selfHitAndMat != null) { // 攻击击中时动画暂停 AnimSuspend(damageData.selfSuspendTime, 1f + (damageData.selfSuspendScale - 1f) * otherHurtAble.Damping); Vector3 rendererOffset = Vector3.zero; if (damageData.effectOrientation.z > 0) { rendererOffset.z = otherObjectController.BackZ; } else { rendererOffset.z = otherObjectController.FrontZ; } Vector3 worldPos; if (otherHurtAble.TryGetHitPos(out worldPos)) { // 打击特效 BothAnimManager.Instance.PlayHitEffect(selfHitAndMat.GetHitEffectType(), otherHurtAble.GetMatType(), worldPos + rendererOffset + forcedOffset, damageData.direction.x > 0 ? Direction.Right : Direction.Left, damageData.effectOrientation.GetAngleZ()); } else { switch (otherHurtAble.EffectShowMode) { case EffectShowMode.FrontOrBack : BothAnimManager.Instance.PlayHitEffect(selfHitAndMat.GetHitEffectType(), otherHurtAble.GetMatType(), new Vector3(damageData.collidePoint.x, damageData.collidePoint.y, otherObjectController.transform.position.z) + rendererOffset + forcedOffset, damageData.direction.x > 0 ? Direction.Right : Direction.Left, damageData.effectOrientation.GetAngleZ()); break; case EffectShowMode.ColliderPoint: BothAnimManager.Instance.PlayHitEffect(selfHitAndMat.GetHitEffectType(), otherHurtAble.GetMatType(), damageData.collidePoint + forcedOffset, damageData.direction.x > 0 ? Direction.Right : Direction.Left, damageData.effectOrientation.GetAngleZ()); break; default: BothAnimManager.Instance.PlayHitEffect(selfHitAndMat.GetHitEffectType(), otherHurtAble.GetMatType(), damageData.collidePoint + forcedOffset, damageData.direction.x > 0 ? Direction.Right : Direction.Left, damageData.effectOrientation.GetAngleZ()); break; } } AudioManager.Instance.PlayEffect(selfHitAndMat.GetHitEffectType(),otherHurtAble.GetMatType(), worldPos + rendererOffset + forcedOffset); } selfObjectController.Speed = speed; return true; }