场景优化————合并网格

简单地合并网格就是将场景中需要合并的物体同时放在同一个父物体的上面,之后通过代码实现将物体的材质放到父物体身上,然后删除该物体,实现缩小占用资源的效果;(个人的观点)

下面分享一组代码,将该这个代码放到需要合并网格的物体的父物体身上,实现将物体的材质放到父物体上,删除本物体的效果

代码如下:

using UnityEngine;

using System.Collections;

 

public class CombineMeshes : MonoBehaviour

{

 

 

void Start()

{

GetMesh(transform);

}

 

void GetMesh(Transform ts)

{

MeshFilter[] meshFilters = ts.GetComponentsInChildren<MeshFilter>(); //获取自身和所有子物体中所有MeshFilter组件

CombineInstance[] combine = new CombineInstance[meshFilters.Length]; //新建CombineInstance数组

 

MeshRenderer[] Renderer = ts.GetComponentsInChildren<MeshRenderer>(); //获取自身和所有子物体中所有MeshRenderer组件

Material[] mats = new Material[Renderer.Length]; //新建材质球数组

 

for (int i = 0; i < meshFilters.Length; i++)

{

mats[i] = Renderer[i].sharedMaterial; //获取材质球列表

 

combine[i].mesh = meshFilters[i].sharedMesh;

//矩阵(Matrix)自身空间坐标的点转换成世界空间坐标的点

//combine[i].transform = meshFilters[i].transform.localToWorldMatrix;

//变换矩阵的问题,要保持相对位置不变,要转换为父节点的本地坐标,

combine[i].transform = ts.worldToLocalMatrix * meshFilters[i].transform.localToWorldMatrix;

 

if (meshFilters[i].gameObject.name != gameObject.name) //除了根物体,其他物体统统销毁

{

Destroy(meshFilters[i].gameObject);

}

}

 

ts.GetComponent<MeshFilter>().mesh = new Mesh();

ts.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);/*为mesh.CombineMeshes添加一个 false 参数,表示并不是合并为一个网格,而是一个子网格列表,可以让拥有多个材质球,如果要合并的网格

用的是同一材质,false改为true,同时将上面的获取Material的代码去掉*/

 

ts.GetComponent<MeshRenderer>().sharedMaterials = mats; //为合并后的GameObject指定材质球数组

 

}

 

}

将该脚本放在父物体的身上,可以实现效果,不过删除以后物体的碰撞盒会消失不见,需要用到碰撞盒的,可以在父物体添加相应的碰撞盒

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值