簡體   English   中英

使用2D Raycast來檢測對象對撞機上的鼠標懸停時的問題

[英]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.

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