1.
光照贴图是场景中3D模型产生的投影、阴影过渡、灯光氛围、模型材质与材质之间的颜色影响等。
2.
很少有3D手游场景是靠灯光与模型即时渲染产生投影及颜色影响,这是非常耗性能的方式,特别又是手机手游,手机的显卡功能并不强大,全部用即时光影手游会变得很卡顿。
场景光照贴图就是为了解决这个问题,它是以贴图的方式模拟手游场景的光影光色,减少大量的即时运算。
光照贴图建议通过unity3D 编辑器渲染光照贴图并导出使用,加载场景时,引擎会自动加载光照贴图达到较好的效果。
如果unity中并未渲染光照贴图,导出后引擎也不会加载报错,但手游的效果会大打折扣。
3.
如果摄像机使用了正交投影,天空盒将达不到所要效果,开发者们可以尝试。
4.
多摄像机的缺点是非常耗性能,模型三角面数与DrawCall数量会成倍上升,多几个摄像机就会多出几倍性能损耗,因此开发者们需酌情考虑。
3D场景的显示大小与位置与2D手游不太一样,主要是靠摄像机的视口(ViewPort)来控制,通过它来进行屏幕的分割。
5.
component是3D世界中的脚本,继承自组件,是组件的一种。该类被定义为 ‘抽象类’ ,不允许实例。该类提供了一系列虚方法。
6.
onReset重置组件参数到默认值,如果实现了这个函数,则组件会被重置并且自动回收到对象池,方便下次复用 如果没有重置,则不进行回收复用 此方法为虚方法,使用时重写覆盖即可。
7.
lh导出的3D显示对象容器Spirte3D类型数据文件,JSON格式编码,是unity3D中layaAir导出插件选择导出预设类别生成,内容比*.ls格式少了光照贴图,其他全部相同。
8.
lm格式数据文件无论是导出 场景文件 或 预设文件 类型,在导出的资源文件夹中都包含了系列*.lm格式文件,本项目中LayaMonkey文件夹为unity中开发者自建的存储FBX模型的文件夹,如图4,在导出时生成了对应的文件夹和.lm资源文件。
*.lm文件就是模型的网格数据文件。可以生成MeshSprite3D或SkinnedMeshSprite3D类型显示对象的Mesh(网格),文件中包含了模型网格的顶点位置、法线、顶点色、顶点UV等信息。
9.
lav文件是蒙皮骨骼动画数据文件。可以生成SkinnedMeshSprite3D蒙皮网格精灵的Avatar(骨骼)。文件中包含了骨骼节点信息。
10.
lmat文件是材质数据文件。可以生成模型可以使用的material(材质)。其中包含了材质贴图,材质球颜色信息,定点色信息,纹理偏移信息等材质相关的信息。
11.
PrimitiveMesh创建时需注意的是,加载到场景中的引擎自带模型,轴心点在模型正中心,因此我们是以模型中心点为参考进行移动、旋转、缩放。加载到场景中时,模型默认会放置到场景的世界座标原点上。
12.
修改子对象模型网格。获取子对象时还应注意一个问题,就是模型与材质未加载完成,是无法获取子对象的,因此需要资源预加载,或异步加载时进行完成事件监听。
13.
支持Shader列表中LayaAir3D目录中的所有Shader。如果使用非LayaAir3D Shader会强制转换为LayaAir3D的默认Shader,之后可能会出现无法预知的错误。
14.
关于材质优化。引擎在加载场景时会对物体进行合并处理,可大幅度提升场景性能。合并原则为同材质的模型,所以开发者在编辑场景模型时尽量使用相同材质,并且越少越好。这样就可以达到今后性能优化的最基本条件。更具体的会在今后的性能优化篇讲解。
15.
设置相机的清除标识为天空盒(这个参数必须设置为CLEARFLAG_SKY,否则无法使用天空盒)。
16.
当纹理大于三维图形表面时,导至一个像素被映射到许多纹理像素上;当维理小于三维图形表面时,许多个像素都映射到同一纹理。
当这些情况发生时,贴图就会变得模糊或发生错位。要解决此类问题,必须通过技术平滑纹理元素和像素之间的对应。这种技术就是纹理过滤。
双线性过滤 (最常用,性能挺好的)
17.
动画过度融合是用于在给定的时间内从一个动画状态平滑过渡到另一个动画状态。如果一个动作跳转到另一个完全不同的动作耗时很短,那么过渡通常的表现令人满意。下面我们的例子演示效果就是将跑步动作与瞄准动作混合起来。
18.
骨骼挂点技术在3D手游中运用非常普遍,比如武器要随着角色的手的动作而变化,那么我们就可以把武器与手上骨骼进行挂点绑定,武器作为手骨骼的子节点,自然就可以跟随手的动作而变化。当然,绑定后的3D模型也可以通过代码来移除绑定或者更换另外的3D模型,通过这种方式可以实现武器或装备的换装功能,骑乘功能等。
19.
在LayaAir3D中有内置的2个天空盒网格:SkyBox盒型网格 与 SkyDome 球形网格。
20.
显存不像内存,内存有垃圾回收机制,而显存不一样,必须手动释放,因此显存的资源释放必须受到重视!
如果单纯的销毁使用该网格的精灵,不对网格资源本身做处理,显存是不会有减少的,网格资源还是在显存中。
//销毁了使用了该网格的精灵
layaMonkey.destroy();
//对网格进行销毁
mesh.destroy();
21.
Sprite3D在调用 destroy() 之后,精灵所引用的材质,纹理,网格并不会跟随精灵的销毁而一起销毁。这些残留下的资源需要分别使用Laya.loader.getRes(url:String)接口获取到资源(Resource)对象之后,再调用资源对象的destroy()方法进行销毁。
但是这种方法是非常麻烦的。LayaAir2.0为了方便开发者,提供了Resource.destroyUnusedResources()接口统一销毁。
Tip:注意需要清理一个的Scene3D或者Sprite3D 相关的资源时,需要销毁(destroy)的不单单是他的本体精灵,克隆的精灵也需要进行销毁。此时destroyUnusedResources 方法会自动释放掉所有没有使用且没有 上锁 的资源。
22.
在2D中,图片使用的是Texture纹理(注意不是3D中的Texture2D)。但是实质上Texture就是对Texture2D的再封装,Texture的bitmap 属性就是他所属的Texture2D ,Texture本身是记录了Texture2的uv属性,来实现图集中的单图片显示。 所以在2D中,同一个图集中的多个不同 Texture 是共用的一个 Bitmap。这样的机制,就可能让开发者在内存管理时产生误解:"销毁了一个2D的 Texture ,那么他所占的显存也应该被释放"。
由于多个Texture引用同一个bitmap ,而Texture并不是真正的显存,bitmap才是真正的显存对象。销毁Texture并不等于销毁bitmap, 所以在这个时候是释放不掉显存的。所以2D图集与图片资源加锁,实际上是对相对应的Texture的bitmap上锁。在加载图集之后,还是使用Laya.loader.getRes(url)拿到图集中的一个Texture纹理,然后通过Texture的bitmap属性上锁。