Unity優化_Mesh合並


今天介紹一個優化技巧,Mesh合並

眾所周知,我們創建的3D游戲物體,是通過MeshFilter 和 MeshRenderer來進行顯示

其中MeshFilter 來控制物體的樣子

MeshRenderer 來控制游戲的顯示效果

如圖所示,我們用四個Cube來拼搭一個簡單的場景:

這里我們要知道,場景中的模型物體,都是由一個一個三角形面片組成的,

這樣的話我們的場景中其實包含了大量三角形面片和頂點信息

物體多的話,對我們游戲運行會產生一定影響,

如果將這些游戲物體的mesh進行融合,就可大量減少場景中三角形面片和頂點的數量

然后現在是我們的代碼部分:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class MeshTool {
    [MenuItem("Tool/Mesh/Combine")]
    public static void MeshCombine()
    {
        GameObject obj = (GameObject)Selection.activeObject; //場景中選擇的物體
        MeshFilter[] filters = obj.GetComponentsInChildren<MeshFilter>(); // 獲取子物體的MeshFilter

        CombineInstance[] combiners = new CombineInstance[filters.Length]; // 根據子物體的MeshFilter數量來創建CombineInstance數組

        for (int i = 0; i < filters.Length; i++)
        {
            combiners[i].mesh = filters[i].sharedMesh;
            combiners[i].transform = filters[i].transform.localToWorldMatrix; // 這里其實不是transform 組件上的transform,其實算是一種作表轉換
        }

        Mesh finalMesh = new Mesh(); // 創建一個新的mesh
        finalMesh.CombineMeshes(combiners);// 將數組中的mesh合並到finalMesh這一個數組中

        obj.GetComponent<MeshFilter>().sharedMesh = finalMesh;// 賦值
        Mesh mesh = obj.GetComponent<MeshFilter>().sharedMesh;
        AssetDatabase.CreateAsset(mesh, "Assets/" + "test" + ".asset"); // 將新的mesh 信息保存到本地
    }
}

在項目中找創建Editor文件夾,然后創建一個.cs文件將我們的代碼放進去

然后以剛剛圖中的四個Cube 為例,我們選中GameObject 並給他添加MeshFilter組件

然后

Tool-->Mesh-->Combine點擊運行我們在Asset文件夾下可以發現這個東西:

這里我們不難看出這個test是一個mesh,

然后我們給GameObject添上MeshRenderer組件並給上材質

在禁用掉GameObject下的四個Cube就可以得到我們想要的場地效果


免責聲明!

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



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