Получить список нескольких игровых объектов, которые пересекают линию мыши

На самом деле я использую следующий код для обнаружения столкновения между мышью и каким-либо объектом.

Я хочу, чтобы код захватывал несколько объектов GameObject (не только первый, но и те, что указаны выше) и сохранял его в списке.

Я посмотрел вокруг 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);          

        }               
    }
}

1 ответ

Решение

Здесь нет ничего смущающего. Единственная разница в том, что Physics.Raycast возвращается true или же false если что-то ударит 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 объектов. Вы можете увеличить его, если хотите.

Другие вопросы по тегам