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);

image

表映射接口

  • 如果要通过接口获取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();
}
}

image

注意!与以往的表映射不同,表映射接口是浅拷贝!也就是引用拷贝
所有映射出来的接口都是引用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);

image

嵌套声明几乎和类一致,无非是要遵循接口的规则