熱更新使用lua腳本與C#腳本進行互相調用,所以首先要了解這兩種不同語言之間是如何進行調用的。
暫時版:http://pan.baidu.com/s/1eSzcSWM
重中之重,------->luainterface
引入luainterface.dll和luanet.dll庫,添加對這個兩個dll庫的引用,這是準備工作。
第一部分 在C#中使用lua解釋器
首先就是創建lua解釋器
//1. 使用lua解釋器
Lua lua = new Lua();
lua["yes"] = 34;
lua["no"] = "string value";
lua.NewTable("mytable");
Console.WriteLine(lua["yes"]);
Console.WriteLine(lua["no"]);
輸出:
調用lua解釋器中的內置函數
/*
script.lua content
print("hahaha")
*/
lua.DoString("num=2");//使用DoString創建變量
lua.DoString("str='a string'");
object[] retVals = lua.DoString("return num,str");//使用DoString返回變量值
foreach (object item in retVals)
{
Console.WriteLine(item); //print : 2 a string
}
輸出:
如何註冊C#的函數到lua解析器中
// 1.把一個類中的普通方法註冊進去
lua.RegisterFunction("NormalMethod", obj, obj.GetType().GetMethod("NormalMethod"))
lua.DoString(" NormalMethod()");
//2.把一個類的靜態方法註冊進去
lua.RegisterFunction("StaticMethod", null, typeof(ClassName).GetMethod("StaticMethod"))
lua.DoString(" StaticMethod()")
測試 //非靜態方法註冊
Program p = new Program();
Lua lua = new Lua();
lua.RegisterFunction("TestMethod", p, p.GetType().GetMethod("TestFunction"));
lua.DoString("TestMethod(1,2)");//傳入參數即可
//靜態方法註冊
//Lua lua = new Lua();
lua.DoFile("test.lua");
lua.RegisterFunction("StaticMethodTest", null, typeof(Program).GetMethod("TestFunctionTo"));//注意函數公有
lua.DoString("StaticMethodTest()");
}
//非靜態方法的註冊
public void TestFunction(int a, int b)
{
Console.WriteLine(a + b);
}
//靜態方法的註冊
public static void TestFunctionTo()
{
Console.WriteLine("this is static method...");
}
第二部分 如何在lua中調用C#
這裏需要理解的就是,我們在lua中調用C#,然後lua腳本執行也可以放在C#中使用解析器執行
lua腳本
/*
call
------------>
lua C#
<------------
excute
*/
require "luanet" --call bridge
luanet.load_assembly("luainterface learn") --use bridge call assembly.dll
GameSceneCallBack=luanet.import_type("luainterface_learn.GameScene")--call calss.
calssInit=GameSceneCallBack()
calssInit:Test()--call method.
sceneName,outValue=calssInit:Test("scene_ui/uiTask")
print(sceneName, outValue)
print(calssInit.GameSceneName)--call filed
print(calssInit.LoadPath)
源類:
/// luainterface.dll
namespace luainterface_learn//***luainterface_learn
{
class GameScene
{
private string GameSceneName = "LoginScene";
public string LoadPath = "ui/Scene_uiChat";
private void Test()
{
Console.WriteLine("this is lua test method ....");
}
string Test(string scenePath, out string SceneName)
{
SceneName = null;
Console.WriteLine("do! call scene:"+scenePath);
SceneName = "RoleSelect";
return "this is test data";
}
}
}
解析器調用
Lua lua=new Lua();
lua.DoFile("ScriptTest.lua");
輸出: