前期准备:
搜索并下载安装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)
thenprint("条件1达成")
elseprint("else达成")
end--[[C#if(条件){条件达成的语句块}else if{else if条件}else{否则达成的语句块}
]]
if(false)
thenprint("条件1达成")
elseif(true)
thenprint("elseif达成")
elseprint("else达成")
end--[[C#if(条件){if(条件){//进入第二层条件}}
]]
if(true)
thenif(true)thenprint("进入第二层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 whiledo{循环体}while(条件)至少执行一次do结构体内的代码,while条件满足时,再do执行代码
]]
local num=1
repeatprint(num)num=num+1
until(num>5) --直到条件满足时,跳出循环-------------------------------------------------------------------------------------[[do{if(){break;}if(){break;}if(){break;}}while(false)
]]repeatif(true)thenprint("此处跳出")breakendif(true)thenprint("此2处跳出")end
until(true)
print("继续执行") local data={"aa","bb","cc","dd","ee"}
--参数1:变量i的初始值,遍历Lua表,使用1
--参数2:增长到多少
--参数3:增长步长,默认值是1
for i=1,#data
doprint(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)
doprint("k:"..k..",v:"..v)
endprint("-----------------------------")
--所有数值迭代器
--相对于ipairs,所有数值迭代器去掉了i,i可以理解为int,
--去掉int的迭代器,也就去掉了连续数值索引的限定
--获取table长度的最稳定方法,就是使用所有数值迭代器获取
for k,v in pairs(data)
doprint("k:"..k..",v:"..v)
end
该系列专栏为网课课程笔记,仅用于学习参考。