Unity教程之-合并(Combine)引用相同材质球的网格(Mesh)

Unity自带了一个合并网格的功能,Mesh.CombineMeshes 组合网格

function CombineMeshes (combine : CombineInstance[], mergeSubMeshes : bool = true, useMatrices : bool = true) : void

结合网格有利于性能最优化。如果mergeSubMeshes为true,所有的网格会被结合成一个单个子网格。否则每一个网格都将变成单个不同的子网格。如果所有的网格共享同一种材质,设定它为真。如果useMatrices为false,在CombineInstance结构中的变换矩阵将被忽略。

用这函数我们可以把引用相同材质球的网格进行合并达到减少Draw Call,优化性能的效果。

我的基本思路是:将所有的材质球用字典存(相同的只存一个),将引用相同材质球的网格存一个链表中用材质球的名称作为Key值;

然后遍历字典用Mesh的成员方法CombineMeshes()合并相同;

OK,上代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
 
public class ComebinMesheDemo : MonoBehaviour {
 
// Use this for initialization
void Start () {
//获取所有网格过滤器;
MeshFilter[] meshFilters = gameObject.GetComponentsInChildren<MeshFilter>();
//存放不同的材质球,相同的就存一个;
Dictionary<string, Material> materials = new Dictionary<string, Material>();
 
//存放要合并的网格对象;
Dictionary<string, List<CombineInstance>> combines = new Dictionary<string, List<CombineInstance>>();
for (int i = 0; i < meshFilters.Length; i++)
{
//构造一个网格合并结构体;
CombineInstance combine = new CombineInstance();
 
//给结构体的mesh赋值;
combine.mesh = meshFilters[i].mesh;
combine.transform = meshFilters[i].transform.localToWorldMatrix;
 
MeshRenderer renderer = meshFilters[i].GetComponent<MeshRenderer>();
Material mat = renderer.sharedMaterial;
 
if (!materials.ContainsKey(mat.name))
{
materials.Add(mat.name, mat);
}
if (combines.ContainsKey(mat.name))
{
combines[mat.name].Add(combine);
}
else
{
List<CombineInstance> coms = new List<CombineInstance>();
coms.Add(combine);
combines[mat.name] = coms;
}
 
Destroy(meshFilters[i].gameObject);
}
GameObject combineObj = new GameObject("Combine");
combineObj.transform.parent = transform;
foreach (KeyValuePair<string, Material> mater in materials)
{
GameObject obj = new GameObject(mater.Key);
obj.transform.parent = combineObj.transform;
MeshFilter combineMeshFilter = obj.AddComponent<MeshFilter>();
combineMeshFilter.mesh = new Mesh();
 
//将引用相同材质球的网格合并;
combineMeshFilter.mesh.CombineMeshes(combines[mater.Key].ToArray(), true,true);
MeshRenderer rend = obj.AddComponent<MeshRenderer>();
 
//指定材质球;
rend.sharedMaterial = mater.Value;
rend.castShadows = false;
rend.receiveShadows = true;
}
}
}
好了,本篇unity3d教程关于合并相同材质的mesh网格的教程到此结束,下篇我们再会!


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值