Lua
Lua语言
心前阳光
天助自助者
展开
-
XLua使用C#泛型函数
Lua只能使用有参数、有class约束的泛型函数没有参数、没有类约束的泛型函数不能直接使用间接使用方法使用限制:支持Mono打包il2cpp打包时 泛型函数的参数是引用类型才可以使用如果参数是值类型 要确保值类型的泛型函数已经在C#中使用过语法:local genericFun=xlua.get_generic_method(类名,方法名)//获取泛型函数local fun=genericFun(参数类型)//指定参数类型例如:local testFun2 =xlua.get_gen原创 2021-11-11 10:01:32 · 536 阅读 · 0 评论 -
Xlua 使用Unity协程
xlua开启和关闭协程和Untiy中使用一致协程开启传入函数时候需要使用util=require(“xlua.util”) xlua工具表lua中没有yield rerurn 但可以使用coroutinue.yield(CS.UnityEngine.WaitForSeconds(1))实例:--xlua工具表util=require("xlua.util")Wait=CS.UnityEngine.WaitForSecondslocal obj=CS.UnityEngine.GameObjec原创 2021-11-09 10:25:58 · 3154 阅读 · 0 评论 -
XLua 为系统类型加特性
C#public static class Lesson10{ [CSharpCallLua] //为系统类型的委托UnityAciton<float>添加特性 再生成代码 public static List<Type> cSharpCallLuaList = new List<Type>() { typeof(UnityAction<float>) };}lua拖动滑块 lua打印滑块数值local slider原创 2021-11-09 09:55:54 · 143 阅读 · 0 评论 -
XLua nil与null
null与nil无法比较,进行判空解决方法1C#对象.Equals(nil)方法2Lua中封装全局方法:function IsNull() if obj==nil or obj:Equals(nil) then return trueend return falseend方法3C#中封装拓展方法[LuaCallCSharp]public static class Lesson09{ public static bool IsNull(this object原创 2021-11-08 10:21:02 · 551 阅读 · 0 评论 -
XLua使用C#二维数组
C#public class Lesson08{public int[,] array = new int[2, 2] { { 1, 2 }, { 3, 4 } };}lua长度local obj=CS.Lesson08()tl=obj.array:GetLength(0)–行tl=obj.array:GetLength(1)–列获取数值print(obj.array:GetValue(0,0))遍历for i=0,obj.array:GetLength(0)-1 do for原创 2021-11-08 09:58:22 · 395 阅读 · 0 评论 -
XLua使用委托、事件
C#public class Lesson07{ public UnityAction delAction; public event UnityAction eventAction; public void UseEvent() { eventAction?.Invoke(); } public void ClearEvent() { eventAction = null; }}Lua使用C#委托原创 2021-11-08 09:39:50 · 1444 阅读 · 0 评论 -
XLua使用C#重载函数
C#public class Lesson06{ public int Calc(int a) { return a; } public float Calc(float a) { return a; }}Lualocal obj=CS.Lesson06()print(obj:Calc(10)) 返回10print(obj:Calc(10.2))**返回0**重载函数 个数相同 精度不同 在lua中会出错lua只有number一种数值类型 C#有多种解原创 2021-11-05 09:48:16 · 495 阅读 · 0 评论 -
XLua使用带有ref或out修饰的函数
C#public class Lesson5{public int RefOutFun(int a, out int b, ref int c) //三个返回值{ b = a;c = b+c;return 3;}}Lua1. local a1,b1,c1=CS.Lesson5().RefOutFun(2,4)print(a1) 3print(b1) 2print(c1) 62. local a,b,c=CS.Lesson5().RefOutFun(2)print(a1) 3pri原创 2021-11-04 10:50:13 · 931 阅读 · 0 评论 -
XLua使用C#拓展方法
C#public class Lesson4{public string name="小兔";public void Speak(){ Debug.Log("你好"); }public static void Eat(){ Debug.Log("吃"); }}//lua中使用拓展方法 加特性 然后点击 Xlua——>生成代码[LuaCallCSharp]public static class Tools{public static void Move(this Lesson4 obj原创 2021-11-04 10:02:23 · 425 阅读 · 0 评论 -
XLua使用C#数组、列表、字典
C#:public class Lesson3{ public int[] array = new int[] { 1, 2, 3, 3 }; public List<int> list = new List<int>(); public Dictionary<int, string> dic = new Dictionary<int, string>();}数组获取local obj=CS.Lesson3() 获取对象原创 2021-11-04 09:27:25 · 3559 阅读 · 1 评论 -
XLua使用C#枚举
使用Unity自带枚举CS.命名空间.枚举.枚举名例如:PrimitiveType=CS.UnityEngine.PrimitiveTypeGameObject =CS.UnityEngine.GameObjectlocal obj=GameObject.CreatePrimitive(PrimitiveType.Cube)使用自定义枚举C#:public enum TestEnum{ english,math}Lua:print(CS.TestEnum.english);其他类型转枚.原创 2021-11-02 09:37:59 · 1473 阅读 · 0 评论 -
XLua脚本中使用C#类
通过CS关键字获取Unity类CS.命名空间.类名()例如:CS.UnityEnging.GameObject()使用静态成员CS.UnityEngine.GameObject.静态方法使用成员方法 要使用冒号:CS.UnityEnging.GameObject():Translate(CS.UnityEngine.Vector3.right)获取自定义类CS.类名()CS.命名空间.类名()添加Mono类Mono类不能自己newXlua提供typeof 方法获取类的Type原创 2021-11-01 10:16:13 · 483 阅读 · 0 评论 -
XLua表映射到LuaTable
lua 脚本testClass ={ testInt=2, testBool=true, testString="qwe", testFloat=1.2, testFun=function() print("123456") end}映射到C#LuaTable table = LuaMgr.GetInstance().Global.Get<LuaTable>("testClass");print(table.Get<int>("testInt")).原创 2021-10-29 14:09:13 · 472 阅读 · 0 评论 -
XLua 表映射为接口
Lua脚本testClass ={ testInt=2, testBool=true, testString="qwe", testFloat=1.2, testFun=function() print("123456") end}C# 接口/// <summary>/// 接口中不允许成员变量 使用属性 接收Lua映射/// 接口属性默认公有 不需要修饰符/// 接口拷贝是引用拷贝 修改接口中的值 lua脚本中的值也会改变/// 接口需要加[CShar.原创 2021-10-29 10:05:04 · 230 阅读 · 0 评论 -
XLua 表映射为类
Lua 表 模拟类testClass ={ testInt=2, testBool=true, testString="qwe", testFloat=1.2, testFun=function()//无参数 无返回值 print("123456") end}C#类映射public class CallLuaClass{ //命名一致 公有 public int testInt; public bool testBool; public s.原创 2021-10-29 09:45:14 · 158 阅读 · 0 评论 -
XLua表映射为List、Dictionary
Lua的表中没有自定义索引 映射为ListtestList={1,2,3,3}--同类型testList2={1,"e"}--不同类型映射 List<int> li = LuaMgr.GetInstance().Global.Get<List<int>>("testList"); List<object> li2 = LuaMgr.GetInstance().Global.Get<List<object>>("tes.原创 2021-10-28 09:46:22 · 405 阅读 · 0 评论 -
XLua 获取全局函数
使用C#委托存放Lua函数自定义委托Unity中的委托UnityActionC#自带ActionLua委托LuaFunction2. 自定已委托需要加特性[CSharpCallLua],在Unity 编辑器中点击XLua Generate Code原创 2021-10-28 09:13:03 · 166 阅读 · 0 评论 -
XLua获取全局变量
Lua解析器中的Global类似lua中的_G表,可获取lua中的全局变量C# 获取Lua全局变量Get泛型方法 参数 Lua脚本中的变量名int testNumber = LuaMgr.GetInstance().Global.Get(“testNumber”);C#设置Lua全局变量值Set泛型方法 参数1 Lua脚本中的变量名 参数2 变量值LuaMgr.GetInstance().Global.Set(“testNumber”, 16);使用Global 不能获取Lua脚本的本地变量原创 2021-10-25 09:47:25 · 301 阅读 · 0 评论 -
XLua 设置加载lua脚本的路径
AddLoader方法AddLoader的参数为委托类型 执行lua语言时 自动执行传入的函数该方法可设置加载lua脚本的路径 并且不用修改lua后缀使用例子using System.IO;using UnityEngine;using XLua;void Start(){LuaEnv env = new LuaEnv();env.AddLoader(MyCustomLoader);//设置自定义加载函数env.DoString(“require(‘Main’)”);}//使用.原创 2021-10-21 10:30:39 · 772 阅读 · 0 评论 -
XLua之 解析器
引用命名空间using XLua;创建解析器LuaEnv env = new LuaEnv();//一般情况下 只需要一个 保持唯一性执行lua语言Dostring方法执行lua语言env.DoString(“print(‘你好世界!’)”);垃圾回收帧更新中定时执行或切换场景时执行env.Tick();销毁lua解析器env.Dispose();执行lua脚本Resources中放lua脚本 且lua脚本后缀改为txt例如 hello.lua 改为 hello.lua.txt.原创 2021-10-20 10:15:57 · 192 阅读 · 0 评论 -
Lua垃圾回收
获取当前lua占用内存数 单位KBprint(collectgarbage(“count”))垃圾回收 类似GCcollectgarbage(“collect”)原创 2021-10-19 10:02:00 · 81 阅读 · 0 评论 -
Lua自带库
时间系统时间print(os.time())时间转换print(os.time({year=2021,month=10,day=19}))当前时间os.date("*t")for k,v in pairs(os.date("*t")) doprint(k,v)end数学绝对值print(math.abs(-11))弧度转角度print(math.deg(math.pi))三角函数print(math.cos(math.pi))向下去整print(math.floor原创 2021-10-19 09:45:26 · 97 阅读 · 0 评论 -
Lua封装、继承
使用表模拟封装Object={age=18}构造函数function Object:new()local obj={}–新建的表作为本地变量setmetatable(obj,self)self.__index=self;–子表没有的属性或方法 可在元表中查找return objend成员方法function Object:Test()print(self.age)end新建类(表)local obj=Object:new()print(obj.age) 18obj:Test.原创 2021-10-18 09:28:18 · 454 阅读 · 0 评论 -
Lua 元表
作用子表执行特定操作 会执行元表中的方法元表类似子表的父亲元表是表元表设置和获取meta={}myTable={}参数1子表 参数 2 元表setmetatable(myTable,meta)参数 子表getmetatable(myTable)元表特定操作__tostring 注意:前面两个下划线meta2={当子表作为字符串使用时候 会调用该方法__tostring=function()return “tostring”end}myTable2={}setme原创 2021-10-14 11:23:37 · 49 阅读 · 0 评论 -
Lua 协程
创建fun=function()print(123)end方式1co=coroutine.create(fun)print(type(co))–返回值是thread方式2co1=coroutine.wrap(fun)print(type(co1))–返回值是function使用coroutine.resume(co)- -执行方式1创建的协程co1()----执行方式2创建的协程挂起fun2=function()local i=1while true doprint(i).原创 2021-10-13 10:31:16 · 305 阅读 · 0 评论 -
Lua特殊用法
多变量赋值依次赋值a,b,c=1,2,“3”print(a…b…c)- -123值的数量少于变量的数量 多的变量赋值为nila,c=1print(a)- -1print©–nil值的数量多于变量的数量 多余的值省略a,c=1,2,3print(a)- -1print©- -2函数多返回值function F()return 1,2,“3”enda,b,c= F()print(a…b…c)–123and orand or 可以连接任何东西and 有假则假 or .原创 2021-10-12 10:00:44 · 85 阅读 · 0 评论 -
Lua多脚本执行
全局变量与本地变量name=“小红”–全局local age=“11”–本地 添加了local 关键字多脚本执行require(“脚本名”)–加载其他脚本 可以访问该脚本的全局变量另外可以使用return关键字返回该脚本的本地变量例如:加载的脚本 load.luak=5return k测试脚本 test.lualocal a=require(“load”)print(a)- -5脚本卸载加载过的脚本 再次加载不执行package.loaded[脚本名]- -判断脚本是否执行过原创 2021-10-11 10:27:58 · 413 阅读 · 0 评论 -
Lua表的公共方法
插入t1={{age=1,name=“q”},{age=2,name=“q”}}t2={name=“wqe”,sex=true}print(#t1)- -2table.insert(t1,t2);–t2插入t1print(#t1)- -3删除删除表的最后一个元素table.remove(t1)print(t1[3])- -nil删除2指定索引元素 参数二代表索引t3={1,2,3,0,-1}table.remove(t3,1)print(t3[1])- -2排序table..原创 2021-10-06 10:16:23 · 149 阅读 · 0 评论 -
Lua实现类
声明类Student={age=11,sex=true,Up=function()print(Student.age) end}使用print(Student.age)Student.Up()类外添加变量Student.name=“小红”类外添加函数Student.Speak=function()print(“你好”)end或者function Student:Speak2()print(self.name)end调用Student:Speak2()Studen.原创 2021-10-06 09:38:22 · 79 阅读 · 0 评论 -
Lua 实现字典
声明a={[“name”]=“小红”,[“age”]=15,[“1”]=1}访问print(a[“name”])print(a[“age”])访问2 key为数值类型的字符串时 不能访问print(a.name)print(a.age)修改a.name=“小宝”print(a.name)增加 添加新的键a[“class”]=“12”print(a.class)移除a[“class”]=nilprint(a.class)遍历for k,v in pairs(a) dop.原创 2021-10-04 09:53:57 · 2728 阅读 · 0 评论 -
Lua 迭代器
“#” 获取的数组长度不准确a={[0]=1,2,[-1]=3,4,5,[5]=4}ipairs迭代器遍历索引和值for index,value in ipairs(a) doprint(index…"\"…value)end遍历索引for key in ipairs(a) doprint(key)endipairs 索引1开始 只能找到连续索引 不能找到索引<=0的pairs迭代器遍历索引和值for key,value in pairs(a) doprint(原创 2021-09-23 19:14:36 · 100 阅读 · 0 评论 -
Lua 数组
使用表构建数组一维数组声明a={1,1,1,"a’,true,nil}遍历#a 获取长度for i=1,#a doprint(a[i])end注意使用#获取数组长度时 遇到nil 返回的长度为nil之前的元素个数lua数组索引从 1 开始a={5,1,1,1,nil}print(a[0])–索引o值为nilprint(a[1])–1print(#a)–长度二维数组表中含表声明a={{1,2,3},{4,5,6}}print(a[1][3])–表1第三个元素遍历原创 2021-09-23 18:42:23 · 614 阅读 · 0 评论 -
Lua 函数
格式function 函数名([变量]) 语句 endF1=function([变量]) 语句 end函数声明的下方 可以使用函数无参数 无返回值function F1()print(1)end有参数 无返回值function F2(a,b)–不需要指定类型print(a+b)end有参数 有返回值function F3(a)return aendfunction F4(a,b)return a+b,a-bendt1,t2=F4(1,1)注意返回多个参数的时原创 2021-09-23 17:12:03 · 79 阅读 · 0 评论 -
Lua循环
while 条件 do 语句 endnum=0; while num <5 do num=num+1; print(num) endrepeat 语句 until 结束条件repeat num=num+1; print(num) until num>5for 变量=开始值,结束值,变量自增值 do 语句 end for i=1,5,2 do --i每次增加2 print(i) end...原创 2021-09-23 14:42:21 · 57 阅读 · 0 评论 -
Lua 条件分支语句
lua中没有switch语句单分支if 条件 then 语句 endif a>7 then print("123") end双分支if 条件 then 语句else 语句 endif a<7 then print(12) else print(123) end多分支if 条件 then 语句elseif 条件 then 语句elseif 条件 then 语句…else 语句 endif a==7 then print(7) elseif a==9 then原创 2021-09-22 18:29:02 · 149 阅读 · 0 评论 -
Lua运算符
算数运算符有+ - * / %没有自增自减 ++ –没有复合运算符 +=数值类型的字符串与number相加 会自动转换为number类型 print(“123.1”+1);–124.1–幂运算 2^5 2的5次方条件运算符< > >= <= == ~=(不等于)逻辑运算符and与 or或 not逻辑非print(1~=2 or 1==1) trueprint(not (1==2)) trueand or 支持短路位运算符不支持位运原创 2021-09-21 09:38:40 · 225 阅读 · 0 评论 -
Lua字符串
str=“123字符串”长度print(#str)--一个汉字占三个长度-- --英语字符一个长度--多行打印print(“123\n123”)str=[[我是小白]]字符串拼接print(string.format(“123%d”,int));–%d 与数字拼接––%a 与任意字符拼接–%s 与字符拼接–其他类型转字符串tostring(a)print(a)字符串公共方法小写转大写str=“aBd”print(string.upper(str))–返回一个新的字原创 2021-09-20 09:34:09 · 69 阅读 · 0 评论 -
Lua变量类型
注释–单行注释–[[多行注释1]]–[[多行注释2]]––[[多行注释3–]]lua可以省略分号简单变量类型nil nullnumber 数值类型string 字符串boolen bool复杂数据类型函数 function表 table数据结构 userdata协同程序 thread注意变量声明 不需要指定变量类型lua中的一个变量可以随便赋值不同类型的数据未声明的变量 默认值为nil通过type函数可以获取变量的类型type函数 返回值是stri原创 2021-09-10 10:53:52 · 563 阅读 · 0 评论