1. 课前准备
- 编辑器:sublime (其他文本编辑器都可以,这里不做推荐)
- 安装lua(仅为学习语法时使用,测试脚本不用本地安装)
- 安装教程:参考菜鸟教程的方法:https://www.runoob.com/lua/lua-environment.html
直接下一步安装就行了。 - 验证安装是否成功:打开控制台,输入lua,进入到lua交互界面。
输入测试代码:print("hello world")
输出hello word
-> 安装成功!
- 安装教程:参考菜鸟教程的方法:https://www.runoob.com/lua/lua-environment.html
2. lua语法学习
这里只讲我们开发手游脚本用得到的语法,不涉及lua的元表这种实现面向对象的用法。
想要深入学习的话可以参考:
- lua 的 官方文档
- lua教程|菜鸟教程
- lua教程|w3cschool
Lua 是一门动态类型语言。 这意味着变量没有类型;只有值才有类型。 语言中不设类型定义。 所有的值携带自己的类型。 这和python一样,有python基础的同学学起来毫无压力,没学过python的同学也没关系,lua对你来说同样很简单。
变量
lua中的变量默认是全局变量,代码里使用过多的全局变量会导致作用域混乱,容易出现变量值被覆盖的问题,建议编写脚本时尽量使用局部变量,小哥刚接触 lua 的时,一直都是用的python语言,刚写lua时踩过的坑,告诉大家。
如:local a = 1
,声明一个局部变量a, 并赋值为1。
数据类型
lua中有八种基本类型: nil, boolean, number, string, function, userdata, thread, table
其中,userdata和thread我们写脚本用不上,这里不介绍。剩下我们只需要学习6种。
nil
表示一个有意义的值不存在时的状态,一个变量赋值为nil就相当于把这个变量删除,任何未被申明的变量,打印都为nil。
示例:如下图
boolean
boolean 类型只有false 和true 两个值。
nil 和 false 都会导致条件判断与假, 其他的任何值都表示真,这和其他语言的判断不一样,注意一下。
number
number 代表了整数和实数(浮点数)。
string
表示不可变的字节序列,可以理解为表示一串文字就好了。
function
函数类型,函数就是一段代码封装起来,实现一个具体的功能,比如,print
函数可以帮你把输入的内容打印在控制台上,print也是一个变量,只不过这个变量的数据类型是function, 这个变量也叫函数名,函数名加上()代表执行这个函数。所以print('hello world')
代表把"hello word" 这个字符串,打印在控制台上,“hello world” 就是作为参数传递到函数print 里。
函数的定义
function 函数名(参数列表)
语句块
end
示例:定义一个函数,输出传入的参数
function func(a, b)
print(a, b)
end
func(1, 2) -- 1, 2
func(nil, 2) -- nil, 2
func(1, nil) -- 1, nil
func(true, false) -- true, false
table
这里是重点,table作为lua语言中唯一的数据结构,他可以用来表示普通数组,字典,等结构,并且可以混着用,但是小哥强烈不建议混着用,因为迭代(遍历)起来会有坑,不展开,大家记着就行。
cookie: lua中--
代表行注释
-- 数组table, 把他当作普通的数组用就行
-- 申明并初始化 1, 2, 3, 4, 5
local arr = {1, 2, 3, 4, 5}
-- 申明,后续往数组里添加元素
local arr2 = {}
table.insert(arr2, 1)
table.insert(arr2, 2)
table.insert(arr2, 3)
-- 最后得到 {1, 2, 3}, 这里的insert相当于python中的apped。
print(arr2[1]) -- 1
print(arr2[2]) -- 2
print(arr2[3]) -- 3
-- 字典table
-- 基本上和普通的字典没区别
- 申明并初始化
local dic = {sex="男", name="杨小哥"}
- 申明,后续增加元素
local dic2 = {}
dic2.sex = "男" -- 不要奇怪,和dic2["sex"] = "男" 等价
dic2.name = "杨小哥" -- 等价于 dic2[“name"] = "杨小哥"
print(dic2.name) -- 杨小哥
print(dic2.sex) -- 男
这里只介绍创建,迭代表元素下面说讲。
循环控制
lua中的循环控制语句这里只介绍,while 语句和for 语句,足以覆盖脚本的开发需求。
while 语句
和其他语言的用法一致,这里讲下语法。
while 真值表达式 do
语句块
end
for 语句
for 循环语句有2种形式。
第一种
for i=start, stop[,step] do
语句块
end
类似于python 的 for i in range(start, stop[,step])
, [, step]
代表可省参数。
示例:
for i =1, 10, 2 do
print(i)
end
-- 输出
1
3
5
7
9
说明:lua的下标是从1开始的, lua作为一门小众语言,最开始是开发出来给工人们使用的,为了降低工人的学习成本,数组下标就延续了人类的习惯,从1开始。
第二种
for i, v in ipairs({10, 20, 30, 40}) do
print(i, v)
end
-- 输出
1 10
2 20
3 30
4 40
ipairs 函数,用来迭代数组table,数据类型里有提到,table可以存数组和字典结构,但是不建议混着用,这个例子专门迭代数组table。
第三种
for k, v in pairs({name="yang", sex="男"}) do
print(k, v)
end
-- 输出
name yang
sex 男
pairs 函数,用来迭代字典table,用ipairs迭代字典是取不到元素的。但是用pairs迭代数组可以取到元素,但不保证顺序。
写脚本的时候注意这两点就行了,不混用就不会有问题。
模块和包
模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。以下为创建自定义模块 module.lua,文件代码格式如下:
-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
print("这是一个公有函数!\n")
end
local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
return module
由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。
上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用。
require 函数
lua 提供了一个require函数来加载模块,要加载一个模块,只要require(“模块名”) 就行了。
示例:
module_1.lua
require("module_2")
print(a) -- 1
print(b) -- 2
print(arr[1]) -- 1
print(arr[2]) -- 2
print(arr[3]) -- 3
module_2.lua
a = 1
b = 2
arr = {1, 2, 3}
总结
lua语法相关的这么些写脚本就够用了,如果有遇到问题可以借助搜索引擎,也可以加小哥的微信,帮你解答。