--  [[]] print

下载Lua For Windows   Sublime Text(仅用于演示,实际项目使用VsCode)       Ctrl+B运行

语法基础

lua 热更资源打包ab_元表

lua 热更资源打包ab_lua_02

lua 热更资源打包ab_元表_03

lua 热更资源打包ab_lua_04

基础类型:nil number string boolean

运算符:and-or-not  ~= ^  if-then-end-elseif-else  while-do-end  repeat-until   for i=1,10 do end

 函数:function  

table: pairs ipairs {["键"]=值,}   {类,可以有函数}  table.insert remove sort  concat

 local require package.loaded[]   _G return

协程:coroutine.creat-wrap    coroutine.resume()-()   coroutine.yield()  coroutine.status-running

元表:setmetatable() __tostring=  __call=  __add等  __index __newIndex

面向对象:封装 继承 多态 base传入self

os.time  os.date("*t") math.cos deg rad max min floor cliet modf

collectgarbage("count")   collectgarbage("collect")

变量

lua 热更资源打包ab_lua_05

lua 热更资源打包ab_开发语言_06

lua 热更资源打包ab_字符串_07

lua 热更资源打包ab_lua_08

lua 热更资源打包ab_字符串_09

  type可以得到类型,而它本身返回一个string

nil string number boolean

字符串

lua 热更资源打包ab_开发语言_10

lua 热更资源打包ab_开发语言_11

如果是括号,不用加双引号

即使s2是其他类型也可以拼接,默认拼接成字符串

lua 热更资源打包ab_lua 热更资源打包ab_12

lua 热更资源打包ab_元表_13

lua 热更资源打包ab_开发语言_14

string提供的公共方法:        注意只是返回一个新字符串,不会改变原字符串

lua 热更资源打包ab_开发语言_15

lua 热更资源打包ab_lua_16

对应输出

lua 热更资源打包ab_开发语言_17

lua 热更资源打包ab_lua 热更资源打包ab_18

lua 热更资源打包ab_lua 热更资源打包ab_19

lua 热更资源打包ab_字符串_20

第二个返回值是,修改了几处

lua 热更资源打包ab_lua_21

lua 热更资源打包ab_字符串_22

运算符

lua 热更资源打包ab_开发语言_23

lua 热更资源打包ab_元表_24

lua 热更资源打包ab_lua_25

lua 热更资源打包ab_字符串_26

lua 热更资源打包ab_开发语言_27

lua 热更资源打包ab_字符串_28

短路就是前面为false后面就不会执行

lua 热更资源打包ab_lua 热更资源打包ab_29

三目运算符也不支持

lua 热更资源打包ab_lua 热更资源打包ab_30

条件分支/循环语句

lua 热更资源打包ab_开发语言_31

lua 热更资源打包ab_lua 热更资源打包ab_32

可以组合

lua 热更资源打包ab_lua_33

lua 热更资源打包ab_字符串_34

dowhile比较特殊,在c#里面是进入条件,而这里是结束条件。 且关键词也不同

lua 热更资源打包ab_lua_35

默认递增,且默认增1

lua 热更资源打包ab_lua 热更资源打包ab_36

lua 热更资源打包ab_开发语言_37

lua 热更资源打包ab_元表_38

递减

函数

lua 热更资源打包ab_lua 热更资源打包ab_39

lua 热更资源打包ab_字符串_40

lua的语法全部是从上到下调用的。在下面定义的函数不能在上面调用,c#可以,但lua不行

lua 热更资源打包ab_lua 热更资源打包ab_41

用的是变量则调用变量

lua 热更资源打包ab_lua 热更资源打包ab_42

参数可以不写类型

参数可以随便传。  返回值也不用指定类型,在外面接收即可。 数量也无限制,类似元组

lua 热更资源打包ab_开发语言_43

lua 热更资源打包ab_字符串_44

打出function,按tab可以补全

lua 热更资源打包ab_字符串_45

不支持重载

lua 热更资源打包ab_lua_46

function默认的三个点其实就是变长参数。 用一个表把他接收起来(类型无限制),然后按长度输出

