UH2S2L18——特殊问题
UH2S2L18——特殊问题
二维数组遍历
先在C#脚本内声明如下内容
12345678910public class Lesson8{ public int[,] array = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } }; public void SetValue(int[,] array, int value, int index1, int index2) { array[index1, index2] = value; }}
获取长度
二维数组的获取某个列或者行的长度是通过GetLength()来获取的,Lua中也可以调用该方法
12345local obj = CS.Lesson8()--获取长度print("行: " .. obj.array:GetLength(0))print(" ...
UH2S2L17——Lua调用委托和事件
UH2S2L17——Lua调用委托和事件
调用委托
委托在Lua中和C#中商业差不多,唯一需要注意的是,当委托为空时不能直接加,要用=,之后才能加
事件的方法加减需要使用这种格式对象:事件名("+/-", 函数变量),且不能直接清空,必须要在C#类里执行实现清空方法再通过Lua调用
先在C#脚本内声明如下内容
12345678910111213public class Lesson7{ //申明委托和事件 public UnityAction del; public event UnityAction eventAction; public void DoEvent() { if (eventAction != null) eventAction(); }}
委托是用来装函数的,使用C#中的委托,就是用来装lua函数的
向委托添加函数
Lua中没有复合运算符 不能+=,如果第一次往委托中加函数 因为是nil,不能直接+,所以第一次,要先等 ...
UH2S2L16——Lua调用重载函数
UH2S2L16——Lua调用重载函数
本章代码关键字
12typeof(CS.类名):GetMethod(方法名, {参数列表}) --反射获取类的方法信息,通过xlua的方法可以转化为函数xlua.tofunction() --xlua提供的将通过反射获取的方法信息转化为函数的方法
调用重载函数
先在C#脚本内声明如下内容
12345678910111213141516171819202122public class Lesson6{ public int Calc() { return 100; } public int Calc(int a, int b) { return a + b; } public int Calc(int a) { return a; } public float Calc(float a) ...
UH2S2L15——Lua调用带out和ref的函数
UH2S2L15——Lua调用带out和ref的函数
调用带out和ref的函数
多个out,ref参数用多返回值接收
out参数
注意:out在Lua中不算参数如果有返回值 第一个返回值就是返回值 之后依次返回out
ref参数
注意:ref和out不同,在Lua中算参数,我们必须传入一个值
先在C#脚本内声明如下内容
1234567891011121314151617181920212223public class Lesson5{ public int RefFun(int a, ref int b, ref int c, int d) { b = a + d; c = a - d; return 100; } public int OutFun(int a, out int b, out int c, int d) { b = a; c = d; return 200; } public in ...
UH2S2L14——Lua调用拓展方法
UH2S2L14——Lua调用拓展方法
本章代码关键字
1[LuaCallCSharp] //声明拓展方法的类必须要加上该类才能在Lua中调用,而其他Lua会调用的类也可以使用该特性,可提升性能
调用拓展方法
在Lua中调用拓展方法和使用成员方法是一致的,
但前提是,需要为拓展方法所在的类需要使用 [LuaCallCSharp] 特性,并生成代码Generate Code
12345678910111213141516171819202122[LuaCallCSharp]public static class Tools{ public static void Move(this Lesson4 obj) { Debug.Log(obj.name + "移动"); }}public class Lesson4{ public string name = "唐老狮"; public void Speak(string str) ...
UH2S2L13——Lua调用数组、List和Dictionary
UH2S2L13——Lua调用数组、List和Dictionary
本章代码关键字
123456CS.System.Array.CreateInstance() --创建数组CS.System.Collections.Generic.List() --创建列表,之后还需要再实例化才可用CS.System.Collections.Generic.Dictionary() --创建字典,之后还需要再实例化才可用字典:get_Item() --通过键获取值,在Lua里创建的字典只能用该方法字典:set_Item() --对键设置值,在Lua里创建的字典只能用该方法字典:TryGetValue() --尝试获取值,第一个返回的是是否成功获取值,第二个返回的是具体的值
调用数组
先在C#脚本内声明如下内容
123456public class Lesson3{ p ...
UH2S2L12——Lua调用枚举
UH2S2L12——Lua调用枚举
本章代码关键字
1枚举.__CastFrom() --数值或字符串转对应枚举函数
调用枚举
枚举的调用规则 和 类的调用规则是一样的,相对于类来说,枚举不存在实例化操作
使用 CS.命名空间.枚举名.枚举成员即可调用,也支持取别名
123PrimitiveType = CS.UnityEngine.PrimitiveTypeGameObject = CS.UnityEngine.GameObjectlocal obj = GameObject.CreatePrimitive(PrimitiveType.Cube)
调用自定义声明的枚举也很简单,和调用自带枚举一样调用即可CS.命名空间.枚举名.枚举成员(注意命名空间)
123456public enum E_MyEnum{ Idle, Move, Atk,}
123E_MyEnum = CS.E_MyEnumlocal c = E_MyEnum.Idleprint(c)
枚举转换相关
数值或者字符串转枚举只需要调用其__CastFrom方法即可
...
UH2S2L11——Lua调用C#类
UH2S2L11——Lua调用C#类
本章代码关键字
123456789101112131415--Lua调用C#的类CS.命名空间.类名CS.UnityEngine.类名CS.类名 --不加命名空间--实例化对象CS.命名空间.类名--静态方法与变量CS.命名空间.类名.方法CS.命名空间.类名.变量--成员方法与变量实例化对象.变量实例化对象:方法 --不要忘记加:!!!,因为Lua里表的方法想要调用表本身需要冒号--技巧别名 = CS.命名空间.类名 --该变量将执行对应的类,可以简化名称并优化性能Lua不支持无参泛型方法,因此需要使用对应的传入Type类型参数的方法
启动Lua脚本
Lua没有办法直接访问C#,一定是先从C#调用Lua脚本后,才把核心逻辑交给Lua来编写
因此需要一个Main脚本,通过它来启动一个Lua入口脚本
12345678910using UnityEngine;public class Main : MonoBehaviour{ void Start() { ...
UH2S2L10——表映射到LuaTable
UH2S2L10——表映射到LuaTable
本章代码关键字
1234LuaTable //可以用于映射Lua中表的一种类,是引用拷贝,建议少用,因为会产生垃圾luaTable.Get<>() //获取表中的变量luaTable.Set<>() //修改表中的变量,会影响Lua中的表的值luaTable.Dispose() //销毁luaTable,若不销毁,则将一直占用内存!
LuaTable
我们在C#脚本里调用Lua解析器的_G表时,其实我们就是在对其返回的LuaTable操作
同样的,我们可以用LuaTable来获取Lua中的表
先在Lua脚本声明如下内容
123456789TestClass = { testInt = 2, testBool = true, testFloat = 1.2, testString = "123", testFun = function() print("123 ...
UH2S2L9——表映射到接口
UH2S2L9——表映射到接口
映射到Lua特性
[CSharpCallLua],当自己声明的委托要接收lua中的函数,以及自己声明的接口映射Lua中的表时,都需要加上此特性
使用该特性后,点击Xlua中的生成代码(Generate Code),以上声明的委托或者接口才会生效
该特性有不在类声明前添加也可以使用的方法,对不能直接修改代码的类也有效,详见:让系统类型和Lua能互相访问
123456789101112[CSharpCallLua]public interface ICSharpCallInterface{ public int testInt { get; set; } public bool testBool { get; set; } public float testFloat { get; set; } public string testString { get; set; } public UnityAction testFun ...