关于如何在CocosCreator中使用Lua虚拟机并运行Lua脚本

声明:纯技术交流,任何利用该技术违反发布平台规则的行为与该帖子及作者无关。
运行版本:3.8.3。(由于使用时是早期版本,现在本人已转行,后续版本未及时测试和迭代,各位大神请自行发挥,2.4版本也有,仅js文件导出Lua引擎封装的区别,其他基本一致,看各位大佬反馈可以后续更新,比较佛系)

适用情况:由于是基于WebAssembly开发,因此只支持H5平台,目前不支持原生开发,适用于一定情况下在H5平台的代码热更新。

首先介绍一下wasmoon工具:https://github.com/ceifa/wasmoon
是一名老外工程师基于WASM技术制作的可被JS的WebAssembly库加载的lua虚拟机。web端教程可以参考:https://www.youtube.com/watch?v=x2dgallze1U
这位博主已经将基础使用情况说的很清晰。我这边只是以此为基础我将其引入到cocos引擎当中。解决了一些加载和使用上的问题。更多的是框架设计让其适用于游戏开发。

测试展示:



展示内容都在lua代码中。

框架设计的原理为启动时首先初始化lua虚拟机,从远程下载lua脚本并挂入虚拟机内,lua脚本可以是单独文件也可以是压缩包,大致代码如下:

具体框架核心设计是在BaseComponent类中,可以做到拖拽.txt或者.lua文件直接展示路径,该路径作为后续lua中文件require路径依据,可以根据个人或项目情况自行分文件路径加载,略微修改即可。示例请看Title和Title2这两个prefab, 组建如图

以此为基础可以作为预制体基本脚本骨骼,下拉框可以选定node类型,方便识别,未选择可以输入自定义类型。该类集成了Cocos最基础的几个生命周期,onLoad, start, update等,可以支持在Lua层开发,一键拖拽傻瓜式开发。入口scene在helloworld中。


常用的静态方法和工具类可以通过反射注册从TS层直接注册,lua中以同样方式调用即可

关于Wasmoon的安装,我已经从node包中将其提出,单独通过导入方式加载,因为其中的js文件需要一定的修改,具体可以自行npm安装后进行对比。至于某些平台缺失的封装比如URL之类的在胶水文件index.js中需要使用的情况,网上已经有很成熟的解决方式,写好js脚本或者直接作为插件在系统运行前加载即可解决,不多赘述。

已在某平台开发者工具中实测,本来有已经完善的项目示例,其解决了上述所说的问题,不过工程项目不知道放哪里了只找到目前这个初版的,问题不大相信大家很容易能解决相关问题。

源码内容已上架商店审核,完全开源,有需要可以自取。

已上传网盘,商城链接审核还在修正中。
网盘链接:https://pan.baidu.com/s/1C2X3pFnV3rtmXWyS0T7dhg
提取码:bt23

安装注意事项:lua虚拟机的glue.wasm文件放在了根目录的luaengine目录下,请将其部署在自己的服务器上,如果没有用nodejs部署一个本地服务器即可,在代码中LuaEngineMgr.ts中第26行为远程加载逻辑,请根据代码修正为自己服务器以及该文件正确地址。操作点击lua测试按钮即可远程加载该wasm虚拟机并执行相应逻辑。如果没有部署或者网络有问题则会报错。

5赞

挺好的,而且也有热更的小游戏可能性了
虽然知道肯定会有人有这类的需求,毕竟谁也不能100%预判到问题和解决方案,但是我还是想来一句玩笑话
“还是吃太饱了。。。”

1赞

使用lua是想解决什么痛点?

我猜一个痛点,就是微信这类小游戏无法热更代码.
ts无法热更,但是lua可以热更吧.
“还是吃太饱了。。。”

ts 写习惯了以后,绝对不想再写 lua 了。大型项目没有强类型的话太痛苦。

一个很多年前的项目,特地去翻出来:https://gitee.com/jianyumofa/qyscript/

这个大佬主页上的每个项目都非常多年了 :rofl:

一楼已经说了,目的就是解决这个问题

已经上传网盘,可以先下载看下,需要先把glue.wasm文件部署服务器,点击按钮会加载,如果没部署则会加载失败报错无法测试,有其他问题可以论坛反馈,谢谢大家。

我在这位大佬群里,他已经停止更新了,这边我是想到了另一种解决办法 :laughing:

1赞

自己实现个eval函数就能热更了。。

能说说具体思路吗

eval函数如果能用的话也不会有qyscript这个工程了