示例#1
0
    void StateInvestigate()
    {
        if (currentPath != null)
        {
            if (currentPath.ReachedEndNode())
            {
                anim.SetBool("move", false);

                currentPath = null;
                curTarget   = null;

                states = ai_states.idle;
                return;
            }

            Vector3 nodePos = currentPath.GetNextNode();

            if (Vector3.Distance(myTransform.position, nodePos) < 1)
            {
                currentPath.currentPathIndex++;
            }
            else
            {
                myTransform.LookAt(nodePos);
                myTransform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
            }
        }
        else
        {
        }
    }
示例#2
0
 void stateMove()
 {
     if (curTarget != null && curTarget.GetComponent <Vitals>().GetCurrentHealth() > 0)
     {
         if (Vector3.Distance(myTransform.position, curTarget.transform.position) > maxAttackDst)
         {
             //MOVE CLOSER
             myTransform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
         }
         else if (Vector3.Distance(myTransform.position, curTarget.transform.position) < minAttackDst)
         {
             //MOVE AWAY
             myTransform.Translate(Vector3.forward * -1 * moveSpeed * Time.deltaTime);
         }
         else
         {
             //ATTACK
             anim.SetBool("move", false);
             states = ai_states.combat;
         }
     }
     else
     {
         anim.SetBool("move", false);
         states = ai_states.idle;
     }
 }
示例#3
0
    void stateIdle()
    {
        if (curTarget != null && curTarget.GetComponent <Vitals>().GetCurrentHealth() > 0)
        {
            myTransform.LookAt(curTarget.transform);
            if (Vector3.Distance(myTransform.position, curTarget.transform.position) <= maxAttackDst && Vector3.Distance(myTransform.position, curTarget.transform.position) >= minAttackDst)
            {
                //ATTACK
                states = ai_states.combat;
            }
            else
            {
                //MOVE
                anim.SetBool("move", true);
                states = ai_states.move;
            }
        }
        else
        {
            //FIND TARGET
            Player[] allPlayers = GameObject.FindObjectsOfType <Player>();
            Player   bestTarget = null;

            for (int i = 0; i < allPlayers.Length; i++)
            {
                Player curPlayer = allPlayers[i];

                if (curPlayer.GetComponent <Team>().getTeamNumber() != myTeam.getTeamNumber() && curPlayer.GetComponent <Vitals>().GetCurrentHealth() > 0)
                {
                    if (canISeeTarget(curPlayer.transform))
                    {
                        print("Searching");
                        if (bestTarget == null)
                        {
                            bestTarget = curPlayer;
                        }
                        else
                        {
                            //CHANGE IF BETTER IS FOUND
                            if (Vector3.Distance(curPlayer.transform.position, myTransform.position) < Vector3.Distance(bestTarget.transform.position, myTransform.position))
                            {
                                bestTarget = curPlayer;
                            }
                        }
                    }
                }
            }
            if (bestTarget != null)
            {
                curTarget = bestTarget;
            }
        }
    }
示例#4
0
    void stateIdle()
    {
        if (curTarget != null && curTarget.GetComponent <Vitals>().getCurHealth() > 0)
        {
            if (currentCover != null)
            {
                coverManager.ExitCover(currentCover);
            }

            currentCover = coverManager.GetCoverTowardsTarget(this, curTarget.transform.position, maxAttackDistance, minAttackDistance, currentCover);

            if (currentCover != null)
            {
                if (Vector3.Distance(myTransform.position, currentCover.transform.position) > 0.2F)
                {
                    currentPath = CalculatePath(myTransform.position, currentCover.transform.position);

                    anim.SetBool("move", true);

                    state = ai_states.moveToCover;
                }
                else
                {
                    state = ai_states.combat;
                }
            }
            else
            {
                if (Vector3.Distance(myTransform.position, curTarget.transform.position) <= maxAttackDistance && Vector3.Distance(myTransform.position, curTarget.transform.position) >= minAttackDistance)
                {
                    //attack
                    state = ai_states.combat;
                }
            }
        }
        else
        {
            //find new target
            Soldier bestTarget = GetNewTarget();

            if (bestTarget != null)
            {
                curTarget = bestTarget;
            }
        }
    }
示例#5
0
    void stateInvestigate()
    {
        if (currentPath != null)
        {
            Soldier alternativeTarget = GetNewTarget();

            if (currentPath.ReachedEndNode() || alternativeTarget != null)
            { //if we reached the end, we'll start looking for a target
                anim.SetBool("move", false);

                currentPath = null;
                curTarget   = alternativeTarget;

                state = ai_states.idle;
                return;
            }

            Vector3 nodePosition = currentPath.GetNextNode();

            if (Vector3.Distance(myTransform.position, nodePosition) < 1)
            {
                //if we reached the current node, then we'll begin going towards the next node
                currentPath.currentPathIndex++;
            }
            else
            {
                //else we'll move towards current node
                myTransform.LookAt(nodePosition);
                myTransform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
            }
        }
        else
        {
            //if we don't have a path, we'll look for a target
            anim.SetBool("move", false);

            currentPath = null;
            curTarget   = null;

            state = ai_states.idle;
        }
    }
 private void ChangeState(ai_states next_state, EnemyAction action)
 {
     next_action = action;
     ai_state.ChangeState(next_state);
     is_state_changed = true;
 }
