Example #1
0
        private void OnEnable()
        {
            if (_singletonInstance != null)
            {
                if (_singletonInstance != this)
                {
                    Destroy(gameObject);
                }

                return;
            }
            _singletonInstance = this;

            DontDestroyOnLoad(gameObject);

            _options = Options;
            Initialize();
        }
        public override void OnInspectorGUI()
        {
            var t = (DllManipulator)this.target;

            t.Options.dllPathPattern = EditorGUILayout.TextField(DLL_PATH_PATTERN_GUI_CONTENT, t.Options.dllPathPattern);
            if (EditorApplication.isPlaying)
            {
                GUI.enabled = false;
            }
            t.Options.loadingMode = (DllLoadingMode)EditorGUILayout.EnumPopup(DLL_LOADING_MODE_GUI_CONTENT, t.Options.loadingMode);
#if UNITY_STANDALONE_LINUX
            t.Options.linuxDlopenFlags = (LinuxDlopenFlags)EditorGUILayout.EnumPopup(LINUX_DLOPEN_FLAGS_GUI_CONTENT, t.Options.linuxDlopenFlags);
#endif
            t.Options.mockAllNativeFunctions = EditorGUILayout.Toggle(MOCK_ALL_NATIVE_FUNCTIONS_GUI_CONTENT, t.Options.mockAllNativeFunctions);
            t.Options.mockCallsInAllTypes    = EditorGUILayout.Toggle(MOCK_CALLS_IN_ALL_TYPES_GUI_CONTENT, t.Options.mockCallsInAllTypes);
            GUI.enabled = true;

            EditorGUILayout.Space();

            var usedDlls = DllManipulator.GetUsedDllsInfos();
            if (usedDlls.Count != 0)
            {
                if (t.Options.loadingMode == DllLoadingMode.Preload && usedDlls.Any(d => !d.isLoaded))
                {
                    if (EditorApplication.isPaused)
                    {
                        if (GUILayout.Button("Load all DLLs & Unpause"))
                        {
                            DllManipulator.LoadAll();
                            EditorApplication.isPaused = false;
                        }
                    }

                    if (GUILayout.Button("Load all DLLs"))
                    {
                        DllManipulator.LoadAll();
                    }
                }
                else if (EditorApplication.isPaused)
                {
                    if (GUILayout.Button("Unpause"))
                    {
                        EditorApplication.isPaused = false;
                    }
                }

                if (usedDlls.Any(d => d.isLoaded))
                {
                    if (EditorApplication.isPlaying && !EditorApplication.isPaused)
                    {
                        if (GUILayout.Button("Unload all DLLs & Pause"))
                        {
                            EditorApplication.isPaused = true;
                            DllManipulator.UnloadAll();
                        }
                    }

                    if (EditorApplication.isPlaying && !EditorApplication.isPaused && t.Options.loadingMode == DllLoadingMode.Preload)
                    {
                        if (GUILayout.Button(UNLOAD_ALL_DLLS_IN_PLAY_PRELOADED_GUI_CONTENT))
                        {
                            DllManipulator.UnloadAll();
                        }
                    }
                    else
                    {
                        if (GUILayout.Button("Unload all DLLs"))
                        {
                            DllManipulator.UnloadAll();
                        }
                    }
                }

                _showLoadedLibraries = EditorGUILayout.Foldout(_showLoadedLibraries, "Mocked DLLs");
                if (_showLoadedLibraries)
                {
                    var prevIndent = EditorGUI.indentLevel;
                    EditorGUI.indentLevel += 1;
                    bool isFirstDll = true;
                    foreach (var dll in usedDlls)
                    {
                        if (!isFirstDll)
                        {
                            EditorGUILayout.Space();
                        }

                        var stateAttributes = new List <string>
                        {
                            dll.isLoaded ? "LOADED" : "NOT LOADED"
                        };
                        if (dll.loadingError)
                        {
                            stateAttributes.Add("LOAD ERROR");
                        }
                        if (dll.symbolError)
                        {
                            stateAttributes.Add("SYMBOL ERRROR");
                        }
                        var state = string.Join(" | ", stateAttributes);

                        EditorGUILayout.LabelField($"[{state}] {dll.name}");
                        EditorGUILayout.LabelField(dll.path);
                        isFirstDll = false;
                    }
                    EditorGUI.indentLevel = prevIndent;
                }
            }
            else if (EditorApplication.isPlaying)
            {
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                EditorGUILayout.LabelField("No DLLs to mock");
                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
            }

            if (EditorApplication.isPlaying && DllManipulator.InitializationTime != null)
            {
                EditorGUILayout.Space();
                var time = DllManipulator.InitializationTime.Value;
                EditorGUILayout.LabelField($"Initialized in: {(int)time.TotalSeconds}.{time.Milliseconds.ToString("D3")}s");
            }
        }