Laya经典面试问题集锦

问题1: LayaBox的发展经历了哪些阶段?
LayaBox 1.x出来的时候主要是解决了FLASH网页游戏转成H5页游,转手游。将Flash的AS转成H5的代码,然后在跑自己的内核来驱动H5的代码。后来随着Flash没落,H5兴起,LayaBox发展成性能最好的次世代H5游戏引擎,后来也支持了手游。
LayaBox2.x阶段进一步优化了3D游戏引擎,并支持了微信小游戏,抖音小游戏,QQ小游戏等。开发语言同时支持了JavaScript/TypeScript/ActionScript
LayaBox 下一个阶段目标主要有两个,第一个是进一步完善LayaAir的引擎,让他成为最好用的游戏引擎之一,同时推出了LayaME,做UGC。

问题2: LayaBox做3D H5小游戏到底怎么样?
LayaBox做的3D微信小游戏在小游戏市场份额中占90%以上, 是非常成熟的H5小游戏开发引擎,同时也可以打包发布到Native平台。

问题3: Laya 与Unity之间到底是如何配合的呢?
Laya 有自己的引擎内核,有自己的开发工具,同时他也巧妙的用了Unity的编辑器,他是如何来做的呢?Laya 引擎内核是独立的,纯代码开发完整的游戏引擎,同时游戏引擎也要提供工具,2D编辑器,是Laya自己提供的,3D编辑器Laya没有自己做而是用了Unity来编辑场景,然后再工具把Unity编辑的场景和角色预制体转成Laya可以使用的格式,这样3D引擎和3D资源就可以用市场比较成熟的Unity,好用,很多资源可以共用,而且市场很多U3D开发的3D游戏,Laya这样做能将这些游戏转成H5的小游戏。

问题4: Laya 到底使用JavaScript开发好还是使用TypeScript开发好?
JavaScript是弱类型编程语言,开发比较灵活,TypeScript对类型的要求比较严格,从灵活性来说Js更灵活,但是灵活的同时,等项目带了不好维护,所以很多公司慢慢的倾向于选择强类型的TypeScript来开发。TypeScript底层运行是是JS,所以建议先学习JS再学习TS

问题5: Laya如何使用图集?
Laya 在做UI的时候,没有图集的概念,直接用单个小图片,UI制作完成以后,Laya会根据文件夹为我们把一个文件夹内的图片自动生成一个图集,如果文件过大,这个文件默认不会打包到图集,一般的图片默认是生成到图集的,如果你想这个图片不生成到图集,可以指定这个图片的类型为不打包。图集的使用能提升绘制性能,节约DrawCall。

问题6: Laya 3D摄像机有哪些模式?
Laya里面摄像机有两种模式,一种是透视摄像机,一种是正交摄像机,这两种摄像机决定了两种不同的投影成像的方式。如下图:
image.png

正交摄像机直接投影到屏幕成像
image.png

问题7: Laya 3D物体结果与Unity有什么区别?
Laya 的3D物体与Unity还是有区别的,Unity是GameObject + [Transform, MeshRender等组件], 而Laya里面是MeshSprite3D包含了MeshRenderer, 并且继承自Sprite3D,Sprite3D里面包含了数据成员transform。所以和Unity的纯组件开发有一些不一样。

问题8: Laya.Script 与Laya.Script3D有什么区别?
Laya 里面有两个代码组件类,一个是Laya.Script, 一个是Laya.Script3D,这两个有什么区别呢?记住一条,2D节点上只能挂Laya.Script, 3D节点上只能挂Laya.Script3D。

问题9: Laya UI里面如何换图片?
Laya Image里面有个skin指向的是图片的路径的字符串,当我们要换图片的时候,只需要将Image的数据成员skin,设置为图片的路径,如果要加载网络图片,也只需要将skin设置成http的一个网络地址。

问题11: Laya组件化开发的固定入口?
Laya写脚本的代码的时候是组件化开发,和Unity类似,接口也和Unity相似,不过前面加了一个on, 如下:
onAwake:组件实例加载的时候调用。
onStart: 组件实例在第一次update之前调用
onUpdate: 组件实例在每次画面刷新的时候调用
onFixedUpdate(): 组件实例以固定的时间间隔调用。
onDestroy(): 组件实例删除的时候调用。
….
接口很多与Unity类似,所以Unity开发人员很快就能上手Laya。

问题12: Laya如何做第三方资源部署?
开发微信抖音小游戏的时候,如果包体超过了大小我们需要把资源部署到第三方的服务器上,Laya为我们提供了第三方部署的方法,只需要设置资源的urlRoot就可以了。如下:
Laya.URL.basePath = https://… /

问题13: Laya 如何裁剪引擎的体积?
打开游戏场景,按住F9, 弹出项目设置对话框。你可以对你用到的库来进行设置,不用的就不要勾选上这样能减少游戏引擎的体积。如图:
image.png

问题14: Laya如何播放粒子特效?
粒子特效的节点为Laya. ShuriKenParticle3D,我们通过场景的节点查找函数获取到粒子节点,获取粒子节点后,里面有个数据成员particleSystem就是粒子的播放的控制,我们只要调用: ((节点 as Laya.ShuriKenParticle3D).particleSystem).play()。

问题15: 3D游戏里面如何监听触摸事件?
3D里面我们使用舞台来进行事件监听,Laya.stage.on(Laya.Event.MOUSE_DOWN, this, this.onTouchStart);
Laya.stage.on(Laya.Event.MOUSE_UP, this, this.onTouchEnd);
Laya.stage.on(Laya.Event.MOUSE_MOVE, this, this.onTouchMove);
image.png

问题16: 微信小游戏如何监听进入后台与回到游戏事件?
if (Laya.Browser.onWeiXin) {
wx.onShow(this.onEnterFrount.bind(this));
wx.onHide(this.onEnterBackGround.bind(this));
}

问题17: Laya如何加载Unity导出的3D游戏场景?
Laya.Scene3D.load(“资源路径”,
Laya.Handler.create(this, function (scene3d) {
// 加载完成的回调
}));

问题18: Laya如何加载Unity导出的预制体?
Laya.Sprite3D.load(“资源路径”,
Laya.Handler.create(this, function (sprite3d) {
// 加载成功的回调
}));

问题19:如何正确的使用Unity来辅助开发Laya项目?
Laya的3D编辑器是Unity, 这里要注意几个问题,而且非常重要。
1: 注意一定要使用laya for unity插件指定的Unity版本,这个真的很重要,很多问题都有可能是它引起的,比如场景性能很差等。
2: 一定要按照laya的支持规范来使用相关的操作,比如Laya兼容组件,Laya兼容的Shader。

问题20: Laya 如何切换材质?
r = (“节点” as Laya.MeshSprite3D).meshRenderer;
r.material = 材质对象;

问题21: Laya如何播放背景音乐?
Laya.SoundManager.playMusic(soundPath, 次数,
Laya.Handler.create(this, this.onSoundPlayEnd));

问题22: Laya的项目目录结构有哪些?
bin: 存放运行时候的代码库,资源等,运行时候的数据所在的目录,非常重要。
laya: 2D UI 场景视图,资源所在的文件夹,专门用来做2D编辑的。
libs: 游戏引擎所在的库的目录,当前项目使用的Laya引擎代码库所在目录。
release: 打包发布到各个平台的发布路径。
src: 代码所在的路径
.laya文件: Laya工程项目文件。
tsconfig.json: ts代码相关的一些设置。

问题23: Laya如何升级引擎?
这里有一个误区,大家都以为只要重新安装了LayaAir的IDE,用新的IDE打开了老的项目就已经升级成功了引擎版本。其实并没有升级引擎版本,还需要把新引擎的库拷贝到项目,如菜单所示:文件-》项目-》类库管理, 选择版本,点击”应用”即可
image.png

问题24: Laya 如何正确的做资源管理和使用资源?
Laya资源加载都是基于异步的,如果是H5游戏,有些资源可能要从服务器下载下来,再加载到内存,所以这个”时间段”会导致黑屏(无内容)与闪烁,所以使用Laya的资源的时候最好做好资源管理的预加载机制,你后面要使用什么资源先预加载进来,这样就可以避免黑屏与内容闪烁,避免由于资源加载照程的卡顿。

问题25: Laya如何监听物理碰撞?
Laya物理引擎的碰撞检测其实非常简单,只需要在物理刚体所在的节点添加脚本,在脚本里面重载下面的接口即可检测到物理碰撞
image.png
问题26:Laya 物理引擎支持哪些碰撞器?
SphereColliderShape 球体碰撞器
BoxColliderShape 盒型碰撞器
CapsuleColliderShape胶囊碰撞器
CylinderColliderShape圆柱碰撞器
ConeColliderShape圆锥碰撞器
MeshColliderShape网格碰撞器

问题27: Laya使用Unity导出天空盒要注意哪些事项?
1:导出的天空盒cubeMap 需要勾选 Readable选项
image.png
2:导出的天空盒材质必须使用LayaAir下的天空盒材质
image.png

问题28: Laya 拖尾的参数有哪些?
Time 拖尾生存时长
minVertexDistance 最小拖尾片段距离
width 拖尾宽度设置(可以为宽度曲线)
Color 采用 colorGradient 方式设置,有两个可选模式
Fixed 固定模式
Blend 混合模式
texture Mode 纹理模式,与普通纹理模式相同。
Stretch 可沿着轨迹的整个长度应用纹理贴图
Tile 使纹理沿着轨迹的长度平铺
alignment 轨迹准线
ALIGNMENT_VIEW 可以使轨迹面向摄像机
ALIGNMENT_TRANSFORM_Z 根据轨迹的变换组件的方向对齐
image.png

问题29: Laya如何使用静态合批?
Laya使用静态合批非常的简单,在Unity中对需要使用静态合并的模型勾选 Static 静态选项导出即可。如图所示:
image.png

问题30: Laya里面动态合批的原则
Laya里面动态合批,是自动完成的不需要开发人员做相关操作,动态合批分为两种,实例合并与顶点合并,他们的条件要求如下:
实例合并:
需要同Mesh和同材质双条件满足。在三维场景中同Mesh同材质的模型还是可能大量存在的,在这时实例合并有不小的发挥空间。
顶点合并:
需要同材质且模型顶点小于10个。顶点合并目前在一些假阴影和特效模型上有发挥空间。
注意:半透明的物体需要连续渲染才能动态合并,所以半透明物体的动态合并几率低。

问题31: LayaIDE如何清理缓存?
开发者在使用IDE的时候,有时候会报出一些错误,有的时候直接忽略即可。有的时候,需要重启IDE才可以解决。也有的时候重启也解决不了。这个时候。我们建议开发者先清理缓存来解决。因为大多数情况都是缓存的问题导致。
在IDE导航的帮助菜单里有一个选项叫“打开编辑器本地缓存”,如图所示。通过点击这里,可跳转到缓存的资源目录。
image.png
缓存目录打开后,如图2所示。如果是布局问题,可以直接删除layout目录。如果也不清楚什么问题。所有看到的目录和文件都删干净也没关系。
image.png

问题32: Laya 3D物体显示有锯齿怎么办?
由于3D抗锯齿默认是开启的,但有的开发者发现锯齿感还是很明显,如果是采用了2.2或更高版本的引擎,那就需要检查是否使用了HDR和后期处理。webGL 1.0不支持renderTarget有抗锯齿,使用相机HDR和后期处理管线的BloomEffect泛光效果就会引起抗锯齿无效。解决办法就是不要使用这两块功能,后期处理一般来说,开发者用的不多。HDR是要特别注意的,在Unity里导出资源时,不要勾选HDR相关选项。如果不小心勾了,不想重新导出的。也可以在项目代码里强制HDR效果。示例代码如下:
this.camera = new Laya.Camera(0, 0.1, 100);
this.camera.enableHDR = false; //关闭HDR

问题33: Laya如何可能一个3D物体?
我们经常需要在游戏里面大量复制同一个物体,那么如何clone一个物体呢?Laya提供了接口来clone, Laya.Sprite3D.instantiate(物体)。

问题34: Laya如何给场景开启雾化功能?
Laya开启雾化功能非常简单,只要在Unity里面开启就可以了,如图所示
在Lighting灯光渲染设置中找到 Other Setting
image.png
然后调整雾化的颜色。
设置完之后就可以拉近或者拉远摄像头查看效果了。

问题35: Laya如何配置场景环境光?
在Unity设置的Lighting面板,选择Scene标签页,找到其中的Environment中的Environment Lighting项。
image.png
Source 光源选项目前可以使用Skybox和Color两种。
Ambient Color 环境光的颜色。设置为Color时的环境光颜色。
Ambient Mode 环境模式,只能使用 Realtime实时光照。
设置之后调整颜色。

问题36: Laya BlinnPhong材质有哪些属性?
albedoColor:Vector4漫反射颜色。
albedoIntensity:Number 漫反射强度。
albedoTexture:BaseTexture 漫反射贴图。
enableLighting:Boolean 是否启用光照。
normalTexture:BaseTexture 法线贴图。
renderMode:int [write-only] 设置渲染模式。
shininess:Number 高光强度,范围为0到1。
specularColor:Vector4 高光颜色。
specularTexture:BaseTexture高光贴图。
tilingOffset:Vector4 纹理平铺和偏移。

问题37: Laya Effect材质有哪些属性?
color:Vector4 颜色。
renderMode:int [write-only] 设置渲染模式。
texture:BaseTexture 贴图。
tilingOffset:Vector4 纹理平铺和偏移

问题38: Laya Unlit材质有哪些属性?
albedoColor:Vector4 反照率颜色。
albedoIntensity:Number 反照率强度。
albedoTexture:BaseTexture 反照率贴图。
enableVertexColor:Boolean 是否支持顶点色。
renderMode:int [write-only] 设置渲染模式。
tilingOffset:Vector4 纹理平铺和偏移。

问题39: Laya PBRStandardMaterial材质有哪些属性?
albedoColor:Vector4 漫反射颜色。
albedoTexture:BaseTexture 漫反射贴图。
emissionColor:Vector4 放射颜色。
emissionTexture:BaseTexture 放射贴图。
enableEmission:Boolean 是否激活放射属性。
enableReflection:Boolean 是否开启反射。
metallic:Number 金属度。
metallicGlossTexture:BaseTexture 金属光滑度贴图。
normalTexture:BaseTexture 法线贴图。
normalTextureScale:Number 法线贴图缩放系数。
occlusionTexture:BaseTexture 遮挡贴图。
occlusionTextureStrength:Number 遮挡贴图强度。
parallaxTexture:BaseTexture 视差贴图。
parallaxTextureScale:Number 视差贴图缩放系数。
renderMode:int [write-only] 设置渲染模式。
smoothness:Number光滑度。
smoothnessSource:int 光滑度数据源。
smoothnessTextureScale:Number 光滑度缩放系数。
tilingOffset:Vector4 纹理平铺和偏移。

问题40: Laya PBRSpecularMaterial材质有哪些属性?
albedoColor:Vector4 反射率颜色。
albedoTexture:BaseTexture 漫反射贴图。
emissionColor:Vector4 放射颜色。
enableEmission:Boolean 是否激活放射属性。
enableReflection:Boolean 是否开启反射。
normalTexture:BaseTexture 法线贴图。
normalTextureScale:Number 法线贴图缩放系数。
occlusionTexture:BaseTexture 遮挡贴图。
occlusionTextureStrength:Number 遮挡贴图强度。
parallaxTexture:BaseTexture 视差贴图
parallaxTextureScale:Number 视差贴图缩放系数。
renderMode:int [write-only] 设置渲染模式。
smoothness:Number 光滑度。
smoothnessSource:int 光滑度数据源。
smoothnessTextureScale:Number 光滑度缩放系数。
specularColor:Vector4 高光颜色。
specularTexture:BaseTexture 高光贴图。
tilingOffset:Vector4 纹理平铺和偏移。

问题41: Laya WaterPrimaryMaterial材质有哪些属性?
horizonColor:Vector4 地平线颜色,水面反射颜色。
mainTexture:BaseTexture 主贴图,水面颜色贴图。
normalTexture:BaseTexture 法线贴图,水面波纹的法线贴图。
waveScale:Number 波动缩放系数。
waveSpeed:Vector4 波动速率。

