private void Update() { if (!runner || !runner.stateMachine || !runner.stateMachine.attacker || runner.stateMachine.isStop) { return; } var me = runner.stateMachine.attacker; Collider[] hitColliders; hitColliders = Physics.OverlapSphere(me.transform.position, radius, SkillDamageCaculate.GetDamageLayer()); for (int i = 0; i < hitColliders.Length; i++) { var enemy = NetworkUtil.GetAttr(hitColliders[i].gameObject); if (enemy != null && SkillLogic.IsEnemy(me, enemy.gameObject)) { if (!hurtEnemy.Contains(enemy.gameObject)) { var dir = enemy.transform.position - me.transform.position; dir.y = 0; var cos = Vector3.Dot(dir.normalized, transform.forward); Log.AI("DamageHit " + runner.stateMachine.name + " " + enemy.name + " cos " + cos + " a " + cosAngle); if (cos > cosAngle) { DoDamage(enemy.gameObject); hurtEnemy.Add(enemy.gameObject); } } } } Log.AI("Check Damage Shape " + runner.stateMachine.name); }
/* * 1自己 自己的宠物 * 2其它玩家 其它玩家的宠物 * 3怪物 * 4墙体 * 5: 事件类型碰撞体不参与技能 例如入口和出口的碰撞体? (忽略这种 假设所有都会碰撞) * * * 对于子弹的发射者来讲 * 按照角色分成三种: * 1:友方 * 2:敌方 * 3:中立(墙体) */ private void FixedUpdate() { if (isDie) { return; } Collider[] col = Physics.OverlapSphere(transform.position, missileData.Radius, SkillDamageCaculate.GetDamageLayer()); foreach (Collider c in col) { //和多个不同的敌人目标碰撞 if (c != lastColobj) { lastColobj = c; var hitT = NetworkUtil.GetAttr(c.gameObject); if (hitT != null) { if (hitT.gameObject != this.attacker) { HitSomething(c); break; } } else { HitSomething(c); break; } } } }
/// <summary> /// 子弹在网络模式下面 /// 只伤害 敌方玩家 /// 不伤害 建筑物 和 我方玩家 /// </summary> /// <returns><c>true</c> if is enemy for bullet the specified a b; otherwise, <c>false</c>.</returns> /// <param name="a">The alpha component.</param> /// <param name="b">The blue component.</param> public static bool IsEnemyForBullet(GameObject a, GameObject b) { var scene = WorldManager.worldManager.GetActive(); if (scene.IsNet) { var aview = a.GetComponent <KBEngine.KBNetworkView>(); var batt = NetworkUtil.GetAttr(b); if (batt != null) { var bview = batt.GetComponent <KBEngine.KBNetworkView>(); if (bview != null && bview.IsPlayer) { var battr = bview.GetComponent <NpcAttribute>(); var aattr = aview.GetComponent <NpcAttribute>(); if (aattr.TeamColor != battr.TeamColor) { return(true); } } } return(false); } else { return(IsEnemy(a, b)); } }
//找到最近的敌人 不考虑朝向方向 public static GameObject FindNearestEnemy(GameObject attacker) { LayerMask mask = SkillDamageCaculate.GetDamageLayer(); var enemies = Physics.OverlapSphere(attacker.transform.position, attacker.GetComponent <NpcAttribute>().AttackRange, mask); float minDist = 999999; GameObject enemy = null; var transform = attacker.transform; foreach (var ene in enemies) { var npcAttr = NetworkUtil.GetAttr(ene.gameObject); if (npcAttr != null && !npcAttr.IsDead && IsEnemy(attacker, npcAttr.gameObject)) { var d = (ene.transform.position - transform.position).sqrMagnitude; if (d < minDist) { minDist = d; enemy = npcAttr.gameObject; } } } return(enemy); }
private void DoDamage(GameObject target) { var oattr = NetworkUtil.GetAttr(target); if (oattr != null) { this.runner.DoDamage(oattr.gameObject); } }
void OnTriggerEnter(Collider other) { if (other.tag == GameTag.Player) { var attr = NetworkUtil.GetAttr(other.gameObject); if (attr != null) { AddHP(attr.gameObject); } } }
public override bool IsEnemy(GameObject a, GameObject b) { var aattr = NetworkUtil.GetAttr(a); var battr = NetworkUtil.GetAttr(b); if (aattr != null && battr != null) { return(a != b && b.tag == GameTag.Player && aattr.TeamColor != battr.TeamColor); } return(false); }
void OnTriggerExit(Collider other) { if (other.tag == GameTag.Player) { var attr = NetworkUtil.GetAttr(other.gameObject); if (attr != null) { RemoveBuff(attr.gameObject); } } }
public void PickCol(GameObject other) { var me = ObjectManager.objectManager.GetMyPlayer(); var attr = NetworkUtil.GetAttr(other.gameObject); Log.Sys("OnTriggerEnter: " + attr + " oth " + other.gameObject); if (attr != null && attr.gameObject == me && !pickYet) { pickYet = true; PickByMe(); } }
/// <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); } } }
private void OnTriggerExit(Collider other) { var attr = NetworkUtil.GetAttr(other.gameObject); if (attr != null) { if (attr.IsMine()) { GameInterface_Skill.RemoveSkillBuff(attr.gameObject, (int)GameBuff.LaserDamageHP); GameInterface_Skill.RemoveSkillBuff(attr.gameObject, Affix.EffectType.SlowDown2); me = null; } } }
private void OnTriggerEnter(Collider other) { var attr = NetworkUtil.GetAttr(other.gameObject); if (attr != null) { if (attr.IsMine()) { Util.ShowMsg("警告:进入核弹区域"); me = attr; GameInterface_Skill.AddSkillBuff(me.gameObject, (int)GameBuff.NuclearDamageHP, Vector3.zero, PlayerId); } } }
private void OnTriggerExit(Collider other) { var attr = NetworkUtil.GetAttr(other.gameObject); if (attr != null) { if (attr == me) { Util.ShowMsg("退出核弹区域"); me = null; GameInterface_Skill.RemoveSkillBuff(attr.gameObject, (int)GameBuff.NuclearDamageHP); } } }
private void Awake() { var attr = NetworkUtil.GetAttr(this.gameObject); var parBox = Util.FindChildRecursive(transform.parent, "boxCollider"); col = Util.FindChildRecursive(transform, "box"); Physics.IgnoreCollision(col.GetComponent <Collider>(), parBox.GetComponent <Collider>()); initPos = transform.localPosition * transform.parent.localScale.x; par = transform.parent; initScale = transform.lossyScale; attr.GetComponent <TankPhysicComponent>().tower = this.gameObject; attr.tower = this.gameObject; }
private void OnTriggerEnter(Collider other) { //Debug.LogError("OnTriggerEnter: "+other); var attr = NetworkUtil.GetAttr(other.gameObject); if (attr != null) { if (attr.IsMine()) { Util.ShowMsg("警告:进入辐射区域"); me = attr; GameInterface_Skill.AddSkillBuff(me.gameObject, (int)GameBuff.DamageHP, Vector3.zero); } } }
public void DoDamage(GameObject g) { Log.AI("SkillLayout DoDamage " + Event.affix.effectType); var attr = NetworkUtil.GetAttr(g); if (Event.affix.effectType != Affix.EffectType.None && Event.affix.target == Affix.TargetType.Enemy) { //Buff目标是本地控制 //通过ID来控制复制信息 实体都要有ID才便于复制 //if(stateMachine.attacker.GetComponent<NpcAttribute>().IsMine()) { if (attr.IsMine()) { //attr.GetComponent<BuffComponent>().AddBuff(Event.affix, stateMachine.attacker.transform.position); NetDateInterface.FastMoveAndPos(); NetDateInterface.FastAddBuff(Event.affix, stateMachine.attacker, attr.gameObject, stateMachine.skillFullData.skillId, Event.EvtId); } } stateMachine.DoDamage(attr.gameObject); }
private bool CheckHit() { Collider[] col = Physics.OverlapSphere(head.transform.position, missileData.Radius, SkillDamageCaculate.GetDamageLayer()); foreach (Collider c in col) { //和多个不同的敌人目标碰撞 var hitT = NetworkUtil.GetAttr(c.gameObject); if (hitT != null) { if (hitT.gameObject != this.attacker) { HitSomething(hitT); return(true); } } } return(false); }
private void Start() { //StartCoroutine(AutoEnemy()); var attr = NetworkUtil.GetAttr(gameObject); if (attr.IsMine()) { var shootManager = new GameObject("ShootManager"); shootManager.transform.parent = transform; Util.InitGameObject(shootManager); var sm = shootManager.AddComponent <ShootManager>(); sm.autoCheck = this; } else { StartCoroutine(SynDir()); } InitTowerTrace(); }
//自适应炮塔调整 IEnumerator AutoEnemy() { var attr = NetworkUtil.GetAttr(gameObject); var phy = attr.GetComponent <GeneraPhysic>(); var trans = attr.transform; while (true) { var enemy = SkillLogic.FindNearestEnemy(trans.gameObject); if (enemy != null) { yield return(StartCoroutine(AutoTarget(trans, enemy))); } else { yield return(StartCoroutine(AdjustTower(attr))); } yield return(new WaitForSeconds(0.3f)); } }
//0.1s 开启关闭 private void OnTriggerEnter(Collider other) { var meId = ObjectManager.objectManager.GetMyServerID(); if (meId == PlayerId) { return; } var attr = NetworkUtil.GetAttr(other.gameObject); if (attr != null) { Log.Sys("LaserEnter: " + other.gameObject); if (attr.IsMine()) { me = attr; GameInterface_Skill.AddSkillBuff(me.gameObject, (int)GameBuff.LaserDamageHP, Vector3.zero, PlayerId); GameInterface_Skill.AddSkillBuff(me.gameObject, "SlowDown2", Vector3.zero, PlayerId); } } }
/* *客户端表现粒子和服务器计算伤害的数值分离开来 */ 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); } } } }
public void PickItemFromNetwork(GameObject who) { pickYet = true; var whoAttr = NetworkUtil.GetAttr(who); BackgroundSound.Instance.PlayEffect("pickup"); GameObject.Destroy(gameObject); var me = ObjectManager.objectManager.GetMyPlayer(); Log.Sys("PickItemFromNetwork: " + whoAttr + " itemType: " + itemData.UnitType); var gen = Resources.Load <GameObject>("particles/drops/generic_item"); var par = ParticlePool.Instance.GetGameObject(gen, ParticlePool.InitParticle); //var par = Instantiate() as GameObject; //par.transform.parent = g.transform; par.transform.position = gameObject.transform.position; var rm = par.AddMissingComponent <RemoveSelf>(); rm.StartCoroutine(rm.WaitReturn(3)); if (whoAttr != null && whoAttr.gameObject == me) { if (itemData.UnitType == ItemData.UnitTypeEnum.POWER_DRUG) { WindowMng.windowMng.ShowNotifyLog("炸弹威力上升"); GameInterface_Backpack.LearnSkill((int)SkillData.SkillConstId.Bomb); } else if (itemData.UnitType == ItemData.UnitTypeEnum.QIPAO_DRUG) { var attr = ObjectManager.objectManager.GetMyAttr(); attr.AddMpMax(20); attr.AddThrowSpeed(0.1f); WindowMng.windowMng.ShowNotifyLog("MP上限增加"); } else if (itemData.UnitType == ItemData.UnitTypeEnum.XieZi_DRUG) { ObjectManager.objectManager.GetMyAttr().AddNetSpeed(0.1f); WindowMng.windowMng.ShowNotifyLog("速度提升"); } else if (itemData.UnitType == ItemData.UnitTypeEnum.LIAN_FA) { GameInterface_Skill.AddSkillBuff(me, (int)GameBuff.LianFa, Vector3.zero); WindowMng.windowMng.ShowNotifyLog("连发弹"); } else if (itemData.UnitType == ItemData.UnitTypeEnum.POTION) { GameInterface_Skill.AddSkillBuff(me, (int)GameBuff.AddHP, Vector3.zero); WindowMng.windowMng.ShowNotifyLog("恢复生命"); } else if (itemData.UnitType == ItemData.UnitTypeEnum.FASHI) { var attr = ObjectManager.objectManager.GetMyAttr(); attr.SetNetSpeed(0); attr.SetJob(Job.ALCHEMIST); WindowMng.windowMng.ShowNotifyLog("攻击提升", 2, null, true); WindowMng.windowMng.ShowNotifyLog("生命值变化", 2, null, true); } else if (itemData.UnitType == ItemData.UnitTypeEnum.CIKE) { var attr = ObjectManager.objectManager.GetMyAttr(); attr.SetJob(Job.ARMOURER); attr.SetNetSpeed(0.5f); WindowMng.windowMng.ShowNotifyLog("移动速度加快", 2, null, true); WindowMng.windowMng.ShowNotifyLog("生命值变化", 2, null, true); } else if (itemData.UnitType == ItemData.UnitTypeEnum.SUPER) { GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.SuperShoot, Vector3.zero); WindowMng.windowMng.ShowNotifyLog("拾获超能子弹", 2, null, true); } else if (itemData.UnitType == ItemData.UnitTypeEnum.HIDE) { GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.Hide, Vector3.zero); WindowMng.windowMng.ShowNotifyLog("拾获隐身药水", 2, null, true); } else if (itemData.UnitType == ItemData.UnitTypeEnum.NUCLEAR) { GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.NuclearBuff, Vector3.zero); WindowMng.windowMng.ShowNotifyLog("拾获核弹,使用后立即逃离区域", 4, null, true); } else if (itemData.UnitType == ItemData.UnitTypeEnum.KNOCK) { GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.KnockBuff, Vector3.zero); WindowMng.windowMng.ShowNotifyLog("获得击退能力", 4, null, true); } else if (itemData.UnitType == ItemData.UnitTypeEnum.WUDI) { GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.WuDi, Vector3.zero); } else if (itemData.UnitType == ItemData.UnitTypeEnum.DaoDan) { GameInterface_Skill.AddBuffWithNet(me, (int)GameBuff.DaoDan, Vector3.zero); } else if (itemData.UnitType == ItemData.UnitTypeEnum.DefaultSkill) { GameInterface_Skill.AddBuffWithNet(me, itemData.triggerBuffId, Vector3.zero); Util.ShowMsg("获得" + itemData.ItemName); } else { GameInterface_Backpack.PickItem(itemData, num); } } }