#C#访问Lua中的全局变量
###C#代码
luaEnv = new LuaEnv();
luaEnv.DoString("require 'CSharpCallLua'");
//获取Lua中的全局变量
string name = luaEnv.Global.Get<string>("name");
print("name:" + name);
int hp = luaEnv.Global.Get<int>("hp");
print("hp:" + hp);
bool isAlive = luaEnv.Global.Get<bool>("isAlive");
print("isAlive:" + isAlive);
###Lua代码
print("C#访问Lua中的全局变量");
hp = 100;
name = "Yuki"
isAlive = true
###输出
C#访问Lua中的全局变量
name:Yuki
hp:100
isAlive:True
#映射到class
- 对lua中的table中的变量的修改不会影响到映射到的C#中的class中的字段,反之也是。
- 这个过程是值拷贝,如果class比较复杂代价会比较大。而且修改class的字段值不会同步到table,反过来也不会。
###C#代码
luaEnv = new LuaEnv();
luaEnv.DoString("require 'CSharpCallLua'");
//映射到class
print("映射到class");
IRole role = luaEnv.Global.Get<IRole>("Yuki");
print("name:" + role.name);
luaEnv.Dispose();
class Role
{
public string name;
public int hp;
bool isAlive;
}
###Lua代码
Yuki = {
name = "Yuki", hp = 100, isAlive = true,
}
###输出
before modify hp in C#
LUA: hp in Lua is 100
after modify hp in C#
LUA: hp in Lua is 100
#映射到interface
- 类似映射到class,但是映射方式为引用。
- C#代码中访问Lua,需要在该interface上添加 [CSharpCallLua] 的特性,而Lua代码中访问C#则需要在Lua对应位置添加 [LuaCallCSharp] 的特性
###C#代码
luaEnv = new LuaEnv();
luaEnv.DoString("require 'CSharpCallLua'");
//映射到interface
print("映射到interface");
IRole role = luaEnv.Global.Get<IRole>("Yuki");
print("before modify hp in C#");
luaEnv.DoString("print('hp in Lua is ' .. Yuki.hp)");
role.hp -= 10;
print("after modify hp in C#");
luaEnv.DoString("print('hp in Lua is ' .. Yuki.hp)");
luaEnv.Dispose();
[CSharpCallLua]
interface IRole
{
string name { get; set; }
int hp { get; set; }
bool isAlive { get; set; }
}
###Lua代码
Yuki = {
name = "Yuki", hp = 100, isAlive = true,
}
###输出
before modify hp in C#
LUA: hp in Lua is 100
after modify hp in C#
LUA: hp in Lua is 90