前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XLua-操作与使用

XLua-操作与使用

作者头像
祝你万事顺利
发布2019-06-02 15:03:53
1.2K0
发布2019-06-02 15:03:53
举报

1.直接用Lua调用C#的方法 使用XLua输出HelloWorld 引入命名空间XLua,声明一个LuaEnv的类的对象,这个类提供了一些方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class HellowWorld01 : MonoBehaviour {
    private LuaEnv luaenv;
    void Start () {
        luaenv = new LuaEnv();
        luaenv.DoString("print('hello world')");
        //luaenv.DoString("CS.UnityEngine.Debug.Log('hello kk')");
    }
    private void OnDestroy()
    {
        luaenv.Dispose();
    }
}

输出结果:

LUA: hello world

2.通过读取Lua文件执行Lua语句

//加载helloWorld.lua.txt,TextAsset会自动加txt的后缀
        TextAsset ta = Resources.Load<TextAsset>("helloWorld.lua");
        //print(ta);
        LuaEnv luaEnv = new LuaEnv();
        luaEnv.DoString(ta.text);
        luaEnv.Dispose();

3.自定义Loader 在xLua加自定义loader是很简单的,只涉及到一个接口: public delegate byte[] CustomLoader(ref string filepath); public void LuaEnv.AddLoader(CustomLoader loader)

通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件,如果需要支持调试,需要把filepath修改为真实路径传出。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。

public class CreateLoader : MonoBehaviour {
    private LuaEnv luaEnv;
    // Use this for initialization
    void Awake () {
        luaEnv = new LuaEnv();
        luaEnv.AddLoader(MyLoader);
        luaEnv.DoString("require 'helloWorld.lua'");
        luaEnv.Dispose();
    }

    private byte[] MyLoader(ref string filePath)
    {
        string s = "print('best kk')";
        return System.Text.Encoding.UTF8.GetBytes(s);
    }
}

4.读取非Resources文件夹下的lua文件通过自定义Loader

public class CreateLoader : MonoBehaviour {
    private LuaEnv luaEnv;
    void Awake () {
        luaEnv = new LuaEnv();
        luaEnv.AddLoader(MyLoader);
        luaEnv.DoString("require 'test007'");
        luaEnv.Dispose();
    }
    private byte[] MyLoader(ref string filePath)
    {
        print(filePath);
        print(Application.streamingAssetsPath);
        string path = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";
        return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
    }
}
C#访问Lua

一.获取Lua中的全局变量

int a = luaEnv.Global.Get<int>("a");
        print(a);

二.访问一个全局的Table 在C#中定义一个类与Lua中的Table相对应

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

在用这个类创建对象来进行接收

Person kk = luaEnv.Global.Get<Person>("person");
        print(kk.name + " " + kk.age);

2.使用接口访问Table 声明一个接口,添加CSharpCallLua的特性

[CSharpCallLua]
    interface IPerson
    {
        string name { get; set; }
        int age { get; set; }
    }

使用接口将获取Lua文件中的引用,这与通过声明类不同,修改实例化的接口将直接修改Lua中的数据。 在接口中声明方法将直接对应Lua中Table中的方法。

person = {
    name = "kk";
    age = 23;
    eat = function()
        print("111");
    end
}
[CSharpCallLua]
    interface IPerson
    {
        string name { get; set; }
        int age { get; set; }
        void eat();
    }

3.使用轻量级的映射方式字典或者集合 将Lua中Table的键值对存在Dictionary中,存在限制,没有明确的键的无法存在Dictionary中。

Dictionary<string, object> dic = luaEnv.Global.Get<Dictionary<string,object>>("person");
        foreach (string item in dic.Keys)
        {
            print(item + " " + dic[item]);
        }

将Lua中Table的键值对存在List中,List中只能存没有明确键的。只能映射值,没有key的。

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

4.另一种by ref方式:映射到LuaTable类

LuaTable luaTable = luaEnv.Global.Get<LuaTable>("person");
        print(luaTable.Get<string>("name"));
        print(luaTable.Get<string>("age"));

三.访问一个全局的function 1.映射到delegate 在C#中delegate的参数与Lua中的funciton的参数对应即可

Action act1 = luaEnv.Global.Get<Action>("add");
act1();
act1 = null;//释放对Lua的引用

在Lua中的方法需要传参的时候:

function add(a,b)
    print(a+b);
end

在定义委托的时候就用delegate并添加CSharpCallLua的特性

[CSharpCallLua]
    delegate void Add(int a, int b);

接受返回值

function add(a,b)
    print(a+b);
    return 666;
end
[CSharpCallLua]
    delegate int Add(int a, int b);

多返回值 使用ref或out参数接受多的返回值

function add(a,b)
    print(a+b);
    return 666,a,b;
end
 [CSharpCallLua]
    delegate int Add(int a, int b,out int resa,out int resb);
Add add = luaEnv.Global.Get<Add>("add");
        //print (add(3, 2));
        int resa;
        int resb;
        int ans = add(6,9,out resa,out resb);
        print(resa + "__" + resb);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C#访问Lua
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档