xLua 学习笔记

xLua下载

https://github.com/Tencent/xLua

解压后打开Assets目录将文件拖进新工程即可使用

主要函数和用法

C#端:

命名空间引入

using XLua; 

主要类

LuaEnv luaEnv = new LuaEnv();//最好全局只有一个
luaEnv.Dispose();//Lua关闭,一般在程序关闭时调用

通过字符串运行Lua

 luaEnv.DoString("print('hello world!!!')");

加载文件

//添加自定义加载方式
luaEnv.AddLoader(

    (ref string FileName) =>
    {
        string filePath = Application.streamingAssetsPath + "/" + FileName + ".Lua";

        return File.ReadAllBytes(filePath);
    }

);
luaEnv.DoString("require 'Lua001'");//lua插件,通过lua语法自己加载文件

变量获取

//获取lua里的全局变量
int a = luaEnv.Global.Get<int>("a");
string str = luaEnv.Global.Get<string>("str");
bool bit = luaEnv.Global.Get<bool>("isBit");

类型映射

可以像变量一样直接映射到Class,但会更耗性能

推荐是使用接口映射

Lua里的表:

Person = {
    name = 'SDHK',
    age = 100,
     
    eat1 = function(self, a, b) --lua的函数如果要传参,都要有个self将自己传进去,self==this 一个意思
        print((a + b) .. '  SDHK!!!!')
    end
}

function Person:eat(a, b) --这种方式定义函数会默认带一个self参数,代表当前table
    print((a + b) .. '  SDHK????')
end

C#映射代码:

//接口映射 是 引用映射,这种方式依赖于生成代码,如果set属性也会设置对应的字段。甚至可以通过interface的方法访问lua的函数。

[CSharpCallLua]//用接口映射Lua表 需要加上这个特性,否则会报错
interface IPerson   
{
    string name { get; set; } //接口只能写函数

    int age { get; set; }

    void eat(int a, int b);
}
IPerson p = luaEnv.Global.Get<IPerson>("Person");//推荐
print(p.name + ":" + p.age);

轻量级映射

字典映射:

Dictionary<string, object> dict = luaEnv.Global.Get<Dictionary<string, object>>("Person");
foreach (var key in dict.Keys)  //只映射出键值对
{
    Debug.Log(key + ":" + dict[key]);
}

List映射:

List<object> list = luaEnv.Global.Get<List<object>>("Person");//只映射下标类型
foreach (var item in list)
{
    Debug.Log(item);
}

LuaTable映射

消耗比较高

//这种方式好处是不需要生成代码,但也有一些问题,比如慢,比方式2要慢一个数量级,比如没有类型检查。
LuaTable tab = luaEnv.Global.Get<LuaTable>("Person");//消耗比较高

Debug.Log(tab.Get<string>("name"));
Debug.Log(tab.Get<int>("age"));

foreach (var item in tab.GetKeys())
{
    Debug.Log(item);
}

函数映射

直接映射

Lua里的函数:

function add(a, b) --纯函数映射
    print(a + b)
    return a + b
end

C#映射代码:

[CSharpCallLua]//纯函数映射需要单独写委托和特性
delegate int add(int a, int b);

void Start()
{
    add add = luaEnv.Global.Get<add>("add");//纯函数映射

    print(add(1, 2));

    add = null;//手动释放引用,不然Lua关闭时会报错
}

函数LuaFunction映射,代价比较大

LuaFunction func = luaEnv.Global.Get<LuaFunction>("add");
print(func.Call(1, 2)[0]);

Lua端:

函数方法调用

--调用u3d C# 方法,没有new,需要写全命名空间
CS.UnityEngine.GameObject('newLua')

--调用C#静态方法
print('访问静态' .. CS.UnityEngine.Time.deltaTime)

获取物体

local Box = CS.UnityEngine.GameObject.Find('newLua')
Box.name = 'Box'

获取组件和属性

Box:AddComponent(typeof(CS.UnityEngine.UI.Text))--CS添加组件
local text1 = Box:GetComponent('Text')--CS获取组件

text1.text = 'Lua写入'  

--类型获取可以直接调用typeof

xlua object this[int index]{ get; set; }

C#的object this[int index] { get; set; }  对应的lua就是get_Item和set_Item

如果定义了委托,那么对于的+=和-=

就是add_委托的名称和remove_委托的名称

猜你喜欢

转载自blog.csdn.net/qq_40346899/article/details/111914094