lua 热更资源打包ab_lua_47

用一个变量接收再返回也可以,但其实function本身就是一个变量,直接返回也是没问题的

lua 热更资源打包ab_开发语言_48

会输出15   充当返回值的函数不要写函数名,它是变量

lua 热更资源打包ab_lua_49

table

lua 热更资源打包ab_元表_50

所有复杂类型都是talbe

lua 热更资源打包ab_lua 热更资源打包ab_51

lua 热更资源打包ab_lua_52

lua 热更资源打包ab_lua_53

lua 热更资源打包ab_字符串_54

例如这里#a,会输出2,后面断了

lua 热更资源打包ab_字符串_55

如果中间为空会断掉,可能遍历不完

lua 热更资源打包ab_lua 热更资源打包ab_56

  

lua 热更资源打包ab_lua_57

lua 热更资源打包ab_lua_58

可以这样写,但一般不建议用负数

顺带一提,#aa=3,aa[1] [2] [3] 分别是2,3,5  并没有被分开

加两道题:

lua 热更资源打包ab_开发语言_59

打印5

lua 热更资源打包ab_lua 热更资源打包ab_60

打印2

lua 热更资源打包ab_开发语言_61

lua 热更资源打包ab_开发语言_62

空一个不会断,空两个会断掉。 一般不建议你自定义索引

迭代器遍历

lua 热更资源打包ab_字符串_63

lua 热更资源打包ab_开发语言_64

lua 热更资源打包ab_字符串_65

中间没有4,断开了,所以5也得不到,这是ipairs

lua 热更资源打包ab_lua_66

 pairs则全部打印出来了

lua 热更资源打包ab_lua 热更资源打包ab_67

lua 热更资源打包ab_元表_68

lua 热更资源打包ab_开发语言_69

这种写法可以只遍历键,只写一个变量

lua 热更资源打包ab_lua_70

字典

lua 热更资源打包ab_字符串_71

 和之前写的键值对类似

lua 热更资源打包ab_lua 热更资源打包ab_72

lua 热更资源打包ab_元表_73

lua 热更资源打包ab_lua 热更资源打包ab_74

lua 热更资源打包ab_字符串_75

为i确保万无一失还是用中括号填键访问比较稳妥

lua 热更资源打包ab_开发语言_76

置空应该可以认为是删除了。 或者直接删代码(有风险)

paint(k,v,1,2,3)其实打印多少个参数都可以,print会自动空行。

lua 热更资源打包ab_lua_77

   也可以只得到键,方法同上。但不能只得到值,这种写法本质上还是得到了键与值。

lua 热更资源打包ab_lua_78

←只不过他没有使用键,只打印值就好了

类和结构体

一切都是模仿

lua 热更资源打包ab_lua_79

方法类似,点出来调用

lua 热更资源打包ab_lua_80

lua 热更资源打包ab_lua_81

建议都用冒号申明而且lua中没有this.age这个东西

lua 热更资源打包ab_元表_82


lua 热更资源打包ab_lua 热更资源打包ab_83

申明函数时如果不用点,而用冒号的话,就会多出一个self关键字,必须配合冒号调用

总结:要么指明是谁的,要么传参时传入自己。 冒号调用等于默认传入自己,如果像↑这种我根本没有写参数,那么self就默认是传入的第一个参数。

可以是 Student:Speak2    Student.Speak2(Student)    两种都可以 self必须配合冒号调用

如果搞不清,可以简单一点调用→

lua 热更资源打包ab_字符串_84

不是非要用冒号和self

lua 热更资源打包ab_字符串_85

但要搞清楚他俩的区别

插入移除排序拼接

lua 热更资源打包ab_字符串_86

↑这样申明是可以的,表里面可以套表

lua 热更资源打包ab_开发语言_87

lua 热更资源打包ab_开发语言_88

t2插入t1后面

lua 热更资源打包ab_lua_89

lua 热更资源打包ab_lua_90

lua 热更资源打包ab_元表_91

如果传参则按参数来,不传参则默认移除最后一个

