获取跨越鼠标线的多个游戏对象的列表

Get an list of multiple gameobjects that cross mouse line

实际上我正在使用以下代码来检测鼠标与某些对象之间的碰撞。

我希望代码捕获多个游戏对象(不仅是第一个,还有上面的)并将其存储在列表中。

我看了看 Physics.RaycastAll 但我有点困惑。

void Update () 
{
    RaycastHit hit;

    Ray ray =  Camera.main.ScreenPointToRay(Input.mousePosition);

    if(Physics.Raycast(ray,out hit))
    {       
        if (hit.collider != null)
        {
            print (hit.transform.gameObject.name);          

        }               
    }
}

这里没有什么令人困惑的地方。唯一的区别是 Physics.Raycast returns truefalse 如果在 Physics.RaycastAll returns 数组 RaycastHit 时被击中。您只需要遍历 RaycastHit.

的数组
void Update()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    RaycastHit[] hit = Physics.RaycastAll(ray);

    for (int i = 0; i < hit.Length; i++)
    {
        if (hit[i].collider != null)
        {
            print(hit[i].transform.gameObject.name);
        }
    }
}

:

如果要检测每个对象命中,最好使用 Physics.RaycastNonAlloc 而不是 Physics.RaycastAll。这根本不会分配内存,尤其是在 Update 函数中执行此操作时。

//Detect only 10. Can be changed to anything
RaycastHit[] results = new RaycastHit[10];

void Update()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    int hitCount = Physics.RaycastNonAlloc(ray, results);

    for (int i = 0; i < hitCount; i++)
    {
        if (results[i].collider != null)
        {
            print(results[i].transform.gameObject.name);
        }
    }
}

上面的代码将最多检测 10 个对象。如果你愿意,你可以增加它。