一、官網(wǎng)的Physics文檔
https://docs.unity.cn/cn/2019.4/ScriptReference/Physics.html
1、Physics下帶NonAlloc都是無GC的,項目中必須使用NonAlloc相關(guān)的函數(shù)來進(jìn)行物理檢測;
Physics.OverlapBox有GC,Physics.OverlapBoxNonAlloc無GC

GC對比.png
二、Physics.NonAlloc的幾個函數(shù)有時候生效有時候不生效問題
1、先看一下下面的測試代碼
public class ColliderTest : MonoBehaviour
{
private Collider[] m_Colliders;
void Update()
{
m_Colliders = Physics.OverlapBox(Vector3.zero, new Vector3(2, 2, 2));
Debug.Log("OverlapBox:" + m_Colliders.Length);
var count = Physics.OverlapBoxNonAlloc(Vector3.zero, new Vector3(2, 2, 2), m_Colliders);
Debug.Log("OverlapBoxNonAlloc:" + count);
}
}
結(jié)果都可以

成功.png
2、現(xiàn)在我們切換到項目中的無GC寫法的代碼中去
public class ColliderTest : MonoBehaviour
{
private Collider[] m_Colliders;
void Update()
{
var count = Physics.OverlapBoxNonAlloc(Vector3.zero, new Vector3(2, 2, 2), m_Colliders);
Debug.Log("OverlapBoxNonAlloc:" + count);
}
}
結(jié)果沒有任何輸出,失敗了,為什么?

失敗.png
三、問題探究解決
1、我們看下兩次代碼都有哪些變化
(1)成功:測試代碼的Physics.OverlapBox接收的Collider數(shù)組用的是m_Colliders
(2)成功:測試代碼的Physics.OverlapBoxNonAlloc參數(shù)也是用的m_Colliders
(3)失敗:測試代碼的Physics.OverlapBoxNonAlloc參數(shù)是用的m_Colliders
2、發(fā)現(xiàn)問題所在
(1)成功:m_Colliders數(shù)組默認(rèn)沒有初始化,Physics.OverlapBox接收的數(shù)組賦值給了m_Colliders,此時m_Colliders就被初始化了,當(dāng)Physics.OverlapBoxNonAlloc傳遞進(jìn)去的數(shù)組就已經(jīng)是初始化后的了,所以成功了;
(2)失?。簃_Colliders數(shù)組沒有被初始化,直接傳遞給了Physics.OverlapBoxNonAlloc的參數(shù),Physics.OverlapBoxNonAlloc內(nèi)部并不會對一個沒有初始化的Collider[]進(jìn)行初始化,因為Collider[]初始化的長度由外部使用者決定的,所以使用Physics.NonAlloc相關(guān)的函數(shù)外部傳遞進(jìn)去的緩存數(shù)組必須先初始化
private Collider[] m_Colliders = new Collider[1];
2、問題解決
public class ColliderTest : MonoBehaviour
{
private Collider[] m_Colliders = new Collider[1];
void Update()
{
var count = Physics.OverlapBoxNonAlloc(Vector3.zero, new Vector3(2, 2, 2), m_Colliders);
Debug.Log("OverlapBoxNonAlloc:" + count);
}
}

成功.png