2015-08-29 38 views
0

你好家伙一直在我的项目上创建FPS游戏AI的FSM,我有一个关于raycast的问题,如果只有一个目标我的代码工作如此完美,但如果有两个目标或更多,我有一些问题,我只是想光线投射只有一个目标,但我不知道如何做到这一点,这里是用ontriggerstay如何光线投射只有一个目标Unity C#

void OnTriggerStay (Collider other) 
{ 
    if(other.gameObject.tag == "CT") 
    { 
     collideWithPlayer = true; 
     Vector3 direction = other.transform.position - transform.position; 
     float angle = Vector3.Angle(direction, transform.forward); 

     if(angle < fieldOfViewAngle * 0.5f) 
     { 
      RaycastHit hit; 

      if((Physics.Raycast(transform.position , direction, out hit, col.radius))) 
      { 
       Debug.DrawRay (transform.position, hit.point - transform.position, Color.cyan); 

       if(hit.collider.gameObject.tag == "CT") 
       { 
         aliveTarget = hit.point; 
         playerInSight = true; 
         transform.LookAt(aliveTarget); 
       } 

       else if ((hit.collider.gameObject.tag != "CT")) {playerInSight = false; } 
       } 
     } 
    } 
} 

香港专业教育学院试了很多方法,但仍然没有工作,我对光线投射代码,即时新手无论如何:D所以也许你们可以帮助我。这里的问题是如果一个目标已经看见(玩家洞察力应该是真实的)并且另一个目标进入视野内但被障碍覆盖,玩家洞察将触发假。这是因为这个脚本会对任何进入视野内的人进行光线投射,所以我只是只有在目标瞄准目标时,才能对一个目标进行光线投射,而不是再次进行光线投射。也许这对你们来说是一个新手问题,我很抱歉提出一个新手问题,但我现在很紧张,请帮助我谢谢你。

脚本上的问题可能是if语句或ontriggerstay()?

+0

当您检查光线投射,检查是否有发现尚未停止光线投射检查的对象。 – MahanGM

+0

感谢您的评论,以及如何检查是否有任何物品被发现? ive试过用bool,它没有工作 –

+0

为什么当你与它发生碰撞时,为“CT”物体进行光线投射?你的意思是说有多个“CT”对象也会产生问题或其他对象? – MahanGM

回答

0

您可以暂时将目标图层更改为特殊图层,例如“hittest”,并确保现在没有其他gameobjects属于此图层,然后仅在该图层上进行raycast。请记住在测试完成后将目标图层恢复到原始图层。我是从手机发布的,所以目前我无法编写代码,但如果您需要未来的支持人员,我可以稍后提供一些示例代码。

+0

感谢您的意见,我真的很感激,如果你能为我提供一些示例代码,特别是如何标记特别的:D –

+0

heey dude,我现在仍然坚持,我可以有你的电子邮件讨论我的问题?谢谢 –

+0

在OnTriggerStay()中,当你找到一个目标时,将它保存在一个类变量中,比如说currentTarget。下一次进入OnTriggerStay()时,检查targetObject是否仍然可见,如果是,则继续使用它。如果不是,请RayCast找到另一个。 –

0

我不知道你是什么情况,但是这可能工作:

if(angle < fieldOfViewAngle * 0.5f) 
{ 
    RaycastHit hit; 

    if(Physics.Raycast(transform.position , direction, out hit, col.radius)) 
    { 
     Debug.DrawRay (transform.position, hit.point - transform.position, Color.cyan); 

     if (hit.collider.gameObject.tag == "CT") 
     { 
      aliveTarget = hit.point; 
      playerInSight = true; 
      transform.LookAt(aliveTarget); 
     } 
    } 
    else 
    { 
     playerInSight = false; 
    } 
} 
+0

无法正常工作,即使目标墙壁 –

+0

我编辑过,playerinsight也会如此。再试一次。 – MahanGM

+0

仍然存在问题,当目标位于对撞机后面时,playerInsight将为真,它应该是假的,因为即使目标在对撞机后面,射线也会被铸造出来并且玩家的洞察力会变为真实 –