Unity3D學習筆記(三十):Lua
阿新 • • 發佈:2019-02-12
path 單行 一個數 eat 之間 分享 mst pat ole Lua:是一個輕量級的腳本語句。不需要編譯,直接運行的語言。
環境配置:
執行Lua有兩種方式:
1、交互式編程(輸入後能立即看到效果)
2、腳本式編程:運行lua文件,.lua為文件後綴
Lua語句結尾不需要用分號結束,寫了分號也沒有問題。
刪除一個中文字符,需要按兩下刪除
註釋:
單行註釋:--
多行註釋:--[[...]]--或--[[...--]]或--[[...]]
print("Hello World") --單行註釋 --print("單行註釋") --多行註釋 --[[ print("多行註釋1") ]] --[[ print("多行註釋2") --]]變量定義: Lua不需要寫變量類型,變量名 = 值。 Lua的標識符(變量名),1個字母或下劃線開頭,後跟0個或多個字母、數字、下劃線 Lua是區分大小寫的。 變量存儲什麽類型的數據,就是什麽類型的變量。 使用type()來獲取變量的類型。 Lua的數據類型: number:小數類型(lua沒有整型和浮點的區分),對應C#的int,float,double(浮點類型不能加f) boolean:布爾類型,true和false。Lua裏把false和nil看作是假,其他的都是真。 nil:表示空數據,等同於null。對於未被定義的變量,想要使用的話得到的都是nil。 string:字符串類型,可以使用雙引號,單引號,[[...]]表示。([[...]]與註釋有歧義,不推薦使用) 1、在對兩個字符串類型的變量,進行算數操作的時候,加減乘除求余,Lua會嘗試把這兩個字符串去轉換成數字去做計算,如果字符串轉換不成功則報錯。 2、使用..來做兩個字符串的連接。 3、使用#來計算字符串的長度,放在字符串的前面。--[[ print("多行註釋3") ]]
--table類型:table表示一個數組的時候,默認索引是從1開始的 創建:b = {} table並不是一個數組,實際是一個“關聯數組”,關聯數組的索引可以是數字,也可以是字符串變量定義 --C# --int a = 1; --Lua a = 1 A = 2 _ = 3 print(a) print(A) print(_) --變量賦值 b = true print(b) print(type(b)) b= 4 print(b) print(type(b)) --number類型 c = 1 d = 1.2 print(c) print(type(c)) print(d) print(type(d)) --三種打印字符串的方式 e = "Hello World" f = ‘Hello World‘ g = [[Hello World]] print(e, f, g)--..連接字符串 x = "1" y = "2" print(x + y)--加號表示算數運算 print(x .. y) --#計算變量長度 print(#e) print(#"Hello World") print(#"你好")--漢字占兩個字節
--C# int[] a = new int[]{1, 2, 3}; --Lua的table a = {1, 6, 3} print(a[1]) print(type(a)) --創建一個空表 b = {} --創建一個表,並且對表進行初始化賦值 c = {"string", true, 1, nil} --table的訪問 print(c[1]) --table的修改 c[1] = 100 print(c[1]) print(#c)--能算table長度,但不一定是真實長度 --table的添加 c[5] = 200 --table的方法:數組的插入和刪除(索引的連續性) --第一個參剩:表的名字 --第二個參數:插入的內容 --依次向後找,只要找到一個nil的位置就把內容插入進去 table.insert(c, "你好") print(c[4])--結果:你好 --第二個參數:要插入的位置,可以跳躍性的插入 table.insert(c, 10, "小明") print(c[10])--結果:小明 --從第三個位置的元素開始,後面的元素依次後移 table.insert(c, 3, "小紅") print(c[3])--結果:小紅 print(c[4])--結果:1 --刪除 --刪除指定索引的位置的元素,後面的元素依次前移 d = {1, 4, "你好", true} table.remove(d, 1) print(d[1])--結果:4 --刪除連續索引的最後一個元素 d[6] = 10 table.remove(d) print(d[3])--結果:nil print(d[6])--結果:10
--table的索引 a = {} a[1] = 0 print(a[1]) --把字符串作為一個索引 a["a"] = "nihao" print(a["a"]) --table可以有0號索引 a[0] = 10 print(a[0]) --table可以有負號索引 a[-1] = 100 print(a[-1]) print("-----------------") b = {[2] = 10, 1, 2, 3, 5, [-1] = 30, ["nihao"] = "你好", key = "不好", c = {1, 5}} print(b[1]) print(b[2])--會被覆蓋掉 print(b[3]) print(b[4]) print(b[5]) print(b[6]) print(b[7]) print(b[-1]) print(b["nihao"]) --第一種訪問字符串為索引的元素 print("-----------------") print(b["nihao"]) --第二種訪問字符串為索引的元素 print(b.nihao) print(b["key"]) print(b.key) print(b.c[2]) --table.insert(c, 3, "小紅")--報錯:只能針對數組 --table.remove(c, 2)--報錯:只能針對數組 --添加字符串為索引的元素 b["key1"] = "可以" b.key2 = "不可以" d = "可不可以" print(b.key1) print(b["key2"]) print(b[d]) print(#b)--結果:4,從1號位索引開始算,一旦索引斷掉,就不往後面計算 f = {[2] = 2} print(#f)Lua中的運算符 數學運算符:+,-,*,/,%,^ Lua裏沒有自增自減運算符,也沒有+= *=之類的 關系運算符:>,<,==,>=,<=,~= Lua裏的不等於~= 邏輯運算符:and,or,not 流程控制語句
--流程控制語句 --C# if(條件){} --Lua --if語句 --[[ if 條件 then print("if語句滿足,執行") end ]]-- if true then print("if語句滿足,執行") end --if else語句 if a then print("if語句滿足,執行") else print("if語句不滿足,執行") end --if elseif語句 if a then--一般條件後面才加then關鍵字 print("if語句滿足,執行") elseif b then--註意elseif是連著的 print("if語句不滿足,執行") end --if elseif else語句 if a then print("if語句滿足,執行") elseif b then--註意elseif是連著的 print("if語句不滿足,執行") else print("if語句都不滿足,執行") end
循環控制語句
--循環控制語句 --C# for,while,do while --Lua --while a = 1 while a < 10 do print(a) a = a + 1 end print("-------------") --do while C#條件滿足繼續執行循? --repeat 循環體 until 條件 條件滿足跳出循環 a = 1 repeat print(a) a = a + 1 until a < 10 print("-------------") --for 變量定義,條件,每次循環累加值 do 循環體 end --條件就是一個數,變量 <= 條件,每次累加值可以不寫,不寫默認為1 --對於循環,有break關鍵字跳出,但是沒有continue關鍵字 for a = 1, 10, 1 do print(a) end方法:調用方法時,一定是先定義,在調用!
--方法 function func3() func1() end --方法的定義1 function 方法名(參數) 方法體 end function func1() print("func1") end --方法的定義2 方法名 = function(參數) 方法體 end func2 = function() print("func2") end --方法的調用,先定義再調用 func1() func2() func3() print("--------有參數的方法--------") --有參數的方法 func4 = function(a, b) print(a, b) end func4()--可以不傳參數,按照nil處理 func4(1)--可以少傳 func4(1, 2) func4(1, 2, 3)--可以多傳,只取前2個 print("--------可變參數的方法--------") --可變參數的方法,參數位置用...表示是可以傳任意的參數 --通過arg來取傳入的參數,arg實際就是一表表示的數組 --當調用的時候,把所有傳遞進來的參數存入到arg中 func5 = function(...) print(#arg) for i = 1, #arg do print(arg[i]) end end func5(1,2,3,54,6,7,8) func5(1,"nihao",true,54,6,7,false,nil) print("--------帶返回值的方法--------") --帶返回值的方法 func6 = function() return "func6" end a = func6() print(func6(), a) print("--------帶多個返回值的方法--------") --帶多個返回值的方法 --多個返回值使用多個變量去接收,每個變量之間以逗號區別 --返回值與接收變量可以數量不一致,多退少補 func7 = function() return "a", true, 1, false end r1,r2,r3,r4 = func7() print(func7()) print(r1,r2,r3,r4) func8 = function() local z = "c" end func8() print("z:", z)
類
--類 a = {1,2,3,4,5,67,78} --遍歷 for i = 1, #a do print(a[i]) end for key, value in ipairs(a) do print("key", key) print("value", value) end b = {1,2,4,5,[-1] = 5, ["key"] = "key", key1 = true} --ipairs()這種方式只能比哪裏出數值類型 for key, value in ipairs(b) do print("key", key) print("value", value) end --pairs()這種方式能全部遍歷出鍵和值 for key, value in pairs(b) do print("key", key) print("value", value) end局部變量和全局變量 一般情況下,定義的變量都是全局的變量,包括方法內定義的 如果變量前多了local關鍵字,那麽證明該變量局部的變量
--lua8 print("開始執行Lua8") local lua8 = {} lua8.const = 10 function lua8.func1() print("func1") end lua8.func2 = function() print("lua8.func2") end function lua8.func3() print("lua8.func3") end print("結束執行Lua8") return lua8
--lua10 print("開始執行Lua10") local lua8 = {func4 = function() print("func4") end, key = 10} lua8.const = 20 function lua8.func1() print("Lua10.func1") end lua8.func2 = function() print("Lua10.func2") end function lua8.func3() print("Lua10.func3") end print("結束執行Lua10") return lua8
Lua11.lua文件,在根目錄下的Lua文件夾下
--Lua11 print("開始執行Lua11")
--require("Lua8") --require(‘Lua8‘) lua10 = require‘Lua10‘ lua8 = require‘Lua8‘ --func() print(lua8.const) print(lua10.const) lua8.func3() lua10.func3() --package.path 裏存儲的都是require所能執行的lua的文件路徑 --print(package.path) --package.path = package.path .. ";D:\\LuaProject\\Lua\\?.lua" --..\\上級目錄,.\\文件的當前目錄 package.path = package.path .. ";.\\Lua\\?.lua" print(package.path) require‘Lua11‘元表:改變規則的 Setmetatable(a, b)--把b設置成a的元表 Getmetatable(a)--返回a的元素 原方法的名字 算數類:__add(加)__sub(減)__mul(乘)__div(除)__unm(相反數)__mod(取余)__pow(求冪) 訪問類:__index(查詢)__newindex(修改table的字段) 關系類:__eg(等於)__lt(小於)等等
tab1 = {"tab1", "111", ‘222‘} tab2 = {"tab2", 11, true} Set = {__add = function(t1, t2)--__add原方法 for k1, v1 in pairs(t1) do print(k1, v1) end print("--------------") for k1, v1 in pairs(t2) do print(k1, v1) end return "Set" end} setmetatable(tab2, Set)--設置元表,把Set這個表設置成tab1的元表 t = tab1 + tab2 --當兩個表進行相加操作時,先判斷兩個表是否有元表? --如果兩個表都沒有元表,兩個表不能進行相加操作 --如果兩個表任意一個表有元素 --再判斷元表內是否有__add的元方法 --如果元表裏沒有__add的元方法,不會執行,報錯 --如果有__add的元方法,那麽兩個表可以相加 --並且相加的結果,就是__add的返回值 --__add的參數1是加號左邊的表,參數2是加號右邊的表 print(t) tab = getmetatable(tab2) print(tab) print("--------------") tab3 = {key = "k1"} Set1 = {__index = function(t1, key) print(type(t1)) for k1, v1 in pairs(t1) do print(k1, v1) end print(type(key), key) return "Set1" end} setmetatable(tab3, Set1) --當你要訪問一個鍵對應值時,先判斷這個表中有沒有這個鍵,如果有就返回這個鍵對應的值 --如果這個表沒有這個鍵,先判斷這個表有沒有元表 --如果有元表,再判斷這個元表有沒有__index的元方法 --如果有,訪問的值就是這個__index返回的值 --__index裏的參數1:表,參數2:要訪問的鍵名 print(tab3.key1)補充內容 邏輯運算符: VS編譯:Ctrl + Shift + B fixedDuration:固定過渡,不許打斷
public float length { get; }//動畫播放時長 public float normalizedTime { get; }//動畫當前規範化時間,1是動畫結尾,0.5是動畫中間 public bool IsName(string name); public bool IsTag(string tag);
public class SkillOverStateBehaviour : StateMachineBehaviour { // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //PlayerController pc = animator.GetComponent<PlayerController>();//獲取動畫組件身上的腳本 //pc.atkID = 0;//把腳本裏的atkID歸零 //animator.SetInteger("skillID", 0);//把animator面板裏的skillID歸零 animator.SetInteger("skillID", 0); } }
using UnityEngine; using System.Collections; using System.Collections.Generic; public class PlayerControl : MonoBehaviour { Animator anim; private void Awake() { anim = GetComponent<Animator>(); } private void Start() { } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { AnimatorStateInfo animSta = anim.GetCurrentAnimatorStateInfo(0); if (animSta.IsName("skill1") && animSta.normalizedTime > 0.3f) { anim.SetInteger("skillID", 2); } else if(animSta.IsName("skill2")) { anim.SetInteger("skillID", 3); } else if(animSta.IsName("skill3")) { anim.SetInteger("skillID", 4); } else if(animSta.IsName("skill4")) { anim.SetInteger("skillID", 5); } else if(animSta.IsName("skill5")) { anim.SetInteger("skillID", 6); } else if(animSta.IsName("skill6")) { anim.SetInteger("skillID", 0); } else { anim.SetInteger("skillID", 1); } } } }
Unity3D學習筆記(三十):Lua