tolua里C#与lua互调

来源:互联网 发布:网络ssid 编辑:程序博客网 时间:2024/05/03 21:50

tolua里C#与lua互调,本文主要讲的是C#调lua方法,下面贴上代码

C#

using System;using UnityEngine;using UnityEditor;using LuaInterface;public class LuaBehavior : MonoBehaviour{    private const string luaPath = "Assets/StreamingAssets/LuaScripts/";    public string luaFullPath;    public string luaName;    private LuaState lua;    private int m_ClassRef = -1;//the lua class ref    private int m_BindLuaRef = -1;//the lua class bind class ref    private int m_StartRef = -1;//the 'Start' function of lua    private int m_OnDestroyRef = -1;// the 'OnDestroy' function of lua    void Awake()    {        lua = new LuaState();        lua.Start();    }    void Start()    {        if (lua.LuaDoFile(luaPath + luaFullPath))        {            Debug.Log("Load file success: fileName = " + luaFullPath);        }        lua.LuaGetGlobal("FirstLua");        m_ClassRef = lua.LuaRef(-1);        if (m_ClassRef == LuaDLL.LUA_REFNIL)        {            Debug.LogError("not find the ref object");        }        lua.LuaGetGlobal("FirstLua");        lua.LuaRawSetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);        lua.LuaGetGlobal("FirstLua");        lua.LuaGetField(-1, "Start");        lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);        lua.PCall(1, 0);        lua.LuaPop(1);        lua.LuaGetGlobal("FirstLua");        lua.LuaGetField(-1, "Function1");        lua.PCall(0, 0);        lua.LuaPop(1);        LuaFunction func = lua.GetFunction("Function2");        if (func == null)        {            Debug.Log("Func is Null");        }        func.Call();        func.Dispose();    }    void OnDestroy()    {    }}

Lua代码

--Created By: xikuo yu--Time: 2016-12-24FirstLua = {}setmetatable({},FirstLua)function FirstLua:Start()if self == nil thenprint("FirstLua Start self is nil")elseprint("FirstLua Start")self:OnDestroy()endendfunction FirstLua:OnDestroy()print("OnDestroy")endfunction FirstLua.Function1()if self == nil thenprint("FirstLua Function1 self is nil")elseprint("FirstLua Function1")endendfunction Function2()print("Function2")end


lua有3中方法,1)带冒号(:)方法,需要有lua表名通过冒号调用,或者传入对应的一个lua表,即方法默认第一个对象为lua表自身,即self。2)带点(.)方法,需要由lua表名通过点操作符调用,方法参数与调用时传入的一直,没有默认的self。3)Global方法,即没有lua表前缀的。

上面C#代码中展示了C#调lua的几种方式




=====================2016.12.25====================

注意,今天又试了下lua_ref的功能,发现tolua的LuaRef是不好使的,总是返回1,然后发现还有一个ToLuaRef,结果返回唯一的ref

void Start()    {        if (lua.LuaDoFile(luaPath + luaFullPath))        {            Debug.Log("Load file success: fileName = " + luaFullPath);        }        lua.LuaGetGlobal("FirstLua");        m_ClassRef = lua.ToLuaRef(); //lua.LuaRef(-1);        if (m_ClassRef == LuaDLL.LUA_REFNIL)        {            Debug.LogError("not find the ref object");        }        lua.LuaGetGlobal("FirstLua");        lua.LuaRawSetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);                lua.LuaGetGlobal("FirstLua");                lua.LuaGetField(-1, "Start");        m_StartRef = lua.ToLuaRef();//lua.LuaRef(-1);        lua.LuaGetField(-1, "Start");        lua.LuaRawSetI(LuaIndexes.LUA_REGISTRYINDEX, m_StartRef);               lua.LuaGetField(-1, "OnDestroy");        m_OnDestroyRef = lua.ToLuaRef(); //lua.LuaRef(-1);        lua.LuaGetField(-1, "OnDestroy");        lua.LuaRawSetI(LuaIndexes.LUA_REGISTRYINDEX, m_OnDestroyRef);        Debug.Log("first lua = " + m_ClassRef);        Debug.Log("start ref = " + m_StartRef);        Debug.Log("destroy ref = " + m_OnDestroyRef);        lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_StartRef);        lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);        lua.PCall(1, 0);        lua.LuaPop(1);        Debug.Log("top " + lua.LuaGetTop());    }


0 0