// 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(); }
//---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"); }