2017-06-07 160 views
0

我來檢查,如果一個遊戲對象可以看到其他的遊戲對象,而無需任何阻斷其視圖功能:如何讓raycast忽略觸發器碰撞器?

public bool CheckVision(GameObject target) 
{ 
    RaycastHit2D ray = (Physics2D.Raycast(transform.position, target.transform.position - transform.position, m_VisionRange)); 
    if(ray.collider.name == target.name) 
    { 
     Debug.DrawRay(transform.position, target.transform.position - transform.position); 
     return true;    
    } 
    else 
    { 
     return false; 
    } 
} 

唯一的問題是,我不希望它用了「isTrigger」撞機碰撞國旗設置;我希望光線技術能夠忽略它們。有任何想法嗎?

+2

您是否考慮過將觸發器碰撞器放在不同的圖層上,並使用圖層蒙版來確保您的raycast不會觸及該圖層上的任何內容? – Serlite

回答

0

爲了使您的光線投射忽略5.2所有觸發對撞機去:

編輯>項目設置>物理學>取消選中「查詢命中觸發器」

(如果您使用的是舊版本的Unity,該複選框被稱爲「Raycasts Hit Triggers」)

其實在版本5.2.0f3中,它不再說Raycasts ...現在顯示爲:「查詢觸發器」如果要讓raycast通過觸發器,請取消選中對撞機。

0

更改上你觸發GameObjects層忽略光線投射或使用LayerMask https://docs.unity3d.com/ScriptReference/LayerMask.html

int targetLayer = 1 << LayerMask.NameToLayer("Target Layer"); 
public bool CheckVision(GameObject target) 
{ 
    RaycastHit2D ray = (Physics2D.Raycast(transform.position, target.transform.position - transform.position, m_VisionRange, targetLayer)); 
    if(ray.collider.name == target.name) 
    { 
     Debug.DrawRay(transform.position, target.transform.position - transform.position); 
     return true;    
    } 
    else 
    { 
     return false; 
    } 
} 
6

圖層蒙板操作爲此所需。如果這只是忽略標記爲觸發器的Colliders,則不必使用圖層。此操作現在使用Unity 5.2及更高版本構建。

。對於3D,將QueryTriggerInteraction.Ignore傳遞給Physics.Raycast函數。

int layer = 1 << LayerMask.NameToLayer("Default"); 
Physics.Raycast(cameraRay, out hit, distance, layer, QueryTriggerInteraction.Ignore); 

。對於2D,設置Physics2D.queriesHitTriggersfalse,如果你不希望它來檢測觸發器。當您希望它再次檢測觸發器時,將其設置爲true。確保在調用Physics2D.Raycast函數之前進行設置。

不檢測觸發器:

Physics2D.queriesHitTriggers = false; 

檢測觸發器:

Physics2D.queriesHitTriggers = true; 

你正在尋找的2D版本。


我已經看到了這個報道不工作的一些特定版本的Unity這是一個錯誤,但我認爲現在是固定的。如果不是,則使用l1sten所述的圖層。

+0

謝謝,有人說我應該在統一設置中改變這一點。在代碼中更改它更好還是它有關係? – sparpo

+0

真的沒關係。通過執行代碼,您可以在運行時和獨立版本中啓用和禁用它,如果您的遊戲需要您這樣做的話。你不能從編輯器那裏做到這一點。這是唯一的區別。 – Programmer