示例#1
0
    private Dictionary <string, Lua.Function> GetFunctionDict()
    {
        if (func_dict_ != null)
        {
            return(func_dict_);
        }
        func_dict_ = new Dictionary <string, Lua.Function>();

        obj_.Push();
        var state = state_.state;

        if (state.Type(1) != UniLua.LuaType.LUA_TTABLE)
        {
            state_.state.Pop(1);
            LuaMono.Log("the script of '" + gameObject.name + "' Return is not a table!");
            return(null);
        }

        state.PushNil();
        while (state.Next(1))
        {
#if UNITY_EDITOR
            Debug.Log(Lua.State.GetString(state, -2));
#endif
            if (state.Type(-2) == UniLua.LuaType.LUA_TSTRING &&
                state.Type(-1) == UniLua.LuaType.LUA_TFUNCTION)
            {
                func_dict_[Lua.State.GetString(state, -2)] = Lua.State.GetFunction(state, -1);
            }
            state.Pop(1);
        }
        state.Pop(1);
        return(func_dict_);
    }
示例#2
0
    /// <summary>
    /// 调用Lua函数
    /// </summary>
    /// <typeparam name="T">返回类型</typeparam>
    /// <param name="methodname">函数名</param>
    /// <param name="ps">参数数组</param>
    /// <returns>返回,函数异常时返回default(T)</returns>
    public T Call <T>(string methodname, params object[] ps)
    {
        var retn = default(T);
        var dict = GetFunctionDict();

        if (dict == null)
        {
            return(retn);
        }

        Lua.Function func = null;
        dict.TryGetValue(methodname, out func);
        if (func == null)
        {
            LuaMono.Log("'" + methodname + "' is not found in '" + gameObject.name + "'");
            return(retn);
        }

        func.Start();
        if (ps != null && ps.Length > 0)
        {
            int length = ps.Length;
            for (var i = 0; i < length; ++i)
            {
                func.Push(ps[i]);
            }
        }
        if (!func.Call())
        {
            LuaMono.LogError(func.last_error_string);
        }
        if (func.GetReturnCount() > 0 &&
            typeof(T) != typeof(DontCareReturn))
        {
            retn = func.GetObject <T>(1);
        }
        func.ClearCall();
        return(retn);
    }