Lua基础汇总向导

本文是关于Lua编程的详细指南,涵盖了Lua的起源、热更新原理及其在游戏开发中的应用,以及Lua的关键特性,如弱类型、标识符、变量、运算符、表、函数和元表等。通过学习,你可以理解如何利用Lua实现游戏的热更新,以及掌握Lua的基础语法和数据结构。
摘要由CSDN通过智能技术生成

一、Lua语言
1.巴西大学研究项目,1993开发完成,Lua是由C编写而成
2.lua方便与其他语言集成,无需编译,利于集成与扩展

二、热更新原理
1.什么是热更新
没有热更新, 用户体验游戏的流程
做游戏 -> 打包 -> 用户下载 -> 用户安装 -> 游玩
做游戏 -> 用户下载 -> 游玩
由于C#属于编译型语言,无法热更新。传统需要重新下载整个安装包,游戏体验差
2.如何利用lua实现热更新
在客户端嵌入lua虚拟机。由于lua代码无需编译,
只需要虚拟机解释执行,所以只要有lua虚拟机的硬件就可以运行lua代码
3.热更新技术
lua
C# light
C# 反射(苹果不支持)
4.lua解析技术(Unity)
ulua (个人维护)
tolua (ulua基础上改变 个人维护 技术成熟)
xlua (腾讯维护 最新技术 不成熟)

学习/改变能力

三、标识符与关键字
1.不能数字开头
在lua中尽量避免使用“下划线+大写字母”,可能与lua内置标识符冲突
_Age
2.lua中的关键字
在Sublime lua关键字颜色有特殊表是
if break do else elseif end

四、变量
1.lua是弱类型语言 ,无需声明变量类型
2.lua语句不需要用 ; 结尾,当时使用 ; 也不会出错
3.print()是lua内置函数(方法)
4.lua中字符串的定义,可以用双引号也可以用单引号
5.C#在使用变量前必须定义,Lua变量可以无需定义直接使用 nil
6.nil是一个lua中的类型,销毁变量
i = 10
i = nil
7.lua变量类型可以随时更改

五、注释
单行注释 – 注释内容
多行注释 – --[[ 注释内容 ]]–

六、字符串
1.在lua字符串的拼接用连接运算符 … 两个点
print(“你好世界”)
name = “小鲤鱼”
age = 18
print(name … “的年龄是” … age)

2.字符串的运算
	普通字符串不能使用任何 加减乘除等运算符连接
	注意:只有当字符串表示的内容是数字的时候才可以参与运算
	字符串表示数字时也可以与数字参与运算
		print("20" + "60")
		print("20" + 20)
		print("20.01" * 20)

七、lua中的数据类型
lua中虽然不需要定义数据类型,但是lua中存在数据类型的概念
1.在lua中可以使用内置函数 type() 来检测lua中某个数据的数据类型
print(type(“Alpha”))
print(type(nil))
print(type(Alpha))
lua中的数据类型
1.nil 表示一个无效值,不占用内存 null
2.string 表一个字符串
3.boolean 只有两个值 true false
所有数据变量都是 true 只有 nil 代表 false
4.number 所有的数字都是number
5.function 函数类型
6.table 表类型,lua中唯一的数据结构
7.userdata用户数据类型
8.thread 表示协程
print(type(“Alpha”)) --string
print(type(nil)) --nil
print(type(Alpha)) --nil
print(type(true)) --boolean
print(type(20)) --number
print(type(20.05789)) --number
print(type(type)) --function
print(type(type(nil))) --string

八、lua中的运算符
1.算术运算符
+ - * / 加减乘除
lua中的除法 不区分整数类型和浮点类型的除法
% 取余
lua中不存在 += -= ++ – 自加 自减等 运算
^ 指数运算符
2.关系运算符
== 等于
> 大于
…等
~= 不等于
3.逻辑运算符
and(&&) 逻辑与 若前者为false,则返回前者,否则返回后者
print( true and 500 ) – 500
print( true and nil ) – nil
or (||) 逻辑或 若前者为true,则返回前者,否则返回后者
print( false or “小鲤鱼” ) – “小鲤鱼”
not(!) 逻辑非 true变false,false变true
lua中不存在三目运算符
a ? b : c 特点 有返回值 运算结果是一个值
如果 a 为真 运算结果返回 b 的值 否则 返回 c 的值
a and b or c (保证b不为false)
b 如果不是false 那么不满足三目运算符
4.其他运算符
# 计算集合长度运算符
… 字符串连接运算符

九、多重赋值
可以同时给多个变量赋值
lua总是将赋值运算符右边值的个数调整到与左边一致的情况
a,b = 10,20
c,d = 100,200,300
e,f,g = 900,800
print(e,f,g)
斐波那契
a, b = b , a+b
print(a,b)
a, b = b , a+b
print(a,b)
a, b = b , a+b
print(a,b)
a, b = b , a+b
print(a,b)
a, b = b , a+b
print(a,b)
a, b = b , a+b
print(a,b)
a, b = b , a+b
print(a,b)

十、Lua中变量的作用域
在lua中定义的变量全部属于全局变量
需要定义局部变量要用loacl关键字

十一、流程控制语句
单分支的条件语句
if 条件 then

end
if nil then
print(“小鲤鱼”)
end
双分支
if 条件 then

else

end
if 0 then
print(“小鲤鱼”)
else
print(“Alpha”)
end
多分支
if 条件 then

