tolua学习笔记之一

3 篇文章 0 订阅
  • LuaState生命周期
  • 获取使用lua方法
  • 获取表和元表
  • 使用协程
  • 使用线程
  • 使用lua创建C#对象

LuaState生命周期

LuaState lua = new LuaState();
lua.Start();
string hello =
    @"                
        print('hello tolua#')
    ";
lua.DoString(hello, "HelloWorld.cs");
lua.CheckTop();
lua.Dispose();
lua = null;

获取使用lua方法

private string script = 
        @"  function luaFunc(num)
                return num + 1
            end

            test = {}
            test.luaFunc = luaFunc
        ";

LuaFunction func = lua.GetFunction("test.luaFunc");
//LuaFunction func = lua["test.luaFunc"] as LuaFunction;

if (func != null)
{
    //有gc alloc
    object[] r = func.Call(123456);
    Debugger.Log("generic call return: {0}", r[0]);

    // no gc alloc
    int num = CallFunc();
    Debugger.Log("expansion call return: {0}", num);

}

int CallFunc()
{
    func.BeginPCall();
    func.Push(123456);
    func.PCall();
    int arg1 = func.CheckNumber();
    func.EndPCall();

    return arg1;
}

//1.通过“.” (点号)来使用非静态的变量以及静态的变量与方法
//2.通过'':“ (冒号)来使用非静态的方法

获取表和元表

private string script =
        @"
            varTable = {1,2,3,4,5}
            varTable.map = {}
            varTable.map.name = 'map1'
            meta = {name = 'meta'}
            setmetatable(varTable, meta)
        ";

LuaState lua = new LuaState();
lua.Start();
lua.DoString(script);        
LuaTable table = lua.GetTable("varTable");

//不能使用table["map.name"]
Debug.log(((LuaTable)(table["map"]))["name"]);

table1 = table.GetMetaTable();

if (table1 != null)
{
    Debugger.Log("varTable metatable name: {0}", table1["name"]);
}

使用协程

local coDelay = nil

function Delay()
    local c = 1

    while true do
        coroutine.wait(1) 
        print("Count: "..c)
        c = c + 1
    end
end

function StartDelay()
    coDelay = coroutine.start(Delay)
end

function StopDelay()
    coroutine.stop(coDelay)
end

使用线程

local coDelay = nil

function Delay()
    local c = 1

    while true do
        coroutine.wait(1) 
        print("Count: "..c)
        c = c + 1
    end
end

function StartDelay()
    coDelay = coroutine.start(Delay)
end

function StopDelay()
    coroutine.stop(coDelay)
end

使用lua创建C#对象

生成wrap文件,在C#脚本里bind到LuaState,
在lua中调用New方法

local newAccount = TestAccount.New(4,'艾弗',1)
//local newAccount = TestAccount(4,'艾弗',1)

LuaState.CheckTop()
LuaState.Collect()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值