前期準備:
搜索并下載安裝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
該系列專欄為網課課程筆記,僅用于學習參考。