Lua与C#交互

准备

下载luanet.dll和LuaInterface.dll
在这里插入图片描述

环境配置

使用VS控制台程序

如果是用控制台程序测试就复制dll到解决方案中。
在这里插入图片描述
将dll属性改为如果较新则复制,防止不被打包。
在这里插入图片描述
将dll添加至引用。
在这里插入图片描述
在这里插入图片描述
之后就可以正常使用了。
在这里插入图片描述

使用Unity

将dll复制到Unity项目的Plugins目录下面即可。
在这里插入图片描述
在这里插入图片描述

Lua 解析器对象

1.操作步骤
①引入 LuaInterface 命名空间;
②实例化 Lua 解析器对象 [在 C#代码中执行 Lua代码,靠的就是这个对象];

        //创建一个Lua解析器
        Lua lua = new Lua();

这里使用控制台运行可能会报错System.BadImageFormatException。
解决方案:项目右键属性->项目设计器->生成->平台->把’默认设置(任何 CPU)'改为x86。
因为’任何 CPU’的程序在64位的机器上就会用运行为64位,而64程序是不能加载32位dll的。

2.两块代码空间
在这里插入图片描述
C#编译完成后是固定的,而Lua是通过运行解析的,这也是我们使用Lua进行Unity热更新的一个原理。

3.Lua 解析器对象操作 Lua 代码空间
使用 Lua 解析器对象,往 Lua 代码空间内写入变量,然后再读取使用变量。

    void Start()
    {
        //创建一个Lua解析器
        Lua lua = new Lua();

        lua["name"] = "Test";
        lua["age"] = 18;

        Debug.Log(lua["name"]);
        Debug.Log(lua["age"]);
    }

说明:在绝大多数情况下,我们是直接在 C#脚本中使用 Lua 解析器对象,加载一个
Lua 脚本文件进行运行。

C#调用 Lua

1.C#内执行 Lua 代码
语法格式
Lua 解析器对象.DoString(“Lua 代码”)
演示:
①变量的声明与访问;

            //1.变量的声明与访问.
            lua.DoString("name = 'Monkey' age = 72 address = 'BeiJing'");
            lua.DoString("print(name, age, address)");

②for 循环语句;[演示@符号的用途,可以字符串换行]

            //2.for 循环语句.
            lua.DoString(@"for i = 0, 10, 1 do 
                            print(i) 
                        end");

③函数的定义与调用;

            //3.函数的定义与调用.
            lua.DoString(@"
                function Show()
                    print('lua show Function')
                end
                Show()
            ");

④table 数组声明与访问。

            //4.table 数组声明与访问.
            lua.DoString("myArray = {'AAA', 'BBB', 'CCC', 'DDD'}");
            lua.DoString(@"
                for i = 1, table.getn(myArray), 1 do
                    print(myArray[i])
                end
            ");

注意事项:
①DoString()方法主要用于执行一些较短的 Lua 代码片段;
②DoString()方法执行过的代码,都会添加到 Lua 代码空间,在 Lua 代码文件中,是直接可以访问到这些代码的。

2.C#内执行 Lua 文件
1.语法格式
Lua解析器对象.DoFile(“[路径]Lua文件.lua”)

[路径]:
相对路径:就是相对于当前文件的一个路径位置。
注意事项:“…\”表示上一级目录。
绝对路径:就是我们电脑上的绝对地址,如“C:\aaa\bbb\ccc\ddd.lua”。
“路径”使用相对路径或者绝对路径都可以,这样我们就可以获取到其他Lua文件。一般都使用相对路径。

注意lua文件要设为如果较新则复制。

Lua代码

--Monkey.lua代码
webName = "擅码网"
webURL = "www.mkcode.net"

num = 3.14159

function LuaHello()
	print("Lua内的Hello方法")
end

function Add(a, b)
	return a + b
end

C#代码

			//这里的Monkey.lua文件处于同级目录
            lua.DoFile("Monkey.lua");
            string webName = lua.GetString("webName");
            string webURL = lua.GetString("webURL");
            Console.WriteLine(webName + ".." + webURL);

2.在 VS 项目内如何创建 lua 脚本?
①添加->新建项->常规->文本文件,改名且后缀写为.lua;但是这样创建出来的文件,文件格式是 UTF-8 BOM 类型,运行后会抛异常。
②使用 Notepad++之类的文本编辑器,可以将类型修改成:UTF-8 类型,即可运行正常,但是这种文档类型不支持中文显示;ANSI 类型,中英文都都支持。
3.案例演示
①在 Lua 脚本文件内访问 DoString 函数添加到“Lua 代码空间”的代码;

	print(name, age, address) --上文中DoString函数声明的变量

②GetString():取 Lua 脚本中的字符串数据;

            lua.DoFile("Monkey.lua");
            string webName = lua.GetString("webName");
            string webURL = lua.GetString("webURL");
            Console.WriteLine(webName + ".." + webURL);

③GetNumber():取 Lua 脚本内的数值数据;

            double num = lua.GetNumber("num");
            Console.WriteLine(num);

④GetFunction():取 Lua脚本内的函数,并执行。

            LuaFunction LuaHello = lua.GetFunction("LuaHello");
            LuaHello.Call();
            LuaFunction Add = lua.GetFunction("Add");
            Object[] obj = Add.Call(100, 20);
            Console.WriteLine(obj[0]);

Lua调用C#代码

1.需求介绍
在独立的 Lua 脚本文件内,我们还需要可以访问 C#项目中的类库文件,比如说在Unity 项目中用 Lua 脚本实现游戏物体的查找,游戏物体的实例化,我们就需要使用到 UnityEngine.dll 内的功能方法。
案例:在 Lua 脚本中访问“控制台类库”,并调用该类库中的静态方法,测试输出和输入方法。

2.步骤演示
①导入 luanet.dll,语法格式:require “luanet”
②获取程序集,语法格式:luanet.load_assembly(“程序集名”)
③获取类型,语法格式:变量名 = luanet.import_type(“程序集名.类名”)

C#计算类代码(测试用)

using System;
namespace three
{
    class Calc
    {
        public static string name = "Calc计算器类";

        public static int Jia(int a, int b)
        {
            return a + b;
        }

        public static int Jian(int a, int b)
        {
            return a - b;
        }

        public static int Cheng(int a, int b)
        {
            return a * b;
        }

        public static int Chu(int a, int b)
        {
            return a / b;
        }

        public static void Show()
        {
            Console.WriteLine("Calc类内的方法");
        }
    }
}

Lua代码(Lua调用C#)

--导入luanet.dll,语法格式:require “luanet”
require "luanet"

--获取程序集,语法格式:luanet.load_assembly(“程序集名”)
luanet.load_assembly("three")
luanet.load_assembly("System")

--获取类型,语法格式:变量名= luanet.import_type(“程序集名.类名”)
Calc = luanet.import_type("three.Calc")
Console = luanet.import_type("System.Console")

print(Calc.name)
print(Calc.Jia(10, 20))
print(Calc.Jian(100, 20))
print(Calc.Cheng(50, 2))
print(Calc.Chu(10, 2))

Console.WriteLine("mkcode")
str = Console.ReadLine()
Console.WriteLine("您输入的是" .. str)

C#代码(C#调用Lua)

using System;
using LuaInterface;

namespace three
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua.DoFile("MkCode.lua");


            Console.ReadKey();
        }
    }
}

3.打包后的项目测试
在项目工程的 Debug文件夹下找到 VS 编译后的项目。动态修改这个项目中的 Lua 代码,就可以直接改变打包后的项目的逻辑关系。这就是热更新的初步原理演示。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值