Lua热更新(Lua)

-- [[]] print

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

语法基础

基础类型: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")

变量

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

nil string number boolean

字符串

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

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

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

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

运算符

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

三目运算符也不支持

条件分支/循环语句

可以组合

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

默认递增,且默认增1

递减

函数

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

用的是变量则调用变量

参数可以不写类型

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

打出function,按tab可以补全

不支持重载

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

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

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

table

所有复杂类型都是talbe

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

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

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

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

加两道题:打印5打印2

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

迭代器遍历

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

pairs则全部打印出来了

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

字典

和之前写的键值对类似为i确保万无一失还是用中括号填键访问比较稳妥

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

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

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

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

类和结构体

一切都是模仿

方法类似,点出来调用建议都用冒号申明

而且lua中没有this.age这个东西

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

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

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

如果搞不清,可以简单一点调用→不是非要用冒号和self

但要搞清楚他俩的区别

插入移除排序拼接

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

t2插入t1后面

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

直接调用默认升序true就是a放前面

一般只用于字符串

多脚本执行

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

require(字符串形式)

注意会从头到尾执行一遍 test文件如这里全局变量testA就可以正常打印,local则不行

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

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

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

但仍然可以通过返回一个本地变量,来使用本地变量只需要在外部去接收它使用

多变量三目运算符

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

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

协程

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

对应wrap

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

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

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

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

元表

输出表默认会打印类型和编码,但如果重写了输出子表会调用元表的tostring方法如果填参数,则参数a代表子表自己

参数a代表子表自己

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

    • * / % ^ == < <= ..同理,注意没有> 和>+,只有小于指定同一张元表才会得true

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

这个倒是没有index重要这个不会管元表

rawget rawset getmetatable 后面几个用的不多

Lua面向对象

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

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

封装

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

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

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

继承

继承用大G表,因为它是全局的。封装不用,因为它是本地的
object表中加了一个方法,传一个字符串可以在大G表中申明一个空表。

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

写的很清楚了

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

多态

子类父类都有同一个方法,子类重写了该方法,执行不同的逻辑。 c#中通过base. 可以保留父类方法,lua中则需要一些操作
在上一步继承方法里,给子类定义一个base属性,让它就等于父类

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

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

总结:

Lua 复制代码
--多态
--申明一个新的类
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)

自带库

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

遍历输出

也可以点出单个值 ↑

🥧就是180°

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

其实用^ 就行了种子变了随机数才会变一般不会改

垃圾回收

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

相关推荐
Swift社区2 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht2 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht2 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20242 小时前
Swift 数组
开发语言
stm 学习ing3 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc4 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe5 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin5 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python