Exemplo n.º 1
0
    void MoveAwayFromThings()
    {
        Collider[] hits;

        if (AfraidOfPlayers)
        {
            hits = Physics.OverlapSphere(transform.position, SightDistance, (1 << LayerMask.NameToLayer("Field")) | (1 << LayerMask.NameToLayer("Player")));
        }

        else
        {
            hits = Physics.OverlapSphere(transform.position, SightDistance, 1 << LayerMask.NameToLayer("Field"));
        }

        Vector3 away = SmallestAwayVector(hits);

        transform.forward = Vector3.Lerp(transform.forward, away.AddNoise(1f).normalized, Time.deltaTime * 10f);
        rigidbody.AddForce(transform.forward * ((hits.Length > 0) ? Speed : Speed * 0.5f), ForceMode.Acceleration);
    }
    public void Look()
    {
        List <Collider> seen     = Physics.OverlapSphere(transform.position, SightDistance, hunterLayerMask).ToList();
        List <Collider> foodSeen = Physics.OverlapSphere(transform.position, SightDistance, foodLayerMask).ToList();

        bool   inCombat = false;
        Hunter closest  = this;

        Vector3 newHeading = CurrentHeading;

        int allies  = 0;
        int enemies = 0;

        foreach (Collider other in seen)
        {
            Hunter otherHunter = other.GetComponent <Hunter>();

            if (closest == this)
            {
                closest = otherHunter;
            }

            else if (!inCombat)
            {
                if ((otherHunter.transform.position - transform.position).magnitude < (closest.transform.position - transform.position).magnitude)
                {
                    closest = otherHunter;
                }
            }

            if (otherHunter.HunterType != HunterType)
            {
                closest  = otherHunter;
                inCombat = true;
                enemies += 1;
            }
            else
            {
                allies += 1;
            }
        }

        if (closest != this)
        {
            Vector3 toClosest = (closest.transform.position - transform.position).Flatten().normalized;

            if (inCombat)
            {
                InCombat   = true;
                newHeading = toClosest;

                if (Health < LowHealthThreshold || (allies < 4 && HunterType == HunterType.Group))
                {
                    newHeading *= -1f;
                }

                else if (isGrounded() && HunterType == HunterType.Group)
                {
                    rb.AddForce((closest.transform.position - transform.position).normalized * 1000f, ForceMode.Impulse);
                }

                speedMultiplier = 1f;
            }
            else if (HunterType == HunterType.Group && Health >= LowHealthThreshold)
            {
                speedMultiplier = 0.5f;
                newHeading      = closest.CurrentHeading.normalized;
                InCombat        = false;
            }
            else
            {
                speedMultiplier = 0.5f;
                newHeading      = CurrentHeading.AddNoise(25f);
                InCombat        = false;
            }
        }
        else
        {
            speedMultiplier = 0.5f;
            newHeading      = CurrentHeading.AddNoise(25f);
        }

        if (foodSeen.Count > 0 && Health < maxHealth * 0.6f)
        {
            speedMultiplier = 0.3f;
            timeMultiplier  = 5f;
            newHeading      = (foodSeen[0].transform.position - transform.position).Flatten().normalized;
        }
        else
        {
            timeMultiplier = 1f;
        }

        CurrentHeading = Vector3.Lerp(CurrentHeading, newHeading, Time.deltaTime * UnityEngine.Random.Range(3f, 10f));
    }