/// <summary> ///子弹伤害计算也交给skillLayoutRunner执行 /// </summary> /// <param name="other">Other.</param> private void DoDamage(Collider other) { var oattr = NetworkUtil.GetAttr(other.gameObject); if (oattr != null && SkillLogic.IsEnemyForBullet(attacker, oattr.gameObject) && !missileData.DontHurtObject) { //MakeSound(); if (runner != null) { runner.DoDamage(oattr.gameObject); } } }
/// <summary> ///子弹伤害计算也交给skillLayoutRunner执行 /// </summary> /// <param name="other">Other.</param> void DoDamage(Collider other) { var oattr = other.GetComponent <NpcAttribute>(); if (oattr == null) { oattr = other.transform.parent.GetComponent <NpcAttribute>(); } if (SkillLogic.IsEnemyForBullet(attacker, oattr.gameObject) && !missileData.DontHurtObject) { if (!string.IsNullOrEmpty(skillData.HitSound)) { BackgroundSound.Instance.PlayEffect(skillData.HitSound); } if (runner != null) { runner.DoDamage(oattr.gameObject); } } }
/* *客户端表现粒子和服务器计算伤害的数值分离开来 */ void HitSomething(Collider other) { Log.AI("Bullet collider enemy " + other.name + " " + other.tag); if (SkillLogic.IsEnemyForBullet(attacker, other.gameObject)) { //攻击多个目标只释放一次 DieParticle CreateHitParticle(); //计算随机的弹射 反射方向 if (LeftRicochets > 0) { Log.AI("Generate new bullet " + LeftRicochets); LeftRicochets--; initPos = transform.position; //子弹应该冲入怪物群中 transform.localRotation = Quaternion.Euler(new Vector3(0, transform.localRotation.eulerAngles.y + Random.Range(-missileData.RandomAngle, missileData.RandomAngle), 0)); //sleepTime = IgnoreTime; } else { //地震是穿透的因此只会等待粒子自然死亡 //非穿透性子弹 if (!missileData.piercing) { GameObject.Destroy(gameObject); } } //伤害多个目标 if (missileData.IsAOE) { AOEDamage(); } else {//只伤害一个目标 //TODO:通过SkillDamageCaculate计算伤害 Level Information DoDamage(other); } //非穿透性子弹 if (!missileData.piercing) { var evt = new MyEvent(MyEvent.EventType.EventMissileDie); evt.missile = transform; MyEventSystem.myEventSystem.PushLocalEvent(attacker.GetComponent <KBEngine.KBNetworkView>().GetLocalId(), evt); } //TODO::撞击其它玩家如何处理 } else if (other.tag == attacker.tag) { } else {//装到墙体 或者建筑物 等对象身上 则 反射 Not used Log.AI("Bullet colldier with Wall " + gameObject.name); if (missileData.HitParticle != null) { GameObject g = Instantiate(missileData.HitParticle) as GameObject; NGUITools.AddMissingComponent <RemoveSelf>(g); g.transform.position = transform.position; g.transform.parent = ObjectManager.objectManager.transform; } if (LeftRicochets > 0) { Log.AI("Generate new bullet " + LeftRicochets); LeftRicochets--; initPos = transform.position; transform.localRotation = Quaternion.Euler(new Vector3(0, transform.localRotation.eulerAngles.y + 180 + Random.Range(-missileData.RandomAngle, missileData.RandomAngle), 0)); //sleepTime = IgnoreTime; } else { if (!missileData.piercing) { GameObject.Destroy(gameObject); } } if (!missileData.piercing) { var evt = new MyEvent(MyEvent.EventType.EventMissileDie); evt.missile = transform; MyEventSystem.myEventSystem.PushLocalEvent(attacker.GetComponent <KBEngine.KBNetworkView>().GetLocalId(), evt); } } }
/* *客户端表现粒子和服务器计算伤害的数值分离开来 */ private void HitSomething(Collider other) { Log.AI("Bullet collider enemy " + other.name + " " + other.tag); var otherAttr = NetworkUtil.GetAttr(other.gameObject); if (otherAttr != null && otherAttr.gameObject == attacker) { return; } if (SkillLogic.IsEnemyForBullet(attacker, other.gameObject)) { var oattr = NetworkUtil.GetAttr(other.gameObject); if (oattr != null) { var buff = oattr.GetComponent <BuffComponent>(); var fanTan = buff.CheckHasSuchBuff(Affix.EffectType.FanTanBullet); Log.Sys("CheckHasSuchBuff: " + fanTan); if (fanTan && fanTanNum == 0) { fanTanNum++; var dirY = transform.localRotation.eulerAngles.y; transform.localRotation = Quaternion.Euler(new Vector3(0, dirY + 180, 0)); this.runner.stateMachine.attacker = oattr.gameObject; var l2 = Util.FindChildRecursive(this.transform, "blue"); if (l2 != null) { l2.gameObject.SetActive(false); var l3 = Util.FindChildRecursive(this.transform, "red"); l3.gameObject.SetActive(true); } return; } } //攻击多个目标只释放一次 DieParticle CreateHitParticle(); //计算随机的弹射 反射方向 if (LeftRicochets > 0) { Log.AI("Generate new bullet " + LeftRicochets); LeftRicochets--; initPos = transform.position; //子弹应该冲入怪物群中 transform.localRotation = Quaternion.Euler(new Vector3(0, transform.localRotation.eulerAngles.y + Random.Range(-missileData.RandomAngle, missileData.RandomAngle), 0)); } else { //地震是穿透的因此只会等待粒子自然死亡 //非穿透性子弹 if (!missileData.piercing) { GameObject.Destroy(gameObject); } } //伤害多个目标 if (missileData.IsAOE) { AOEDamage(); } else { DoDamage(other); } //非穿透性子弹 if (!missileData.piercing) { var evt = new MyEvent(MyEvent.EventType.EventMissileDie); evt.missile = transform; MyEventSystem.myEventSystem.PushLocalEvent( attacker.GetComponent <KBEngine.KBNetworkView>().GetLocalId(), evt); } //TODO::撞击其它玩家如何处理 } else { //装到墙体 或者建筑物 等对象身上 则 反射 Not used Log.AI("Bullet colldier with Wall " + other.name); CreateHitParticle(); if (LeftRicochets > 0) { Log.AI("Generate new bullet " + LeftRicochets); LeftRicochets--; initPos = transform.position; transform.localRotation = Quaternion.Euler(new Vector3(0, transform.localRotation.eulerAngles.y + 180 + Random.Range(-missileData.RandomAngle, missileData.RandomAngle), 0)); //sleepTime = IgnoreTime; } else { if (!missileData.piercing) { GameObject.Destroy(gameObject); } } if (!missileData.piercing) { var evt = new MyEvent(MyEvent.EventType.EventMissileDie); evt.missile = transform; if (attacker != null) { MyEventSystem.myEventSystem.PushLocalEvent( attacker.GetComponent <KBEngine.KBNetworkView>().GetLocalId(), evt); } } } }