在C#中访问Lua程序(基于xLua)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System;

public class CSharp2Lua : MonoBehaviour
{

    private void Start()
    {
        LuaEnv luaenv = new LuaEnv();
        luaenv.DoString("require 'C#2Lua'");//这行之后可以取到txt中的变量  注意number和int float double 类型的匹配

        //int a = luaenv.Global.Get<int>("a");//获取到lua中的全局变量a
        //print(a);
        //string str = luaenv.Global.Get<string>("str");//获取到lua中的全局变量str
        //print(str);
        //bool isDie = luaenv.Global.Get<bool>("isDie");//获取到lua中的全局变量isDie
        //print(isDie);

        //第一种方式 class映射

        //Preson p = luaenv.Global.Get<Preson>("preson");//得到表
        //print(p.name + "-" + p.age);//值拷贝,比较耗费性能
        //p.name = "zxw1";//如果在此处修改表中的值,Lua中的值不会发生改变,反过来,在Lua中修改值也不会改变此处的值
        //luaenv.DoString("print(person.name)");//如果在此处修改表中的值,Lua中的值不会发生改变,反过来,在Lua中修改值也不会改变此处的值

        //第二种方法 interface映射(主流)

        //IPreson p = luaenv.Global.Get<IPreson>("preson");
        //print(p.name + "-" + p.age);
        //p.name = "zxwss";//可以在此处修改表中的值,Lua中的值可以被修改,相当于引用
        //luaenv.DoString("print(preson.name)");//可以在此处修改表中的值,Lua中的值可以被修改,相当于引用
        //p.eat(19,6);//p.eat(self.19.6) 在Lua中需要多一个参数,self,是它的本身 ,而在C#中则不需要

        //第三种方法 Dictionary或List

        //通过Dictionary映射 无法映射没有Key的值

        //Dictionary<string, object> dict = luaenv.Global.Get<Dictionary<string, object>>("preson");//得到字典
        //foreach(string key in dict.Keys)//遍历字典中的值
        //{
        //    print(key + "-" + dict[key]);//输出键值对
        //}

        //通过List映射 只能映射表中没有Key的值

        //List<object> list = luaenv.Global.Get<List<object>>("preson") //得到List集合
        //foreach (object o in list)
        //{
        //    print(o);
        //}

        //第四种方法 通过LuaTable

        //LuaTable tab = luaenv.Global.Get<LuaTable>("preson");//得到LuaTable
        //print(tab.Get<string>("name"));
        //print(tab.Get<int>("age"));       

        //调用Lua中的全局函数

        //Action act = luaenv.Global.Get<Action>("add");//映射函数(委托)  需要引入using System;  
        //act();
        //act = null;//释放函数

        //1.映射到delegate

        //Add add = luaenv.Global.Get<Add>("add");//得到add委托
        //int res_;
        ////int res_=0; //ref参数需要赋初值
        //int res = add(19, 6,out res_);
        //print(res);
        //print(res_);
        //add = null;//释放委托

        //2.映射到LuaFunciton  代价较大 减少调用次数

        LuaFunction func = luaenv.Global.Get<LuaFunction>("add");
        object[] os = func.Call(19, 6);//传入的参数为19,6
        foreach(object o in os)
        {
            print(o);
        }
        luaenv.Dispose();
    }
    [CSharpCallLua]//添加特性
    delegate int Add(int a, int b,out int res);//定义委托  用out/ref参数来接收Lua中大于一个的返回值
    class Preson//第一种方式
    {
        public string name;
        public int age;
        public int age2;//此处是空映射,如果输出空映射,则返回0,而不是nil
    }
    [CSharpCallLua]//添加特性
    interface IPreson//第二种方式 接口不能包含字段,必须声明为get set方法
    {
        string name { get; set; }
        int age { get; set; }
        void eat(int a, int b);
    }
}

下面是Lua脚本

a=100
str="zxw"
isDie=false
preson={
	name="zxw",age=19,2,3,1,
	eat=function(self,a,b)
	print(a+b)
	end
}
function add(a,b)
print(a+b)
return a*b,a-b
end

猜你喜欢

转载自blog.csdn.net/qq_43461641/article/details/85344514
今日推荐