elseif 条件 then

else

end

a = false
b = false
if a then
	print("a为真")
elseif b then
	print("a为假 b为真")
else
	print("a b都为假")
end 
1.if必须要配合then
2.elseif必须连着写 并且需要配合then使用
3.if后的条件可以加括号也可以不加括号
4.必须要以end结尾

十二、循环语句
死循环不会造成计算机卡死,会造成进程卡死

1.while 
while 循环条件 do
	<循环体>
end
while true do
	print("小鲤鱼")
end

2.repeat (do .. while)
repeat
	<循环体>
until (条件)
条件为true时退出循环
无论条件是否成立至少会执行一次循环体

3.for
for 循环变量 = 初始值 , 结束值 ,(步长) do
	<循环体>
end
	1.初始值、结束值、步长都可以是小数
	2.初始值、结束值、步长都可以用变量代替
	3.循环次数的公式 (结束值 - 初始值)/步长
for i = 0 , 9 do
	print(i)
end

for i = 0 , -9 , -2 do
	print(i)
end

lua中的泛型for循环
for 循环列表 in 迭代函数 do
	<循环体>
end
4.ipairs 与 pairs
迭代函数 
参数是集合

ipairs 顺序遍历集合(序号不能断开),遇到nil就停止遍历
ipairs:函数有三个返回值
	1.第一个返回值是一个迭代函数
	2.第二个返回值是传入的集合
	3.第三个返回值是当前集合遍历到的位置
table = {1,2,3,4,5}
for v in ipairs(table) do
	print(v)
end
pairs  
1.一定会遍历完整个集合
2.遇到nil的元素不会输出

十三、表(table)
表是一种数据类型
(1)表的声明
tb = {} --声明了一个空表
print(type(tb))
(2)lua表中可以放任意类型的数据
tb = {1,2,3,4,5,“Alpha”,true,{}}
(3)lua表的大小不固定可以随意扩展
tb = {100,200,300,400,500,600}
print(tb[6])
tb[7] = 999
print(tb[7])
(4)表的销毁 tb = nil
(5)表的长度用# (表中不能存在空元素(nil))
print(#tb)
(6)如果直接用print函数打印表名 会输出 table 内存地址
print(tb)
(7)表的赋值会将旧表的地址赋给新表
tb = {1,2,4,{nil},“a”,4,7}
print(tb)
ta = {}
print(ta)
ta = tb
print(ta)
print(tb)
(8)数组风格表可以和字典风格表随意混合
tb = {
name = “Alpha”,
5 , “Alpha”,
Age = 18,
999, false,
Sex = false,
}
for k,v in pairs(tb) do
print(k,v)
end
print(tb[“name”])
1.数组风格的表结构
(1)数组风格表的声明 tb = {1,2,3,4,5,6}
(2)访问数组表中的元素 tb[2] --表名[元素下标(从1开始)]
修改表中某个元素 tb[1] = 500
(3)lua中数组下标可以是任意数字,如果该下标的元素不存在则为nil
lua中不存在数组越界的错误
print(tb[1.1])

		tb[5.1] = 999
		print(tb[5.1])
	(4)数组下标可以不连续 
		tb = {100,200,nil,"Alpha",false,{}}
		print(tb[3]) 

		tb = {100,200,300,400,500,600}
		print(tb[6])
		tb[100] = 999
		print(tb[100])
	(5)将数组中的某个元素移除 只需要将对应元素赋值为nil
		tb[4] = nil
	(6)遍历数组风格的表 
		数组风格表结构的遍历 可以使用pairs也可以使用ipairs
		用ipairs时数组中不能有nil元素
		for i,v in ipairs(tb) do -- i 是下标 v是元素
			print(i,v)
		end
2.字典风格的表结构
	(1)声明方法 表名 = { 键 = 值 , 键 = 值}
		tb = {
			name = "Alpha",
			Age = 18,
			Sex = false,
		}
	(2)访问字典中的某个元素 表名["键"]
		print(tb["name"])
		或者 表名.键
	(3)可以用任意类型做键 除了nil	
		如果不用字符串做键
		那么只能通过如下方法定义和访问一个键值对
		tb[false] = true
		print(tb[false])
	(4)添加键值对
		tb.aa = 111
		print(tb.aa)
		print(tb["aa"])

		tb["bb"] = 333
		print(tb.bb) 
		print(tb["bb"])

	(5)遍历字典风格的表结构 字典风格的表结构必须用pairs
	for k,v in pairs(tb) do -- k是键 v是值
		print(k,v)
	end

十四、Lua中的函数
1.函数的定义
(1)
function 函数名(形参1,形参2)
函数体
end
(2)
函数名 = function (形参1,形参2)
函数体
end
2.函数的调用
函数名(实参1,实参2)
3.函数的返回值
在函数体中使用 return 返回值 来返回函数体中的变量

Lua函数的基本性质
	A:无需定义返回类型,可以返回任意数量和类型的数据
	B:函数的参数,无需定义类型
	C:函数无需大括号
	D:可以把函数赋值给变量

4.函数中的全局与局部变量
	A:在函数中定义的变量默认都为全局变量
		function Add(a,b)
			--C# 中c 是一个局部变量
			c = a + b
		end
		Add(10,90)
		print(c)
	B:想要在函数中定义局部变量需要使用local关键字(形参的作用域在函数内部)
		function Add(a,b)
			--C# 中c 是一个局部变量
			local c = a +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值