初识xLua(一)

通过xLua运行Lua程序

导入网上下载的 xLua 包,其中也包涵示例代码和场景。

using XLua;

    private LuaEnv luaenv;

    void Start () {
   
        
        //构建Lua虚拟机
        luaenv = new LuaEnv();
        
        //通过 Lua 语法(执行一个字符串)输出 Hello world
        //luaenv.DoString("print('Hello world!')"); 
        
        //通过 Lua 调用 C# 语法输出 Hello world
        luaenv.DoString(" CS.UnityEngine.Debug.Log('Hello world') ");

	}

    private void OnDestroy()
    {
   
        
        luaenv.Dispose();
    }
}


加载运行lua源文件

这里要注意一点 该文件的全名(包括后缀)为:helloworld.lua.txt

        TextAsset ta = Resources.Load<TextAsset>("helloworld.lua"); 

        LuaEnv env = new LuaEnv();
        
        env.DoString(ta.text);

        env.Dispose();

通过内置的 Loader 方法加载,比如,DoString(" require ‘byfile’ ")

        LuaEnv env = new LuaEnv();

        env.DoString("require 'helloworld'");
        
        env.Dispose();

添加自定义的Loader方法

涉及到一个接口:

public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader 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));
    }

C#访问Lua

全局变量

要注意,获取的变量类型一定要对

        LuaEnv luaEnv = new LuaEnv();
        luaEnv.DoString("require 'CSharpCallLua'");
        
        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);

        luaEnv.Dispose();

Table

table 的名字为 person

person = {
    name="MoGu",age=100 }

把访问到的 table 映射到 class

class Person
    {
   
        public string name;
        public int age;
    }

        LuaEnv luaEnv = new LuaEnv();
        luaEnv.DoString("require 'CSharpCallLua'");
        
        Person p = luaEnv.Global.Get<Person>("person");
        print(p.name+"-"+ p.age);

        luaEnv.Dispose();

用这种方式访问到 table 后,对类中的值修改,是不会影响原来的 table 的。


把访问到的 table 映射到 interface

person = {
   
	name="MoGu",age=100 ,
	
	eat=function(self,a,b)
		print(a+b)
	end
}

需要给接口添加一个特性 [CSharpCallLua]

可以通过 interface 的方法访问 Lua 的函数

   [CSharpCallLua]
   interface IPerson
    {
   
        string name {
    get; set; }
        int age {
    get; set; }
        void eat(int a,int b);
    }

        LuaEnv luaEnv = new LuaEnv()
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值