Unity动态对象优化

本文介绍了一种在Unity中优化动态对象的方法,通过遍历所有SkinnedMeshRenderer组件,组合动态对象并应用骨骼动画,从而减少DrawCalls。提供了一个完整的源代码示例,方便开发者直接调用。

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

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
public  static  void  CombineToMesh(GameObject _go)
     {
         SkinnedMeshRenderer[] _smr = _go.GetComponentsInChildren<SkinnedMeshRenderer>();
         List<CombineInstance> lcom =  new  List<CombineInstance>();
 
         List<Material> lmat =  new  List<Material>();
         List<Transform> ltra =  new  List<Transform>();
 
         for  ( int  i = 0; i < _smr.Length; i++)
         {
             lmat.AddRange(_smr[i].materials);
             ltra.AddRange(_smr[i].bones);
 
             for  ( int  sub = 0; sub < _smr[i].sharedMesh.subMeshCount; sub++ )
             {
                 CombineInstance ci =  new  CombineInstance();
                 ci.mesh = _smr[i].sharedMesh;
                 ci.subMeshIndex = sub;
                 lcom.Add(ci);
             }
             Destroy(_smr[i].gameObject);
 
         }
 
         SkinnedMeshRenderer _r = _go.GetComponent<SkinnedMeshRenderer>();
         if  (_r ==  null )
             _r = _go.AddComponent<SkinnedMeshRenderer>();
         _r.sharedMesh =  new  Mesh();
         _r.bones = ltra.ToArray();
         _r.materials =  new  Material[] { lmat[0] };
         _r.rootBone = _go.transform;
 
         _r.sharedMesh.CombineMeshes(lcom.ToArray(),  true false );
 
     }

以上是完整的源代码,大家只要将其调用即可。

本文出自 “海游移动” 博客,请务必保留此出处http://jxwgame.blog.51cto.com/943299/1604569

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值