unity, 判斷可見性


如果一個物體被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是否可見即可。

缺點是:這個判斷是有一小點兒開銷的,如果物體成百上千可能會導致可察覺的開銷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM