UH2S3L11——Lua调用数组、List和Dictionary
UH2S3L11——Lua调用数组、List和Dictionary
本章代码关键字
1234System.Array.CreateInstance() --创建数组System.Collections.Generic.List_泛型参数() --创建列表,需要先在CustomSetting中去添加对应类型System.Collections.Generic.Dictionary_键泛型参数_值泛型参数() --创建字典,需要先在CustomSetting中去添加对应类型字典:TryGetValue() --尝试获取值,以字符串为键的的字典只能通过该方法获取值
Lua调用C#数组
假设我们要调用下面这个数组
1234public class Lesson3{ public int[] array = new int[5] { 1, 2, 3, 4, 5 }; ...
UH2S3L12——Lua调用枚举
UH2S3L12——Lua调用枚举
本章代码关键字
123tostring() --枚举转字符串,传入要转换的枚举值枚举值:ToInt() --枚举值转数字枚举.IntToEnum() --数字转枚举值,传入数字
Lua调用C#枚举
假设我们要调用下面这个枚举
123456789101112//枚举#region Lesson2 Enum/// <summary>/// 自定义测试枚举/// </summary>public enum E_MyEnum{ Idle, Move, Atk,}#endregion
调用Unity当中的枚举,枚举的调用规则 和 类的调用规则是一样的,
即命名空间.枚举名.枚举成员,也支持取别名
同样,如果报错,需要在CustomSetting中去加上 然后生成代码
xLua的区别是,没有提供字符串转枚举的功能
调用Unity自带的枚举
1234PrimitiveType = UnityEngine.PrimitiveTy ...
UH2S3L10——Lua调用C#类
UH2S3L10——Lua调用C#类
本章代码关键字
1LuaBinder.Bind() //Lua使用Unity中的类相关必须要执行该方法,传入正在使用的lua解释器
123456789101112131415--Lua调用C#的类命名空间.类名UnityEngine.类名类名 --不加命名空间--实例化对象命名空间.类名--静态方法与变量命名空间.类名.方法命名空间.类名.变量--成员方法与变量实例化对象.变量实例化对象:方法 --不要忘记加:!!!,因为Lua里表的方法想要调用表本身需要冒号--技巧别名 = 命名空间.类名 --该变量将执行对应的类,可以简化名称并优化性能Lua不支持无参泛型方法,因此需要使用对应的传入Type类型参数的方法
初始化Lua调用C#类相关
toLua的解析器如果要使用C#类相关,必须要使用调用LuaBinder.Binder()方法,并传入当前正在使用的Lua解析器
1LuaBinder.Bind(luaState); //Lua使用Unity中的类相关
Lua调用 ...
UH2S3L9——使用toLua提供的协程
UH2S3L9——使用toLua提供的协程
本章代码关键字
12LuaLooper //toLua在使用协程前,必须要在场景上的某个游戏对象上挂载该脚本,并关联当前正在运行的解析器luaLooper.luaState //如果要让lua解析器的可以执行协程,就必须要先将解析器与关联到luaLooper.luaState上
1234-- 以下是toLua为我们提供的协程方法,原本的Lua里不存在这些方法coroutine.start() --将某个函数作为协程开启,返回协程变量coroutine.wait() --挂起协程,输入秒数可以将协程挂起指定的一段时间coroutine.stop() --传入协程,停止某个协程
toLua提供的协程
toLua为Lua的协程添加了start,wait,stop函数,使得协程的开启、挂起、停止更加方便了
12345678910111213141516171819202122232425-- tolua协程相关的代码local coDelay = nil-- ...
UH2S3L8——访问Lua中table
UH2S3L8——访问Lua中table
本章代码关键字
12luaTable.GetLuaFunction() //获取表中的函数luaTable.GetTable<>() //获取表中的表
访问Lua中table
对于下面用table模拟的Class
1234567891011121314-- lua中的一个自定义table(模拟类)testClass = { testInt = 2, testBool = true, testFloat = 1.2, testString = "123", testFun = function() print("表中的函数打印") end, testTable = { testTableInt = 111, testTableBool = true, }}
如果要获取表中的变量,直接使用中括号索引获取即可
12345LuaTable luaTa ...
UH2S3L7——访问Lua中table表现List和Dictionary
UH2S3L7——访问Lua中table表现List和Dictionary
本章代码关键字
1234567luaState.GetTable() //获取全局table变量,为引用拷贝LuaTable //Lua的table类型luaTable[] //可以通过索引获取table的值,只支持int和string类型luaTable.ToArray() //将LuaTable转换为数组形式luaTable.ToDictTable<>() //将LuaTable转换为LuaDictTable<>形式LuaDictTable<> //toLua的table模拟字典类,可以通过它去通过键获取值,键的类型不限LuaDictEntry<> //LuaDictTable的键值对,可以通过迭代器遍历获取键与值
获取Table
和xLua的表映射为某种数据结构不同,toLu ...
UH2S3L6——全局函数获取
UH2S3L6——全局函数获取
本章代码关键字
1234567891011121314LuaFuntion //可用于装载Lua函数的类luaState.GetFunction() //通过lua解析器获取全局函数luaFunction.Call<>() //调用Lua的无返回值的函数,适用于不多于9个参数的无返回值的Lua函数luaFunction.ToDelegate<>() //将lua函数类提取到委托中lunFunction.Dispose() //销毁lua函数,防止内存泄露luaFunction.BeginPCall() //开始调用lua函数luaFunction.Push() //传入参数luaFunction.PCall() //结束参数的传入,调用函数luaFunction.CheckNumber() //获取Number类型的返回 ...
UH2S3L5——全局变量获取
UH2S3L5——全局变量获取
本章代码关键字
1luaState[] //C#可以通过tolua解析器的索引器传入全局变量名来调用全局变量
调用Lua全局变量
想要在C#中获取全局变量需要调用toLua解析器,使用[]传入全局变量名来调用全局变量
和xLua一样,我们在C#中只调用Lua的Main脚本,剩下的Lua脚本调用在Lua的Main脚本里执行
和xLua一样,我们无法调用C#的Lua的局部变量
Main.lua
123print("第一个Lua脚本执行!")-- 通过启动main时来执行脚本require("CSharpCallLua/Test")
Test.lua
123456789print("C#调用Lua的测试脚本")-- 全局变量testNumber = 1testBool = truetestFloat = 1.2testString = "123"local testLocal = 10
获取全局变量
想要在C#中获取全局变量需要调用toLua解析器,使用索引器[] ...
UH2S3L4——toLua解析器管理器
UH2S3L4——toLua解析器管理器
Lua解析器管理器要做的工作
封装管理唯一的toLua解析器,对外开放调用Lua解析器接口,在打包后可调用自定义解析规则,实现直接执行lua脚本的方法
继承单例模式基类
这里让ABManager继承了单例模式基类BaseManager<T>,作为单例模式管理器使用
基础成员与属性、初始化方法
由于toLua解析器一般是唯一的,因此使用一个私有成员变量luaState来管理这个唯一的toLua解析器
因为以后外部会经常调用luaState(主要是调用_G表内内容),因此开放只读属性LuaState使外部可以方便的调用
初始化方法会在解析器为空时实例化解析器,在打包后可调用自定义解析规则
初始化方法中需要初始化DelegateFactory,执行DelegateFactory.Init(),以便于正常使用委托
初始化方法中需要让LuaLooper挂载到自己的游戏对象上,并将管理的LuaState关联到其luaState属性上,以便于正常使用Lua协程
初始化方法中需要注册Lua协程,执行Lu ...
UH2S3L3——toLua解析器自定义解析方式
UH2S3L3——toLua解析器自定义解析方式
本章代码关键字
123AddSearchPath() //添加解析路径luaState.RemoveSeachPath() //移除指定读取的路径LuaFileUtils.ReadFile() //如果要自定义toLua解析器的解析方法,需要在继承LuaFileUtils的类里重写ReadFile()方法
自定义toLua解析路径
我们自己编写的Lua脚本,默认只能找到Assets/Lua文件夹下的,放到其子文件夹下或者其他路径下需要去指定路径
指定解析路径有以下的方式:
如果该lua脚本在Assets/Lua文件夹下的文件夹内,则可以加父目录
1luaState.Require("CSharpCallLua/L2_Loader");
使用LuaState中的方法AddSearchPath()
12luaState.AddSearchPath(Application.dataPath + "/Lua/CSharpCallL ...