meshBaker版本:3.31

drawCall 优化利器

最基本的使用


一.搭建场景



如上图场景,新建4个材质,分别附上这4个贴图,贴图是MeshBaker自带的。

运行后

二.使用meshBaker

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




上面有2个组件,注意,3.6版本的结构和这个有点区别

点击Open Tools For Adding Objects,弹出如下窗口

List Shaders In Scene 按钮是可以打印当前场景中物体使用的shader,lightmapping,等一些信息,可以做参考

选中需要合并的物体,点击Add Selected Meshes,一定要选中物体

输出如下信息

点回MeshBaker0会看到Objects To。。。里面已经有4个物体了,也就是我们刚才选中的物体,当然,你自己手动拖进去也是可以的。

接下来点击Create Empty Assets For Combined Material

弹出如下窗口,选好路径,自定义名字保存即可,这个主要是用来储存合并材质和合并信息的

之后点击Bake Materials Into Combined Material

等待操作完成后,找到下面这个脚本,点击Bake就可以了

会生成一个 CombinedMesh-MeshBaker0-mesh 的对象

然后点击Disable Renderers on Source Objects,就是隐藏原来物体的Render组件

运行后可以看到 DrawCalls 从 5 降到 2 了

情景再现:大场景中,有很多细碎的小物体,如果一个个点的话很累,而且shader可能用的不一样,使用起来就比较麻烦了,还好MeshBaker提供了自动合并的功能,来试试吧。

接着教程一中场景

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

2.点击Open Tools For Adding Objects,弹出如下窗口

3.点开Show Tools

4.点击 select folder for Combined Material Assets 就是选择一个目录给存放材质这些资源

5.选择Lightmapping 为 Preserve Lightmapping,就是保留,

选忽略的话那就是没有lightmapping了

6.Included object Must Be Static 是否必须是静态物体,我们这个场景中没有静态物体,

那我们取消勾选

7.点击Generate Mesh Bakers

8.控制台会输出Created 1 bakers. Added 4 objects,

同时场景中多了一个MeshBaker-Diffuse-LM-1物体,我们这个场景内容较少,

shader类型也少所以只有一个物体,如果内容多的话,会有多个物体。

9.点击Bake EveryMeshBaker In Scene,

处理完成后会生成CombinedMesh-MeshBaker-Diffuse-LM-1-mesh

效果和教程一是一样的,但是比较方便

PS:如果你发现生成后,你的场景样式不对,

那你尝试把CombinedMesh-XXXXX-Diffuse-XXX

叫Diffuse这个给隐藏掉看看是否正确。

有童鞋可能已经发现了,如果照教程一或教程二进行合并,物体上若有位移的脚本或者是动画,他确是无法进行位移的

下面来讲下解决方法。

其实方法很简单,接着教程二场景

1.首先我们在某个cube上挂一个位移的脚本,简单的pos位移就行。

2.运行,发现那个cube并未移动,点击那个物体,发现只有碰撞器在移动,

此时我们使用的是meshBaker合并后的网格,源对象的meshRender是禁用的。

3.点开MeshBaker-Diffuse-LM-1,然后找到下面的Renderer选项,选择Skinned Mesh Renderer,然后Bake

4.在运行,你就能发现物体在移动了

5.注意,可能你在场景中漫游的时候会发现物体突然消失了。你可以调meshBaker生成出来网格的Bounds,调到适当大小即可

最好不要勾选Update When Offscreen 比较耗

1.导入Assets->Import Package->Character Controller

2.新建场景,把3rd Person Controller拖到场景中,移除上面除Animation的其他所有脚本

3.把他拖到自己的文件夹内,当成一个新的预设

4.创建对象,GameObject->CreateOther->MeshBaker->Material Only Baker

5.点击Open Tools For Adding Objects,弹出如下窗口

6.选中3rd....点击Add Selected Meshes

7.物体已经添加进入,然后点Create Empty Asset.....创建一个预置的材质信息。

8.然后 Bake Materials Into Combined Material这样预置材质就创建好了,当然你可以添加N个物体一起

后面讲解如何使用。

情景再现:如一个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.下面来编写代码,首先来看下使用前和使用后的对比

