/// <summary> /// Gets all the food things that are alive, edible, attackable, not a wolf and not self /// </summary> /// <param name="hits"></param> /// <returns></returns> private AttackableTrait[] GetAllAliveAttackableFoodTraits(RaycastHit[] hits) { List <AttackableTrait> attackingTraits = new List <AttackableTrait>(); foreach (RaycastHit hit in hits) { if (ReferenceEquals(hit.transform.gameObject, this.gameObject)) { continue; } //Is the thing edible? EdibleTrait edibleTrait = hit.transform.GetComponent <EdibleTrait>(); if (edibleTrait) { // wolves won't eat wolves WolfController wolfController = hit.transform.GetComponent <WolfController>(); if (!wolfController) { // They aren't vegetarien MeatTrait meatTrait = hit.transform.GetComponent <MeatTrait>(); if (meatTrait) { AttackableTrait attackableTrait = hit.transform.GetComponent <AttackableTrait>(); if (attackableTrait) { attackingTraits.Add(attackableTrait); } } } } } return(attackingTraits.ToArray()); }
private void SetStateToAttacking(AttackableTrait thingToAttack) { currentState = eWolfStates.Attacking; //GetComponentInChildren<MeshRenderer>().materials[0].color = Color.red; attackStateVars.target = thingToAttack.transform; }
private bool FindFood(RaycastHit[] hits) { EdibleTrait[] edibleTraits = GetEdibleTraits(hits); if (edibleTraits.Length > 0) { SetStateToEating(edibleTraits[UnityEngine.Random.Range(0, edibleTraits.Length)]); return(true); } else { AttackableTrait[] attackableTraits = GetAllAliveAttackableFoodTraits(hits); if (attackableTraits.Length > 0) { //TODO: Make this choice more intelligent (Closer, weaker, more food worty) AttackableTrait attackableTrait = attackableTraits[UnityEngine.Random.Range(0, attackableTraits.Length)]; SetStateToAttacking(attackableTrait); return(true); } } return(false); }