簡體   English   中英

Unity Physics2D.Raycast遇到大型2D對撞機的麻煩

[英]Unity Physics2D.Raycast having trouble with large 2D colliders

我有一個非常簡單的Unity組件,用於檢查鼠標屏幕位置是否在2D對撞機內。

var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
RaycastHit2D hit = Physics2D.Raycast(screenRay.origin, screenRay.direction);
if (hit)
{
    Debug.Log("hit something");
}

我將Image對象添加到在“屏幕空間:相機”中渲染的Canvas,並將Box Collider 2D組件添加到圖像。

上面的代碼在鼠標指針位於Box Collider 2D內部但不在外部時記錄“命中”,這就是我想要的。

但是,僅當盒對撞機的尺寸小於120 x 120時,這才是正確的。 如果是那個大小或更大,我開始在屏幕上的任何地方獲取日志輸出-Physics2D.Raycast在整個屏幕上返回內容。 Physics2D.Raycast似乎認為對撞機突然占據了整個屏幕,但實際上並沒有,甚至還沒有關閉。 將對撞機縮小到115 x 115可以解決此問題,但是正如您可以想象的那樣,我不希望在某些對撞機尺寸上出現特殊行為。 圖片尺寸為100x100。 如果我將對撞機的大小設置為1x1(幾乎看不到),則Raycaster會在整個100x100的圖像上命中目標。

圖像的尺寸無效。 有誰知道為什么這個魔術大小突然大於指定的大小?

編輯:CircleCollider2D有相同的問題-如果半徑超過100左右,我突然在整個屏幕上與它碰撞。

Physics2D.Raycast打算在2D空間中使用。 當我在3D空間中使用UI元素時,Physics2D.Raycast無法按預期工作,因此應改用GetRayIntersection。 這段代碼運行良好:

var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
RaycastHit2D hit = Physics2D.GetRayIntersection(screenRay);
if (hit)
{
    Debug.Log("hit something");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM