(学习笔记)C#与lua互相调用

1.输出lua脚本内容:

	void Start () {

        TextAsset ta = Resources.Load<TextAsset>("helloworld.lua"); // 是 helloworld.lua.txt
        LuaEnv env = new LuaEnv();//最好一个游戏只有一个,它对应lua虚拟机,处于开销考虑
        env.DoString(ta.text);

        //env.DoString("require 'helloworld'");// 或者是这样,helloworld.lua.txt
        env.Dispose();
	}

2.自定义Loader

void Start () {
        LuaEnv env = new LuaEnv();

        env.AddLoader(MyLoader);

        env.DoString("require 'test'");

        env.Dispose();
	}
	
    private byte[] MyLoader(ref string filePath)
    {
        string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";
        return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath));
    }
3.加载变量

 double a = luaEnv.Global.Get<double>("a");//获取到lua里面的全局变量 a
        print(a);
        //1,通过class(struct)
        //值拷贝,改变任意一者,不会改变对方并且耗费性能
        //可以吧类型加载到GCOptimize生成降低开销
        Person p = luaEnv.Global.Get<Person>("person");
        print(p.name + "-" + p.age + "-" + p.age2);
        p.name = "Sikiedu.com";
        luaEnv.DoString("print(person.name)");

        //2,通过interface
        //引用方式,方法里面第一个参数是隐藏参数,传递自身对象
        //需要在interface前面加上特性  [CSharpCallLua]
        IPerson p = luaEnv.Global.Get<IPerson>("person");
        print(p.name + "-" + p.age);
        p.name = "Sikiedu.com";
        luaEnv.DoString("print(person.name)");
        p.eat(12, 34);//  p.eat(p,12,34);

        //3,通过Dictionary、List
        //轻量级 前提是table里面value和key类型需要一致
        Dictionary<string, object> dict = luaEnv.Global.Get<Dictionary<string, object>>("person");
        foreach (string key in dict.Keys)
        {
            print(key + "-" + dict[key]);
        }
        List<int> list = luaEnv.Global.Get<List<int>>("person");
        foreach (object o in list)
        {
            print(o);
        }

        //4,通过LuaTable,不推荐使用
        //不需要生成代码,,但是很慢,比方式2慢一个数量级,而且没有类型检查
        LuaTable tab = luaEnv.Global.Get<LuaTable>("person");
        print(tab.Get<string>("name"));
        print(tab.Get<int>("age"));
        print(tab.Length);
	class Person
    {
        public string name;
        public int age;
        public int age2;
    }


    [CSharpCallLua]
    interface IPerson
    {
        string name { get; set; }
        int age { get; set; }
        void eat(int a,int b);
    }
4.访问函数

 //访问Lua中的全局函数
        Action act1 = luaEnv.Global.Get<Action>("add");
        act1();
        act1 = null;//有绑定,没这一步没法释放env

        //1、映射到Delegate
        //性能好,类型安全,但是要生成很多代码
        Add add = luaEnv.Global.Get<Add>("add");
        int resa = 0; int resb = 0;
        int res = add(34, 78, out resa, out resb);
        print(res);
        print(resa);
        print(resb);
        add = null;

        //2、映射到LuaFunction
        //优缺点与前者正好相反
        LuaFunction func = luaEnv.Global.Get<LuaFunction>("add");
        object[] os= func.Call(1, 2);//可以传递任意类型参数,返回值是数组
        foreach(object o in os)
        {
            print(o);
        }

        luaEnv.Dispose();
	}

Lua写入C#

--实例化对象
CS.UnityEngine.GameObject("ss");
--Debug
print(CS.UnityEngine.Time.deltaTime);
--给静态变量赋值
CS.UnityEngine.Time.timeScale=0.5
--方法,把CS.UnityEngine作为一个变量存起来,简单还节省内存
local gameObject=CS.UnityEngine.GameObject
camera=gameObject.Find("MainCamera")
//使用.需要把自身作为第一个参数传递

cameraConmmpont=camera.GetComponent(camera."Camera")

//使用:不需要
cameraConmmpont=camera:GetComponent(camera."Camera")




猜你喜欢

转载自blog.csdn.net/qq_35957011/article/details/79800532