ToLua学习笔记,运行bundle中的lua脚本

ToLua框架支持直接读取运行lua脚本文件,也支持读取打包到.unity3d中的lua脚本。另外ToLua还支持字节码方式读取脚本。

打包工具类Packager.cs中对脚本的打包,选择如下打包方式:


注意此部分经过我的修改。然后它会调用下边部分:



上边选择了lua字节码方式,其实区别只是EncodeLuaFile函数会把lua脚本编译成可被luajit执行的格式文件。此函数内容如下:


无论是否选择字节码方式,最终生成的到临时目录Lua中的文件都是.byte结尾的。

ToLua/Lua和Lua目录下的脚本会拷贝到Lua目录下

我的工程目录结构如下:


临时目录下的结构如下:


对lua脚本的打包是把他们所在的文件夹打包,而不是每个lua文件分别打包,所以在遍历Lua目录后,还需要把Lua目录本身加入打包列表,因为它下边也包含脚本.

最终打包到StreamingAssets下的结构如下:


打包完资源后,BuildLuaFile()函数会生成一个luafiles文件,到StreamingAssets/lua中,内容如下:


BuildLuaFile函数的内容如下:


这个文件是用来干啥的呢?我们看一下LuaManager.cs中的代码:


此代码经过了我的修改,它的目的是读取luafiles中列出来的所有包含lua脚本的.unity3d文件,并加入到loader的字典中:

我们来看下LuaLoader.cs中的代码:


此代码经过了我的修改,注意上边转小写的目的是因为之前打包的时候,所有资源文件都被小写化了。

这里读取了所有脚本的bundle包,并组合了名称,保存到字典中,继续看AddSearchBundle函数:

那什么时候会使用到它们呢?我们来看LuaManager.cs中的调用:


继续进入:


此处我也做了修改,增加了bundleName参数,为什么增加这个参数后续会介绍。继续进入ReadFile


我选择了bundle方式,所以会执行下边函数,那上边的beZip是哪里设置的呢?看下边:


继续进入ReadZipFile:


这里是最关键的地方,只要是有luaState.DoFile的调用最终都会执行到这里

这里经过了我的修改,框架原来的代码只有fileName参数,而我们的资源包是以文件夹为单位的,所以想确定fileName(lua脚本名)到底属于哪个资源包是做不到的,

因此才会有原来的那种拼接字符串的无奈写法。

我这里增加了bundleName参数,在直接调用时,可以找到资源包,注意zipMap.TryGetValue这行。

但其实这里还有个问题,有的时候并不是主动调用DoFile才会到这个函数,比如初始化时,后续的子调用到达这里,这个时候bundleName参数是null的,所以我也保留了

原来的那种拼接方式,只是稍作修改,符合我luafiles文件中的文件名格式。这种方式能运行lua目录下和lua/fileName目录下的脚本。


之前还有个地方运行时也会调用这里:


ReadZipFile返回的是byte[],最终输入到下边运行:


这里lua文件名也就是chunkName(块名),最终由底层dll调用,此时运行实例便可看到main.lua的结果

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Unity ,我们可以使用 Lua 作为脚本语言来开发游戏。Lua 是一种轻量级的脚本语言,具有简单、高效、可扩展等特点,被广泛用于游戏开发、Web 开发、嵌入式开发等领域。 在 Unity 使用 Lua 可以带来以下好处: 1. 灵活性:使用 Lua 可以让游戏逻辑与游戏引擎分离,从而提高游戏的灵活性和可维护性。 2. 开发效率:Lua 语言具有简单、易学的特点,可以提高开发效率。 3. 可扩展性:Lua 语言具有可扩展的特点,可以通过编写 C 代码扩展 Lua 的功能,从而满足游戏开发的需求。 Unity 提供了多种方式来使用 Lua,比如使用第三方插件(如 SLuaLuaInterface、ToLua 等),或者使用 Unity 自带的 Lua 解释器(在 Unity 5.3 以后版本提供)。使用这些工具,我们可以将 Lua 脚本与 C# 代码无缝地集成在一起,从而实现游戏逻辑的编写。 以下是一个使用 SLua 插件的示例代码: ``` using UnityEngine; using SLua; public class Example : MonoBehaviour { private LuaSvr luaSvr; void Start() { luaSvr = new LuaSvr(); luaSvr.init(null, () => { luaSvr.luaState.doString("print('Hello, Lua!')"); }); } } ``` 在上面的示例代码,我们使用 SLua 插件来初始化 Lua 解释器,并执行一段简单的 Lua 脚本,输出一条日志信息。当我们运行这个示例时,Unity 将自动执行 Lua 脚本,并在控制台输出一条日志信息。 希望这个示例可以帮助您更好地了解如何在 Unity 使用 Lua 开发游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值