UH2S2L9——表映射到接口
映射到Lua特性
[CSharpCallLua]
,当自己声明的委托要接收lua中的函数,以及自己声明的接口映射Lua中的表时,都需要加上此特性
使用该特性后,点击Xlua中的生成代码(Generate Code),以上声明的委托或者接口才会生效
该特性有不在类声明前添加也可以使用的方法,对不能直接修改代码的类也有效,详见:让系统类型和Lua能互相访问
1 2 3 4 5 6 7 8 9 10 11 12
| [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 { get; set; } }
[CSharpCallLua] public delegate void CustomCall5(string a, params int[] args);
|
表映射接口
- 如果要通过接口获取Lua中表的内容,就自定义一个对应的接口
接口中的变量都用属性去声明,多了少了无所谓,会忽略
- 注意:接口前面一定要加上特性
[CSharpCallLua]
一定要点击Xlua中的生成代码,如果接口结构改了,一定要先清除再生成
- 引用拷贝,改了接口对象中的值,对应Lua表中的值也会改变
先在Lua脚本声明如下内容
1 2 3 4 5 6 7 8 9
| TestClass = { testInt = 2, testBool = true, testFloat = 1.2, testString = "123", testFun = function() print("123123123") end, }
|
再在C#脚本中声明对应的接口
C#的接口是不能声明成员变量的,但是我们可以声明对应的属性
如同自己声明的委托接收Lua全局函数那样,接口映射表同样也需要添加 [CSharpCallLua]
,并Generate Code
这个自定义接口中的属性可以更多也可以更少,但是每次修改接口结构必须要先Clear Generate Code,再重新Generate Code!
1 2 3 4 5 6 7 8 9
| [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 { get; set; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class L8_CallInterface : MonoBehaviour { void Start() { LuaManager.Instance.Init(); LuaManager.Instance.DoLuaFile("Main");
ICSharpCallInterface obj = LuaManager.Instance.Global.Get<ICSharpCallInterface>("TestClass"); Debug.Log(obj.testInt); Debug.Log(obj.testBool); Debug.Log(obj.testFloat); Debug.Log(obj.testString); obj.testFun(); } }
|
注意!与以往的表映射不同,表映射接口是浅拷贝!也就是引用拷贝
所有映射出来的接口都是引用Lua的表的,这意味着通过接口的属性修改值将会影响Lua的表中的值!
1 2 3 4 5 6 7 8 9 10 11 12 13
| LuaManager.Instance.Init(); LuaManager.Instance.DoLuaFile("Main");
ICSharpCallInterface obj = LuaManager.Instance.Global.Get<ICSharpCallInterface>("TestClass"); Debug.Log(obj.testInt); Debug.Log(obj.testBool); Debug.Log(obj.testFloat); Debug.Log(obj.testString); obj.testFun();
obj.testInt = 10000; ICSharpCallInterface obj2 = LuaManager.Instance.Global.Get<ICSharpCallInterface>("TestClass"); Debug.Log(obj2.testInt);
|
嵌套声明几乎和类一致,无非是要遵循接口的规则