/// <summary> /// 部件逻辑 /// </summary> public void RunPartsAI() { for (int i = 0; i < Ship.PartsList.Count; ++i) { var part = Ship.PartsList[i]; var enemyList = TargetSelector.FindTarget(part, CampType); if (enemyList.Count == 0) { part.PartState = PartState.Idle; continue; } part.PartState = PartState.Guard; proto.PartFireEvent partFireEvent = new proto.PartFireEvent(); partFireEvent.partid = part.Id; for (int enemyIndex = 0; enemyIndex < enemyList.Count; ++enemyIndex) { EnemyInfo enemyInfo = enemyList[enemyIndex]; if (enemyInfo.InAttackRange) { part.PartState = PartState.Attack; } if (!part.IsCoolDownFinished()) { continue; } part.StartCoolDown(); partFireEvent.add_fireinfo(PartFire(part, enemyInfo.EnemyShip)); } if (partFireEvent.fireinfo_size() != 0) { BehaviorMsg_.add_partfireevent(partFireEvent); } } }
/// <summary> /// 战斗回调 /// </summary> /// <param name="obj"></param> private void BattleSys_EventOnFightFrameInfo(proto.S2CFightFrameInfo obj) { if (UserStatusPanel.Instance != null) { UserStatusPanel.Instance.ShowTime(obj.fighttick / 1000); } for (int i = 0; i < obj.underattacklist_size(); i++) { proto.UnderAttackInfo underAttackInfo = obj.underattacklist(i); TeamDisplay display = GetTeamDisplay(underAttackInfo.unitid); display.ModifyHp(underAttackInfo); } for (int i = 0; i < obj.behaviorsequences_size(); i++) { proto.UnitBehavior unit = obj.behaviorsequences(i); TeamDisplay display = GetTeamDisplay(unit.unitid); if (unit.breakaway) { display.BreakAway(); continue; } if (unit.has_position()) { display.Move(((float)unit.position.posx) / 10000f, ((float)unit.position.posz) / 10000f, unit.position.movetype); } // 部件开火信息表 for (int eventIndex = 0; eventIndex < unit.partfireevent_size(); eventIndex++) { proto.PartFireEvent fireEvent = unit.partfireevent(eventIndex); if (fireEvent == null) { Debug.LogError("PartFireEvent is null"); continue; } display.ShipFire(fireEvent); } } for (int i = 0; i < obj.useskill_size(); i++) { proto.UseSkill skill = obj.useskill(i); if (skill.skillstage == Def.SkillStage.Sing && EventOnSkillSing != null) { EventOnSkillSing(skill.skillid); } else if (skill.skillstage == Def.SkillStage.Casting && EventOnSkillTrigger != null) { EventOnSkillTrigger(skill.skillid); } TeamDisplay display = GetTeamDisplay(skill.unitid); display.UseSkill(skill); } }
/// <summary> /// 舰船开火 /// </summary> /// <param name="skill"></param> public void ShipFire(proto.PartFireEvent fireEvent) { if (Trans_ == null) { return; } Part part = GetPart(fireEvent.partid); if (part == null) { Debug.LogError("can't find part:" + fireEvent.partid); return; } CastPartFire(fireEvent, part); }
public void ShipFire(proto.PartFireEvent fireEvent) { if (ShipList_.Count == 1) { ShipList_[0].ShipFire(fireEvent); return; } for (int i = 0; i < ShipList_.Count; i++) { if (ShipList_[i] == null) { continue; } Global.Instance.StartCoroutine(ShipFireIE(ShipList_[i], fireEvent)); } }
/// <summary> /// 部件开火 /// </summary> /// <param name="fireEvent"></param> /// <param name="part"></param> private void CastPartFire(proto.PartFireEvent fireEvent, Part part) { ShowCast(part); // 范围攻击,只生成一个子弹 if (part.partType == SpellType.AOE) { List <BulletTarget> targetList = new List <BulletTarget>(); for (int i = 0; i < fireEvent.fireinfo_size(); i++) { proto.PartFireInfo info = fireEvent.fireinfo(i); TeamDisplay target = BattleSceneDisplayManager.Instance.GetTeamDisplay(info.targetid); if (target == null) { continue; } BulletTarget bulletTarget = new BulletTarget(); bulletTarget.delayFrame = info.delayframe; bulletTarget.Target = target; targetList.Add(bulletTarget); } ClientParts parts = Team_.GetPartsByID(part.partID); ShowBullet(parts, targetList, part.partType, part.attackPoint, part.bulletPath, part.hitEffect, Vector3.zero); return; } // 个体攻击,每个对象都生成子弹 for (int i = 0; i < fireEvent.fireinfo_size(); i++) { proto.PartFireInfo info = fireEvent.fireinfo(i); TeamDisplay target = BattleSceneDisplayManager.Instance.GetTeamDisplay(info.targetid); if (target == null) { continue; } List <BulletTarget> targetList = new List <BulletTarget>(); BulletTarget bulletTarget = new BulletTarget(); bulletTarget.delayFrame = info.delayframe; bulletTarget.Target = target; targetList.Add(bulletTarget); ClientParts parts = Team_.GetPartsByID(part.partID); ShowBullet(parts, targetList, part.partType, part.attackPoint, part.bulletPath, part.hitEffect, Vector3.zero); } }
private IEnumerator ShipFireIE(ShipDisplay display, proto.PartFireEvent fireEvent) { yield return(new WaitForSeconds(Random.Range(0f, 1f))); display.ShipFire(fireEvent); }