热更新中的lua与c#

    xiaoxiao2021-03-26  20

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

    输出:

    转载请注明原文地址: https://ju.6miu.com/read-659634.html

    最新回复(0)