Unity3D动态对象优化代码分享

具体解释请仔细看注释里已经讲解的很细致了,这里就不多废话了

代码如下:

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

/// <summary>

/// 动态对象优化

/// </summary>

public class DynamicOptimization : MonoBehaviour {

// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

}

/// <summary>

/// 动态对象优化

/// </summary>

/// <param name=”gameObject”>物体</param>

public void DynamicObjectOptimization(GameObject gameObject)

{

//SkinnedMeshRenderer:蒙皮网格渲染器—获取所有带有网格渲染器的物体(包含子物体)

SkinnedMeshRenderer[] smr = gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();

//CombineInstance:用来描绘网格合并的结构,结合网格有利于性能最优化

List<CombineInstance> listCom = new List<CombineInstance>();

//所有材质集合

List<Material> listMat = new List<Material>();

//物体的基本信息集合

List<Transform> listTrans = new List<Transform>();

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

{

//获取材质信息

listMat.AddRange(smr[i].materials);

//物体信息—bones:用于蒙皮网格的骨骼列表

listTrans.AddRange(smr[i].bones);

//获取共享网格的信息

for(int k=0;k<smr[i].sharedMesh.subMeshCount;k++)

{

//合并实例

CombineInstance ci = new CombineInstance();

//获取网格信息

ci.mesh = smr[i].sharedMesh;

//获取网格的索引信息

ci.subMeshIndex = k;

//添加

listCom.Add(ci);

}

//删除

Destroy(smr[i].gameObject);

}

//获取物体上的渲染器信息

SkinnedMeshRenderer smRenderer = gameObject.GetComponent<SkinnedMeshRenderer>();

//判断是否包含有网格渲染器,如果没有则进行添加

if(smRenderer==null)

{

smRenderer = gameObject.AddComponent<SkinnedMeshRenderer>();

}

//蒙皮网格

smRenderer.sharedMesh = new Mesh();

//骨骼列表

smRenderer.bones = listTrans.ToArray();

//材质

smRenderer.materials = new Material[] { listMat[0] };

//获取物体的信息

smRenderer.rootBone = gameObject.transform;

//合并网格(CombineMeshes)函数的第二个参数是设置是否将多个子网格合并成一张实际的网格。

//一个实际的网格只能施加一个材质,所以只有被合并的所有网格原来使用的就是同一个材质(即共享材质)时,

//将它们真正合并才能正确应用材质。否则应该将该参数置为false,表示不实际合并这些sub mesh,

//而是将它们作为被合并后Mesh对象的sub mesh。

smRenderer.sharedMesh.CombineMeshes(listCom.ToArray(), true);

}

}

以上就是本文所述的全部内容了,希望大家能够喜欢

除声明外,跑步客文章均为原创,转载请以链接形式标明本文地址
  Unity3D动态对象优化代码分享

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23117.html

相关内容

详解C#中的System.Timers.Timer定时器的使用和定时自动清理内存应用

C#实现的Excel文件操作类实例

详解c#读取XML的实例代码

C#中Dictionary的作用及用法讲解


C#静态变量与实例变量实例分析

C# 数组实例介绍(图文)

WinForm中DefWndProc、WndProc与IMessageFilter的区别

C#中实现屏蔽Ctrl+C的方法

时间: 2024-10-09 08:33:13

Unity3D动态对象优化代码分享的相关文章

ava Swing心型动态图案的代码分享

今天java商城产品开发的工作人员分享一个java  Swing心型动态图案的代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 pa

Unity动态对象优化

对于静态对象,Unity可以使用通过勾选Static,然后让Unity自身进行优化Draw Calls,但是对于动态对象,Unity在这方面没有处理,这就需要我们自己去实现,实现的原理就是首先去遍历每个对象的SkinnderMeshRenderer,然后将其所有的动态对象组合成一个大的对象并且将骨骼动画赋值给他,这样,我们就实现了动态对象的优化,代码如下: public static void CombineToMesh(GameObject _go)     {         Skinned

Unity3D静态对象优化系列二

在系列一中,我们已经知道了问题所在,一个是优化后我们模型位置改变了,另一个是如果是不同的材质的物体一起优化的时候,不同的材质的对象会消失掉,我们在系列二中主要是解决这两个问题: 接下来我们改进的思路是查找所有的MeshFilter,同时我们根据不同的材质对我们需要优化的对象进行分离.这就需要我们定义两个链表:         ArrayList materials = new ArrayList();         ArrayList combineInstanceArrays = new A

Unity3D静态对象优化系列三

我们接着系列二的问题继续讲解,系列二中的问题是如果多个材质是相同的,它没有去优化,接下来我们将其优化一下,首先要找到在哪里去优化,我们看下面的for循环语句也是系列二的代码,如下:                 for (int s = 0; s < meshFilter.sharedMesh.subMeshCount; s++)                 {                     int materialArrayIndex = 0;                 

【代码分享——Java&amp;Json】Json转成java对象,已经java对象转成Json对象

做记录用,肯定有地方不完整,先放着吧 [代码分享--Java&Json]Json转成java对象,已经java对象转成Json对象,布布扣,bubuko.com

于Unity3D动态创建对象和创建Prefab三种方式的原型对象

u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject orignal) 需要的对象为原型. 文提供三种方式获得prefab对象. 方式一:使用脚本的public字段 直接在Project视图里找到做好的prefab,将其拖拽到指定脚本的指定public GameObject 字段. 方式二:Resource类 1.在Assets目录下的任何位置创建一个名为resources的目录.将做好的prefab放到这个目录下,p

java随机动态生成汉字验证码图片的实例代码分享

原创不易,转载请注明出处:java随机动态生成汉字验证码图片的实例代码分享 代码下载地址:http://www.zuidaima.com/share/1809721113234432.htm 汉字验证码实现原理 将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码图片并用文本框值和session值比较,功能相对来说还是比较简单的. 效果图,如下: 验证成功后: java随机动态生成汉字验证码图片的实例代码分享

JS打字效果的动态菜单代码分享

这篇文章主要介绍了JS打字效果的动态菜单,推荐给大家,有需要的小伙伴可以参考下. 这是一款基于javascript实现的打字效果的动态菜单特效代码,分享给大家学习学习. 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式.为大家分享的JS打字效果的动态菜单代码如下 <html> <head> <title>JS打字效果的动态菜单</title> <meta http-equiv="imagetoolbar" content=&q

Unity3d iOS基本优化和高级优化

原地址:http://www.cocoachina.com/bbs/read.php?tid=70395&page=1 分享看见的2篇好文.简单翻译了一下并且放出原文http://www.cratesmith.com/archives/1831.做减法大量代码在Update()或FixedUpdate()中做处理,意味着无论代码的执行速度如何,都将在每次帧刷新的时候调用到, 复制代码 public class MyHoming : MonoBehaviour { public void Upda