public static void LoadSceneAsync(string p_name, LoadSceneMode p_sceneMode, bool p_holdSceneActivation, bool p_setAsActiveScene, ReceiveArgsMethodType p_methodType, object[] p_argsToSend = null, GameObject[] p_gameObjectsToSend = null, Action <float> p_callbackProgress = null, Action p_finishCallback = null)
        {
            if (p_setAsActiveScene)
            {
                GameCore.instance.StartCoroutine(SetSceneAsMainCorroutine(p_name));
            }

            if (p_methodType != ReceiveArgsMethodType.NONE)
            {
                SceneDataParams __params = new SceneDataParams();
                __params.sceneName         = p_name;
                __params.receiveMethodType = p_methodType;
                __params.argsToSend        = p_argsToSend;
                __params.gameObjectsToSend = p_gameObjectsToSend;
                SceneCore.instance.AddSceneParams(__params);
            }

            AsyncOperation __operation = null;

            switch (p_sceneMode)
            {
            case LoadSceneMode.ADDITIVE:
                __operation = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(p_name, UnityEngine.SceneManagement.LoadSceneMode.Additive);
                __operation.allowSceneActivation = !p_holdSceneActivation;

                GameCore.instance.StartCoroutine(HandlerLoadAsyncCorroutine(__operation, p_name, p_holdSceneActivation, p_sceneMode, p_callbackProgress, p_finishCallback));

                if (p_gameObjectsToSend != null)
                {
                    for (int i = 0; i < p_gameObjectsToSend.Length; i++)
                    {
                        p_gameObjectsToSend [i].transform.SetParent(null);
                        UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(p_gameObjectsToSend [i], UnityEngine.SceneManagement.SceneManager.GetSceneByName(p_name));
                    }
                }
                break;

            case LoadSceneMode.SINGLE:
                __operation = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(p_name, UnityEngine.SceneManagement.LoadSceneMode.Additive);
                __operation.allowSceneActivation = !p_holdSceneActivation;

                if (UnityEngine.SceneManagement.SceneManager.GetSceneByName(p_name).isLoaded)
                {
                    if (SceneCore.instance.GetSceneByName(p_name) != null)
                    {
                        SceneCore.instance.GetSceneByName(p_name).OnUnloadedScene();
                        SceneCore.instance.RemoveScene(p_name);
                    }

                    UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(p_name);
                }

                GameCore.instance.StartCoroutine(HandlerLoadAsyncCorroutine(__operation, p_name, p_holdSceneActivation, p_sceneMode, p_callbackProgress, p_finishCallback));

                if (p_gameObjectsToSend != null)
                {
                    for (int i = 0; i < p_gameObjectsToSend.Length; i++)
                    {
                        p_gameObjectsToSend [i].transform.SetParent(null);
                        UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(p_gameObjectsToSend [i], UnityEngine.SceneManagement.SceneManager.GetSceneByName(p_name));
                    }
                }
                break;

            default:
                break;
            }
        }
        public static void LoadScene(string p_sceneName, LoadSceneMode p_sceneMode, bool p_setAsActiveScene, ReceiveArgsMethodType p_methodType, object[] p_argsToSend = null, GameObject[] p_gameObjectsToSend = null, Action p_sceneFinishedLoadCallback = null)
        {
            if (p_setAsActiveScene)
            {
                GameCore.instance.StartCoroutine(SetSceneAsMainCorroutine(p_sceneName));
            }

            GameCore.instance.StartCoroutine(CheckSceneLoadedCorroutine(p_sceneName, p_sceneFinishedLoadCallback));

            if (p_methodType != ReceiveArgsMethodType.NONE)
            {
                SceneDataParams __params = new SceneDataParams();
                __params.sceneName         = p_sceneName;
                __params.receiveMethodType = p_methodType;
                __params.argsToSend        = p_argsToSend;
                __params.gameObjectsToSend = p_gameObjectsToSend;
                SceneCore.instance.AddSceneParams(__params);
            }

            switch (p_sceneMode)
            {
            case LoadSceneMode.ADDITIVE:
                UnityEngine.SceneManagement.SceneManager.LoadScene(p_sceneName, UnityEngine.SceneManagement.LoadSceneMode.Additive);

                if (p_gameObjectsToSend != null)
                {
                    for (int i = 0; i < p_gameObjectsToSend.Length; i++)
                    {
                        p_gameObjectsToSend [i].transform.SetParent(null);
                        UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(p_gameObjectsToSend [i], UnityEngine.SceneManagement.SceneManager.GetSceneByName(p_sceneName));
                    }
                }
                break;

            case LoadSceneMode.SINGLE:

                if (UnityEngine.SceneManagement.SceneManager.GetSceneByName(p_sceneName).isLoaded)
                {
                    if (SceneCore.instance.GetSceneByName(p_sceneName) != null)
                    {
                        SceneCore.instance.GetSceneByName(p_sceneName).OnUnloadedScene();
                        SceneCore.instance.RemoveScene(p_sceneName);
                    }

                    UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(p_sceneName);
                }

                UnityEngine.SceneManagement.SceneManager.LoadScene(p_sceneName, UnityEngine.SceneManagement.LoadSceneMode.Additive);

                if (p_gameObjectsToSend != null)
                {
                    for (int i = 0; i < p_gameObjectsToSend.Length; i++)
                    {
                        p_gameObjectsToSend [i].transform.SetParent(null);
                        UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(p_gameObjectsToSend [i], UnityEngine.SceneManagement.SceneManager.GetSceneByName(p_sceneName));
                    }
                }

                for (int i = UnityEngine.SceneManagement.SceneManager.sceneCount - 1; i >= 0; i--)
                {
                    if (UnityEngine.SceneManagement.SceneManager.GetSceneAt(i).name != "VoxFrameworkScene" && UnityEngine.SceneManagement.SceneManager.GetSceneAt(i).name != p_sceneName)
                    {
                        UnityEngine.SceneManagement.Scene __scene = UnityEngine.SceneManagement.SceneManager.GetSceneAt(i);

                        if (__scene.isLoaded)
                        {
                            if (SceneCore.instance.GetSceneByName(__scene.name) != null)
                            {
                                SceneCore.instance.GetSceneByName(__scene.name).OnUnloadedScene();
                                SceneCore.instance.RemoveScene(__scene.name);
                            }

                            UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(__scene.name);
                        }
                    }
                }
                break;

            default:
                break;
            }
        }