public override IEnumerator Execute() { //find the nearest enemy aiTree.aiTarget = AIPublicFunc.GetNeareatEnemy(aiTree.aiUnit); //find if the nearest enemy in attack range List <Vector3> enemyFloor = aiTree.moveRange.enemyFloor; List <Unit> enemyList = new List <Unit>(); //get all of enemies of current ai unit foreach (Vector3 v in enemyFloor) { enemyList.Add(AIPublicFunc.GetUnit(v)); } if (enemyList.Contains(aiTree.aiTarget)) { //if the enemy is in attack range of aiUnit Data = true; } else { Data = false; } yield return(0); }
IEnumerator UseUnitSkillAI(string skillName, Unit aiUnit, Unit target) { yield return(StartCoroutine(AIPublicFunc.TurnToAI(aiUnit, target))); aiTree.outline.RenderOutLine(aiUnit.transform); aiUnit.GetComponent <CharacterAction>().SetSkill(skillName); UnitSkill unitSkill = SkillManager.GetInstance().skillQueue.Peek().Key as UnitSkill; aiTree.rtsCamera.FollowTarget(target.transform.position); yield return(new WaitForSeconds(0.5f)); unitSkill.Init(aiUnit.transform); unitSkill.Focus(target.transform.position); yield return(new WaitForSeconds(0.5f)); aiTree.outline.CancelRender(); unitSkill.Confirm(); yield return(new WaitUntil(() => { return unitSkill.complete == true; })); aiTree.rtsCamera.FollowTarget(aiUnit.transform.position); yield return(0); }
public override IEnumerator Execute() { yield return(StartCoroutine(AIPublicFunc.TurnToAI(aiTree.aiUnit, "forward"))); Data = true; yield return(0); }
/// <summary> /// if the aiUnit can't reach enemies in one round, he should choose more round to complete attack /// the move target should not only be the neareast from the neareast enemy /// but also in move range /// </summary> private void MoveMoreStep() { List <Vector3> availableFloors = new List <Vector3>(); foreach (KeyValuePair <Vector3, GameObject> kp in aiTree.moveRange.rangeDic) { availableFloors.Add(kp.Key); } aiTree.moveTarget = AIPublicFunc.GetNeareastFloor(aiTree.aiTarget, availableFloors); }
public override IEnumerator Execute() { //find the nearest enemy aiTree.aiTarget = AIPublicFunc.GetNearestEnemy(aiTree.aiUnit); List <Vector3> nextFloors = AIPublicFunc.GetNextFloors(aiTree.aiTarget.transform.position); //just leave these floors that could be reached in moveRange List <Vector3> canReachNextFloors = nextFloors.FindAll(nf => aiTree.moveRange.rangeDic.ContainsKey(nf)); //detect if there are other team mates in these floors List <Unit> teamMatesList = UnitManager.GetInstance().units.FindAll(p => p.playerNumber == aiTree.aiUnit.playerNumber); List <Vector3> availableFloors = new List <Vector3>(canReachNextFloors); foreach (Unit u in teamMatesList) { foreach (Vector3 v in canReachNextFloors) { if (u.transform.position == v && u.transform != aiTree.aiUnit.transform) { availableFloors.Remove(v); } } } //find if the nearest enemy in attack range //List<Vector3> enemyFloor = aiTree.moveRange.enemyFloor; //List<Unit> enemyList = new List<Unit>(); //get all of enemies of current ai unit //foreach (Vector3 v in enemyFloor) //{ // enemyList.Add(AIPublicFunc.GetUnit(v)); //} if (availableFloors.Count > 0) { aiTree.moveTarget = AIPublicFunc.GetNeareastFloor(aiTree.aiUnit, availableFloors); //if the enemy is in attack range of aiUnit Data = true; } else { Data = false; } yield return(0); }
public override IEnumerator Execute() { //choose a floor in moveRange and it is the neareast from aiUnit to aiTarget //get the four floors next aiTarget List <Vector3> nextFloors = AIPublicFunc.GetNextFloors(aiTree.aiTarget.transform.position); //just leave these floors that could be reached in moveRange List <Vector3> canReachNextFloors = nextFloors.FindAll(nf => aiTree.moveRange.rangeDic.ContainsKey(nf)); //detect if there are other team mates in these floors List <Unit> teamMatesList = UnitManager.GetInstance().units.FindAll(p => p.playerNumber == aiTree.aiUnit.playerNumber); List <Vector3> availableFloors = new List <Vector3>(canReachNextFloors); foreach (Unit u in teamMatesList) { foreach (Vector3 v in canReachNextFloors) { if (u.transform.position == v && u.transform != aiTree.aiUnit.transform) { availableFloors.Remove(v); } } } if (availableFloors.Count > 0) { //find the nearest floor aiTree.moveTarget = AIPublicFunc.GetNeareastFloor(aiTree.aiUnit, availableFloors); Data = true; } else { if (RemoteAttackDetect()) { RemoteAttack(); Data = true; } else { Data = false; } } yield return(0); }
public override IEnumerator Execute() { Transform targetTransform = aiTree.aiTarget.transform; Transform unitTransform = aiTree.aiUnit.transform; //Move if (unitTransform.position == aiTree.moveTarget) //target position is as same as aiUnit, don't need to move { Debug.Log(aiTree.aiUnit.name + " don't need to move"); yield return(new WaitForSeconds(0.5f)); } else { //auto move forward target aiTree.aiUnit.GetComponent <CharacterAction>().SetSkill("Move"); Move moveSkill = SkillManager.GetInstance().skillQueue.Peek().Key as Move; moveSkill.Init(unitTransform); //var path = aiTree.moveTarget - unitTransform.position; //Debug.Log(path); //if(path.x > 0) //{ // for (int i = 0; i < path.x; i++) // { // moveSkill.Focus(unitTransform.position + new Vector3(i, 0, 0)); // yield return new WaitForSeconds(0.1f); // } //} //if(path.z > 0) //{ // for (int i = 0; i < path.z; i++) // { // moveSkill.Focus(unitTransform.position + new Vector3(path.x, 0, 0) + new Vector3(0, 0, i)); // yield return new WaitForSeconds(0.1f); // } //} moveSkill.Focus(aiTree.moveTarget); yield return(new WaitForSeconds(0.5f)); aiTree.outline.CancelRender(); moveSkill.Confirm(); yield return(new WaitUntil(() => { return moveSkill.skillState == Skill.SkillState.reset; })); } aiTree.moveRange.Delete(); yield return(new WaitForSeconds(0.1f)); //Use Skill if (aiTree.skillName != "") { yield return(StartCoroutine(AIPublicFunc.TurnToAI(aiTree.aiUnit, aiTree.aiTarget))); if (aiTree.outline) { aiTree.outline.RenderOutLine(unitTransform); } aiTree.aiUnit.GetComponent <CharacterAction>().SetSkill(aiTree.skillName); UnitSkill unitSkill = SkillManager.GetInstance().skillQueue.Peek().Key as UnitSkill; aiTree.rtsCamera.FollowTarget(targetTransform.position); yield return(new WaitForSeconds(0.5f)); unitSkill.Init(unitTransform); unitSkill.Focus(targetTransform.position); yield return(new WaitForSeconds(0.5f)); if (aiTree.outline) { aiTree.outline.CancelRender(); } unitSkill.Confirm(); yield return(new WaitUntil(() => { return unitSkill.complete == true; })); aiTree.rtsCamera.FollowTarget(unitTransform.position); } //ChooseDirection yield return(StartCoroutine(AIPublicFunc.TurnToAI(aiTree.aiUnit, aiTree.finalDirection))); //ChooseTrick Data = true; yield return(0); }