Пример #1
0
    // Use this for initialization
    void Start()
    {
        otherTeam = team == 0 ? "TeamB" : "TeamA";
        anim      = GetComponent <Animator>();
        anim.SetBool("Idling", true);
        anim.SetBool("NonCombat", true);
        agent = GetComponent <NavMeshAgent>();
        InitPriorities();
        enemies   = new List <GameObject>();
        maxAmmo   = ammo;
        maxHealth = health;
        topTier   = decisionCategory.Patrol;
        StartCoroutine("DetermineBehaviour");
        //DetermineBehaviour();
        //SortPriorities();

        //Outputs();
    }
Пример #2
0
    //---Determine my state and priorities---
    public IEnumerator DetermineBehaviour()
    {
        //yield return new WaitForEndOfFrame();
        yield return(new WaitForSeconds(1));

        if (UnityEditor.Selection.activeGameObject == gameObject)
        {
            string resString = "";
            if (topTier == decisionCategory.Combat)
            {
                resString = combatState.ToString();
            }
            else if (topTier == decisionCategory.Patrol)
            {
                resString = patState.ToString();
            }
            else if (topTier == decisionCategory.Survival)
            {
                resString = survState.ToString();
            }
            Debug.Log(gameObject.name + " called from " + topTier.ToString() + " " + resString);
        }
        float threat    = CalcThreat();
        float bravery   = CalcBravery();
        float condition = CalcCondition();

        //yield return new WaitForEndOfFrame();
        yield return(new WaitForSeconds(1));

        //determine priorities
        for (int i = 0; i < priorities.Count; i++)
        {
            Priorities pri = priorities[i];
            if (pri.key == "Health")
            {
                pri.value = 5 - (health / maxHealth) * 5;
            }
            if (pri.key == "Cover")
            {
                if (!behindCover && haveLOS)
                {
                    pri.value = 10 - (health / maxHealth) * 10;
                }
                else
                {
                    pri.value = 0;
                }
            }

            if (pri.key == "Ammo")
            {
                pri.value = 4 - (ammo / maxAmmo) * 4;
            }
            if (pri.key == "Fighting")
            {
                pri.value = 3;
                //pri.value = 5 - ((int)threat / (int)bravery) * 5; //this will need refining
            }
            if (pri.key == "Escape")
            {
                //pri.value = 4 - ((int)threat / (int)bravery) * 4; //this will need refining
            }
            priorities[i] = pri;
        }

        SortPriorities();
        //Outputs();
        //Determine which high level state we're in
        if (priorities[0].key == "Health" && priorities[0].value > 3 ||
            priorities[0].key == "Cover" && priorities[0].value > 3 ||
            priorities[0].key == "Escape" && priorities[0].value > 3 ||
            priorities[0].key == "Ammo" && priorities[0].value > 3)
        {
            topTier = decisionCategory.Survival;
        }
        else if (priorities[0].key == "Fighting" && priorities[0].value >= 1)
        {
            topTier = decisionCategory.Combat;
        }
        else
        {
            topTier = decisionCategory.Patrol;
        }
        //yield return new WaitForEndOfFrame();
        yield return(new WaitForSeconds(1));

        //Determine which low level state we're in
        if (topTier == decisionCategory.Patrol)
        {
            anim.SetBool("NonCombat", true);
            //determine ideal patrol behaviour
            if (threat > 1 && !haveLOS)
            {
                patState = patrolStates.Seek;
                Seek();
            }
            else
            {
                int choice = Random.Range(0, 2);
                if (choice == 0)
                {
                    patState = patrolStates.Idle;
                    Idle();
                }
                else
                {
                    patState = patrolStates.Wander;
                    Wander();
                }
            }
            if (UnityEditor.Selection.activeGameObject == gameObject)
            {
                Debug.Log(gameObject.name + " result is " + topTier.ToString() + " " + patState.ToString());
            }
        }
        else if (topTier == decisionCategory.Combat)
        {
            //determine course of action for combat
            anim.SetBool("NonCombat", false);
            if (haveLOS && ammo > 0)
            {
                if (UnityEditor.Selection.activeGameObject == gameObject)
                {
                    Debug.Log(gameObject.name + " should attack");
                }
                combatState = combatStates.Attack;
                Attack();
            }
            else if (haveLOS && ammo == 0)
            {
                combatState = combatStates.Charge;
                Charge();
            }
            else
            {
                combatState = combatStates.Reposition;
                Reposition();
            }
            if (UnityEditor.Selection.activeGameObject == gameObject)
            {
                Debug.Log(gameObject.name + " result is " + topTier.ToString() + " " + combatState.ToString());
            }
        }
        else if (topTier == decisionCategory.Survival)
        {
            anim.SetBool("NonCombat", true);
            if (priorities[0].key == "Health")
            {
                survState = survivalStates.SeekHealth;
                SeekHealth();
            }
            else if (priorities[0].key == "Cover")
            {
                survState = survivalStates.SeekCover;
                SeekCover();
            }
            else if (priorities[0].key == "Escape")
            {
                survState = survivalStates.Run;
                Run();
            }
            else if (priorities[0].key == "Ammo")
            {
                survState = survivalStates.SeekAmmo;
                SeekAmmo();
            }
            if (UnityEditor.Selection.activeGameObject == gameObject)
            {
                Debug.Log(gameObject.name + " result is " + topTier.ToString() + " " + survState.ToString());
            }
        }
        yield return(new WaitForEndOfFrame());
        //yield return new WaitForSeconds(1);
        //StopCoroutine("DetermineBehaviour");
    }