2016-08-19 41 views
0

我对敌人的“视野”脚本有一些问题。看完一个教程,为玩家创建一个视野后,我想我可以将它切换到敌人,以便他们检测到玩家并做一些其他的事情。我创建了一个布尔变量“playerInRange”来检测敌人是否检测到玩家并将此变量设置为true或false。 只用一个敌人就可以正常工作。当我添加另一个时,新敌人不会检测到玩家。所以也许它与协程相关,但我不确定。也许你对我有一点暗示。 这里是我的代码一点点(我删除评论的重要组成部分,使它稍微小了一点):敌人的视野只能与1个敌人一起工作

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有targetMask,这个变量正确设置玩家的层? – Rob

+0

罗布嗨, 感谢您的评论。该targetMask设置正确(为了我的观点): ** public LayerMask targetMask; ** 我可以选择哪一层是目标层,第一个敌人可以正常工作但不是第二个:/ – t3chnico

+2

你不用我猜你没有看过这个脚本是在做什么提示:如果第一个敌人看到玩家,但是第二个没有看到玩家,会发生什么?...如果第一个玩家没有看到玩家,那该怎么办? ,但第二呢?) – Adam

回答

-1

谢谢你们为你的小提示。这真是有点层次问题:(对不起,我是新手/ DAU问题。 干杯 尼科

+0

如果评论回答了您的问题,您应该要求评论者将其作为回答发布或自己发布答案,并将评论意见归功于评论者。 – workoverflow