Unity: Graphics.DrawMesh()

用Unity最不習慣的就是 一切都是gameobject, 連要畫個 mesh也要object.
gameobject.transform.  一堆.transform相關的函數........
根本沒必要..

兩個相同的mesh,用gameobject, 要存兩分mesh,
多個不就更麻煩了? 還有 動態 產生mesh,又要複製go...
又要釋放..... mesh的資料 就是一次載入就好.
 


找了半天, 終於找到: Graphics.DrawMesh(), 只要寫在Update()就跟以前用c++ 迴圈一樣的寫法了。最主要是想畫很多個相同的mesh.

public static void DrawMesh(Mesh mesh, Matrix4x4 matrix, Material material, int layer, Camera camera = null, int submeshIndex = 0, MaterialPropertyBlock properties = null, bool castShadows = true, bool receiveShadows = true, bool useLightProbes = true);

好用的這個函數就夠了。

(Mesh mesh, Matrix4x4 matrix, Material material)  參數這幾個就夠了.
這就很像 一般用 d3d  自己會寫的render含數 會傳的參數。 

unity 的 Matrix4x4 函數也很難用,  為何不直接照D3D的 Matrix函數就好?

學3D最重要的就是 Matrix,, 弄懂這個就夠了。

----------------------------------------------------------------
還有在 Update() , 直接把整個logic寫在裡面加上Graphics.DrawMesh().
速度會比事先算好gameboject的位置, 還慢。
所以 只執行一次的 logic, 變成要先算好位置, 存起來, 在Update()的 Graphics.DrawMesh(). 只畫位置。

所以這就是跑 script的缺點。

void Update () {
        for (int i = 0; i < m_szRenderWin.Count; i++)
            Graphics.DrawMesh(m_szRenderWin[i].mesh, m_szRenderWin[i].matrix/* Matrix4x4 */, m_Material, 0);
}

4 則留言:

  1. 其實要產生很多方塊,用這個API也蠻好用的
    https://docs.unity3d.com/ScriptReference/Object.Instantiate.html
    為什麼一堆transform?因為很多東西都需要hierarchy阿,像是人物的骨架、坦克的炮台和車身,沒有hierarchy還得自己把position、scale、rotaion重組回Matrix4X4,再作矩陣連鎖,transfrom幫我們cover掉這樣不是很好嗎

    回覆刪除
  2. GameObject 每一個都要mesh, 但是mesh都是一樣的, 所以可以只一份mesh就可。
    所以用DrawMesh的優點 在這點。不清楚 Object 跟 GameObject 有甚麼差別。

    回覆刪除
  3. 好像GameObject是繼承自Object;後來還真遇到不得不用Graphics.DrawMesh的情況

    回覆刪除
  4. 你可以在Start跟Awake裡先算好Matrix陣列,記在Array裡(不過都過這麼久了,搞不好你已經發現這2個方法了)
    https://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html

    回覆刪除