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

问题描述 投票:0回答:1

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

我希望代码捕获多个GameObjects(不仅是第一个,而是上面的那些)并将其存储在List中。

我看了一下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);          

        }               
    }
}
c# unity3d raycasting gameobject
1个回答
3
投票

这里没有什么令人困惑的。唯一的区别是Physics.Raycast返回truefalse如果有什么东西被击中,而Physics.RaycastAll返回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个对象。如果需要,可以增加它。

© www.soinside.com 2019 - 2024. All rights reserved.