转:Unity热更新专题(三)Unity热更新之LuaInterface(上)

 

1、什么是LuaInterface?

LuaInterface包括两个核心库,一个是LuaInterface.dll,一个是Luanet.dll,我们可以通过LuaInterface来完成Lua和C#(CLR)之间的互相调用。

 

2、在CLR中执行Lua代码

创建一个C#工程,导入LuaInterface中的以下两个dll文件。

 

并添加到引用。

 

修改Program.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace LuaInterface
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();//创建Lua解释器
            lua["num"] = 34;
            Console.WriteLine(lua["num"]);
            Console.ReadKey();
        }
    }
}


此时运行项目,可能会出现以下错误。

 

我们继续修改App.config文件如下:

 

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <startup useLegacyV2RuntimeActivationPolicy="true">  
    <supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/>  
    <supportedRuntime version="v2.0.50727"/>  
  </startup>  
</configuration>  


再次运行:

 

就看到我们想要看到的结果了。

这就是LuaInterface的一个简单示例。

接下来让我们继续。

 

3、在C#中执行Lua脚本文件,或者脚本字符串

 

①Dostring

在上面的工程中,修改Program.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace LuaInterface
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();                //创建Lua解释器
            lua.DoString("num=2");
            lua.DoString("str='a string'");
            object[] values = lua.DoString("return num,str");
            foreach (object obj in values)
            {
                Console.WriteLine(obj);
            }
            Console.ReadKey();
        }
    }
}

 

执行结果:


 

 

②DoFile

在原工程目录下添加myLua.lua文件

 

修改myLua.lua文件如下:

num = 2
string = "hello world"
print(string)


修改Program.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace LuaInterface
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();                //创建Lua解释器
            lua.DoFile("myLua.lua");
            Console.ReadKey();
        }
    }
}


记住先修改myLua.lua的属性:

 

 

否则可能会报出以下错误:

 

 

好了,让我们按F5看看输出结果。

 

 

结果如我们预期所料。

 

 

4、把一个C#方法注册进Lua的一个全局方法

 

①Lua和C#中类型的对应

②两个注册方法的使用

我们首先来看代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace LuaInterface
{
    class Program
    {
        public void CLRMethod()
        {
            Console.WriteLine("----->CLRMethod");
        }
        public static void MystaticMethod()
        {
            Console.WriteLine("----->MystaticMethod");
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            Lua lua = new Lua();             //创建lua的解释器
            //注册类的普通方法到Lua中
            lua.RegisterFunction("LuaMethod1", p, p.GetType().GetMethod("CLRMethod"));
            lua.DoString("LuaMethod1()");
            //注册类的静态方法到Lua中
            lua.RegisterFunction("LuaMethod2", null, typeof(Program).GetMethod("MystaticMethod"));
            lua.DoString("LuaMethod2()");
            Console.ReadKey();
        }
    }

    
}


运行结果如下:

 

让我们来分析一下这两个方法:

 

 

 

展开阅读全文

没有更多推荐了,返回首页