2015-08-29 36 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將爲真,它應該是假的,因爲即使目標在對撞機後面,射線也會被鑄造出來並且玩家的洞察力會變爲真實 –