public override float GetRotation()
    {
        scannerRay.Clear();

        //on execute le scan des 3 zones autour de nous avec les raycasts
        float angleStep    = angleScannedRadian / (raycastNumber - 1);
        int   nbrRayCasted = 0;

        for (float angle = -angleScannedRadian / 2; nbrRayCasted < raycastNumber; angle += angleStep)
        {
            Vector2 translatedVector = Trigonometry.RotateVector(transform.up, angle);

            RaycastHit2D[] result = new RaycastHit2D[1];
            Physics2D.Raycast(
                origin: raycastStartPosition.transform.position,
                direction: translatedVector,
                contactFilter: new ContactFilter2D().NoFilter(),
                results: result,
                distance: distanceCaptureRay
                );
            nbrRayCasted++;

            if (result[0].collider.CompareTag("Player"))
            {
                Debug.DrawRay(raycastStartPosition.transform.position, translatedVector, Color.green);
            }
            scannerRay.AddRay(result[0], angle);
        }

        //on regarde quelle zone présente un danger le plus faible
        ZoneScanRay zoneDecision = scannerRay.SafestZone();

        //si la zone choisie est tout de même très dangereuse
        if (zoneDecision.danger >= 500)
        {
            //alors on utilise le pouvoir de saut
            useSecondaryBonus = true;
        }

        if (scannerRay.isEnnemyInFrontZone())
        {
            usePrimaryBonus = true;
        }
        else
        {
            usePrimaryBonus = false;
        }

        return(zoneDecision.decision);
    }
Exemple #2
0
    // une methode pour calculer les rayons d'une zone latérale
    public static float ComputeRaySide(StoreRay ray, ZoneScanRay zone)
    {
        if (ray.ray.collider.CompareTag("PickUp"))
        {
            return(0);
        }

        // plus c'est proche plus ça donne des points de danger
        float x = ray.ray.distance;

        //float angleImportance = Mathf.Clamp(Mathf.Abs(ray.angle), 0, 1.5f);
        float danger = Mathf.Clamp((-0.8f * x + 4f) / (x * 10f), 0f, 50f);

        //plus l'angle est droit devant plus ça donne des points danger

        /*x = Mathf.Abs(ray.angle);
         * float facteur = Mathf.Clamp(-4 * x - 3, 1, 3);
         *
         * danger *= facteur;*/

        return(danger);
    }
Exemple #3
0
    //une methode pour calculer le danger des rayons d'une zone devant
    public static float ComputeRayFront(StoreRay ray, ZoneScanRay zone)
    {
        float danger = 0;

        if (ray.ray.collider.CompareTag("PickUp"))
        {
            return(0);
        }
        else if (ray.ray.collider.CompareTag("Player") && ray.ray.distance < 3 && Mathf.Abs(ray.angle) < 0.1f)
        {
            zone.isFrontOfEnnemy = true;
        }

        // plus c'est proche plus ça donne des points de danger
        float x             = ray.ray.distance;
        float importanceRay = Mathf.Clamp(-36 * Mathf.Abs(ray.angle) + 10, 1, 10);

        danger += (3f + importanceRay) * Mathf.Clamp((-3f * x + 6) / (x * 8f), 0, 50);


        return(danger);
    }