2016-08-19 2 views
0

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); 
     } 
    } 
} 
+0

OverlapSphere a une targetMask, est cette variable correctement réglée couche du joueur? – Rob

+0

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

+2

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

Répondre

-1

Merci les gars pour votre petit indice. Il était vraiment un petit problème de hiérarchie :(Désolé pour cette question débutant/DAU. Vive Nico

+0

Si un commentaire répond à votre question, vous devriez demander à l'intervenant de l'afficher comme réponse ou d'afficher la réponse vous-même et de donner crédit à l'intervenant. – workoverflow