UH2S2L5——全局变量获取

本章代码关键字

1
2
3
luaEnv.Global                //获取_G表,通过它可以调用Lua脚本中的全局变量
luaEnv.Global.Get<>() //获取全局变量
luaEnv.Global.Set<>() //修改全局变量

xLua内的多脚本执行

由xLua的Lua解析器执行Lua脚本时,即使是在Lua脚本里遇到require​语句,也是由xLua帮我们处理
只要是执行lua脚本,xLua都会自动的进入我们的重定向函数中查找文件

出于这个原因,我们完全可以在Unity里只执行一个入口Main脚本,剩下的脚本启动都在Lua脚本里执行

1
2
3
4
5
6
7
8
9
10
11
using UnityEngine;

public class L3_LuaMgr : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Main");
}
}

1
2
print("主Lua脚本启动")
require("Test")
1
2
3
4
5
print("Test.lua")
TestNumber = 1
TestBool = true
TestFloat = 1.2
TestString = "123"

image

调用_G表

由于Lua中全局变量存储在_G​表内,我们可以通过Lua解析器的Global​属性来获取_G​表

1
2
3
4
5
6
7
8
9
10
11
12
public LuaTable Global
{
get
{
if (luaEnv == null)
{
Debug.LogError("Lua解析器未初始化!");
return null;
}
return luaEnv.Global;
}
}

调用全局变量

我们通过C#,无法直接获取本地全局变量

获取全局变量

通过调用_G​表,我们可以通过Get<>()​传入变量类型与变量名获取全局变量
虽然整数和浮点数在Lua里都是Number类型,但是我们根据其具体值使用合适的变量类型即可接收,
例如1.2​这个浮点数用float​和double​都可以接收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int i = LuaManager.Instance.Global.Get<int>("TestNumber");
Debug.Log("TestNumber:" + i);

bool b = LuaManager.Instance.Global.Get<bool>("TestBool");
Debug.Log("TestBool:" + b);

float f = LuaManager.Instance.Global.Get<float>("TestFloat");
Debug.Log("TestFloat:" + f);

double d = LuaManager.Instance.Global.Get<double>("TestFloat");
Debug.Log("TestFloat_double:" + d);

string s = LuaManager.Instance.Global.Get<string>("TestString");
Debug.Log("TestString:" + s);

要注意,这种方式获取的变量都是值拷贝,也就是修改接收到的变量不会影响原来的全局变量

1
2
3
4
5
int i = LuaManager.Instance.Global.Get<int>("TestNumber");
Debug.Log("TestNumber:" + i);
i = 10;
int i2 = LuaManager.Instance.Global.Get<int>("TestNumber");
Debug.Log("TestNumber:" + i2);

image

修改全局变量

我们可以通过Set<>()​传入变量名和要修改的值获取全局变量(泛型参数可忽略)

1
2
3
4
5
int i = LuaManager.Instance.Global.Get<int>("TestNumber");
Debug.Log("TestNumber:" + i);
LuaManager.Instance.Global.Set<string, int>("TestNumber", 55);
int i2 = LuaManager.Instance.Global.Get<int>("TestNumber");
Debug.Log("TestNumber_i2:" + i2);

image