热更新预备-Lua核心知识总结

文章目录

    • 环境搭建
    • HelloWorld
    • Lua数据类型
    • Lua变量
    • Lua循环
      • **Break:退出循环(当前层)**
      • **Continue:执行下次循环**
      • **return:退出所有循环**
      • Lua repeat...until 循环
    • Lua流程控制
    • Lua函数
    • lua运算符
    • lua迭代
    • Lua数组和表
      • **数组和表的使用**
      • **表的方法**
      • **表的增删改查**

提到热更新,那么首当其冲的就是Lua,这里总结一下Lua常用的知识点,后面对Xlua进行探索再进行补充。此篇是针对热更新而总结的Lua所以会将Lua与C#进行一番对比,日后体验使用ILRuntime来实现热更新,两者会再做一个总结。

环境搭建

开发中使用Rider或者vscode写lua体验会比较好,VS目前还没有插件支持lua语法,使用VS搭建lua环境比较复杂,实用性也比较低,在学习阶段,尽量以快速为准,所以最佳是采用vscode,Rider不是免费的(不过日后开发需要与C#进行交互,可以试试)
vscode安装两个插件即可开始写lua,方便快捷
热更新预备-Lua核心知识总结_第1张图片
热更新预备-Lua核心知识总结_第2张图片

HelloWorld

单行注释

多行注释
–[[
多行注释
多行注释
–]]

标示符

全局变量
全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。
在默认情况下,变量总是认为是全局的。
当且仅当一个变量不等于nil时,变量存在
热更新预备-Lua核心知识总结_第3张图片
输出再控制台,直接按下Ctrl+F5运行
热更新预备-Lua核心知识总结_第4张图片

Lua数据类型

Lua的书写不需要声明数据类型,直接进行赋值即可
热更新预备-Lua核心知识总结_第5张图片

Lua变量

Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
变量的默认值均为 nil。

Lua的赋值
Lua 对多个变量同时赋值,不会进行变量传递,仅做值传递:

应该尽可能的使用局部变量,有两个好处:

  1. 避免命名冲突。
  2. 访问局部变量的速度比全局变量更快。

索引 table
热更新预备-Lua核心知识总结_第6张图片

Lua循环

Lua的循环与C#,
break语句只退出当前块的循环(如果是嵌套循环都是只退出最内层循环)
continue执行下次循环
return退出全部循环

Break:退出循环(当前层)

Lua
热更新预备-Lua核心知识总结_第7张图片
C#
热更新预备-Lua核心知识总结_第8张图片

Continue:执行下次循环

执行下次循环,break是结束循环(即不执行后面的循环了)
lua中没有Continue语法,使用goto实现continue效果(goto到continue2标签跳过语句print,与continue跳过的效果是一样的,continue跳过本次循环,可以使用goto将需要跳过的语句放在 goto与标签之间)

lua
热更新预备-Lua核心知识总结_第9张图片
C#

热更新预备-Lua核心知识总结_第10张图片
可以看到continue1被跳过,后续的循环仍在进行,而break则是直接结束循环(当前层)

return:退出所有循环

退出所有循环

Lua
热更新预备-Lua核心知识总结_第11张图片
C#
热更新预备-Lua核心知识总结_第12张图片

Lua repeat…until 循环

Lua 编程语言中 repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。
直到条件判断语句(condition)为 true 才会停止
热更新预备-Lua核心知识总结_第13张图片
在C#中,没有repeat语句,使用的是 do while循环,此循环是在结束后判断,但是内容为True才会继续进行循环,如果为false则结束循环
热更新预备-Lua核心知识总结_第14张图片
同样的逻辑,只运行一次,即, do while至少运行一次,因为在每次循环结束后才进行判断
所以与lua判断反向即可(两者对循环结束一个是true,一个是false)
热更新预备-Lua核心知识总结_第15张图片
总结:lua的while循环是true的时候运行,C#同,
C# do while也是为true才执行,lua的repeat则是false才继续执行(两者都是判断true,不过一个是true执行,一个是true结束)

Lua流程控制

控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。
要注意的是Lua中 0 为 true:

热更新预备-Lua核心知识总结_第16张图片
与C#进行对比,C#只有true和false两个判断,只对bool类型进行使用
热更新预备-Lua核心知识总结_第17张图片

Lua函数

Lua 中函数使用function,我们还可以将函数作为参数传递给函数,如下
热更新预备-Lua核心知识总结_第18张图片
第8行调用打印函数传进去一个10,被打印。
第9行函数三个参数,最后一个参数是函数,对前面传进来的3+2进行处理,因为传进来的是打印函数,所以打印出5。

Lua可以返回多个值,只要在return 后面列出就行
热更新预备-Lua核心知识总结_第19张图片

C#函数返回多个值
C#中有两种方法可以在函数中返回多个值,关键字是out
具体请看这篇
https://www.cnblogs.com/roucheng/p/3562327.html

Lua可变参数
Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 … 表示函数有可变的参数。
热更新预备-Lua核心知识总结_第20张图片
#可以获取表的数据个数,将可变参数传入 table,然后用#获取可变参数的个数
热更新预备-Lua核心知识总结_第21张图片
select("#",…) 直接获取可变参数的数量。(select(’#’, …) 返回可变参数的长度)

select(n, …) 用于返回 n 到 select(’#’,…) 的参数:
调用select时,必须传入一个固定实参selector(选择开关)和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参,否则只能为字符串"#",这样select会返回变长参数的总数。
热更新预备-Lua核心知识总结_第22张图片

C#可变参数
使用 params object(T)【】
(参数数组与数组参数的区别,一个传递数量不定的参数,一个传递数组,此处为参数数组)
热更新预备-Lua核心知识总结_第23张图片
总结:
lua将可变参数(…)传入table中然后进行处理,C#直接对可变参数的数组进行处理,lua还可以select关键字对可变参数进行 遍历等操作(建议还是使用table方法,目前select没发现优势)

lua运算符

在C#中用!= 判断不等关系,而Lua用~=
热更新预备-Lua核心知识总结_第24张图片
and or not 【相当于C#中 &&(与) ||(或) !(非)】
重点展示一下非的用法,
热更新预备-Lua核心知识总结_第25张图片
运算符连接:
lua不支持+重载直接 进行字符串拼接,试用…进行字符串拼接
热更新预备-Lua核心知识总结_第26张图片
热更新预备-Lua核心知识总结_第27张图片
C#直接使用+ 即可进行字符串连接
热更新预备-Lua核心知识总结_第28张图片

lua迭代

pairs 和 ipairs区别
同:都是能遍历集合(表、数组)
异:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
ipair不会遍历序列0,,且遇到nil会进行跳过
热更新预备-Lua核心知识总结_第29张图片
pairs 遍历序列0,且遇到nil不会跳过,但0是放在后面的(尽量不要再lua的表中使用序号0
热更新预备-Lua核心知识总结_第30张图片

C#使用 foreach进行遍历

Lua数组和表

数组和表的使用

数组和表是Lua最重要的数据结构之n
数组序号从1开始,表类似于C#的字典,指定值的同时即是对表的数值的添加。移除即令表为nil
热更新预备-Lua核心知识总结_第31张图片
表和数组的界限在Lua里并不是那么明显,数组也可以当成表来使用,可以看到我们把数组当成表,如图,
在里面添加字符为key,字符为value的内容,一样可以进行遍历,
同时也说明,数组可以看成是key为数字,值为string(或者别的内容)的表(数组是特殊的表)。
此外,数值for循环 遍历带有字符串aa的数组,会产生nil
热更新预备-Lua核心知识总结_第32张图片

表的方法

可以看到具体的方法,其中maxn已经删除
热更新预备-Lua核心知识总结_第33张图片

表的增删改查

表增加内容使用 = 即可,删除直接令为nil,查找使用【】和if进行判断,修改直接赋值即可
可以发现,即使表不存在序号,也不存在内容,也可以用if进行判断

热更新预备-Lua核心知识总结_第34张图片
相比较而言,C#的数组下标从0开始,列表的内核其实还是数组(一个被维护的数组),不允许数组序号为非数字
而字典也是key 和value的形式
可以看到从0开始为a,如果不存在索引,即报错
字典同样
热更新预备-Lua核心知识总结_第35张图片
热更新预备-Lua核心知识总结_第36张图片
C#中只要是集合都可以遍历
(有这些对付热更新应该是够了,后续有需要会再补充)

你可能感兴趣的:(编程之美,unityDemo,lua,Unity,热更新)