Unity优化——网格合并

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yaojiawudi/article/details/72828030
最近在做VR教育这一块东西,国产货讲道理很多都不是很成熟,因为性能不好,所以会考虑很多的优化手段,使得工程能在国产一体机上流畅运行。
下面就是网格,材质的合并。
这个优化的前提是不能静态批处理,如果静态批处理会消失或者运行后移动到不知道那里去;其次最好父物体是一个Scale是111 的物体,否则放到其下得物体会变形(你可以
在一个隐蔽的地方方格Cube 0-0)

using UnityEngine;
using System.Collections;
using System;

// 网格合并
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(MeshFilter))]
public class he : MonoBehaviour {

		
	void Start () {
		
		// 获取自身和所有子物体中所有的MeshFilter组件
		MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();  
		// 新建CombineInstance数组 
		CombineInstance[] combine = new CombineInstance[meshFilters.Length];    
		// 获取自身和所有子物体中所有MeshRenderer组件 
		MeshRenderer[] meshRenderer = GetComponentsInChildren<MeshRenderer>();
		// 新建材质球数组
		Material[] mats = new Material[meshRenderer.Length];  

		for (int i = 0; i < meshFilters.Length; i++)                            
		{
			// 获取材质球列表
			mats[i] = meshRenderer[i].sharedMaterial;                          
			// 获取网格
			combine[i].mesh = meshFilters[i].sharedMesh;
			// 获取位置
			 combine[i].transform = transform.worldToLocalMatrix * meshFilters [i].transform.transform.localToWorldMatrix;
//			combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
			// 隐藏子物体
			meshFilters[i].gameObject.SetActive(false);

		}
		// 新建一个Mesh
		transform.GetComponent<MeshFilter>().mesh = new Mesh(); 
		// 为mesh.CombineMeshes添加一个 false 参数,表示并不是合并为一个网格,而是一个子网格列表 
		transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine,false); 
		// 为合并后的GameObject指定材质
		transform.GetComponent<MeshRenderer>().sharedMaterials = mats;          

		transform.gameObject.SetActive(true);

	}
		
}


展开阅读全文

没有更多推荐了,返回首页