[csharp] view plaincopy
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class EnemyMaker : MonoBehaviour {
  5. //我们的水管工人预置
  6. public GameObject prefab;
  7. //用来管理敌人的网格
  8. public MB3_MeshBaker meshBaker;
  9. //用来记录已经生成的预置
  10. private List<GameObject> prefabs;
  11. // Use this for initialization
  12. void Awake () {
  13. prefabs = new List<GameObject> ();
  14. }
  15. // Update is called once per frame
  16. void Update () {
  17. }
  18. void OnGUI(){
  19. if(GUI.Button(new Rect(0,0,100,100),"增加预置")){
  20. Vector3 pos = new Vector3(Random.Range(-2,2),1,Random.Range(-2,2));
  21. Quaternion dir = Quaternion.Euler(new Vector3(0,Random.Range(0,360.0f),0));
  22. //生成一个 工人预设
  23. GameObject worker = Instantiate(prefab,pos,dir) as GameObject;
  24. GameObject firstMeshRenderer = null;
  25. //获取对象身上的所有renderer组件对象
  26. List<GameObject> needAddList= getRenderers(worker,ref firstMeshRenderer);
  27. meshBaker.AddDeleteGameObjects(needAddList.ToArray(),null);
  28. meshBaker.Apply();
  29. //由于一个物体身上SkinnedMeshRenderer和MeshRenderer一起合并的话不知道为什么人物无法移动,
  30. //但是把某个MeshRenderer启用就可以移动了,
  31. //不知道是什么原因,如果你知道为什么,请留言~~~谢谢
  32. if(firstMeshRenderer){
  33. firstMeshRenderer.transform.renderer.materials = new Material[0]{};
  34. firstMeshRenderer.transform.renderer.enabled = true;
  35. }
  36. prefabs.Add(worker);
  37. }
  38. if(GUI.Button(new Rect(110,0,100,100),"删除第一个")){
  39. if(prefabs.Count>0){
  40. GameObject worker = prefabs[0];
  41. GameObject firstMeshRenderer = null;
  42. List<GameObject> needDelList = getRenderers(worker, ref firstMeshRenderer);
  43. meshBaker.AddDeleteGameObjects(null,needDelList.ToArray());
  44. meshBaker.Apply();
  45. Destroy(prefabs[0].gameObject);
  46. prefabs.RemoveAt(0);
  47. }
  48. }
  49. GUI.Label (new Rect(0,110,200,100),"当前预设数量:"+prefabs.Count);
  50. }
  51. List<GameObject> getRenderers(GameObject obj,ref GameObject firstMeshRenderer){
  52. List<GameObject> needAddList = new List<GameObject>();
  53. SkinnedMeshRenderer[] smrs = obj.GetComponentsInChildren<SkinnedMeshRenderer>();
  54. for (int i = 0; i < smrs.Length; i++) {
  55. needAddList.Add(smrs[i].gameObject);
  56. }
  57. MeshRenderer[] mr = obj.GetComponentsInChildren<MeshRenderer>();
  58. for (int i = 0; i < mr.Length; i++) {
  59. if(i == 0){
  60. firstMeshRenderer = mr[i].gameObject;
  61. }
  62. needAddList.Add(mr[i].gameObject);
  63. }
  64. return needAddList;
  65. }
  66. }

核心代码

参数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启用就可以移动了,

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

