示例#1
0
    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);
    }
示例#2
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);
    }
示例#3
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);
    }
示例#7
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);
    }