热更新使用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");
输出:
