示例#1
0
        //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;
                            }
                        }
                    }
                }
            }
        }
示例#2
0
        //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);
        }
示例#3
0
        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;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }