LayaBox开发过程中遇到的一些小问题以及解决思路

引擎版本:Laya2.0
示例脚本:TypeScript

常用的功能和常见问题,一般官方文档或网上可以直接搜到,但仍有一些问题,官方文档里是没提到的,然后网上搜到同样问题的帖子,却没人回答。作为一个开源免费的引擎,不是每个问题,官方都能准时解答的,甚至你发个帖子,很长一段时间都没有一个答案,这时只能自己慢慢摸索一下了。这里我就把自己遇到的一些小问题及解决思路记录下来,希望对那些遇到同样问题的人有帮助。这些问题并不大,却有点烦人,你明知道实现某个功能可能就是一行代码的事,却没有关于如何使用的说明,这让人很苦恼。

Laya的TextInput组件显示密码与隐藏密码

密码输入框一般都是用TextInput这个组件吧,然后在编辑器的右侧将该组件的type设置为password就可以将输入的密码变成号了,但有时可能还需要这样一个功能:有个勾选框,选中的时候就显示密码,取消选中时密码就变成号,很自然就想到通过代码来改变组件的type就行了textinput.type = "text"textinput.type = "password",很可惜,改完后测试发现那个文本框中的密码并没有立即显示和隐藏。然后我发现改完type后需要点击选中文本框才能刷新显示,网上根本搜不到解决方案,官方文档也没有说明,不过我还是摸索到了解决办法:改变type后手动触发一下TextInput的输入状态和取消输入状态,也就是textinput.focus = truetextinput.focus = false就行了。
LayaBox开发过程中遇到的一些小问题以及解决思路_第1张图片
LayaBox开发过程中遇到的一些小问题以及解决思路_第2张图片
LayaBox开发过程中遇到的一些小问题以及解决思路_第3张图片
LayaBox开发过程中遇到的一些小问题以及解决思路_第4张图片

Laya的TextInput限制文本的输入类型

一般的,TextInput的type设为text时可以输入任意类型的文本,设为number时只能输入数字。官方文档的介绍中也提到了一下字符限制。但是,如果我要只能输入字母、数字和特定符号,不能输入中文,这怎么办?文档里的只演示了限制一种类型,限制多类型的格式就不知道了,网上也搜不到介绍…这又让我好找,其实也很简单,选中TextInput,在右侧的属性列表中找到这个设置一下就行了:
在这里插入图片描述
这里限制了只能输入数字、小写字母、和三个符号。要限制中文,也一样的,看下官方文档中限制中文的格式,加上去就行了。这里的格式和Javascript的正则表达式相似,但又有不同…有点坑

Laya的TextInput隐藏右侧的bar(滑动条)

如果将TextInput的type设置为number,右侧就会出现一个这样的bar:
LayaBox开发过程中遇到的一些小问题以及解决思路_第5张图片
然后我看了官方文档和API介绍,好像并没有接口用来隐藏这个东西的。这就很尴尬了
解决办法也很简单,把type设置为text(这个类型并不会出现这个奇葩东西),然后用上面的方法限制一下文本的输入类型就行了。目前我只发现了这个方法,其他的我不清楚。

Laya中的碰撞检测

用过CocosCreator的应该都知道,物体加上Collider后,给物体绑定一个脚本,在脚本中写个特定回调,碰撞后需要执行什么逻辑直接写在这个回调中就可以了,根本不用你在写什么碰撞判断什么blabla的,很方便。如果你不知道,到cocos的官方文档中查一下就可以看到详细例子了。然而…当我想在Laya中这样使用的时候,我找来找去,发现并没有例子介绍。尴尬…着实让我好找,其实用起来也很简单:
第一种方法和CocosCreator中的用法差不多,给对象添加碰撞组件
LayaBox开发过程中遇到的一些小问题以及解决思路_第6张图片
可以在右侧的属性面板中找到Collider的label属性,给它起个标签名,用于区分哪个碰撞体发生了碰撞。最关键的地方就是写个脚本绑定到对象中,也就是那个ColliderTest脚本组件了,脚本内容如下:
LayaBox开发过程中遇到的一些小问题以及解决思路_第7张图片
那个other参数就是另一个碰撞体对象了,在调试面板可以看到它的详细信息:
LayaBox开发过程中遇到的一些小问题以及解决思路_第8张图片
关于这几个碰撞回调,官方的LayaAir脚本参数说明中的碰撞事件那里有提到,但是没有使用示例。

还有第二种方法,这个方法不用绑定脚本,但是也需要给对象添加碰撞组件,然后在场景的脚本文件中,给碰撞对象监听一个碰撞事件,像这样:
LayaBox开发过程中遇到的一些小问题以及解决思路_第9张图片
这两种方法使用起来都很简单,但官方并没有给出示例,网上也比较难搜到。

Laya场景UI文件复用

Laya新建场景文件时那四种模式我就不说了,不清楚的网上搜下。这里我遇到一种情况就是,游戏中可能有几个页面,它们界面的UI类型和布局都一样,就是UI上面的内容不一样。本来这只需要建一个UI文件就行了的,然后用两个脚本去控制该场景去显示不同内容。但是,一般我们新建场景时都是用分离模式,然后新建一个脚本继承该场景的UI类,再把这个脚本绑定到场景的runtime属性中,像这样:
在这里插入图片描述
然后就可以在这个脚本中控制界面UI内容的显示了,再通过Laya.Scene.open("test.scene")来打开该场景。但是,我查找了下,好像并没有接口可以在打开场景后设置这个runtime属性的,所以一个场景只能用一个脚本 。
不过还是让我找到了方法,新建场景时用内嵌模式,该模式和分离模式不同的地方在于:内嵌模式同样会有一个UI类,但场景中的对象是直接在UI类中的一个变量来描述的:
LayaBox开发过程中遇到的一些小问题以及解决思路_第10张图片
但是在分离模式中,场景中的对象是在那个.scene文件中描述的,所以需要加载那个场景文件才能打开场景,而内嵌模式打开场景时并不需要加载什么场景文件。
分离模式需要新建一个脚本继承UI类,然后绑定到场景的runtime中,内嵌模式同样需要继承UI类,但是不需要绑定到场景的runtime中,打开场景时只需要实例化该脚本,然后sceneInstance.open()就可以了。代码大致是这样:
LayaBox开发过程中遇到的一些小问题以及解决思路_第11张图片
在这里插入图片描述
这样就可以达到场景UI复用的效果。我们可以新建任意脚本继承该UI类,然后,在脚本中更新界面的显示内容,最后实例化打开场景就行了。

Laya从对象的脚本文件中获取它的兄弟节点

有时可能可能会遇到这样一种情况,某个对象绑定了一个脚本,然后在该脚本中写该对象的逻辑,但是该对象需要与场景中的其他节点互动,如果是该对象的子节点,那直接获取到脚本所在的节点,然后通过getChildByName()就可以了,如果不是它的子节点,而是它的兄弟节点呢?这下就无法用getChildByName()。解决办法很简单,只需获取到节点所在的场景,通过场景的getChildByName()就行了,像这样:
在这里插入图片描述

Laya场景对象鼠标事件监听问题

可能会遇到这样一种情况:场景中有个对象需要监听鼠标的MOUSE_DOWN、MOUSE_UP等事件,如果你点击了该对象,肯定可以监听到MOUSE_DOWN事件,然后按住不放,从对象身上移开,此时松开鼠标,是监听不到MOUSE_UP事件的(即使你用该对象监听了该鼠标事件)。如果我只要点击了该对象,在任何地方松开鼠标都执行MOUSE_UP的事件,该怎么办呢?很简单,只需要用舞台Laya.stage监听一下同一个事件即可。因为舞台可以监听到所有鼠标事件,不管你点击哪个对象。你可能会怀疑,这样做会不会随便点击舞台都执行那个事件逻辑了?不会的,只要加个判断,如果在该对象上按下鼠标,再从任意位置松开鼠标,就执行对应事件逻辑就行了。这个问题的解决办法可以看引擎的ScrollBar源码的滑动事件监听部分,差不多就是这样用的。点击滑块,然后按住不放,从滑块上移开,任然可以滑动滑块,因为此时任然可以执行MOUSE_MOVE事件(此时的这个事件是有舞台监听的,并不是滑块这个对象)。自己动手试一下就清楚了

好了,以上提到的一些小问题都是我在使用过程中亲身经历,然后官方文档中没有介绍或网上也比较难搜到的。如果还有不清楚的地方,欢迎讨论

你可能感兴趣的:(小游戏开发)