xLua中C#呼叫Lua

小紫蘇xw發表於2021-10-11

C#呼叫Lua

一.前提

這裡使用的是XLua框架,需要提前配置xlua,設定載入器路徑;

可以參考之前的Blog:《xlua入門基礎》

二.C#呼叫Lua全域性變數

lua中所有的全域性變數都會存在一個表中,對應xLua中的Global,通過lua直譯器返回出來;

通過Global的方法Get<型別>(key)呼叫;

--Lua程式碼
num = 199
name = "littlePerilla"
hp = 2112.121
active = true
//c#程式碼
private void Start()
{
	XluaEnv.I.DoString("CSharpCallVariable");
	LuaTable golbal = XluaEnv.I.Golbal();

	int id = golbal.Get<int>("num");
	string name = golbal.Get<string>("name");
	float hp = golbal.Get<float>("hp");
	bool active = golbal.Get<bool>("active");

	Debug.Log(id + "," + name + "," + hp + "," + active);
}

呼叫lua中區域性變數,通過table呼叫;

三.C#呼叫Lua全域性方法

呼叫lua中方法和呼叫變數方式相同,返回值為委託型別;

1.無引數方法

--Lua程式碼
func = function ()
	print("lua函式")
end
 Action act1 = golbal.Get<Action>("func");
 act1();

2.帶引數方法

--Lua程式碼
func2 = function(mName)
	print(mName)
end
[CSharpCallLua]
public delegate void Func2(string name);

private void Start()
{
	Func2 act3 = golbal.Get<Func2>("func2");
	act3("littlePerilla");
}

3.多返回值

--Lua程式碼
func1 = function()
	return 1,2,3
end	

1)使用委託

[CSharpCallLua]
public delegate void Func(out int a, out int b, out int c);

private void Start()
{
	Func act3 = golbal.Get<Func>("func1");
    int a,b,c;
	act3(out a,out b,out c);
}

2)使用LuaFunction

LuaFunction act2 = golbal.Get<LuaFunction>("func1");
object[] objs = act2.Call();
foreach (var obj in objs)
{
    Debug.Log(obj);
}

坑:這裡使用委託必須要加[CSharpCallLua]特性,但是有時候加了也會失效,可能是xlua版本和Unity版本相容問題;

四.C#呼叫Lua表

Lua中的table相當於C#中的類,呼叫表也就是呼叫類;

--lua程式碼
tabe = {}

tabe.name = "littlePerilla"
tabe.hp = 100

tabe.attack = function (self)
	return "展開了攻擊"
end

tabe.jump = function(self)
	self = tabe
	print(self.name.."跳了起來")
end

通過Class對映

[CSharpCallLua]
public class Role
{
    [CSharpCallLua]
    public delegate string Func1();
    [CSharpCallLua]
    public delegate void Func2();
    
    public string name;
    public int hp;
    public Func1 attack;
    public Func2 jump;
}

public class CSharpCallTable:MonoBehaviour
{
    private void Start()
    {
        XluaEnv.I.DoString("CSharpCallTable");
        LuaTable global = XluaEnv.I.Golbal();
        
        //通過table和c#中類對映來呼叫
		Role core = global.Get<Role>("tabe");
		core.name = "SuperPerilla";
		Debug.Log(core.name+","+core.hp);
		Debug.Log(core.attack());
		core.jump();
    }
}

通過LuaTable

public class CSharpCallTable:MonoBehaviour
{
    private void Start()
    {
        XluaEnv.I.DoString("CSharpCallTable");
        LuaTable global = XluaEnv.I.Golbal();
        
        //通過C#中luatable型別呼叫
		LuaTable core2 = global.Get<LuaTable>("tabe");
		core2.Set<string, string>("name", "SuperPerilla"); 
		Func<string> osp = core2.Get<Func<string>>("attack");
		Debug.Log(osp());
		Action jump = core2.Get<Action>("jump");
		jump();
    }
}

坑:這兩個列印結果明顯不同,通過類對映呼叫,修改類物件的欄位後,再呼叫lua方法,方法中使用了該欄位,發現欄位值並沒有改變,這應該是和lua中self的賦值有關係;

建議使用LuaTable來呼叫lua中的table;

相關文章