前期准备:
搜索并下载安装LuaForWindows,例:
安装完成后开启cmd窗口,输入lua
出现版本号证明成功下载安装
使用Sublime Text编辑器编写Lua
使用浏览器或CSDN搜索Sublime Text下载并安装,安装成功后打开编辑器,编辑界面如下图:
打开专门存放Lua项目文件的文件夹:
在文件夹中新建本次要编写代码的文件:
编写示例代码并保存文件:
在Sublime Text编辑器中运行Lua代码快捷键:Ctrl+B(弹出框选择lua)
在cmd中运行方式如下:
Lua回顾网站
https://www.runoob.com/lua/lua-tutorial.html
语言执行方式
编译型语言:代码在运行前需要使用编译器,先将程序源代码编译为可执行文件,再执行
C/C++
Java,C#
Go,Objective-C
解释型语言(脚本语言):需要提前安装编程语言解析器,运行时使用解析器运行程序源代码
JavaScript(TypeScript)
Python,PHP,Perl,Ruby
SQL
Lua
特点:运行才能调试,运行速度稍慢,开发速度快。
解析器安装
解压缩解析器(即前文提到的LuaForWindows
Lua是什么
Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua特点
轻量级:它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供一部分功能,Lua可以使用它们,就像是本来就内置的功能一样。
使用领域:
游戏行业(魔兽世界的插件,愤怒的小鸟)
Web领域(Nginx功能开发)
嵌入式领域
使用方式
需要高性能的程序部分,使用(C/C++)实现。需要快速实现功能部分,使用Lua实现
国内游戏行业流行的Lua使用方式
Cocos2D-X(Cocos):核心引擎使用C++实现,提供LuaBinding(API的Lua调用),
游戏逻辑开发部分可使用Lua开发(刀塔传奇)
Unity3D:使用如xLua插件(API的Lua调用),实现游戏核心代码使用C#实现(打包时il2cpp,编译为C++),游戏逻辑使用Lua开发(王者荣耀)
Lua语言基础
环境安装
Mac:使用Homebrew安装
Windows:https://www.lua.org/download.html(或见前文)
编程方法
交互式编程
脚本式编程(将脚本的路径,传递给编译器)
Lua基本语法
注释
单行,多行
变量
命名,内部全局变量,局部,全局
数据类型
type()函数判断类型
nil boolean number string function table
部分示例代码:
--//C#的单行注释
--Lua的单行注释
--[[
/* */C#的多行注释
]]
--[[ Lua的多行注释]]
Lua变量与数据类型,字符串操作
--C#定义变量
--类型 变量名=变量值;
--例:string name="myName";
--Lua会自动推导变量类型
--Lua可以不用写分号,也可以编写分号
--变量声明
name="myName"
--调用变量
--C# Debug.Log(); Console.WriteLine();
print(name)
--内置变量
--特点:下划线+大写字母
--查看Lua的版本
print(_VERSION)
--可以调用一个不存在的变量
--值是nil(相当于C#中的null)
print(id)
--销毁一个已经定义的变量
name=nil
print(name)
--全局变量和局部变量
--data ="myData" 定义了一个全局变量
--一般开发中,轻易不会使用全局变量,因为全局变量可以被随意更改,不安全,不稳定
local data="myData" --定义了一个局部变量(data的作用域是当前文件)
-------------------------------------------------------------------------
--数据类型
--获得的变量的类型,使用type()
local name="Unity"
--type()是函数结构,是一个代码片段,可以重复调用执行,有参数有返回值
print(type(name))
--获得type()返回值的类型
-- type()返回值的类型是string
print(type(type(name)))
--对一个没有定义的变量获取类型
print(type(bb))
--判断一个未定义的变量
print(type(bb)=="nil")
--数字类型的数值
--C#中多种数字类型,被归纳到number数据类型中,例:
print(type(123))
print(type(1.25))
--布尔类型的数值
--布尔有true和false
print(type(true))
--单引号字符串
print(type('LikeChar'))
-------------------------------------------------------------------------
--单行定义字符串
local str1 = "abc"
local str2 = 'def'
--多行定义字符串
--完全的还原字符串内部的定义结构,如换行符都是存储的
local str3 = [[
one
two
]]
--C#字符串拼接
-- str1 + str2
print(str1..str2)
--Lua对两个字符串相加时,会将他们转换成数字类型,转换失败会报错,
--如果转换成功,则进行加运算后,得到数字结果
print("1"+"2")
--获取字符串的长度
print(#str1)
-------------------------------------------------------------------------
--字符串相关函数
--string.函数名
--字符串大写化
print(string.upper(str1))
--字符串小写化
print(string.lower(str1))
--Lua支持多返回值
--字符串的下标是从1开始的!!!
--字符串查找
--参数1:被查找的字符串,参数2:查找的内容
--返回值:起始找到的位置下标和结束找到的位置下标
print(string.find("abcdefg","cde"))
--字符串的反转
print(string.reverse("abcdefg"))
--截取字符串
--方式1(提供起始位置下标,截取到结尾)
print(string.sub("abcdefg",3))
--方式2(提供起始位置下标,提供结束位置) C#的第二个参数是截取长度
print(string.sub(3,5))
--截取到倒数第二个字符
local data="abcdefghijk"
print(string.sub(data,3,#data-1))
--字符串格式化
--参数1:需要被格式化的字符串,其中包含占位符,%d表示数字
--参数2:填入格式化字符串中的内容
print(string.format("I'm the %d player,she is the %d player",3,5))
--字符串重复
--被重复的字符串
--重复的次数
print(string.rep("abc",2))
--ASCII转字符
print(string.char(65))
--字符转ASCII
print(string.byte("A"))
--字符串替换
--参数1:原始串,参数2:需要替换的内容,参数3:替换后的内容
--返回值:替换结果,替换的次数
print(string.gsub("abcd","bc","**"))
Lua数组
--数组初始化
--C# string[] data=new string[20];
local data = {}
--起始索引从1开始
--类型可以混合
--索引值可以为负数
--即使索引从1开始,也可以赋值0索引
--索引可以断开
--初始化时,对于没有索引的值,索引是从1向上累加的
--初始化提供索引的赋值方法,[索引值]=数值
data={"abc",123,[-1]=100,[0]=99,[4]=233}
print(data[-1])
--获取数组的长度
--这种方式,获得的是从1索引开始,索引连续的数据个数
--中间断开,计数结束
print(#data)
--修改某一个值
data[1]="def"
print(data[1])
--数组在Lua中是用Table实现的
local data2={{"aa","bb"},{11,22}}
print(data2[2][1])
Lua运算符+判断,循环语句
--2的3次方
print(2^3)
--C#不等于"!="
print(2~=3)
--Lua没有++ --
local i=0
i = i + 1
--Lua没有+=,-=,*=
--[[
C#
if(条件)
{
条件达成的语句块
}
]]
local con1 = true
if(con1)
then
print("条件1达成")
end
--[[
C#
if(条件){
条件达成的语句块
}
else{
否则达成的语句块
}
]]
if(false)
then
print("条件1达成")
else
print("else达成")
end
--[[
C#
if(条件){
条件达成的语句块
}
else if{
else if条件
}
else{
否则达成的语句块
}
]]
if(false)
then
print("条件1达成")
elseif(true)
then
print("elseif达成")
else
print("else达成")
end
--[[
C#
if(条件)
{
if(条件){
//进入第二层条件
}
}
]]
if(true)
then
if(true)
then
print("进入第二层if")
end
end
--Lua没有switch,所以可以使用if-elseif-else的结构代替
--[[
C#
while(条件)
{
循环制
}
]]
local num=1
while(num<3) --当条件满足时,进入循环
do
--local修饰的num,虽然是局部变量,但是作用域为当前文件,所以在循环体内,可以取得值
print(num)
num=num+1
end
--[[
C# do while
do
{
循环体
}while(条件)
至少执行一次do结构体内的代码,while条件满足时,再do执行代码
]]
local num=1
repeat
print(num)
num=num+1
until(num>5) --直到条件满足时,跳出循环
-----------------------------------------------------------------------------------
--[[
do
{
if()
{
break;
}
if()
{
break;
}
if()
{
break;
}
}while(false)
]]
repeat
if(true)
then
print("此处跳出")
break
end
if(true)
then
print("此2处跳出")
end
until(true)
print("继续执行")
local data={"aa","bb","cc","dd","ee"}
--参数1:变量i的初始值,遍历Lua表,使用1
--参数2:增长到多少
--参数3:增长步长,默认值是1
for i=1,#data
do
print(data[i])
end
--倒序遍历
for i=#data,1,-1
do
print(data[i])
end
--迭代器(遍历table)
--one是不加中括号的字符串索引
--"aa" "bb"自动加1,2索引
--[4]指定数字索引
--[-1]指定负数索引
--["two"]是加中括号的字符串索引写法
local data={one="cc","aa","bb",[4]=3,[-1]=4,["two"]="dd"}
--连续索引数值迭代器
--迭代器就是指向table的指针,连续数字索引迭代器,
--只会获取从1开始的数字索引,且必须索引是连续的才能持续获得值
--此处的for结构,可以理解为C#的foreach结构
for k,v in ipairs(data)
do
print("k:"..k..",v:"..v)
end
print("-----------------------------")
--所有数值迭代器
--相对于ipairs,所有数值迭代器去掉了i,i可以理解为int,
--去掉int的迭代器,也就去掉了连续数值索引的限定
--获取table长度的最稳定方法,就是使用所有数值迭代器获取
for k,v in pairs(data)
do
print("k:"..k..",v:"..v)
end
该系列专栏为网课课程笔记,仅用于学习参考。