unity3d开发教程-lua入门 unity3d 开发
suiw9 2024-11-05 12:38 23 浏览 0 评论
如果你还没有编程基础,建议你先学习一些编程基础。本文不是完全菜鸟教程,主要针对有其他语言经验的开发者,如果想看菜鸟教程,建议看菜鸟教程的 Lua教程。
先看一个简单类的代码
1 ---@class BsnsPack @Base class of business pack
2 local BsnsPack = {
3 -- class fields
4 maxSerialNo = 0,
5 }
6
7 BsnsPack.__index = BsnsPack
8
9 --- new()
10 ---@return BsnsPack
11 function BsnsPack.new()
12 local o = {}
13
14 -- member fields
15 o.serialNo = 0
16 o.mod = 0
17 o.cmd = 0
18 o.payload = nil
19
20 -- bind BsnsPack methods
21 setmetatable(o, BsnsPack)
22 return o
23 end
24
25 --- set serial No.
26 ---@param serialNo number
27 function BsnsPack:setSerialNo(serialNo)
28 self.serialNo = serialNo
29 end
30
31 --- get serial No.
32 ---@return number
33 function BsnsPack:getSerialNo()
34 return self.serialNo
35 end
36
37 --- set mod
38 ---@param mod number
39 function BsnsPack:setMod(mod)
40 self.mod = mod
41 end
42
43 --- get mod
44 ---@return number
45 function BsnsPack:getMod()
46 return self.mod
47 end
48
49 --- set cmd
50 ---@param cmd number
51 function BsnsPack:setCmd(cmd)
52 self.cmd = cmd
53 end
54
55 --- get cmd
56 ---@return number
57 function BsnsPack:getCmd()
58 return self.cmd
59 end
60
61 --- set payload
62 ---@param payload any
63 function BsnsPack:setPayload(payload)
64 self.payload = payload
65 end
66
67 --- get payload
68 ---@return any
69 function BsnsPack:getPayload()
70 return self.payload
71 end
72
73 function BsnsPack.test()
74 print(BsnsPack.serialNo)
75 end
76
77 --- testPrivate
78 ---@param self BsnsPack
79 local function testPrivate(self)
80 print(self.serialNo)
81 end
82
83 ---@alias Request BsnsPack @Request is BsnsPack
84 local Request = BsnsPack
85
86 ---@class Response : BsnsPack @Response class
87 local Response = {}
88 setmetatable(Response, BsnsPack) -- bind super methods
89 Response.__index = Response
90
91 --- new()
92 ---@return Response
93 function Response.new()
94 local o = BsnsPack.new()
95
96 -- member fields
97 o.code = 0
98
99 setmetatable(o, nil) -- remove original metatable
100 setmetatable(o, Response) -- bind Response methods
101 return o
102 end
103
104 --- get result code
105 ---@return number
106 function Response:getCode()
107 return self.code
108 end
109
110 local bsnsPack = {}
111 bsnsPack.BsnsPack = BsnsPack
112 bsnsPack.Request = Request
113 bsnsPack.Response = Response
114
115 return bsnsPack
1、第1行:这是一行注释
Lua的行注释以两个减号 -- 开头,
class注解:---@class TYPE[: PARENT_TYPE {, PARENT_TYPE}] [@comment]
这样有利于 VS Code 代码提示,例如将鼠标放到代码中出现 BsnsPack 的地方上,会有小弹窗提示这个table的key,以及key的类型。
用得比较多的注解有 ---@class,---@return,---@param
2、第2行,定义一个叫 BsnsPack 的class(通过table模拟)。
Lua里没有类,Lua的结构化数据类型叫table,基于key-value结构。相对于其他语言的 map / dictionary。访问一个table的key对应的值,可以用点 . 来访问,也可以用中括号[]来访问
Lua里没有单独的数组结构,也是基于table,数组下标是key,数组元素是value,要注意的是,Lua里数组下标是从1开始的。
创建table的最简单方式就是花括号 {},创建一个空table。
Lua是脚本语言,变量不需要指定类型,只需要给它赋值。所以 BsnsPack = {maxSerialNo = 0,} 相当于定义了个变量 BsnsPack,它的值是一个table。
Lua的变量默认是全局的,加载到内存的Lua代码都可以访问这个变量。为了避免命名冲突和意外修改,一般建议变量定义为局部变量,限制它的作用域。在变量前面加个 local定义局部变量。
这里定义的 BsnsPack ,作用域只在这个文件里。其他文件不能访问。也可以在函数、代码块里用 local 定义局部变量。
3、第7行,给 BsnsPack一个叫 __index 的 key 赋值为 BsnsPack 自己
Lua 的 table 里,__index 是个特殊的key,这是 Lua实现类和继承的关键。
Lua里有个概念叫做元表。Lua定义了一些语言默认key,这些key一般跟 +、-、*、/等操作符、key的访问、值更新关联,这些key叫做元方法(Lua里的函数/方法也可以作为值),这些元方法合起来叫元表。
Lua里设置元表的方法是代码第 21 行的 function setmetatable(t, metatable),调用这个方法会让参数 metatable 成为 参数 t 的元表。
设置元表后,在代码里访问参数 t 的一个key时会发生以下情况:
1)Lua先在 t 里找,看有没有这个key,如果有,就返回这个key的值。否则,执行2)
2)Lua看参数 metatable 有没有 __index 这个key,如果有,就在 __index 对应的值里查找(__index的值如果是表,在这个表里查找;如果是函数,执行这个函数)
BsnsPack.__index = BsnsPack,如果其他的table设置 BsnsPack 为元表,就可以访问 BsnsPack 所有的key。 这些key的值如果是方法,就可以调用这些方法。
所以 BsnsPack 可以定义方法的模板,这就跟class类似。BsnsPack定义的数据key,相当于静态字段class field。BsnsPack定义的方法key,可以是成员方法member method,也可以是class method,后面介绍
4、第11~23行,定义BsnsPack的一个叫new的key,它的值是一个方法
Lua里一个代码块不用花括号{},通过end作为结束标记。
定义方法用 function 开头,用点.或者冒号:分割talbe名和方法名,
用冒号:定义的方法,会有个默认参数self,相当于调用者,如果外部用 BsnsPack:new() 这样调用,则self == BsnsPack,如果用a:new()这样调用,self==a。
用点.定义的方法,没有默认参数,只能显式写参数self。
一般地,用冒号:定义成员方法member method(例如第23行的 function BsnsPack:setSerialNo(serialNo) )
1)调用 o:setSerialNo(serialNo) 时,这里的self是对象o,只改对象o的serialNo,其他对象的serialNo不受影响。
用点.定义构造对象的方法(例如第11行的 function BsnsPack.new()),以及静态方法class method(例如第69行的 function BsnsPack.test() )
1)在其他地方通过 BsnsPack.new()构造BsnsPack对象
1)在其他地方通过 BsnsPack.test()调用类方法
建议,方法定义的时候是冒号:,调用的时候用冒号:,定义的时候是点.,调用的时候也用点.
构造方法不一定叫new,只是为了统一,建议都用new,与其他语言一致。
方法new里面的 local o = {},定义的key都是成员字段member field(每次调用方法 BsnsPack.new() 都创建一个新的 table并对其字段初始化后返回)
Lua没有私有的成员方法,可以定义文件的 local 方法,把对象作为参数self显式的传进去(例如第79行 local function testPrivate(self))
5、第84行,给类BsnsPack定义一个别名 Request,其实就是把一个table赋值给另外一个变量
6、第87~102行,定义一个类Response,继承基类BsnsPack
第87行,定义子类Response
第88行,设置元表,使得Response可以访问BsnsPack所有的key(继承BsnsPack所有的方法)
第89行,所有对象可以访问Response所有的key(通过递归,包括BsnsPack所有的key)
第94行,通过调用BsnsPack构造方法初始化o,o是BsnsPack的对象,拥有基类所有的member field
第97行,定义Response相对于基类新增的字段code
第99、100行,修改o的元表为Response,这样o可以访问Response所有的成员方法 member method(通过递归,包括BsnsPack所有的成员方法)
Response可以重写BsnsPack的方法
1 function Response:getPayload()
2 return self.payload
3 end
由于Lua里访问key,先在table本身查找,如果没有才在元表查找,所以会调用重写的方法,实现多态。
7、第110~115行,导出本文件定义的类。
由于class的定义都是以 local 方式定义的局部变量,外部不能访问,所以要把它当作文件的返回值 return
如果该文件只导出一个class,直接return这个局部变量就可以,(例如,如果只导出BsnsPack,return BsnsPack 就可以)
由于本文件需要导出3个class,这里把他们放到一个table里导出
其他文件需要访问这个文件的class,需要调用require方法导入进来,该方法的参数是路径(不含后缀.lua),返回值是这个lua文件的return值
1 local bsnsPack = require("Assets.Lua.bsns.bsns_pack")
2 local Request = bsnsPack.Request
3 local Response = bsnsPack.Response
8、如果想模块化管理,把一个模块所有的类通过一个文件暴露给其他模块,可以在这个文件定义一个局部变量,把这个模块所有的文件的类,都通过require导入进来,并赋值给跟类同名的key,最后返回这个局部变量
文件bsns.lua
1 local bsns = {}
2
3 local bsnsPack = require("Assets.Lua.bsns.bsns_pack")
4 bsns.Request = bsnsPack.Request
5 bsns.Response = bsnsPack.Response
6
7 bsns.BsnsMod = require("Assets.Lua.bsns.bsns_mod")
8 bsns.BsnsCenter = require("Assets.Lua.bsns.bsns_center")
9
10 return bsns
9、可以实现一个通用的类定义函数
1 --- define a class
2 --- t._className, a string array, define class name
3 --- t._super, a table, define super class
4 --- t.__ctor, a function(self, ...), define member fields
5 --- @param t any
6 function class(t)
7 -- extends super
8 if t._super ~= nil then
9 -- static fields and methods
10 local superStaticClone = {}
11 for k, v in pairs(t._super) do
12 if k == "_ctor" then
13 goto continue
14 end
15
16 superStaticClone[k] = v
17
18 ::continue::
19 end
20
21 setmetatable(t, superStaticClone)
22 end
23
24 t.__index = t
25 -- new method
26 t.new = function(...)
27 local o = {}
28 invokeCtor(o, t, ...)
29
30 setmetatable(o, t) -- bind class
31 return o
32 end
33
34 function invokeCtor(o, cls, ...)
35 if cls._super ~= nil then
36 invokeCtor(o, cls._super, ...)
37 end
38
39 if cls._ctor ~= nil then
40 setmetatable(o, cls)
41 o:_ctor(...)
42 setmetatable(o, nil)
43 end
44 end
45
46 return t
47 end
有了这个函数可以这样定义类
1 local TestClass = class({
2 -- class name
3 _className = "TestClass",
4
5 -- static fields:
6 size = 2,
7 count = 0,
8
9 -- member:
10 _ctor = function(self, ...)
11 local params = {...}
12 self.count = params[1]
13 self.age = params[2]
14 end
15 })
16
17 local TestClass2 = class({
18 _className = "TestClass2",
19 ---@class TestClass
20 _super = TestClass,
21
22 _ctor = function(self, ...)
23 self.fdsl = 3256
24 end
25 })
10、简单语法介绍
1)Lua里的语句不需要分号;结尾
2)Lua常用的基本数据类型有nil、boolean、number、string、function、table
3)获取数组长度用 #数组变量,例如
1 local array = {"Lua", "Tutorial"}
2 local len = #array
3 print(len)
4)遍历数组用
1 for i, v in ipairs(table) do
2
3 end
5)遍历对象用
1 for k, v in pairs(obj) do
2
3 end
6)其他语法请查阅菜鸟教程
11、Lua代码规范可参考 https://lua.ren/topic/172/
相关推荐
- 俄罗斯的 HTTPS 也要被废了?(俄罗斯网站关闭)
-
发布该推文的ScottHelme是一名黑客,SecurityHeaders和ReportUri的创始人、Pluralsight作者、BBC常驻黑客。他表示,CAs现在似乎正在停止为俄罗斯域名颁发...
- 如何强制所有流量使用 HTTPS一网上用户
-
如何强制所有流量使用HTTPS一网上用户使用.htaccess强制流量到https的最常见方法可能是使用.htaccess重定向请求。.htaccess是一个简单的文本文件,简称为“.h...
- https和http的区别(https和http有何区别)
-
“HTTPS和HTTP都是数据传输的应用层协议,区别在于HTTPS比HTTP安全”。区别在哪里,我们接着往下看:...
- 快码住!带你十分钟搞懂HTTP与HTTPS协议及请求的区别
-
什么是协议?网络协议是计算机之间为了实现网络通信从而达成的一种“约定”或“规则”,正是因为这个“规则”的存在,不同厂商的生产设备、及不同操作系统组成的计算机之间,才可以实现通信。简单来说,计算机与网络...
- 简述HTTPS工作原理(简述https原理,以及与http的区别)
-
https是在http协议的基础上加了一层SSL(由网景公司开发),加密由ssl实现,它的目的是为用户提供对网站服务器的身份认证(需要CA),以至于保护交换数据的隐私和完整性,原理如图示。1、客户端发...
- 21、HTTPS 有几次握手和挥手?HTTPS 的原理什么是(高薪 常问)
-
HTTPS是3次握手和4次挥手,和HTTP是一样的。HTTPS的原理...
- 一次安全可靠的通信——HTTPS原理
-
为什么HTTPS协议就比HTTP安全呢?一次安全可靠的通信应该包含什么东西呢,这篇文章我会尝试讲清楚这些细节。Alice与Bob的通信...
- 为什么有的网站没有使用https(为什么有的网站点不开)
-
有的网站没有使用HTTPS的原因可能涉及多个方面,以下是.com、.top域名的一些见解:服务器性能限制:HTTPS使用公钥加密和私钥解密技术,这要求服务器具备足够的计算能力来处理加解密操作。如果服务...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- 图解HTTPS「转」(图解http 完整版 彩色版 pdf)
-
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。...
- HTTP 和 HTTPS 有何不同?一文带你全面了解
-
随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...
- HTTP与HTTPS的区别,详细介绍(http与https有什么区别)
-
HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的...
- 一文让你轻松掌握 HTTPS(https详解)
-
一文让你轻松掌握HTTPS原文作者:UC国际研发泽原写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。...
- 如何在Spring Boot应用程序上启用HTTPS?
-
HTTPS是HTTP的安全版本,旨在提供传输层安全性(TLS)[安全套接字层(SSL)的后继产品],这是地址栏中的挂锁图标,用于在Web服务器和浏览器之间建立加密连接。HTTPS加密每个数据包以安全方...
- 一文彻底搞明白Http以及Https(http0)
-
早期以信息发布为主的Web1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)