예제 #1
0
 private void UF_DrawTagGC()
 {
     GUILayout.Space(4);
     if (GUILayout.Button("GC UnusedRes", GUILayout.Height(40), GUILayout.Width(120)))
     {
         Resources.UnloadUnusedAssets();
     }
     GUILayout.Space(4);
     if (GUILayout.Button("GC AssetBundle", GUILayout.Height(40), GUILayout.Width(120)))
     {
         AssetSystem.UF_GetInstance().UF_ClearAll(false);
         Resources.UnloadUnusedAssets();
     }
     GUILayout.Space(4);
     if (GUILayout.Button("GC Mono", GUILayout.Height(40), GUILayout.Width(120)))
     {
         System.GC.Collect();
     }
     GUILayout.Space(4);
     if (GUILayout.Button("GC Lua", GUILayout.Height(40), GUILayout.Width(120)))
     {
         GLuaState lua = GLuaState.Get(System.IntPtr.Zero);
         lua.LuaGC(LuaGCOptions.LUA_GCCOLLECT);
     }
 }
예제 #2
0
    public static Delegate RemoveDelegate(Delegate obj, Delegate dg)
    {
        LuaDelegate remove = dg.Target as LuaDelegate;

        if (remove == null)
        {
            obj = Delegate.Remove(obj, dg);
            return(obj);
        }

        GLuaState state = remove.func.GetGLuaState();

        Delegate[] ds = obj.GetInvocationList();

        for (int i = 0; i < ds.Length; i++)
        {
            LuaDelegate ld = ds[i].Target as LuaDelegate;

            if (ld != null && ld == remove)
            {
                obj = Delegate.Remove(obj, ds[i]);
                state.DelayDispose(ld.func);
                state.DelayDispose(ld.self);
                break;
            }
        }

        return(obj);
    }
예제 #3
0
        public static int GetEnumObject(IntPtr L, System.Enum e, out object obj)
        {
            GLuaState state = GLuaState.Get(L);

            obj = state.GetEnumObj(e);
            return(state.EnumMetatable);
        }
예제 #4
0
    public static Delegate CreateDelegate(Type t, LuaFunction func, LuaTable self)
    {
        DelegateValue Create = null;

        if (!dict.TryGetValue(t, out Create))
        {
            throw new LuaException(string.Format("Delegate {0} not register", LuaMisc.GetTypeName(t)));
        }

        if (func != null)
        {
            GLuaState   state  = func.GetGLuaState();
            LuaDelegate target = state.GetLuaDelegate(func, self);

            if (target != null)
            {
                return(Delegate.CreateDelegate(t, target, target.method));
            }
            else
            {
                Delegate d = Create(func, self, true);
                target = d.Target as LuaDelegate;
                state.AddLuaDelegate(target, func, self);
                return(d);
            }
        }

        return(Create(func, self, true));
    }
예제 #5
0
    static int Destroy(IntPtr L)
    {
        try
        {
            int count = LuaDLL.lua_gettop(L);

            if (count == 1)
            {
                UnityEngine.Object arg0 = (UnityEngine.Object)ToLua.CheckObject(L, 1);
                ToLua.Destroy(L);
                UnityEngine.Object.Destroy(arg0);
                return(0);
            }
            else if (count == 2)
            {
                float            arg1       = (float)LuaDLL.luaL_checknumber(L, 2);
                int              udata      = LuaDLL.tolua_rawnetobj(L, 1);
                ObjectTranslator translator = GLuaState.GetTranslator(L);
                translator.DelayDestroy(udata, arg1);
                return(0);
            }
            else
            {
                return(LuaDLL.luaL_throw(L, "invalid arguments to method: Object.Destroy"));
            }
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e));
        }
    }
예제 #6
0
 public Enumerator(LuaDictTable list)
 {
     state = list.state;
     top   = state.LuaGetTop();
     state.Push(list.table);
     state.LuaPushNil();
 }
예제 #7
0
        private string UF_GetLuaRefCSObject()
        {
            ObjectTranslator objectTranslator = GLuaState.GetTranslator(System.IntPtr.Zero);
            Dictionary <System.Type, int>           dicRefState = new Dictionary <System.Type, int> ();
            List <KeyValuePair <System.Type, int> > lstSort     = new List <KeyValuePair <System.Type, int> > ();

            foreach (KeyValuePair <object, int> item in objectTranslator.objectsBackMap)
            {
                System.Type t = item.Key.GetType();
                if (dicRefState.ContainsKey(t))
                {
                    dicRefState [t] += 1;
                }
                else
                {
                    dicRefState.Add(t, 1);
                }
            }
            foreach (var item in dicRefState)
            {
                lstSort.Add(item);
            }

            lstSort.Sort((x, y) => - x.Value.CompareTo(y.Value));

            string msg = "";

            foreach (var each in lstSort)
            {
                msg += each.Key.ToString() + " : " + each.Value.ToString() + "\n";
            }
            return(msg);
        }
