熱更新中的lua與c#

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

輸出:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章