//Detect if the player is in vision private void DetectThreat() { Vector3 pos = transform.position; //React to player foreach (PlayerCharacter player in PlayerCharacter.GetAll()) { Vector3 char_dir = (player.transform.position - pos); if (char_dir.magnitude < detect_range) { float dangle = detect_angle / 2f; // /2 for each side float angle = Vector3.Angle(transform.forward, char_dir.normalized); if (angle < dangle || char_dir.magnitude < detect_360_range) { state = BirdState.Alerted; state_timer = 0f; StopMoving(); return; } } } //React to other characters foreach (Selectable selectable in Selectable.GetAllActive()) { if (selectable.gameObject != gameObject) { Vector3 dir = (selectable.transform.position - pos); if (dir.magnitude < detect_range) { Character character = selectable.GetComponent <Character>(); if (character && character.attack_enabled) //Only afraid if the character can attack { if (character.GetDestructible().team_group != this.destruct.team_group) { state = BirdState.Alerted; state_timer = 0f; StopMoving(); return; } } } } } }
//Get nearest active destructible selectable public static Destructible GetNearest(Vector3 pos, float range = 999f) { Destructible nearest = null; float min_dist = range; foreach (Selectable selectable in Selectable.GetAllActive()) //Loop on active selectables only for optimization { Destructible destruct = selectable.GetDestructible(); if (destruct != null && selectable.IsActive()) { float dist = (destruct.transform.position - pos).magnitude; if (dist < min_dist) { min_dist = dist; nearest = destruct; } } } return(nearest); }
private void DetectAction() { if (PlayerIsFar(detect_range)) { return; } foreach (Selectable selectable in Selectable.GetAllActive()) { if (selectable.gameObject != gameObject) { Vector3 dir = (selectable.transform.position - transform.position); if (dir.magnitude < detect_range) { DigSpot dig = selectable.GetComponent <DigSpot>(); Destructible destruct = selectable.GetComponent <Destructible>(); if (can_attack && destruct && destruct.attack_group == AttackGroup.Enemy && destruct.required_item == null) { attack_target = destruct; action_target = null; character.Attack(destruct); ChangeState(PetState.Attack); return; } else if (can_dig && dig != null) { attack_target = null; action_target = dig.gameObject; ChangeState(PetState.Dig); character.MoveTo(dig.transform.position); return; } } } } }
//Detect if the player is in vision private void DetectThreat(float range) { Vector3 pos = transform.position; //React to player float min_dist = range; foreach (PlayerCharacter player in PlayerCharacter.GetAll()) { Vector3 char_dir = (player.transform.position - pos); float dist = char_dir.magnitude; if (dist < min_dist) { float dangle = detect_angle / 2f; // /2 for each side float angle = Vector3.Angle(transform.forward, char_dir.normalized); if (angle < dangle || char_dir.magnitude < detect_360_range) { player_target = player; attack_target = null; min_dist = dist; } } } //React to other characters/destructibles foreach (Selectable selectable in Selectable.GetAllActive()) { if (selectable.gameObject != gameObject) { Vector3 dir = (selectable.transform.position - pos); if (dir.magnitude < min_dist) { float dangle = detect_angle / 2f; // /2 for each side float angle = Vector3.Angle(transform.forward, dir.normalized); if (angle < dangle || dir.magnitude < detect_360_range) { //Find destructible to attack if (HasAttackBehavior()) { Destructible destruct = selectable.GetDestructible(); if (destruct && (destruct.attack_group == AttackGroup.Ally || destruct.attack_group == AttackGroup.Enemy)) //Attack by default (not neutral) { if (destruct.attack_group == AttackGroup.Ally || destruct.team_group != this.destruct.team_group) //Is not in same team { attack_target = destruct; player_target = null; min_dist = dir.magnitude; } } } //Find character to escape from if (HasEscapeBehavior()) { Character character = selectable.GetComponent <Character>(); if (character && character.attack_enabled) //Only afraid if the character can attack { if (character.GetDestructible().team_group != this.destruct.team_group) //Not afraid if in same team { attack_target = destruct; player_target = null; min_dist = dir.magnitude; } } } } } } } }