Projet-IA-Madelaine/Scripts/PlayerBehaviourScripts/SensorsScript.cs

104 lines
3.5 KiB
C#
Raw Normal View History

2024-06-12 21:03:42 +02:00
using UnityEngine;
using System.Collections.Generic;
public class SensorsScript : MonoBehaviour
{
// Layer à ignorer
public int ObserverlayerToIgnore = 9;
public int IteratorlayerToIgnore = 7;
// Liste des angles et des offsets pour les raycasts
public List<Vector2> raycastConfigurations = new List<Vector2>()
{
new Vector2(1.18f, 75f),
new Vector2(1.18f, 55f),
new Vector2(1.18f, 35f),
new Vector2(1.18f, 15f),
new Vector2(1.18f, 5f),
new Vector2(0.59f, 4f),
new Vector2(0.59f, 0),
new Vector2(0.59f, -4f),
new Vector2(0f, -5f),
new Vector2(0f, -15f) ,
new Vector2(0f, -35f) ,
new Vector2(0f, -55f) ,
new Vector2(0f, -75f)
};
// Longueur des raycasts
public float raycastDistance = 20f;
// Fonction pour obtenir les données de raycasts d'observation
public List<SensorData> GetObserverRaycast()
{
List<SensorData> raycastsData = new List<SensorData>();
// Calculer le LayerMask pour ignorer le layer spécifié
int layerMask = ~(1 << ObserverlayerToIgnore);
// Pour chaque configuration de raycast
foreach (var config in raycastConfigurations)
{
// Créer une variable pour stocker la position de départ du raycast
Vector3 raycastStartPoint = transform.position;
// Obtenir l'angle et l'offset à partir de la configuration
float offset = config.x;
float angle = config.y;
// Calculer la direction du raycast en fonction de l'angle
Vector2 raycastDirection = Quaternion.Euler(0, 0, angle) * transform.right;
// Ajuster la position de départ du raycast en fonction de l'offset
if (offset == 0.59f)
{
raycastStartPoint += new Vector3(0.5f, offset, 0f);
}
else
{
raycastStartPoint += new Vector3(0f, offset, 0f);
}
// Effectuer le raycast en ignorant le layer spécifié
RaycastHit2D hit = Physics2D.Raycast(raycastStartPoint, raycastDirection, raycastDistance, layerMask);
// Dessiner une ligne pour visualiser le raycast (pour le débogage)
Debug.DrawRay(raycastStartPoint, raycastDirection * raycastDistance, Color.blue);
// Créer un objet SensorData pour stocker les informations du raycast
SensorData data = new SensorData();
// Enregistrer les informations du raycast
if (hit.collider != null)
{
data.hitLayer = hit.collider.gameObject.layer;
data.distance = hit.distance;
// Dessiner une ligne rouge jusqu'au point de collision (pour le débogage)
Debug.DrawLine(raycastStartPoint, hit.point, Color.red);
}
else
{
// Si aucun objet n'a été touché, utiliser des valeurs par défaut
data.hitLayer = -1;
data.distance = raycastDistance;
// Dessiner une ligne verte jusqu'à la fin du raycast (pour le débogage)
Debug.DrawRay(raycastStartPoint, raycastDirection * raycastDistance, Color.green);
}
// Ajouter les données du raycast à la liste
raycastsData.Add(data);
}
return raycastsData;
}
}
// Classe pour stocker les données du raycast touché
public class SensorData
{
public int hitLayer;
public float distance;
}