Получить список нескольких игровых объектов, которые пересекают линию мыши
На самом деле я использую следующий код для обнаружения столкновения между мышью и каким-либо объектом.
Я хочу, чтобы код захватывал несколько объектов 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 объектов. Вы можете увеличить его, если хотите.