如果一個物體被unity判定為”退一萬步講也一定不可見“,則unity不會去渲染它,但是如果我們給此物體添加了邏輯,這個邏輯仍然會被執行。
因此,假如這個邏輯是巨耗性能的邏輯,比如說”mesh的每個頂點都按sin(t)波動“之類,那么我們需要手動根據可見性去優化這個邏輯,比如不可見就停了它,或者不可見時運行一個此邏輯的極簡版等。
所以需要能獲得物體的可見性。
方法1:
MeshRender.isVisible;
如果MeshRender.isVisible==true,說明unity認為這個mesh”退一萬步講也一定不可見“。
這個方法的好處是沒有一點兒額外開銷,因為在unity運行場景管理算法的時候這些東西都已經得到了,而且一般來講最多也就是對數復雜度。
這個方法的局限性是如果gameObject沒有MeshRender這個組件,例如是一個巨復雜的模型的根節點,那么這個方法沒法直接用,只能把每個帶MeshRender的子孫節點都遍歷一遍。
方法2:
bool I_Can_See(GameObject Object) {
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(Camera);
if (GeometryUtility.TestPlanesAABB(planes , Object.collider.bounds))
return true;
else
return false;
}
參考: http://answers.unity3d.com/questions/8003/how-can-i-know-if-a-gameobject-is-seen-by-a-partic.html
這個方法好處是
1,不依賴於是否存在MeshRender組件。
2,可以自建包圍盒,增加了靈活性,甚至可以故意造一個錯誤的包圍盒來用(比如比模型實際范圍大一倍或者小一倍)。比如在復雜模型的根節點上建一個名為boundingBox的切點,為它添加一個boxCollider,調節這個boxCollider讓它包圍整個模型。
3,不用遍歷子孫節點,直接用視截體planes去判斷這個collider.bounds是否可見即可。
缺點是:這個判斷是有一小點兒開銷的,如果物體成百上千可能會導致可察覺的開銷。