XLlua使用之C#访问lua

10 篇文章 0 订阅
3 篇文章 0 订阅
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

public class CSharpCallLua : MonoBehaviour {
    private static LuaEnv luaEnv = new LuaEnv();//创建Lua虚拟机

	// Use this for initialization
	void Start () {
        luaEnv.DoString("require 'CSharpCallLua'"); //CSharpCallLua.lua.text文件存放在Resources或StreamingAssets里

        //int age = luaEnv.Global.Get<int>("age");
        //string name = luaEnv.Global.Get<string>("name");
        //bool isTrue = luaEnv.Global.Get<bool>("IsTrue");

        //print(age);
        //print(name);
        //print(isTrue);

        //第一种方式,使用类
        //类,值复制 类里面发生改变,不影响lua
        //Person person = luaEnv.Global.Get<Person>("person");
        //print(person.iAge + "-" + person.iName);\
   
        //第二种方式,使用接口
        //引用,值引用,C#发生改变影响Lua
        /*
        person= 
            {
            age = 19,
            name = "xp",
            eat = function(arg, num1, num2) //由于lua机制 没有this,所以传入arg,在CSharp中已经默认传入
	            print(num1 + num2)                                                                                
            end
            }

            --另外两种方式
            --function person:eat(num1, num2)
	        --    print(num1 + num2)
            --end

            --function person.eat(arg, num1, num2)
	        --    print(num1 + num2)
            --end

         */

        //IPerson person = luaEnv.Global.Get<IPerson>("person");
        //print(person.age);
        //person.age = 18;
        //print(person.age);
        //person.eat(1, 2);

        //第三种方式,使用Dictonary和List,
        //Dictionary<string , object> dictonary = luaEnv.Global.Get<Dictionary<string, object>>("person");
        //foreach(string key in dictonary.Keys)
        //{
        //    print(key + "-" + dictonary[key]);
        //}
        //Dictionary缺陷:只映射键值对类型
        //List缺陷:只映射范型制定类型

        //List<int> list = luaEnv.Global.Get<List<int>>("person");
        //foreach(object item in list)
        //{
        //    print(item);
        //}

        //第四种方法使用LuaTable,性能比第二种方法低,没有类型检查
        //LuaTable luaTable = luaEnv.Global.Get<LuaTable>("person");
        //int age = luaTable.Get<int>("age");
        //string name = luaTable.Get<string>("name");
        //print(age);
        //print(name);

        //调用Lua 的function方法 通过代理,效率更高
        //int rest1 = 0;
        //int rest2 = 0;

        //Add add = luaEnv.Global.Get<Add>("Add");
        //int result = add(1, 2, out rest1, out rest2);
        //print(result);
        //print(rest1);
        //print(rest2);

        //add = null;//索引置空,否则无法释放()

        //通过LuaFunction调用Lua方法 ,该方法效率比较低,每次调用映射消耗性能,推荐用代理方法
        LuaFunction luaFunction = luaEnv.Global.Get<LuaFunction>("Add");
        object[] os = luaFunction.Call(1, 2);
        foreach(object o in os)
        {
            print(o);
        }

        luaEnv.Dispose();
    }

    [CSharpCallLua]
    delegate int Add(int num, int num2, out int rest1, out int rest2);//当有三个返回值时,out 可以接受后面几个返回值

    [CSharpCallLua]
    interface IPerson{
        int age{ get;set;}
        int name { get; set;}
        void eat(int num1, int num2);
    }

    //class Person{
    //    public int iAge;
    //    public string iName;
    //}
 }
	


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值