예제 #8
0
        private void UF_DebugEvent()
        {
            GLuaState lua    = GLuaState.Get(System.IntPtr.Zero);
            int       oldtop = lua.LuaGetTop();

            try{
                lua.LuaGetGlobal("Lua");
                if (lua.LuaIsNil(-1) || !lua.lua_istable(-1))
                {
                    return;
                }
                lua.LuaGetField(-1, "global");
                if (lua.LuaIsNil(-1) || !lua.lua_istable(-1))
                {
                    return;
                }
                lua.LuaGetField(-1, "event");
                if (lua.LuaIsNil(-1) || !lua.lua_istable(-1))
                {
                    return;
                }
                lua.LuaGetField(-1, "debug_event");
                if (lua.LuaIsNil(-1) || !lua.lua_isfunction(-1))
                {
                    return;
                }
                lua.Push(true);
                lua.LuaCall(1, 0);
            }catch (System.Exception ex) {
                Debugger.UF_Exception(ex);
            }
            lua.LuaSetTop(oldtop);
        }
예제 #9
0
        private string UF_GetLuaRefUnityObject()
        {
            string           msg = "";
            ObjectTranslator objectTranslator = GLuaState.GetTranslator(System.IntPtr.Zero);

            Dictionary <string, int> mDicUnityObject = new Dictionary <string, int> ();

            foreach (KeyValuePair <object, int> item in objectTranslator.objectsBackMap)
            {
                Object uobj = item.Key as Object;
                if (uobj != null)
                {
                    string key = uobj.name + "(" + uobj.GetType().ToString() + ")";
                    if (!mDicUnityObject.ContainsKey(key))
                    {
                        mDicUnityObject.Add(key, 1);
                    }
                    else
                    {
                        mDicUnityObject [key] += 1;
                    }
                }
            }
            foreach (KeyValuePair <string, int> item in mDicUnityObject)
            {
                msg = msg + item.Key + "   |   " + item.Value + "\n";
            }
            return(msg);
        }
예제 #10
0
        //绑定全局方法
        static void UF_RegisterGFunction(GLuaState luastate)
        {
            if (luastate == null)
            {
                return;
            }

            IntPtr L = luastate.LuaGetL();

            LuaDLL.tolua_pushcsfunction(L, UF_PrintTag);
            LuaDLL.lua_setglobal(L, "printt");

            LuaDLL.tolua_pushcsfunction(L, UF_PrintWarn);
            LuaDLL.lua_setglobal(L, "warn");

            LuaDLL.tolua_pushcsfunction(L, UF_PrintError);
            LuaDLL.lua_setglobal(L, "error");

            LuaDLL.tolua_pushcsfunction(L, UF_Unit64ToString);
            LuaDLL.lua_setglobal(L, "unit64_tostring");

            LuaDLL.tolua_pushcsfunction(L, UF_MonoGC);
            LuaDLL.lua_setglobal(L, "GCMono");

            LuaDLL.tolua_pushcsfunction(L, UF_TrackMsg);
            LuaDLL.lua_setglobal(L, "TrackMsg");

            LuaDLL.lua_pushboolean(L, GlobalSettings.DebugMode);
            LuaDLL.lua_setglobal(L, "DEBUG_MODE");
        }
 public static void Register(GLuaState L)
 {
     L.BeginClass(typeof(LuaInterface.LuaMethod), typeof(System.Object));
     L.RegFunction("Destroy", Destroy);
     L.RegFunction("Call", Call);
     L.RegFunction("__tostring", ToLua.op_ToString);
     L.EndClass();
 }
예제 #12
0
        public static LuaReflection Get(IntPtr L)
        {
#if !MULTI_STATE
            return(_reflection);
#else
            return(GLuaState.GetReflection(L));
#endif
        }
예제 #13
0
 public static void Register(GLuaState L)
 {
     //L.BeginClass(typeof(LuaInterface.LuaOutMetatable), null);
     //L.EndClass();
     L.BeginPreLoad();
     L.RegFunction("tolua.out", LuaOpen_ToLua_Out);
     L.EndPreLoad();
 }
 public static void Register(GLuaState L)
 {
     L.BeginClass(typeof(LuaInterface.LuaProperty), typeof(System.Object));
     L.RegFunction("Get", Get);
     L.RegFunction("Set", Set);
     L.RegFunction("__tostring", ToLua.op_ToString);
     L.EndClass();
 }
