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