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_); }
/// <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); }