unity3d meshBaker教程(五) 动态添加删除物体

情景再现:如一个RPG游戏,会刷新很多的怪物,如果不做优化的话那么每一个怪物都需要占用几个DC,如何才能动态生成,并且又不占用DC呢?下面就来操作一下。


使用教程三的场景,就是cube会上下移动的场景。

任务:我们需要在该场景中,动态增加3rd Person Controller这个预置,并且保证drawCalls





1.创建对象,GameObject->CreateOther->MeshBaker->Mesh And MaterialBaker 


命名为MeshBakerEnemy(随意拉。。),为了方便管理,可以把这个MeshBaker当成只负责合并敌人

场景由另一个来负责


2.选择Material Bake Result 这个就是我们 教程四 制作的预置材质,Combined mesh Material也一样






3.下面来编写代码,首先来看下使用前和使用后的对比





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

public class EnemyMaker : MonoBehaviour {
	//我们的水管工人预置
	public GameObject prefab;
	//用来管理敌人的网格
	public MB3_MeshBaker meshBaker;
	//用来记录已经生成的预置
	private List<GameObject> prefabs;
	// Use this for initialization
	void Awake () {
		prefabs = new List<GameObject> ();
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnGUI(){
		if(GUI.Button(new Rect(0,0,100,100),"增加预置")){
			Vector3 pos = new Vector3(Random.Range(-2,2),1,Random.Range(-2,2));
			Quaternion dir = Quaternion.Euler(new Vector3(0,Random.Range(0,360.0f),0));
			//生成一个 工人预设
			GameObject worker = Instantiate(prefab,pos,dir) as GameObject;
			GameObject firstMeshRenderer = null;
			//获取对象身上的所有renderer组件对象
			List<GameObject> needAddList= getRenderers(worker,ref firstMeshRenderer);

			meshBaker.AddDeleteGameObjects(needAddList.ToArray(),null);
			meshBaker.Apply();

			//由于一个物体身上SkinnedMeshRenderer和MeshRenderer一起合并的话不知道为什么人物无法移动,
			//但是把某个MeshRenderer启用就可以移动了,
			//不知道是什么原因,如果你知道为什么,请留言~~~谢谢
			if(firstMeshRenderer){
				firstMeshRenderer.transform.renderer.materials = new Material[0]{};
				firstMeshRenderer.transform.renderer.enabled = true;
			}

			prefabs.Add(worker);

		}	

		if(GUI.Button(new Rect(110,0,100,100),"删除第一个")){
			if(prefabs.Count>0){
				GameObject worker = prefabs[0];
				GameObject firstMeshRenderer = null;
				List<GameObject> needDelList = getRenderers(worker, ref firstMeshRenderer);

				meshBaker.AddDeleteGameObjects(null,needDelList.ToArray());
				meshBaker.Apply();

				Destroy(prefabs[0].gameObject);

				prefabs.RemoveAt(0);


			}
		}

		GUI.Label (new Rect(0,110,200,100),"当前预设数量:"+prefabs.Count);
	}


	List<GameObject> getRenderers(GameObject obj,ref GameObject firstMeshRenderer){
		List<GameObject> needAddList = new List<GameObject>();
		
		SkinnedMeshRenderer[] smrs = obj.GetComponentsInChildren<SkinnedMeshRenderer>();
		for (int i = 0; i < smrs.Length; i++) {
			needAddList.Add(smrs[i].gameObject);
		}

		MeshRenderer[] mr = obj.GetComponentsInChildren<MeshRenderer>();
		for (int i = 0; i < mr.Length; i++) {
			if(i == 0){
				firstMeshRenderer = mr[i].gameObject;
			}
			needAddList.Add(mr[i].gameObject);
		}
		return needAddList;
	}
}

核心代码

参数1,需要增加的对象
参数2,需要删除的对象

meshBaker.AddDeleteGameObjects(needAddList.ToArray(),null);
meshBaker.Apply();



Cannot add objects. Resulting mesh will have more than 64k vertices. Try using a Multi-MeshBaker component. This will split the combined mesh into several meshes. You don't have to re-configure the MB2_TextureBaker. Just remove the MB2_MeshBaker component and add a MB2_MultiMeshBaker component.
UnityEngine.Debug:LogError(Object)
DigitalOpus.MB.Co

如果遇到这个报错,使用MB3_MultiMeshBaker替换MB3_MeshBaker

需要创建GameObject->CreateOther->MeshBaker->Multi-Mesh And MaterialBaker 操作和 meshBaker一样


由于一个物体身上SkinnedMeshRenderer和MeshRenderer一起合并的话

不知道为什么人物无法移动,

但是把某个MeshRenderer启用就可以移动了,

不知道是什么原因,如果你知道为什么,请留言~~~谢谢






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值