【Unity技术栈】Unity热更新之Lua语法
聪头 游戏开发萌新

唐老狮–Unity热更新之Lua语法

2021年3月4日14:44:35

URL:https://www.bilibili.com/video/BV1iA411n7oQ?p=1

环境搭建

Windows下Lua版本只支持到5.1.5,而最新版有5.4.x,建议在Windows学习,Linux开发。

LuaForWindows:https://github.com/rjpcomputing/luaforwindows

image

image

安装即可

验证

image

IDE

image

image

Sublime Text:http://www.sublimetext.com/

Ctrl+B即可运行

注释

单行注释 –

1
--单行注释

多行注释 –[[ –]]

1
2
3
4
--[[
多行注释
print('one')
--]]

1.变量

lua中所有的变量都不需要声明变量类型,类似C#的var关键字

image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
print('Hello World') --Hello World

--变量--
--2021年3月4日15:10:09--
--nil
print('*************nil*************')
a = nil
print(a) --nil
print(type(a)) --nil

--number
print('*************number*************')
a = 1
print(a) --1
a = 1.2
print(a) --1.2
print(type(a)) --number

--string
print('*************string*************')
a = '123'
a = "123"
print(a) --123
print(type(a)) --string

--boolean
print('*************boolean*************')
a = true
print(a) --true
print(type(a)) --boolean
print(type(type(a))) --type返回值是string
print(b) --lua中使用没有声明的变量默认为nil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Hello World
*************nil*************
nil
nil
*************number*************
1
1.2
number
*************string*************
123
string
*************boolean*************
true
boolean
string
nil
[Finished in 0.1s]