lua 热更资源打包ab_开发语言_92

lua 热更资源打包ab_开发语言_93

直接调用默认升序

lua 热更资源打包ab_lua 热更资源打包ab_94

true就是a放前面

lua 热更资源打包ab_开发语言_95

lua 热更资源打包ab_lua 热更资源打包ab_96

一般只用于字符串

多脚本执行

我们之前声明的都是全局变量,哪怕是在函数内部申明的,也是全局变量

lua 热更资源打包ab_lua_97

require(字符串形式)

lua 热更资源打包ab_元表_98

 注意会从头到尾执行一遍 test文件

lua 热更资源打包ab_元表_99

如这里全局变量testA就可以正常打印,local则不行

可以执行另一个lua文件(这里的test是文件名,必须加引号) 同时允许获取其中的全局变量

lua 热更资源打包ab_元表_100

其他脚本只能加载一次。想要再次执行,只能卸载过后再次加载     注意是中括号

lua 热更资源打包ab_字符串_101

本地变量例外,不会被存到大G表中。  G表也可以用来存东西

lua 热更资源打包ab_lua 热更资源打包ab_102

但仍然可以通过返回一个本地变量,来使用本地变量

lua 热更资源打包ab_元表_103

只需要在外部去接收它使用

lua 热更资源打包ab_字符串_104

多变量三目运算符

lua 热更资源打包ab_lua 热更资源打包ab_105

另外函数可以同时返回多个返回值

lua 热更资源打包ab_元表_106

  非-not

lua 热更资源打包ab_lua 热更资源打包ab_107

分别输出2,1,nil    可以利用此特性模拟三目运算符

lua 热更资源打包ab_lua_108

lua 热更资源打包ab_lua_109

lua 热更资源打包ab_开发语言_110

协程

lua 热更资源打包ab_字符串_111

lua 热更资源打包ab_字符串_112

输出

lua 热更资源打包ab_开发语言_113

这几种方法都可以,注意f1是一个函数

lua 热更资源打包ab_开发语言_114

对应wrap

lua 热更资源打包ab_元表_115

注意调用一次协程只执行一次,lua特性是从上到下只执行一次想要多次执行协程就要多次调用

lua 热更资源打包ab_lua_116

lua 热更资源打包ab_lua 热更资源打包ab_117

两种方法都有返回值,第一种会额外返回执行状态(所以可以用两个变量接收),第二种只会返回值

lua 热更资源打包ab_字符串_118

lua 热更资源打包ab_lua 热更资源打包ab_119

实测,只能得到create的协程的状态

lua 热更资源打包ab_元表_120

running状态和 coroutine.running() 只能写在协程内部去得,写在外面是得不到“正在运行”的状态的

lua 热更资源打包ab_元表_121

元表

lua 热更资源打包ab_字符串_122

lua 热更资源打包ab_开发语言_123

lua 热更资源打包ab_lua_124

lua 热更资源打包ab_lua_125

输出表默认会打印类型和编码,但如果重写了

lua 热更资源打包ab_元表_126

lua 热更资源打包ab_元表_127

输出子表会调用元表的tostring方法

lua 热更资源打包ab_字符串_128

如果填参数,则参数a代表子表自己

lua 热更资源打包ab_lua 热更资源打包ab_129

lua 热更资源打包ab_元表_130

lua 热更资源打包ab_元表_131

参数a代表子表自己

lua 热更资源打包ab_lua_132

第二个参数开始,才代表你传进去的参数。  一个表本身是不支持像函数一样调用的。必须指定了元表,并设置了__call 才可以像函数一样调用。

lua 热更资源打包ab_字符串_133

+ - *  / % ^  == < <= ..同理,注意没有> 和>+,只有小于

lua 热更资源打包ab_开发语言_134

lua 热更资源打包ab_元表_135

指定同一张元表才会得true

lua 热更资源打包ab_lua 热更资源打包ab_136

lua 热更资源打包ab_字符串_137

lua 热更资源打包ab_字符串_138

也可以在meta.__index={} 申明一个空表        可以寻找元表的元表,但前提给爷表的index也指定好