示例#7
0
    void stateCombat()
    {
        if (curTarget != null && curTarget.GetComponent <Vitals>().getCurHealth() > 0)
        {
            //if the target escapes during combat
            if (!canISeeTheTarget(curTarget))
            {
                Soldier alternativeTarget = GetNewTarget();

                if (alternativeTarget == null)
                {
                    //If I can't see the target anymore, I'll need to Investigate last known position
                    targetLastKnownPosition = curTarget.transform.position;

                    //we'll need to calculate a path towards the target's last known position and we'll do so using the Unity NavMesh combined with some custom code
                    currentPath = CalculatePath(myTransform.position, targetLastKnownPosition);
                    anim.SetBool("move", true);

                    if (currentCover != null)
                    {
                        coverManager.ExitCover(currentCover);
                    }
                    state = ai_states.investigate;
                }
                else
                {
                    curTarget = alternativeTarget;
                }
                return;
            }

            myTransform.LookAt(curTarget.transform);

            if (Vector3.Distance(myTransform.position, curTarget.transform.position) <= maxAttackDistance && Vector3.Distance(myTransform.position, curTarget.transform.position) >= minAttackDistance)
            {
                //attack
                if (curFireCooldown <= 0)
                {
                    anim.SetTrigger("fire");

                    curTarget.GetComponent <Vitals>().getHit(damageDealt);

                    curFireCooldown = fireCooldown;
                }
                else
                {
                    curFireCooldown -= 1 * Time.deltaTime;
                }
            }
            else
            {
                if (curCoverChangeCooldown <= 0)
                {
                    curCoverChangeCooldown = coverChangeCooldown;
                    anim.SetBool("move", false);

                    state = ai_states.idle;
                }
                else
                {
                    curCoverChangeCooldown -= 1 * Time.deltaTime;
                }
            }
        }
        else
        {
            state = ai_states.idle;
        }
    }
示例#8
0
    void stateMoveToCover()
    {
        if (curTarget != null && currentCover != null && currentCover.AmICoveredFrom(curTarget.transform.position))
        {
            if (currentPath != null)
            {
                Soldier alternativeTarget = GetNewTarget();

                if (alternativeTarget != null && alternativeTarget != curTarget)
                {
                    float distanceToCurTarget         = Vector3.Distance(myTransform.position, curTarget.transform.position);
                    float distanceToAlternativeTarget = Vector3.Distance(myTransform.position, alternativeTarget.transform.position);
                    float distanceBetweenTargets      = Vector3.Distance(curTarget.transform.position, alternativeTarget.transform.position);

                    if (Mathf.Abs(distanceToAlternativeTarget - distanceToCurTarget) > 5 && distanceBetweenTargets > 5)
                    {
                        curTarget = alternativeTarget;
                        coverManager.ExitCover(currentCover);
                        currentCover = coverManager.GetCoverTowardsTarget(this, curTarget.transform.position, maxAttackDistance, minAttackDistance, currentCover);
                        currentPath  = CalculatePath(myTransform.position, currentCover.transform.position);
                        return;
                    }
                }

                if (currentPath.ReachedEndNode())
                { //if we reached the end, we'll start looking for a target
                    anim.SetBool("move", false);

                    currentPath = null;

                    state = ai_states.combat;
                    return;
                }

                Vector3 nodePosition = currentPath.GetNextNode();

                if (Vector3.Distance(myTransform.position, nodePosition) < 1)
                {
                    //if we reached the current node, then we'll begin going towards the next node
                    currentPath.currentPathIndex++;
                }
                else
                {
                    //else we'll move towards current node
                    myTransform.LookAt(nodePosition);
                    myTransform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
                }
            }
            else
            {
                //if we don't have a path, we'll look for a target
                anim.SetBool("move", false);

                state = ai_states.idle;
            }
        }
        else
        {
            anim.SetBool("move", false);

            state = ai_states.idle;
        }
    }
示例#9
0
    void stateCombat()
    {
        if (curTarget != null && curTarget.GetComponent <Vitals>().GetCurrentHealth() > 0)
        {
            if (!canISeeTarget(curTarget.transform))
            {
                targetLastKnownPos = curTarget.transform.position;

                currentPath = CalcPath(myTransform.position, targetLastKnownPos);

                anim.SetBool("move", true);
                states = ai_states.Investigate;
                return;
            }

            myTransform.LookAt(curTarget.transform);
            if (Vector3.Distance(myTransform.position, curTarget.transform.position) <= maxAttackDst && Vector3.Distance(myTransform.position, curTarget.transform.position) >= minAttackDst)
            {
                //ATTACK
                if (curFireRate <= 0)
                {
                    anim.SetTrigger("fire");
                    AudioManager.PlaySound(fire, AudioManager.AudioGroups.GameSFX);

                    float outCome = Random.Range(0, 2);
                    if (outCome == 1)
                    {
                        curTarget.GetComponent <Vitals>().getHit(damage);
                    }

                    curFireRate = fireRate;
                }
                else
                {
                    curFireRate -= 1 * Time.deltaTime;
                }
            }
            else
            {
                //MOVE
                anim.SetBool("move", true);
                states = ai_states.move;
            }
        }
        else
        {
            if (curTarget != null && curTarget.GetComponent <Vitals>().GetCurrentHealth() <= 0)
            {
                targetLastKnownPos = curTarget.transform.position;

                currentPath = CalcPath(myTransform.position, targetLastKnownPos);

                anim.SetBool("move", true);
                states = ai_states.Investigate;
            }
            else
            {
                states = ai_states.idle;
            }
        }
    }