今天介紹一個優化技巧,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就可以得到我們想要的場地效果