UH2S2L8——表映射到类

表映射类

  • 如果我们要将Lua中的表映射到C#中的类对象中,就声明一个对应的自定义类
    其中的成员变量命名要和Lua中表的自定义索引一致
    但是它可少可多,无非就是忽略
  • 值拷贝 改变实例化对象中的值 不会影响我们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#脚本中声明对应的类

注意!在这个类中去声明成员变量的名字一定要和Lua脚本那边的一样,且成员变量必须是公共的, 私有和保护变量没办法赋值
这个自定义类中的变量可以更多也可以更少,如果成员变量比lua中的少,就会忽略它,如果成员变量比lua中的多,即使不会赋值也会忽略

1
2
3
4
5
6
7
8
9
10
11
12
13
public class CallLuaClass
{
public int testInt;
public bool testBool;
public float testFloat;
public string testString;
public UnityAction testFun;

public void Test()
{
Debug.Log(testInt);
}
}

这样,我们就可以如调用全局变量那样获取类对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class L7_CallClass : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Main");
CallLuaClass obj = LuaManager.Instance.Global.Get<CallLuaClass>("TestClass");
Debug.Log(obj.testInt);
Debug.Log(obj.testBool);
Debug.Log(obj.testFloat);
Debug.Log(obj.testString);
obj.testFun();
obj.Test();
}
}

image

这样获取到的对象仍然是深拷贝,或者说值拷贝,修改该对象无法影响Lua中表的内容

嵌套映射

先在Lua脚本声明如下内容,嵌套一个表

1
2
3
4
5
6
7
8
9
10
11
12
TestClass = {
testInt = 2,
testBool = true,
testFloat = 1.2,
testString = "123",
testFun = function()
print("123123123")
end,
testInClass = {
testInInt = 5
}
} -- 用表模拟的类

再在C#脚本中声明对应的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CallLuaClass
{
public int testInt;
public bool testBool;
public float testFloat;
public string testString;
public UnityAction testFun;
public CallLuaInClass testInClass;

public void Test()
{
Debug.Log(testInt);
}
}

public class CallLuaInClass
{
public int testInInt;
}
1
2
3
4
5
6
7
8
9
10
public class L7_CallClass : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Main");
CallLuaClass obj = LuaManager.Instance.Global.Get<CallLuaClass>("TestClass");
Debug.Log(obj.testInClass.testInInt);
}
}

image