情景再现:如一个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
UnityEngine.Debug:LogError(Object)
DigitalOpus.MB.Co
如果遇到这个报错,使用MB3_MultiMeshBaker替换MB3_MeshBaker
需要创建GameObject->CreateOther->MeshBaker->Multi-Mesh And MaterialBaker 操作和 meshBaker一样