J'ai un problème avec un script pour un "champ de vision" de l'ennemi. Après avoir regardé un tutoriel pour créer un champ de vision pour le joueur, j'ai pensé que je pouvais le passer aux ennemis pour qu'ils puissent détecter le joueur et faire d'autres choses. J'ai créé une variable booléenne "playerInRange" pour détecter si les ennemis détectent le joueur et mettent cette variable à true ou false. Cela fonctionne bien avec un seul ennemi. Quand j'en ajoute un autre, le nouvel ennemi ne détectera pas le joueur. Alors peut-être que c'est lié à la coroutine mais je ne suis pas sûr. Peut-être que vous avez un indice pour moi. est ici un peu de mon code (je retire une grande partie des commentaires pour en faire un peu plus petit):Champ de vision pour ennemi ne fonctionne qu'avec 1 ennemi
void Start() {
StartCoroutine("FindTargetsWithDelay", .2 f);
}
IEnumerator FindTargetsWithDelay(float delay) {
while (true) {
yield
return new WaitForSeconds(delay);
FindVisibleTargets();
}
}
public void FindVisibleTargets() {
visibleTargets.Clear();
Collider[] targetsInViewRadius = Physics.OverlapSphere(transform.position, viewRadius, targetMask);
for (int i = 0; i < targetsInViewRadius.Length; i++) {
Transform target = targetsInViewRadius[i].transform;
Vector3 dirToTarget = (target.position - transform.position).normalized;
if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle/2) {
float dstToTarget = Vector3.Distance(transform.position, target.position);
if (!Physics.Raycast(transform.position, dirToTarget, dstToTarget, obstacleMask)) {
// Not so nice solution!
// The movement should be in a separate script!
visibleTargets.Add(target);
nav.SetDestination(player.position);
anim.SetBool("IsRunning", true);
if (dstToTarget < attackRange) {
playerInRange = true;
Debug.Log(playerInRange);
}
}
} else {
anim.SetBool("IsRunning", false);
playerInRange = false;
Debug.Log(playerInRange);
}
}
}
OverlapSphere a une targetMask, est cette variable correctement réglée couche du joueur? – Rob
Salut Rob, merci pour votre commentaire. La targetMask est défini correctement (pour mon point de vue): ** public LayerMask targetMask; ** Je peux choisir quel calque est le calque cible, le premier ennemi fonctionne bien avec lui mais pas le second:/ – t3chnico
dis pas comment tu en as ajouté un autre Je soupçonne que tu n'as pas lu ce que ce script est en train de faire: si le premier ennemi voit le joueur, mais pas le second, que se passe-t-il? , mais en second lieu?) – Adam