2.字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
--字符串--
--2021年3月4日15:18:50--
--1.获取字符串长度
print('*************获取字符串长度*************')
s = 'abc聪头' --中文占3个长度
print(#s) --9

--2.字符串多行打印
print('*************字符串多行打印*************')
print('123\n123')
s = [[


]]
print(s)

--3.字符串拼接
print('*************字符串拼接*************')
s = '123456'
s1 = '123'
s2 = '456'
s3 = s1..s2
print(s == s3) --true
print(string.format('我今年%d岁了', 18)) --我今年18岁了
--%d: 数字
--%a: 任何字符
--%s: 字符串

--4.其他类型->字符串
print('*************其他类型->字符串*************')
a = true
print(tostring(a)) --true

--5.公共方法
print('*************公共方法*************')
str = "aBcDe"
--转大写
print(string.upper(str)) --ABCDE
--转小写
print(string.lower(str)) --abcde
--反转
print(string.reverse(str)) --eDcBa
--查找(lua默认索引从1开始) 返回起始索引 结束索引
print(string.find(str, 'Bc')) --2 3
--截取
print(string.sub(str, 3)) --cDe
--截取
print(string.sub(str, 3, 4)) --cD
--重复
print(string.rep(str, 2)) --aBcDeaBcDe
--字符串替换 返回结果 次数
print(string.gsub(str, 'Bc', '**')) --a**De 1
--字符转ASCII码
a = string.byte('Lua', 1)
print(a)
--ASCII码转字符
print(string.char(a))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
*************获取字符串长度*************
9
*************字符串多行打印*************
123
123



*************字符串拼接*************
true
我今年18岁了
*************其他类型->字符串*************
true
*************公共方法*************
ABCDE
abcde
eDcBa
2 3
cDe
cD
aBcDeaBcDe
a**De 1
76
L
[Finished in 0.1s]

3.运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
--运算符--
--2021年3月4日15:39:16--

--1.算术运算符--
print('*************算术运算符*************')
-- Lua: + - * / % ^
-- 没有自增自减 ++ --
-- 没有复合运算符 += -= *= /= %=

--加法
a = 1
b = 2
print(a + b)
print("123.4" + 1) --124.4 会自动转为number

--减、乘、除、取余略

--幂运算
print(2 ^ 5)

--2.条件运算符--
print('*************条件运算符*************')
-- Lua: > < >= <= == ~=
print(1 ~= 2) --true

--3.逻辑运算符--
print('*************逻辑运算符*************')
-- Lua: and or not
print(true or false)

--4.不支持位运算符

--5.不支持三目运算符
1
2
3
4
5
6
7
8
9
*************算术运算符*************
3
124.4
32
*************条件运算符*************
true
*************逻辑运算符*************
true
[Finished in 0.1s]

4.条件分支语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--条件分支--
--2021年3月4日15:48:04--

--if 条件 then ... end
--单分支
a = 5
if a > 5 then
print('123')
else
print('321')
end --321
--多分支
if a < 5 then
print('abc')
elseif a == 5 then
print('cba')
end --cba

--lua 没有switch
1
2
3
321
cba
[Finished in 0.1s]

5.循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
--循环--
--2021年3月4日15:53:41--

-- while --
print('*************while*************')
num = 0
while num < 5 do
print(num)
num = num + 1
end

-- do while --
print('*************do while*************')
num = 0
repeat
print(num)
num = num + 1
until num > 5

-- for --
print('*************for*************')
for i = 1, 5 do --默认递增 i+1
print(i)
end
for i = 1, 5, 2 do --递增2
print(i)
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
*************while*************
0
1
2
3
4
*************do while*************
0
1
2
3
4
5
*************for*************
1
2
3
4
5
1
3
5
[Finished in 0.1s]

6.函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
--函数--
--2021年3月4日15:59:57--
--语法
--function 函数名()
--end

--1.无参数无返回值--
print('*************无参数无返回值*************')
function F1( )
print("F1 函数")
end
F1() --F1 函数

F2 = function ( )
print("F2 函数")
end
F2() --F2函数
print(type(F2)) --function
print(F2) --function: 00C2BEB0

--2.有参数有返回值
print('*************有参数有返回值*************')
function F3( a )
print(a)
end
F3(1) --1
F3('Hello World') --Hello World
--传入的参数不匹配 补nil或丢弃
F3() --nil
F3(1, 2, 3) --1

--3.有多返回值
print('*************有多返回值*************')
function F4(a, b)
return a, b
end
a,b = F4(2,3)
print(F4(2, 3)) --2 3
print(a,b) --2 3

--4.重载
--Lua不支持重载,默认调用最后一个声明的函数

--5.变长参数
print('*************变长参数*************')
function F7(...)
--变长参数使用 用一个表存起来再用
args = {...}
for i = 1, #args do
print(args[i])
end
end
F7(1,2,'hello')

--6.函数嵌套
print('*************函数嵌套*************')
function F8( )
return function ( )
print(123)
end
end
f8 = F8()
f8()
--闭包--
function F9( x )
--改变传入参数的生命周期
return function ( y )
return x + y --里面使用外面函数传入的参数x
end
end
f9 = F9(10)
print(f9(5))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*************无参数无返回值*************
F1 函数
F2 函数
function
function: 00ADC468
*************有参数有返回值*************
1
Hello World
nil
1
*************有多返回值*************
2 3
2 3
*************变长参数*************
1
2
hello
*************函数嵌套*************
123
15
[Finished in 0.1s]

7.表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
--表--
--2021年3月4日16:21:08--
--所有的复杂类型都是基于table(表)

--1.数组 lua索引从1开始
print('*************数组*************')
a = {1,2,3,nil,true}
b = {1,2,nil,true,nil}
print(a[1])
--中间为nil可能会截断
print(#a) --5
print(#b) --2
for i = 1, #a do
print(a[i])
end

--2.二维数组
print('*************二维数组*************')
a = {{1,2,3}, {4,5,6}}
for i = 1, #a do
b = a[i]
for j = 1, #b do
print(b[j])
end
end

--3.自定义索引
print('*************自定义索引*************')
aa = {[0] = 1, 2, [1] = 3, [-1] = 4, 5}
print(aa[0]) --1
print(aa[-1]) --4
print(#aa) --2
for i = 1, #aa do
print(aa[i]) -- 2 5
end
--深坑 当出现一个nil时仍取最大索引,连续两个nil截断
aa = {[1] = 1, [2] = 2, [4] = 4, [5] = 5} --断3
for i = 1, #aa do
print(aa[i]) -- 1 2 nil 4 5
end
aa = {[1] = 1, [2] = 2, [5] = 5} --断 3 4
for i = 1, #aa do
print(aa[i]) -- 1 2
end
aa = {[1] = 1, [2] = 2, [4] = 4, [6] = 6} --断 3 5
for i = 1, #aa do
print(aa[i]) -- 1 2 nil 4 nil 6
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
*************数组*************
1
5
2
1
2
3
nil
true
*************二维数组*************
1
2
3
4
5
6
*************自定义索引*************
1
4
2
2
5
1
2
nil
4
5
1
2
1
2
nil
4
nil
6
[Finished in 0.1s]

8.迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--表之迭代器遍历--
--2021年3月4日16:40:39--
--#得到的长度,不一定准确

a = {[0] = 1, 2, [-1] = 3, 4, 5, [5] = 6}
--1.ipairs
print('*************ipairs*************')
--从索引1处开始往后遍历 索引小于等于0的值找不到
--只能找到连续索引的 键 如果中间断序 它无法遍历出后面的内容
for i,k in ipairs(a) do
print('ipairs遍历键值'..i..'_'..k)
end
--[[
ipairs遍历键值1_2
ipairs遍历键值2_4
ipairs遍历键值3_5
--]]

--2.pairs
print('*************pairs*************')
--找到所有键和值
for i,k in pairs(a) do
print('pairs遍历键值'..i..'_'..k)
end
1
2
3
4
5
6
7
8
9
10
11
12
*************ipairs*************
ipairs遍历键值1_2
ipairs遍历键值2_4
ipairs遍历键值3_5
*************pairs*************
pairs遍历键值1_2
pairs遍历键值2_4
pairs遍历键值3_5
pairs遍历键值0_1
pairs遍历键值-1_3
pairs遍历键值5_6
[Finished in 0.1s]

9.字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--字典--
--2021年3月4日16:52:41--

--1.字典的声明
a = {['name'] = '聪头', ['age'] = 14, ['1'] = 5}
--查找
print(a['name']) --聪头
print(a.age) --14
--新增
a['sex'] = true
--删除
print(a['1'])
a['1'] = nil
print(a['1'])
--遍历 如果要模拟字典,用pairs遍历
for _,v in pairs(a) do
print(_,v)
end
1
2
3
4
5
6
7
8
聪头
14
5
nil
age 14
name 聪头
sex true
[Finished in 0.2s]

10.类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
--类--
--2021年3月4日17:07:28--

--1.类和结构体
Student = {
name = '聪头',
age = '23',
sex = '男',
--函数声明1
Up = function ( )
--这个age是全局变量,与Student的age无关
--pritn(age)
print('成长')
end
}
--静态调用
print(Student.name)
Student.Up()

--函数声明2
Student.Speak = function ( t )
print(t.name..'说话')
end
--函数声明3
function Student.Sleep( )
print('睡觉')
end
--函数声明4
--冒号:第一个参数传自身
--self:表示默认传入的第一个参数
function Student:Eat( )
print(self.name..'吃饭')
end

--函数调用
Student.Speak(Student)
Student:Speak()
--Student.Eat() --报错
Student:Eat()
Student.Eat(Student)

print('*************表的公共操作*************')
t1 = {{age = 1, name = "123"}, {age = 2, name = "345"}}
t2 = {name = "聪头", sex = true}
--1.插入
print('*************插入*************')
print(#t1)
table.insert(t1, t2)
print(#t1)
print(t1[3].sex)

--2.删除(默认最后一个索引的内容)
print('*************删除*************')
table.remove(t1)
print(t1[1].name)
--删除指定索引的内容
table.remove(t1, 2)
print(t1[1].name)

--3.排序
print('*************排序*************')
t2 = {5,2,7,9,5}
table.sort(t2) --默认升序
for _, v in pairs(t2) do
print(v)
end
table.sort(t2, function(a,b)
if a > b then
return true
end
end)
print('------------------------------')
for _, v in pairs(t2) do
print(v)
end

--4.拼接
print('*************拼接*************')
tb = {'123', '456', '789', '10101'}
str = table.concat(tb, ';')
print(str)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
聪头
成长
聪头说话
聪头说话
聪头吃饭
聪头吃饭
*************表的公共操作*************
*************插入*************
2
3
true
*************删除*************
123
123
*************排序*************
2
5
5
7
9
------------------------------
9
7
5
5
2
*************拼接*************
123;456;789;10101
[Finished in 0.1s]

11.包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
print('*************全局变量和本地变量*************')
--全局变量
a = 1
--局部变量 local
local b = 2

print('*************多脚本执行*************')
--关键字 require('脚本名')
print(require('Practice11_Require2'))
print(testA)
print(testB)

print('*************脚本卸载*************')
--require加载执行的脚本,加载一次后不会再被执行
require('Practice11_Require2')
--该脚本是否被执行 true / false
print(package.loaded['Practice11_Require2'])
--脚本卸载
package.loaded['Practice11_Require2'] = nil
local testB = require('Practice11_Require2')
print(testB)

print('*************大G表*************')
--_G表是一个总表(table),它将我们声明的所有全局变量都存储在其中
--local变量不会存储其中
for k,v in pairs(_G) do
print(k,v)
end

Practice11_Require2.lua

1
2
3
4
5
print('测试')
testA = "123"
local testB = '456'

return testB

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
*************全局变量和本地变量*************
*************多脚本执行*************
测试
456
123
nil
*************脚本卸载*************
456
测试
456
*************大G表*************
a 1
string table: 00C59DF8
xpcall function: 00C57B70
package table: 00C574A8
tostring function: 00C57D70
print function: 00C578B0
os table: 00C59F88
unpack function: 00C57DF0
require function: 00C58A68
getfenv function: 00C577B0
setmetatable function: 00C57B30
next function: 00C57A70
assert function: 00C579D0
tonumber function: 00C57CD0
io table: 00C59F60
rawequal function: 00C57B10
testA 123
collectgarbage function: 00C57A10
arg table: 00C59B28
getmetatable function: 00C577F0
module function: 00C58C88
rawset function: 00C57910
math table: 00C59A38
debug table: 00C59B50
pcall function: 00C57850
table table: 00C57480
newproxy function: 00C504F8
type function: 00C57BF0
coroutine table: 00C57660
_G table: 00C53E50
select function: 00C57950
gcinfo function: 00C577D0
pairs function: 00C53F60
rawget function: 00C579F0
loadstring function: 00C57750
ipairs function: 00C53E78
_VERSION Lua 5.1
dofile function: 00C57990
setfenv function: 00C57970
load function: 00C578D0
error function: 00C57890
loadfile function: 00C57A30
[Finished in 0.1s]

12.特殊用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
print('*************特殊用法*************')

print('*************多变量赋值*************')
a,b,c = 1,2,'123',4 --多的值会丢弃
print(a)
print(b)
print(c)
a,b,c = 1,2 --多变量赋值 如果后面值不够 会自动补空
print(a)
print(b)
print(c)

print('*************多返回值*************')
--同上

print('*************and or*************')
--在lua中 nil和false认为是假
--and:为真返回第二个,为假返回第一个假(短路)
print(1 and 2) --为真,返回第二个 2
print(false and nil) --为假,返回nil或false(默认返回第一个false)
print(1 and nil) --为假返回nil
print(1 and false) --为假返回false
print(true and 3) --为真,返回第二个 3
--or:为真返回第一个(短路), 为假返回最后一个假
print(true or 1) -- true
print(false or 1) -- 1
print(nil or 2) --2
print(false or nil) --nil

--三目运算符
x = 3
y = 2
local res = (x>y) and x or y
print(res)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*************特殊用法*************
*************多变量赋值*************
1
2
123
1
2
nil
*************多返回值*************
*************and or*************
2
false
nil
false
3
true
1
2
nil
3
[Finished in 0.1s]

13.协程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
--协同程序
print('*************协程的创建*************')
fun = function ( )
print(123)
end
--法1.coroutine.create() 常用
co = coroutine.create(fun)
print(co) --本质:一个线程对象
print(type(co)) --thread
--法2.coroutine.wrap()
co2 = coroutine.wrap(fun)
print(co2)
print(type(co2)) --function

print('*************协程的运行*************')
--1.运行通过 create创建的协程
coroutine.resume(co)
--2.函数运行协程
co2()

print('*************协程的挂起*************')
fun2 = function ( )
local i = 1
while(true) do
--print(i)
print(coroutine.status(co3)) --co4运行时为suspended
--挂起
coroutine.yield(i)
i = i + 1
end
end
co3 = coroutine.create(fun2)
coroutine.resume(co3)
coroutine.resume(co3)
--参数①:协程是否启动成功
--参数②:yield返回值
isOk, tempi = coroutine.resume(co3)
print(isOk, tempi)

co4 = coroutine.wrap(fun2)
print(co4()) --直接返回yield的内容
co4()

print('*************协程的状态*************')
--协程状态
--dead 结束
--suspended 暂停
--running 进行中(协程内获得)
print(coroutine.status(co))
print(coroutine.status(co3))

--当前运行的线程号(协程内获得)
print(coroutine.running())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*************协程的创建*************
thread: 00CAE080
thread
function: 00CA0528
function
*************协程的运行*************
123
123
*************协程的挂起*************
running
running
running
true 3
suspended
1
suspended
*************协程的状态*************
dead
suspended
nil
[Finished in 0.1s]

14.元表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--元表
--2021年3月11日18:32:23
print('*************元表概念*************')
--任何表都可以作为另一个表的元表(元表相当于父类,有元表的表相当于子类,下面叫子表)
print('*************设置元表*************')
meta = {}
myTable = {}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(父类)
setmetatable(myTable, meta)

print('*************特定操作*************')
print('*************元表操作-__tostring*************')
meta2 = {
--当字表被当做字符串使用时,会默认调用tostring方法
__tostring = function (t) --默认传自身
return t.name
end
}
myTable2 = {
name = "聪头"
}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(父类)
setmetatable(myTable2, meta2)
print(myTable2)
myTable2.name = "lua"
print(myTable2)

print('*************元表操作-__call*************')
--元表meta3
meta3 = {
--当字表被当做字符串使用时,会默认调用tostring方法
__tostring = function (t) --默认第一个参数传自身(子表)
return t.name
end,
--当字表被当做函数使用时,会默认调用__call方法
__call = function ( t ) --默认第一个参数传自身(子表)
print('我的名字:'..t.name)
end
}
myTable3 = {
name = "聪头"
}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(父类)
setmetatable(myTable3, meta3)
print(myTable3())

print('*************元表操作-运算符重载*************')
--[[
算术运算符:
加法:__add
减法:__sub
乘法:__mul
除法:__div
取余:__mod
幂:__pow
条件运算符:
==:__eq return true/false --两个对象元表一致,才能准确调用方法
<:__lt return true/false
<=:__le return true/false
拼接运算符:__concat return ""
--]]
meta4 = {
--相当于加法运算符重载
__add = function ( t1, t2 )
return t1.age + t2.age
end
}
myTable4 = {age = 1}
myTable5 = {age = 2}
setmetatable(myTable4, meta4)
print(myTable4 + myTable5)

print('*************元表操作-__index和__newindex*************')
--__index:
--当子表中,找不到某一个属性时会到元表中__index指定的表去找索引
meta6 = {
age = 1
}
meta6.__index = meta6 --建议在外面声明__index
myTable6 = {}
setmetatable(myTable6, meta6)
print(myTable6.age)

--__newindex:
--当赋值时,如果赋值一个不存在的索引,会把这个值赋值到__newindex所指的表中,不修改自身
meta7 = {

}
meta7.__newindex = meta7
myTable7 = {}
setmetatable(myTable7, meta7)
myTable7.age = 1
print(myTable7.age)


print('*************获取元表*************')
print(getmetatable(myTable7))
--rawget:只会在自身找age,不管元表(忽略__index)
print(rawget(myTable6, "age"))
--同理rawget,忽略__newindex
print(rawset(myTable6, "age", 2))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
*************元表概念*************
*************设置元表*************
*************特定操作*************
*************元表操作-__tostring*************
聪头
lua
*************元表操作-__call*************
我的名字:聪头

*************元表操作-运算符重载*************
3
*************元表操作-__index__newindex*************
1
nil
*************获取元表*************
table: 00AD0F80
nil
table: 00AD0CD8
[Finished in 0.1s]

15.面向对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
--面向对象
--2021年3月12日13:27:37
print('*************封装*************')
--面向对象 类 都是基于表实现
Object = {}
Object.id = 1

function Object:new( )
local obj = {}
setmetatable(obj, self)
self.__index = self
return obj
end
print(Object:new())
print(Object:new().id)

print('*************继承*************')
--声明类
function Object:subClass( className )
--_G表:所有声明的全局变量,都以键值对的形式存在其中
_G[className] = {}
local obj = _G[className]
setmetatable(obj, self)
self.__index = self
obj.base = self --父类引用
return obj
end
function Object:Test( )
print(self.id)
end
local classPerson = Object:subClass("Person") --相当于声明一个Person类
print(classPerson.id)
--创建对象
local p1 = Person:new() --相当于调用Object的new方法,生成了一个Person对象
print(p1.id) --1
p1.id = 100
print(p1.id) --100
print(p1:Test()) --100

print('*************多态*************')
--相同行为,不同表现
Object:subClass("GameObject")
GameObject.posX = 0
GameObject.posY = 0
function GameObject:Move( )
self.posX = self.posX + 1
self.posY = self.posY + 1
print(self.posX)
print(self.posY)
end
GameObject:subClass("Player")

local p1 = Player:new()
--p1:Move()
--重写并保留父类方法
function Player:Move( )
--使用:调用,相当于把基类表作为第一个参数传入了方法中
--self.base:Move()
--所以,要使用.调用父类方法,并传入self!!!!!!!
--这样调用父类方法的时,使用的是自己的属性,而不是父类这张表的属性(静态属性)
self.base.Move(self)
--1.进入父类Move方法
--2.自身posX = 父类posX(__index获得) + 1

print("子类移动")
end
p1:Move()

local p2 = Player:new()
p2:Move()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
*************封装*************
table: 00C09FF0
1
*************继承*************
1
1
100
100

*************多态*************
1
1
子类移动
1
1
子类移动
[Finished in 0.2s]

16.自带库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
--自带库
--2021年3月12日14:36:56
print('*************时间*************')
--系统时间
print(os.time())
print(os.time({year = 2014, month = 8, day = 14}))

local nowTime = os.date("*t")
print(nowTime)
for k,v in pairs(nowTime) do
print(k,v)
end
print(nowTime.hour)

print('*************数学运算*************')
--math
--绝对值
print(math.abs(-11))
--弧度->角度
print(math.deg(math.pi))
--三角函数 传弧度
print(math.cos(math.pi))
--向下向上取整
print(math.floor(2.6))
print(math.ceil(5.2))
--最大最小值
print(math.max(1,2))
print(math.min(4,5))
--分离整数和小数
print(math.modf(1.2))
--幂运算
print(math.pow(2,5))
print(2^5)
--随机数
math.randomseed(os.time())
print(math.random(100))
print(math.random(100))
--开方
print(math.sqrt(4))

print('*************路径*************')
--lua脚本加载路径
print(package.path)
package.path = package.path..";C:\\"
print(package.path)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
*************时间*************
1615532545
1407988800
table: 00C0A000
hour 15
min 2
wday 6
day 12
month 3
year 2021
sec 25
yday 71
isdst false
15
*************数学运算*************
11
180
-1
2
6
2
4
1 0.2
32
32
5
77
2
*************路径*************
;.\?.lua;C:\Program Files (x86)\Lua\5.1\lua\?.lua;C:\Program Files (x86)\Lua\5.1\lua\?\init.lua;C:\Program Files (x86)\Lua\5.1\?.lua;C:\Program Files (x86)\Lua\5.1\?\init.lua;C:\Program Files (x86)\Lua\5.1\lua\?.luac
;.\?.lua;C:\Program Files (x86)\Lua\5.1\lua\?.lua;C:\Program Files (x86)\Lua\5.1\lua\?\init.lua;C:\Program Files (x86)\Lua\5.1\?.lua;C:\Program Files (x86)\Lua\5.1\?\init.lua;C:\Program Files (x86)\Lua\5.1\lua\?.luac;C:\
[Finished in 0.2s]

17.垃圾回收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--垃圾回收
--2021年3月12日14:49:15

--垃圾回收关键字
--collectgarbage
--获取当前lua占用的字节数 K字节 返回值*1024 就可以得到具体的内存占用字节数
print(collectgarbage("count") * 1024)

--进行垃圾回收 类似C# GC
collectgarbage("collect")

print(collectgarbage("count") * 1024)

--lua中有自动定时进行GC的方法
--Unity中热更新开发 尽量不要用自动垃圾回收
1
2
3
20505
19672
[Finished in 0.1s]
 评论