提到热更新,那么首当其冲的就是Lua,这里总结一下Lua常用的知识点,后面对Xlua进行探索再进行补充。此篇是针对热更新而总结的Lua所以会将Lua与C#进行一番对比,日后体验使用ILRuntime来实现热更新,两者会再做一个总结。
开发中使用Rider或者vscode写lua体验会比较好,VS目前还没有插件支持lua语法,使用VS搭建lua环境比较复杂,实用性也比较低,在学习阶段,尽量以快速为准,所以最佳是采用vscode,Rider不是免费的(不过日后开发需要与C#进行交互,可以试试)
vscode安装两个插件即可开始写lua,方便快捷
单行注释
–
多行注释
–[[
多行注释
多行注释
–]]
标示符
全局变量
全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。
在默认情况下,变量总是认为是全局的。
当且仅当一个变量不等于nil时,变量存在
输出再控制台,直接按下Ctrl+F5运行
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
变量的默认值均为 nil。
Lua的赋值
Lua 对多个变量同时赋值,不会进行变量传递,仅做值传递:
应该尽可能的使用局部变量,有两个好处:
Lua的循环与C#,
break语句只退出当前块的循环(如果是嵌套循环都是只退出最内层循环)
continue执行下次循环
return退出全部循环
执行下次循环,break是结束循环(即不执行后面的循环了)
lua中没有Continue语法,使用goto实现continue效果(goto到continue2标签跳过语句print,与continue跳过的效果是一样的,continue跳过本次循环,可以使用goto将需要跳过的语句放在 goto与标签之间)
可以看到continue1被跳过,后续的循环仍在进行,而break则是直接结束循环(当前层)
退出所有循环
Lua 编程语言中 repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。
直到条件判断语句(condition)为 true 才会停止
在C#中,没有repeat语句,使用的是 do while循环,此循环是在结束后判断,但是内容为True才会继续进行循环,如果为false则结束循环
同样的逻辑,只运行一次,即, do while至少运行一次,因为在每次循环结束后才进行判断
所以与lua判断反向即可(两者对循环结束一个是true,一个是false)
总结:lua的while循环是true的时候运行,C#同,
C# do while也是为true才执行,lua的repeat则是false才继续执行(两者都是判断true,不过一个是true执行,一个是true结束)
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。
要注意的是Lua中 0 为 true:
与C#进行对比,C#只有true和false两个判断,只对bool类型进行使用
Lua 中函数使用function,我们还可以将函数作为参数传递给函数,如下
第8行调用打印函数传进去一个10,被打印。
第9行函数三个参数,最后一个参数是函数,对前面传进来的3+2进行处理,因为传进来的是打印函数,所以打印出5。
C#函数返回多个值:
C#中有两种方法可以在函数中返回多个值,关键字是out
具体请看这篇
https://www.cnblogs.com/roucheng/p/3562327.html
Lua可变参数
Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 … 表示函数有可变的参数。
#可以获取表的数据个数,将可变参数传入 table,然后用#获取可变参数的个数
select("#",…) 直接获取可变参数的数量。(select(’#’, …) 返回可变参数的长度)
select(n, …) 用于返回 n 到 select(’#’,…) 的参数:
调用select时,必须传入一个固定实参selector(选择开关)和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参,否则只能为字符串"#",这样select会返回变长参数的总数。
C#可变参数
使用 params object(T)【】
(参数数组与数组参数的区别,一个传递数量不定的参数,一个传递数组,此处为参数数组)
总结:
lua将可变参数(…)传入table中然后进行处理,C#直接对可变参数的数组进行处理,lua还可以select关键字对可变参数进行 遍历等操作(建议还是使用table方法,目前select没发现优势)
在C#中用!= 判断不等关系,而Lua用~=
and or not 【相当于C#中 &&(与) ||(或) !(非)】
重点展示一下非的用法,
运算符连接:
lua不支持+重载直接 进行字符串拼接,试用…进行字符串拼接
C#直接使用+ 即可进行字符串连接
pairs 和 ipairs区别
同:都是能遍历集合(表、数组)
异:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
ipair不会遍历序列0,,且遇到nil会进行跳过
pairs 遍历序列0,且遇到nil不会跳过,但0是放在后面的(尽量不要再lua的表中使用序号0)
C#使用 foreach进行遍历
数组和表是Lua最重要的数据结构之n
数组序号从1开始,表类似于C#的字典,指定值的同时即是对表的数值的添加。移除即令表为nil
表和数组的界限在Lua里并不是那么明显,数组也可以当成表来使用,可以看到我们把数组当成表,如图,
在里面添加字符为key,字符为value的内容,一样可以进行遍历,
同时也说明,数组可以看成是key为数字,值为string(或者别的内容)的表(数组是特殊的表)。
此外,数值for循环 遍历带有字符串aa的数组,会产生nil
表增加内容使用 = 即可,删除直接令为nil,查找使用【】和if进行判断,修改直接赋值即可
可以发现,即使表不存在序号,也不存在内容,也可以用if进行判断
相比较而言,C#的数组下标从0开始,列表的内核其实还是数组(一个被维护的数组),不允许数组序号为非数字
而字典也是key 和value的形式
可以看到从0开始为a,如果不存在索引,即报错
字典同样
C#中只要是集合都可以遍历
(有这些对付热更新应该是够了,后续有需要会再补充)