实际上我正在使用以下代码来检测鼠标和某个对象之间的碰撞。
我希望代码捕获多个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);
}
}
}
答案 0 :(得分:3)
这里没有什么令人困惑的。唯一的区别是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个对象。如果需要,可以增加它。