Nouveau sur ce forum je commence à écrire ici car j'ai un soucis qui me bloque...
J'essaye de faire un petit Tower Defense un peu différent: Mes IA sont des visiteurs de musée qui doivent visiter un musée et admirer les œuvres.
L'idée étant que le joueur va créer le tracé du musée (en créant des couloirs) et en plaçant des œuvres. Avant de voir arriver des vagues de touristes (mes IA) pour visiter ce musée.
Évidemment les œuvres sont des objectifs pour l'IA, qui doit aller vers l'objectif le plus proche puis se diriger vers la suivante.
Une fois toutes les œuvres visités, l'IA se dirige vers la sortie.
Mais tout ce petit GD est gêné par un souci,
Si mon IA recense bien tous les objets ayant le tag "Objectif" dans une liste, lorsque je veux supprimer l'objectif atteint de la liste, le script enlève TOUS les composant de la liste. Rendant mon IA immobile (ou se dirigeant vers un objectif qui n'est pas le plus proche avant de s’arrêter)
Pouvez-vous m'aider à comprendre quel est le problème?
Voici une image de ma scène:
Et voici mon script à l'heure actuelle:
_________________________________________________________________________
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class AI_Test_Interest_New : MonoBehaviour
{
private Vector3 targetPosition; // Vector pour diriger l'IA vers le point le plus proche
private NavMeshAgent directionNavAgent;
public List<GameObject> Targets;//liste d'objectif
public GameObject closest; //Censé être la cible la plus proche
public GameObject Actual; //Censé être la cible atteinte par l'IA
public bool TargetGet = false; // Pour savoir si l'IA a touché le trigger de l'objectif.
public bool Atteint = false; // Bool secondaire sans doute inutile pour savoir si l'IA a atteint l'objectif et est prêt à repartir vers l'objectif suivant apres avoir retiré l'objectif attein précedemment.
void Start()
{
FindTargets(); // charge toutes les entité avec le tag objectif dans la liste dés le départ
}
void Update()
{
MoveToClosest(); // placé dans le update pour le moment pour pousser un dplacement constant
if (TargetGet == true)
{
ChangeTarget();
//BUT : retirer l'objet actuel de la liste pour le remplacer par le secon plus proche.
//QUESTION : desactiver le collider pour eviter qu'il prenne d'emblée le script ontriggerenter?
}
if (Atteint == true)
{
FindClosestTarget(); // une fois le changement fait, retrouve la cible la plus proche
Debug.Log("change");
}
}
void MoveToClosest() // Pour se deplacer vers la cible la plus proche
{
directionNavAgent = GetComponent<NavMeshAgent>();
FindClosestTarget();
directionNavAgent.destination = targetPosition;
}
void OnTriggerEnter(Collider other) // Active le bool TargetGet
{
if (other.tag == "Objectif")
{
Debug.Log("Pouti");
TargetGet = true;
}
}
void FindTargets() // Trouve les objets ayant le tag "Objectif"
{
Targets = new List<GameObject>();
foreach (GameObject go in GameObject.FindGameObjectsWithTag("Objectif"))
{
Targets.Add(go);
}
//Targets.Add(GameObject.FindGameObjectWithTag("Objectif"));
}
void ChangeTarget() // Enleve la Target la plus proche pour la remplacer par la suivante.
{
float distance = Mathf.Infinity;
Vector3 Position = transform.position;
foreach (GameObject go in Targets) // reprend le code du FindTarget, car au moment ou le script est lancé le plus proche est forcemment celui à retirer de la liste
{
Vector3 diff = go.transform.position - Position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance)
{
Actual = go;
Targets.Remove(Actual);
//Targets.Remove(Actual);
Atteint = true;
}
}
Debug.Log("Removed");
}
void FindClosestTarget() // Trouve la cible la plus proche
{
float distance = Mathf.Infinity;
Vector3 Position = transform.position;
int i = (Targets.Count);
Debug.Log(i);
foreach (GameObject go in Targets)
{
Vector3 diff = go.transform.position - Position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance)
{
closest = go;
distance = curDistance;
targetPosition = closest.transform.position;
}
}
return;
}
}