예제 #15
0
        public static ObjectTranslator Get(IntPtr L)
        {
#if !MULTI_STATE
            return(_translator);
#else
            return(GLuaState.GetTranslator(L));
#endif
        }
 public static void Register(GLuaState L)
 {
     L.BeginClass(typeof(KeyValuePair <,>), null, "KeyValuePair");
     L.RegFunction("__tostring", ToLua.op_ToString);
     L.RegVar("Key", get_Key, null);
     L.RegVar("Value", get_Value, null);
     L.EndClass();
 }
예제 #17
0
 public void Dispose()
 {
     if (state != null)
     {
         state.LuaSetTop(top);
         state = null;
     }
 }
예제 #18
0
 public static void Register(GLuaState L)
 {
     L.BeginClass(typeof(System.Collections.IEnumerator), null);
     L.RegFunction("MoveNext", MoveNext);
     L.RegFunction("Reset", Reset);
     L.RegVar("Current", get_Current, null);
     L.EndClass();
 }
예제 #19
0
 public static void Register(GLuaState L)
 {
     L.BeginClass(typeof(LuaInterface.EventObject), typeof(System.Object));
     L.RegFunction("__add", op_Addition);
     L.RegFunction("__sub", op_Subtraction);
     L.RegFunction("__tostring", ToLua.op_ToString);
     L.EndClass();
 }
예제 #20
0
 void Clear()
 {
     //_call = null;
     _add     = null;
     _remove  = null;
     self     = null;
     luaState = null;
 }
예제 #21
0
 public static void UF_Bind(GLuaState luastate)
 {
     //注册全局方法
     UF_RegisterGFunction(luastate);
     //注册UI索引方法
     UF_RegisterUI(luastate);
     //自定义的注册类
     LuaNetwork.UF_Register(luastate);
 }
예제 #22
0
        //LuaFunction _call = null;

        public LuaBeatEvent(LuaTable table)
        {
            self     = table;
            luaState = table.GetGLuaState();
            self.AddRef();

            _add    = self.GetLuaFunction("Add");
            _remove = self.GetLuaFunction("Remove");
            //_call = self.GetLuaFunction("__call");
        }
 public static void Register(GLuaState L)
 {
     L.BeginClass(typeof(Dictionary <,> .ValueCollection), typeof(System.Object), "ValueCollection");
     L.RegFunction("CopyTo", CopyTo);
     L.RegFunction("GetEnumerator", GetEnumerator);
     L.RegFunction("New", _CreateSystem_Collections_Generic_Dictionary_ValueCollection);
     L.RegFunction("__tostring", ToLua.op_ToString);
     L.RegVar("Count", get_Count, null);
     L.EndClass();
 }
예제 #24
0
 public void UF_OnReset()
 {
     if (m_Luastate != null)
     {
         m_Luastate.Dispose();
     }
     m_IsInited       = false;
     lfHandleEventMsg = null;
     lfHandleNetMsg   = null;
     m_Luastate       = null;
     System.GC.Collect();
 }
예제 #25
0
        //加载全部Lua模块
        internal IEnumerator UF_InitFramework()
        {
            if (!m_IsInited)
            {
                Debugger.UF_Log("LuaFramework  ->  Start");
                m_Luastate = new GLuaState();

                //第三方库
                //m_Luastate.OpenLibs(LuaDLL.luaopen_struct);
                m_Luastate.OpenLibs(LuaDLL.luaopen_lpeg);
                //m_Luastate.OpenLibs(LuaDLL.luaopen_bit);
                m_Luastate.LuaSetTop(0);

                //加载基础库
                UF_LuaBaseStart(m_Luastate);

                //静态绑定
                LuaBinder.Bind(m_Luastate);

                //自定义绑定
                LuaCustomBinder.UF_Bind(m_Luastate);

                yield return(null);

                //开启一个加载线程加载全部Runtime.Lua模块
                Thread thread = new Thread(new ThreadStart(UF_InitLuaModules));
                thread.Start();
                //主线程等待全部Lua加载
                while (!m_IsInited)
                {
                    yield return(null);
                }
                yield return(null);

                m_Luastate.Collect();
                System.GC.Collect();
                yield return(null);

                //获取固有方法
                lfHandleNetMsg   = m_Luastate.GetFunction("OnHandleProtocol");
                lfHandleEventMsg = m_Luastate.GetFunction("OnHandleEvent");

                //模块加载完成,主函数启动
                UF_CallLuaFunction("MainAwake");
                yield return(null);
            }
            else
            {
                Debugger.UF_Warn("LuaFramework is already Init");
            }

            yield break;
        }