lua 热更资源打包ab_lua 热更资源打包ab_139

这个倒是没有index重要

lua 热更资源打包ab_字符串_140

lua 热更资源打包ab_字符串_141

这个不会管元表

lua 热更资源打包ab_开发语言_142

rawget rawset getmetatable  后面几个用的不多

Lua面向对象

封装就是new一个对象,接收,访问该表是访问它的元表,但增加却是增加的它自己

继承,是父类自己提供的方法,通过该方法创建一个子类,自动指定父类为元表,也可以new

封装

先申明一个空表,然后增加方法,该方法又返回一个空表,只不过又用到了元表的知识得到id

lua 热更资源打包ab_元表_143

这时候外面myobj就等于里面local obj了,只有建立元表关系,并指定index才能访问其中的id

lua 热更资源打包ab_lua 热更资源打包ab_144

输出1,2

lua 热更资源打包ab_元表_145

为什么?原因:myobj第一次调用test,把自己作为参数传递,但它其中没有id',所以使用了元表当中的id。但之后又设置了id,就输出自己的

继承

继承用大G表,因为它是全局的。封装不用,因为它是本地的


lua 热更资源打包ab_开发语言_146

object表中加了一个方法,传一个字符串可以在大G表中申明一个空表。

注意区分传入时是字符串,调用则只需要名字  类似字典的访问  因为都是键值对

lua 热更资源打包ab_lua 热更资源打包ab_147

lua 热更资源打包ab_lua 热更资源打包ab_148

写的很清楚了

如果改变了class1的name,不影响父类的值,相当于子类拥有了自己的值

多态

lua 热更资源打包ab_开发语言_149

lua 热更资源打包ab_lua_150

子类父类都有同一个方法,子类重写了该方法,执行不同的逻辑。 c#中通过base. 可以保留父类方法,lua中则需要一些操作

lua 热更资源打包ab_lua 热更资源打包ab_151

在上一步继承方法里,给子类定义一个base属性,让它就等于父类

lua 热更资源打包ab_lua_152

注意冒号调用操作的是父类数据,不要这么写

lua 热更资源打包ab_开发语言_153

lua 热更资源打包ab_元表_154

这三次调用实际上都是在操作GameObject这个大类里的数据,并不是他们自己的

lua 热更资源打包ab_元表_155

总结:

lua 热更资源打包ab_lua 热更资源打包ab_156

--多态
--申明一个新的类
Object:subClass("GameObject")
--成员变量
GameObject.posX = 0
GameObject.posY = 0
--成员方法
function GameObject:Move()
	self.posX = self.posX + 1
	self.posY = self.posY + 1
end

--实例化对象使用
local obj = GameObject:new()
print(obj.posX)
obj:Move()
print(obj.posX)


--申明一个新的类 Player 继承 GameObject
GameObject:subClass("Player")
--多态 重写了 GameObject的Move方法
function Player:Move()
	--base调用父类方法 用.自己传第一个参数
	self.base.Move(self)
end
print("****")
--实例化Player对象
local p1 = Player:new()
print(p1.posX)
p1:Move()
print(p1.posX)

自带库

lua 热更资源打包ab_元表_157

lua 热更资源打包ab_lua 热更资源打包ab_158

os.time得到的是这种 所以我们一般自定规则  注意os.date("*t")得到一张表

lua 热更资源打包ab_字符串_159

lua 热更资源打包ab_字符串_160

遍历输出

也可以点出单个值   ↑

lua 热更资源打包ab_lua_161

🥧就是180°

30°是弧度,一π等于180°。 面板上显示的是角度,如cos(30°)=cos(30*mathf.deg2rad)

lua 热更资源打包ab_lua 热更资源打包ab_162

其实用^ 就行了

lua 热更资源打包ab_lua_163

种子变了随机数才会变

lua 热更资源打包ab_lua 热更资源打包ab_164

一般不会改

垃圾回收

lua 热更资源打包ab_开发语言_165

尽量是手动触发GC,不要自动GC。 比如过场景时手动去触发GC