问题42 Laya 粒子材质有哪些属性?
renderMode:int [write-only] 设置渲染模式。
color:Vector4 颜色
tilingOffset:Vector4 获取纹理平铺和偏移。
texture:BaseTexture 漫反射贴图。
depthWrite:Boolean 是否写入深度。
cull:int 剔除方式。
blend:int 混合方式。
blendSrc:int 混合源。
blendDst:int 混合目标。
depthTest:int 深度测试方式。

问题43: Laya 纹理贴图的模式有哪些?
纹理的循环模式(重复或钳制)。LayaAir3D支持WARPMODE_CLAMP 纹理的边缘拉伸和WARPMODE_REPEAT 纹理重复平铺两种模式。在LayaAir3D中默认是使用 Repeat模式。

问题44: Laya如何开启MiniMap?
LayaAir3D是支持纹理的mipmap的。在我们对一个模型的贴图使用了MipMap技术之时,游戏运行中这个模型的贴图会根据摄像机距离模型的远近而调整不同质量的贴图显示。在LayaAir3D中是默认开启了纹理的mipmap的。

问题45: Laya 如何使用GPU的压缩纹理?
在2.0正式版中已经支持纹理这个功能了。Unity导出时,在工具面板勾选平台对应的平台导出即可:
image.png
IOS 与 Android 支持纹理压缩功能,由于安卓和IOS的纹理压缩图片完全不一样,所以资源必须分三份。Conventional 通用平台,只是普通的JPG和PNG。
导出后分了3个不同的文件夹,对应的3个平台可以使用的资源。

问题46: Laya 支持的RenderTexture深度缓存格式有哪些?
在LayaAir3D中支持的深度缓冲格式有:
FORMAT_DEPTH_16
FORMAT_STENCIL_8
FORMAT_DEPTHSTENCIL_16_8

问题47: Laya Stats参数分别表示什么意思?
为了方便开发者进行性能优化,LayaAir3D提供了一个性能统计面板——Stat统计面板,开发者可以实时查看相关的性能参数。
image.png
FPS(WebGL)/FPS(3D):Laya2D 模式或者 Laya3D 模式下的帧频,也就是每秒显示的帧数,值越高、越稳定,感觉越流畅;
Sprite:统计场景上所有状态为Active的精灵(包括容器)数量,它的大小会影响引擎进行节点遍历、数据组织和渲染的效率。
RenderBatches:渲染批次;
SavedRenderBatches: 合并的渲染批次;
CPUMemory: CPU内存;
GPUMemory: GPU显存 ;
Shader: Shader提交次数 ;
TriFaces: 三角面 ;
Frustumculling:摄像机的视锥裁剪次数;
OctreeNodeCulling: 八叉树节点裁剪次数;

问题48: 如何开启Laya Stats面板?
方法1:编辑模式—F9—预览设置—勾选帧率统计面板
方法2: 在项目启动后直接在控制台输入 Laya.Stat.show()

问题49: Laya如何销毁资源并释放内存?
在LayaAir 3D游戏开发中,资源释放非常重要。3D资源包括了模型、贴图、材质、动画等,为了达到好的画面效果,文件会比2D大很多,而3D引擎基本所有资源都会放入GPU中进行计算渲染,因此占用很多的显存。当游戏关卡的不断加载,游戏不断深入,放入显存中的资源越来越多,如果不释放资源,那么游戏最后终将崩溃。显存不像内存,内存有垃圾回收机制,而显存不一样,必须手动释放,因此显存的资源释放必须受到重视!
对单个的资源销毁释放内存,需要调用该资源对象的destroy()方法。

问题50: Laya 2D UI 如何优化DrawCall?
对复杂静态内容设置cacheAs,能大量减少DrawCall,使用好cacheAs是游戏优化的关键。
尽量保证同图集的图片渲染顺序是挨着的,如果不同图集交叉渲染,会增加DrawCall数量。尽量保证同一个面板中的所有资源用一个图集,这样能减少提交批次。

评论

 

关注公众号

可用手机学习

获取最新课程