前言
出于热更新的需要,越来越多的Unity游戏项目都采用了Lua做为热更脚本,先不说众多的lua热更解决方案,也不说lua与unity如何结合及最佳实践,本文先主要介绍一下Lua的语法及自身特点:
什么是Lua
借用Lua官网介绍的一句:Lua是一个强大的,高效的,轻量的嵌入式脚本语言。支持过程编程,面向对象编程,函数式编程,数据驱动编程和数据描述。
设计目的
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua的特点
- 轻量级:它用标准C语言编写并以源代码的形式开放,编译后仅仅100多k,可以很方便的嵌入别的程序里。
- 可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
- 其它特性:支持面向过程编程和函数式编程,自动内存管理,内置模式匹配,闭包,协同机制的多线程是,通过闭包和table可以很方便的支持面向对象编程所需要的一些关键机制。如数据抽象,虚函数,继承和重载等。
基本语法
注释
- 单行注释:
--
- 多行注释:
--[[xxxxx--]]
标识符
和大多数语言一样,区分大小写,字母,数字,下划线,不能有特殊字符
数据类型
- nil:就是null值,在条件语句中相当于false
- boolean:false和true
- number:数字类型
- string:字符串,用”“或”表示
- function:用C或Lua编写的函数
- userdata:任意存储在变量中的C数据结构
- thread:线程,用于执行协同程序
- table:本质上是一个关联数组,数组索引可以是数字或者是字符串。table的创建是通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。
可以使用type函数测试值的类型
print(type(nil)) --nil
print(type(false)) --boolean
print(type(10)) --number
print(type('')) --string
print(type(function() end)) -- function
print(type({}))--table
print(type(coroutine.create(function() end)))--thread
注意的地方:nil作比较时应该加上双引号”:
type(X) == nil --false
type(X) == "nil" --true
string字符串:由一对双引号或单引用来表示,也可以用2个方括号[[]]表示一块字符串,对一个数字字串进行算数操作时,会尝试转成数字,字符串连接使用..,#计算字符串长度
s = 'hello'
html=[[
<html><header></header><body></body></html>
]]
print('2'+6) -- 8
print('a'..'b') -- ab
print(#'hello') -- 5
table:默认初始索引从1开始
**thread:主要的线程是协同程序(coroutine).它跟线程(thread)差不多,拥有独立的栈,局部变量和指令指针,和其他协同程序共享全局变量和其他大部分东西。
线程和协程的区别:线程可以同时运行多个,而协程做任意时刻只能运行一个,并且处于运行状态的协程只有被挂起时才会暂停。
userdata可以将任意C/C++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中调用
变量
Lua变量有三种类型:分别是全局变量,局部变量和表中的域
默认是全局变量,除非用local显示声明为局部变量
赋值
可以对多个变量同时赋值,会先计算右边所有的值再执行赋值操作
a='hello'
a,b=10,2*x
x,y=y,x
索引
对table的索引使用方括号[].Lua也提供了.操作
Lua循环
- while:while(exp) do … end
- for:for var=exp1,exp2,exp3 do … end for … in do end
- repeat…until:repeat … until(exp)
分支控制
if(exp) then … elseif …else … end
Lua函数
[scope] function name(arg1,arg2,arg3…,argn)
body
return r1,r2
end
- 可以将函数作为参数传递给函数
- 可以将函数赋值给变量
- 可以返回多个值
- 可传递可变参数,使用三个点 … 表示
- 可将可变参数赋值给一个变量
- 可通过select(‘#’,…)获取可变参数的数量
- 可通过select(n,…)读取参数
Lua运算符
算术运算符
+-,*,/,%,^,-
关系运算符
==,~=(不等于),>,<,>=,<=
逻辑运算符
and,or,not
其它运算符
..(连接字符串),#(返回字符串或表的长度)
匹配模式
直接用常规的字符串描述
s = "Deadline is 12/12/2020,firm"
date="%d%d/