unity3d meshBaker 基本的使用相关推荐

  1. Unity MeshBaker 合并网格和材质

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Mesh ...

  2. Unity3D 引擎学习2022资料整理(二)

    Utils C APR:Apache Portable Runtime:另一个跨平台的实用函数库.Apache2.0.官网 C Algorithms:一个常用算法和数据结构的集合.官网 CPL:The ...

  3. Unity3D游戏优化方案

    浅谈Unity3D项目优化 作为一个入行不足三年的攻城狮来讲,讲引擎中的优化,经验确实不足,unity3D引擎作为一款侧重移动端游戏开发引擎来讲,优化游戏是确实有必要的,毕竟他要适配所有机型的前提下又 ...

  4. unity3d游戏开发猜想——当程序猿老去

    程序猿将代码注入生命去打造互联网的浪潮之巅.当有一天他们老了.会走向那里,会做些什么? 非常多年以后,在我60岁的那天早晨,天刚蒙蒙亮我就起床了,先去公园晨练,然后回来做早餐(50岁的时候我学会了做饭 ...

  5. Unity3D 中 2D_Toolkit插件下载 和 导入方法

    Unity3D 中 2D_Toolkit插件下载 和 导入方法 1.你把下载来的包放到 安装目录:Editor\Standard Packages里面. 2.然后按ctrl+9,进入asset sto ...

  6. Unity3D 镜面反射

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:[119706192] 本文链接地址: Unity3D 镜面反射 这是官方CharacterCustomization事例中的镜面 ...

  7. [推荐]C#快速开发3d游戏工具--Unity3d

    最近有幸接触了一点Unity3d的东西,和大家分享一下. Unity3d 简介 是一款可视化的,3d游戏开发软件.可以进行手动绘制3d场景,自己添加摄像机角度,3d模型设计,事件触发,对于园子里大家很 ...

  8. unity3d 切换网络_Unity3d新网络请求方式UnityWebRequest详解

    Unity将要逐步放弃www网络请求api,新的api请求方式来临:UnityWebRequestThe,也正是本篇文章要给大家介绍的重点,那就是UnityWebRequestThe的使用详解. 旧的 ...

  9. Unity3D提示“XX,some are mac os x (unix) and some are windows”

    2019独角兽企业重金招聘Python工程师标准>>> 解决办法: 将Unity安装目录\Editor\Data\Resources\ScriptTemplates\目录下的所有文件 ...

  10. unity3d教程运行物理机制

    首先,我们将把Hooke定律写Euler方法结合在一起找到新坐标.加速和速度. Hooke定律是F=kx,这里的F是指由水流产生的力(记住,我们将把水体表面模拟为水流),k是指水流的常量.x则是位移. ...

最新文章

  1. python 申请内存空间、用于创建多维数组_python 申请内存空间,用于创建多维数组的实例...
  2. 个推无法获取个推id_最新个推Android 推送 SDK Maven 集成
  3. Spring起步(一)Building a RESTful Web Service
  4. 如何通过提问成为更好的开发人员
  5. ftl转PDF服务器上中文不显示,解决Linux中swftools转换中文pdf时出现乱码问题
  6. 中序线索树和后序线索树
  7. 三勾商城是开发友好的微信小程序商城,框架支持SAAS,支持发布 iOS + Android + 公众号 + H5 + 各种小程序
  8. ffmpeg rtp传输使用
  9. Solidity-让合约地址 接受ETH的转账充值的 三种方式
  10. 你可能不知道的shell、bash二三事(Centos 7)
  11. Excel 2010实战技巧精粹
  12. BOM有效日期的设置
  13. EDA技术及应用实验2 f_adder程序
  14. 程序人生 - 车辆年检与费用你知道多少?
  15. 思科 Packet Tracer 实验六 路由协议基本配置
  16. 图像特效---(Sketch Filter)素描滤镜
  17. Flask框架学习笔记(1)
  18. Matlab在不同坐标系中绘图(对数、极坐标、双轴图)以及极坐标和直角坐标的相互转换
  19. 分享2019年陆陆续续读过的书-附书单
  20. A股暴跌三日市值蒸发4.2万亿 股民人均浮亏超2万

热门文章

  1. windows批量修改文件权限
  2. linux中PATH环境变量的作用和使用方法
  3. 闪耀DTCC | 腾讯云——提供全球领先的专业云计算服务
  4. 【Vue知识点- No5.】生命周期、axios、购物车案例
  5. 我的OpenBSD配置文件
  6. mybati-plus自定义sql异常Invalid bound statement (not found)封装的sql查询正常
  7. 如何在vue项目中实现图表进行数据分析
  8. android华为怎么截屏快捷键,华为P9/P9Plus怎么截图 快捷键截图方法介绍
  9. android 字体外发光,CSS3 霓虹外发光字体效果
  10. topic是短语还是句子_新仁爱版英语unit4 topic1短语和句子