예제 #26
0
 public static void Register(GLuaState L)
 {
     L.BeginClass(typeof(System.Object), null);
     L.RegFunction("Equals", Equals);
     L.RegFunction("GetHashCode", GetHashCode);
     L.RegFunction("GetType", GetType);
     L.RegFunction("ToString", ToString);
     L.RegFunction("ReferenceEquals", ReferenceEquals);
     L.RegFunction("Destroy", Destroy);
     L.RegFunction("New", _CreateSystem_Object);
     L.RegFunction("__eq", op_Equality);
     L.EndClass();
 }
 public static void Register(GLuaState L)
 {
     L.BeginClass(typeof(ReadOnlyCollection <>), typeof(System.Object), "ReadOnlyCollection");
     L.RegFunction("Contains", Contains);
     L.RegFunction("CopyTo", CopyTo);
     L.RegFunction("GetEnumerator", GetEnumerator);
     L.RegFunction("IndexOf", IndexOf);
     L.RegFunction(".geti", get_Item);
     L.RegFunction("get_Item", get_Item);
     L.RegFunction("__tostring", ToLua.op_ToString);
     L.RegVar("Count", get_Count, null);
     L.EndClass();
 }
예제 #28
0
        private void UF_LuaBaseStart(GLuaState luastate)
        {
            if (luastate != null)
            {
                string toluaroot = LuaRoot;

                string[] luafiles =
                {
                    "Main.lua",

                    "Mathf.lua",        //ToLua/UnityEngine/Mathf.lua
                    "Vector3.lua",      //ToLua/UnityEngine/Vector3.lua
                    "Quaternion.lua",   //ToLua/UnityEngine/Quaternion.lua
                    "Vector2.lua",      //ToLua/UnityEngine/Vector2.lua
                    "Vector4.lua",      //ToLua/UnityEngine/Vector4.lua
                    "Color.lua",        //ToLua/UnityEngine/Color.lua
                    "Ray.lua",          //ToLua/UnityEngine/Ray.lua
                    "Bounds.lua",       //ToLua/UnityEngine/Bounds.lua
                    "RaycastHit.lua",   //ToLua/UnityEngine/RaycastHit.lua
                    "Touch.lua",        //ToLua/UnityEngine/Touch.lua
                    "LayerMask.lua",    //ToLua/UnityEngine/LayerMask.lua
                    "Plane.lua",        //ToLua/UnityEngine/Plane.lua
                    "TypeOf.lua",       //ToLua/System/TypeOf.lua
                    "ValueType.lua",    //ToLua/System/ValueType.lua
                    "BindingFlags.lua", //ToLua/System/BindingFlags.lua
                };

                int top = m_Luastate.LuaGetTop();
                for (int k = 0; k < luafiles.Length; k++)
                {
                    var assetinfo = AssetDataBases.UF_GetAssetInfo(luafiles[k]);
                    if (assetinfo == default(AssetDataBases.AssetFileInfo))
                    {
                        throw new LuaException(string.Format("Can not get lua file[{0}] in AssetDataBase,Load file failed!", luafiles[k]), LuaException.GetLastError());
                    }
                    if (!UF_DoFile(m_Luastate.LuaGetL(), assetinfo.path, Path.GetFileNameWithoutExtension(assetinfo.name)))
                    {
                        string err = m_Luastate.LuaToString(-1);
                        m_Luastate.LuaSetTop(top);
                        throw new LuaException(err, LuaException.GetLastError());
                    }
                }
                m_Luastate.LuaSetTop(top);

                //打开基础库
                LuaUnityLibs.OpenLuaLibs(luastate.LuaGetL());

                luastate.Start();
            }
        }
예제 #29
0
        public virtual void Dispose(bool disposeManagedResources)
        {
            if (!beDisposed)
            {
                beDisposed = true;

                if (reference > 0 && luaState != null)
                {
                    luaState.CollectRef(reference, name, !disposeManagedResources);
                }

                reference = -1;
                luaState  = null;
                count     = 0;
            }
        }
예제 #30
0
        private string UF_GetLuaGInfo()
        {
            GLuaState lua    = GLuaState.Get(System.IntPtr.Zero);
            int       oldtop = lua.LuaGetTop();

            lua.LuaGetGlobal("TraceGlobal");
            string info = string.Empty;

            if (!lua.LuaIsNil(-1) && lua.lua_isfunction(-1))
            {
                lua.LuaCall(0, 1);
                info = lua.LuaToString(-1);
            }
            lua.LuaSetTop(oldtop);
            return(info);
        }