![](/img/trans.png)
[英]2D Raycast does not correctly detect overlapping colliders and ignores Sorting Layer
[英]Issues using a 2D Raycast to detect mouse hover on object colliders
我目前在Unity中的2D角色選擇屏幕上工作,該屏幕應與真人快打角色選擇屏幕類似。 目前,我有一個名為CharacterSelector
的類附加到主攝像機。 該類包含用於選擇/取消選擇字符,懸停事件和選擇確認的方法。 我能夠使用RayCast2D
構建我的角色選擇方法。 但是,在將其用於懸停事件時遇到了問題。
在我的場景中,我有一組角色圖像可供玩家選擇(如果它們已解鎖)。 當玩家用鼠標懸停在角色上時,角色圖像應被黃色邊框包圍。 當用戶單擊所需的字符時,較大版本的圖像將彈出到字符圖像組的左側。
現在,我有以下代碼用於懸停方法:
public void onHover(Ray ray, RaycastHit2D hit)
{
if(hit.collider == null)
{
Debug.Log("nothing hit");
}
if (Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity))
{
print(hit.collider.name);
}
}
此方法屬於CharacterSelection
類繼承的類。 以下是CharacterSelection
類:
class CharacterSelector : Selector
{
Ray ray;
RaycastHit2D hit;
public void Start()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
}
void Update()
{
onHover(ray, hit);
if (Input.GetMouseButtonDown(0))
{
selectCharacter();
}
}
}
另外,我現在要懸停的所有角色圖像都具有2D Box Colliders。 截至目前,我無法進行懸停操作。 它不會將字符圖像的名稱打印到控制台。 我將其用作第一步,以了解Unity是否能夠識別字符圖像。 讓我知道是否可以提供其他信息!
鼠標幾乎每幀都會改變屏幕上的位置。 這意味着您的光線應根據鼠標位置的每一幀進行更新。 所以我將相應的語句從Start()移到了Update();
class CharacterSelector : Selector
{
Ray ray;
RaycastHit2D hit;
public void Start()
{
}
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
onHover(ray, hit);
if (Input.GetMouseButtonDown(0))
{
selectCharacter();
}
}
}
其次,如果查看Physics2D.Raycast的定義,您會發現它使您返回了RaycastHit2D對象。 這是您應該檢查對撞機的對象,而不是應該拋出NullReferenceException的命中對象,我不知道為什么沒有這樣做。 所以這:
public void onHover(Ray ray, RaycastHit2D hit)
{
hit = Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity);
if(hit.collider == null)
{
Debug.Log("nothing hit");
}
else
{
print(hit.collider.name);
}
}
除此之外,您實際上不需要onHover()函數中的hit參數,它可以是函數中的局部變量。 但是,如果您打算在CharacterSelector腳本中使用hit變量,則應將onHover的聲明更改為: onHover(Ray ray, out RaycastHit2D hit)
out
關鍵字通過引用而不是其值的副本傳遞變量。
另外,我認為不應該在onHover中檢查鼠標是否懸停在對象上,這有點誤導並且對我來說似乎不合邏輯。 我將onHover的主體移至另一個函數,如RaycastChecker()。 僅當鼠標實際上懸停在精靈上時,我才調用onHover()。 (就像在OnCollisionEnter中一樣,您認為碰撞確實發生了,所以我認為onHover也應該如此)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.