里面提到的中心要点就是联结(combine),联结,再联结。而对于具体怎么联结他却略过不提,于是只好自己研究。
先解释下联结的原理和意思:文档里说,显卡对于一个含100个面片的物体的和含1500个面片的物体的渲染消耗几乎是等价的。所以如果你有N个同一材质的东西,那么把他们联成同一个物体再统一用一个material那么对于显卡的渲染消耗就要降低N倍。
再讲具体做法,方法有2:
1是直接在max等工具里联结好,贴上同一材质再导进来,这方法固然好却不灵活,而且通常不实用,因为项目里大量同一材质的东西都是unity系统的树啊花花草草啊石头等。
2、就是在unity里再联结,这个要怎么做呢,其实也挺简单的,经常看Island Demo项目的人应该很早就注意到里面的石头这些都是连在一起的,原因就在这里,他提供了现成就脚本实现联结。
先到Island Demo的Assets/Script下找到CombineChildren.cs和MeshCombineUtility.cs两个脚本复制到自己的项目文件(我们要用的只是前者,但他会调用后者,没有后者unity会报错,所以把后者扔到项目里不管就好)
然后把你项目里那些用同一Materials的东西扔到一个空物体里面去,再把CombineChildren.cs贴到那个空物体上,搞定!
下面,我们来看看这个神奇的脚本帮我们做了什么工作,运行游戏之前,见图1,Island Demo就是按上述方法做了个_RocksCombined的东西,上面只贴着这个脚本,他里面全是岛上个一块块小石头,用的是同一个Materials
运行游戏后,神奇的事情发生了。
这个_RocksCombined上面出现了一个Combined Mesh,并带有他里面石头的Material,他里面的小石头的MeshRenderer的钩都自动去掉了,即被disable了。
这就是这个脚本自动帮我们做的优化方法,实现了对同材质物体的联结,从而降低了系统开销。
Unity3D的动画播放实际上都是通过AnimationState来进行控制的,Animation组件中提供的CrossFade,Play等方法其实就是将一系列对AnimationState参数进行设置的 *** 作进行了封装。其中主要相关的参数有四个:
layer: 该动画片段(AnimationClip)所在的播放层次。
weight: 该动画片段在动画混合中所占的权重(0~1)
enable: 该动画片段是否进行播放
编,程,回,忆,录,之unity3d
blendMode: 混合方式,有两种Blend和Additive
默认初始化情况下Animation组件中的全部AnimationState的layer=0,weight=0, enable=false。Animation组件默认播放的AnimationState的layer=0, weight=1, enable=true。
分为三层tilemap
草地层,悬崖层,覆盖层
Z分别为0,50,100
悬崖的tilemap设置 mode改为Individual模式
分别在各自层级上刷上草和悬崖
在覆盖层上刷上悬崖上层的草皮
刷完后的效果
打开草地的整体效果,这样便完成了第二层草地覆盖第一层悬崖的视觉效果,但实际上第二层的草地和第一层的草地是同一层tilemap,只有悬崖上的覆盖层使用了一个单独的层级,使视觉上显示为覆盖层和草皮像在同一层
同理,如果还需要第三层的话,在需要的位置继续在悬崖层刷上悬崖
在覆盖层刷上覆盖草皮,如此,便实现了视觉上的高度关系,后期只要处理好人物的行走障碍,让人物的寻路贴了悬崖边缘,就可以了
注意,虽然可以做这样的背面悬崖的效果,但是不要在靠近背面悬崖的地方放置植物,石头等装饰物,会产生层级错误,
其他物体的z设置为200
加上植物后的整体效果,层级显示正确
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)