游戏人生
首页
(current)
GameDevTools
登陆
|
注册
个人中心
注销
Lua 教程
Lua 教程
Lua 编辑器安装
Lua 变量
Lua 数据类型
Lua 循环
Lua 流程控制
Lua 函数
Lua 运算符
Lua 字符串
Lua 数组
Lua 迭代器
Lua table(表)
Lua 模块(module)
Lua 文法 BNF范式
Lua 实例
<< Lua table(表)
Lua 文法 BNF范式 >>
Lua 模块(module)
在前面的lua教程中,都只是介绍lua的语法知识,从来没有介绍过一个lua游戏项目怎么去操作。 一个游戏项目,lua代码行数都是以十万计,这几十万行代码,我们都是分拆成几百个代码文件,每个同时负责各自部分的代码文件。 这一个一个的代码文件,lua称之为模块(module) 下面以实例来介绍,在lua项目中使用module。 ------------ ####使用模块 一般项目中,会将一些辅助性的函数,存放在单个代码文件中,以Helper.lua 或 Tools.lua 命名,我这里也新建 Helper.lua ,里面有一个求和的函数,代码如下: `Helper.lua` ```lua ---Helper.lua ---辅助性 功能函数集合 Helper={} function Helper.Add(varA,varB) return varA+varB end return Helper ``` `main.lua` ```lua ---main.lua ---使用require 引入其他代码文件,注意 require 后面是文件名。 require "Helper" print(Helper.Add(1,2)) ``` 输出结果: 3 ------------ ####require原理 上面的例子,在 `main.lua` 中,引用了 `Helper.lua` 这个代码文件,并且调用了 `Helper.Add` 这个函数。 引用其他的代码文件,是通过调用 `require` 来实现的。 `require` 一个代码文件,其实是运行了这个代码文件。 上面例子中,`require "Helper"` 能成功,是因为 Helper.lua 文件,和 main.lua 在同一个目录,那如果在不同的目录要怎么办呢? ####require 目录设置 将上面的 Helper.lua 代码文件,移入到 Helper 目录中。  再次运行,报错: main.lua:1: module 'Helper' not found: no field package.preload['Helper'] no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\lua\Helper.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\lua\Helper\init.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\Helper.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\Helper\init.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\..\share\lua\5.3\Helper.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\..\share\lua\5.3\Helper\init.lua' no file '.\Helper.lua' no file '.\Helper\init.lua' no file './Helper.lua' no file './Helper/init.lua' no file './lua/Helper.lua' no file './lua/Helper/init.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/Helper/Helper.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/Helper.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/Helper/Helper/init.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/Helper/init.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/Helper.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/Helper/Helper.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/Helper/init.lua' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\Helper.dll' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\..\lib\lua\5.3\Helper.dll' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\loadall.dll' no file '.\Helper.dll' no file 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin/clibs53/Helper.dll' stack traceback: [C]: in function 'require' ...ua\ZeroBraneStudioEduPack-1.80-win32\myprograms\main.lua:1: in main chunk [C]: in ? 提示Helper 没有找到,在错误信息中,列出了很多文件夹,这些文件夹其实就是 require 默认去这些目录里查找引用的代码文件。 如果是自定义的目录,我们需要将自定义目录,添加到 require 的搜索目标中。 require的搜索范围其实是一个字符串,存储在 package.path 中。 下面代码输出了 require 搜索范围: print(package.path) 输出结果: "D:\lua\ZeroBraneStudioEduPack-1.80-win32\myprograms\main.lua"'. Program 'lua53.exe' started in 'D:\lua\ZeroBraneStudioEduPack-1.80-win32\myprograms' (pid: 3936). ;D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\lua\?.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\lua\?\init.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\?.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\?\init.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\..\share\lua\5.3\?.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\bin\..\share\lua\5.3\?\init.lua;.\?.lua;.\?\init.lua;./?.lua;./?/init.lua;./lua/?.lua;./lua/?/init.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/?/?.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/?.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/?/?/init.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/?/init.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/?.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/?/?.lua;D:\lua\ZeroBraneStudioEduPack-1.80-win32\lualibs/?/init.lua 那么只要将自定义的文件夹路径,添加到 `package.path` 里即可。 修改 `main.lua`: ```lua package.path=package.path .. ";" .. "D:/lua/ZeroBraneStudioEduPack-1.80-win32/myprograms/Helper/?.lua" require "Helper" print(Helper.Add(1,2)) ``` 再次运行,输出结果: 3
<< Lua table(表)
Lua 文法 BNF范式 >>
提交
5e4fa1132de88f4e9f9a4600