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); }
// 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); }
//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); }