Beispiel #1
0
        /// <summary>
        /// Add startup
        /// </summary>
        /// <param name="nameDotVariant">nameDotVariant</param>
        /// <param name="abs">AbStartupContents</param>
        // -------------------------------------------------------------------------------------------------------
        protected void addNewRuntimeAbStartupContents(string nameDotVariant, AbStartupContents abs)
        {
            if (SimpleReduxManager.Instance.SceneChangeStateWatcher.state().stateEnum != SceneChangeState.StateEnum.ScenePlaying)
            {
                return;
            }

            // -----------------

            // Enqueue
            {
                AbStartupContentsGroup group = new AbStartupContentsGroup(nameDotVariant);

                group.absList.Add(abs);

                this.m_runtimeQueue.Enqueue(group);
            }

            // StartCoroutine
            {
                if (this.m_runtimeLoading == null)
                {
                    StartCoroutine(this.m_runtimeLoading = this.loadAssetBundleInRuntimeIE());
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Load AbStartupContentsGroup
        /// </summary>
        /// <param name="absGroup">AbStartupContentsGroup</param>
        /// <returns>IEnumerator</returns>
        // -------------------------------------------------------------------------------------------------------
        protected IEnumerator loadAbStartupContents(AbStartupContentsGroup absGroup)
        {
            if (absGroup == null)
            {
                yield break;
            }

            if (absGroup.absList.Count <= 0)
            {
#if UNITY_EDITOR
                Debug.LogError("(#if UNITY_EDITOR) : Implementation Error in loadAbStartupContents");
#endif
                yield break;
            }

            // ---------------------

            // Caching
            {
                while (!Caching.ready)
                {
                    yield return(null);
                }
            }

            // ---------------------

            if (absGroup.assetBundle)
            {
                foreach (var abs in absGroup.absList)
                {
                    if (abs.currentWorkingState == StartupContents.WorkingState.DoneSuccessOrError)
                    {
                        continue;
                    }

                    // --------------

                    // TODO?
                    yield return(this.loadAdditiveSceneIfNeeded(absGroup.assetBundle));

                    if (abs.successAction != null)
                    {
                        abs.successAction(absGroup.assetBundle);
                    }
                }
            }

            else if (
                this.m_dependencies.ContainsKey(absGroup.nameDotVariant) &&
                this.m_dependencies[absGroup.nameDotVariant].assetBundle
                )
            {
                absGroup.assetBundle = this.m_dependencies[absGroup.nameDotVariant].assetBundle;

                foreach (var abs in absGroup.absList)
                {
                    if (abs.currentWorkingState == StartupContents.WorkingState.DoneSuccessOrError)
                    {
                        continue;
                    }

                    // --------------

                    // TODO?
                    yield return(this.loadAdditiveSceneIfNeeded(absGroup.assetBundle));

                    if (abs.successAction != null)
                    {
                        abs.successAction(absGroup.assetBundle);
                    }
                }
            }

            else
            {
                float noProgressTimer  = 0.0f;
                float previousProgress = 0.0f;

                using (WWW www =
                           WWW.LoadFromCacheOrDownload(
                               this.createAssetBundleUrl(absGroup.nameDotVariant),
                               this.m_manifestInfo.manifest.GetAssetBundleHash(absGroup.nameDotVariant)
                               ))
                {
#if !UNITY_WEBGL
                    www.threadPriority = this.m_threadPriority;
#endif

                    // set progressValueFunc
                    {
                        foreach (var abs in absGroup.absList)
                        {
                            abs.progressValueFunc = () =>
                            {
                                return((www != null) ? www.progress : 0.0f);
                            };
                        }
                    }

                    // set urlIfNeeded
                    {
                        foreach (var abs in absGroup.absList)
                        {
                            abs.urlIfNeeded = www.url;
                        }
                    }

                    // wait www done
                    {
                        while (!www.isDone)
                        {
                            foreach (var abs in absGroup.absList)
                            {
                                if (abs.progressAction != null)
                                {
                                    abs.progressAction(www);
                                }
                            }

                            // timeout
                            {
                                if (this.m_noProgressTimeOutSeconds > 0.0f)
                                {
                                    if (Mathf.Approximately(previousProgress, www.progress))
                                    {
                                        noProgressTimer += Time.deltaTime;
                                    }

                                    else
                                    {
                                        noProgressTimer = 0.0f;
                                    }

                                    previousProgress = www.progress;

                                    if (noProgressTimer >= this.m_noProgressTimeOutSeconds)
                                    {
                                        foreach (var abs in absGroup.absList)
                                        {
                                            abs.errorMessage = this.messageTimeout();
                                        }

                                        break;
                                    }
                                }
                            }

                            yield return(null);
                        } // while (!www.isDone)

                        foreach (var abs in absGroup.absList)
                        {
                            if (abs.progressAction != null)
                            {
                                abs.progressAction(www);
                            }
                        }

                        yield return(null);
                    }

                    // success or fail
                    {
                        // set errorMessage
                        {
                            foreach (var abs in absGroup.absList)
                            {
                                if (string.IsNullOrEmpty(abs.errorMessage))
                                {
                                    abs.errorMessage = www.error;
                                }
                            }
                        }

                        // success
                        if (string.IsNullOrEmpty(this.m_manifestInfo.dummyStartup.errorMessage))
                        {
                            if (www.assetBundle)
                            {
                                yield return(this.decryptAssetBundleIfNeeded(www.assetBundle, (ab) =>
                                {
                                    absGroup.assetBundle = ab;
                                }));

                                if (absGroup.assetBundle)
                                {
                                    yield return(this.loadAdditiveSceneIfNeeded(absGroup.assetBundle));

                                    // success action
                                    {
                                        foreach (var abs in absGroup.absList)
                                        {
                                            if (abs.successAction != null)
                                            {
                                                abs.successAction(absGroup.assetBundle);
                                            }

                                            else if (abs.successDetailAction != null)
                                            {
                                                abs.successDetailAction(absGroup.assetBundle, abs.identifierForDetail);
                                            }

                                            else if (abs.successDetailActionForAsync != null)
                                            {
                                                bool finished = false;

                                                abs.successDetailActionForAsync(absGroup.assetBundle, abs.identifierForDetail, () =>
                                                {
                                                    finished = true;
                                                });

                                                while (!finished)
                                                {
                                                    yield return(null);
                                                }
                                            }
                                        }
                                    }

                                    // Don't fo here
                                    {
                                        // absGroup.unloadAssetBundle(false);
                                    }
                                } // if (this.m_manifestInfo.manifestAssetBundle)

                                else
                                {
                                    absGroup.absList[0].errorMessage = this.messageFailedToDecryptAssetBundle();
                                    this.updateError(absGroup.absList[0]);
                                }
                            } // if (www.assetBundle)

                            else
                            {
                                absGroup.absList[0].errorMessage = this.messageAssetBundleNotFound();
                                this.updateError(absGroup.absList[0]);
                            }
                        } // if (string.IsNullOrEmpty(this.m_manifestInfo.dummyStartup.errorMessage))

                        // fail
                        else
                        {
                            foreach (var abs in absGroup.absList)
                            {
                                if (abs.failedAction != null)
                                {
                                    abs.failedAction(www);
                                }
                            }

                            // updateError
                            {
                                this.updateError(absGroup.absList[0]);
                            }
                        }
                    } // success or fail

                    // set progressValueFunc to null
                    {
                        foreach (var abs in absGroup.absList)
                        {
                            abs.progressValueFunc = null;
                        }
                    }
                } // using
            }
        }
Beispiel #3
0
        /// <summary>
        /// Load AssetBundle in runtime
        /// </summary>
        /// <returns>IEnumerator</returns>
        // -------------------------------------------------------------------------------------------------------
        protected IEnumerator loadAssetBundleInRuntimeIE()
        {
            // addLockToBefore
            {
                SceneChangeManager.Instance.addLockToBefore(this);
            }

            // wait 1 frame
            {
                yield return(null);
            }

            // setManifestFileAndFolderUrl
            {
                this.setManifestFileAndFolderUrl();
            }

            // loop
            {
                AbStartupContentsGroup group = null;

                while (this.m_runtimeQueue.Count > 0)
                {
                    // Peek
                    {
                        group = this.m_runtimeQueue.Peek();
                    }

                    // clearContents
                    {
                        this.clearContents(false);
                    }

                    // downloadManifest
                    {
                        if (!this.m_manifestInfo.manifest)
                        {
                            yield return(this.downloadManifest());
                        }

                        if (this.hasError())
                        {
                            break;
                        }
                    }

                    // addAllDependencies
                    {
                        yield return(this.addAllDependencies(group.nameDotVariant));
                    }

                    // m_dependencies
                    {
                        // startAbStartupSub
                        {
                            foreach (var depend in this.m_dependencies)
                            {
                                yield return(this.loadAbStartupContents(depend.Value));
                            }
                        }

                        if (this.hasError())
                        {
                            break;
                        }
                    }

                    // group
                    {
                        // startAbStartupSub
                        {
                            yield return(this.loadAbStartupContents(group));

                            group.unloadAssetBundle(false);
                        }

                        if (this.hasError())
                        {
                            break;
                        }
                    }

                    // Dequeue
                    {
                        if (!this.hasError())
                        {
                            this.m_runtimeQueue.Dequeue();
                        }
                    }
                } // while (this.m_runtimeQueue.Count > 0)
            }

            // finish
            {
                if (this.hasError())
                {
                    DialogManager.Instance.showYesNoDialog(
                        this.createErrorMessage(),
                        this.retryRuntime,
                        this.backToTileBecauseOfRuntimeError
                        );
                }

                else
                {
                    // removeLockFromBefore
                    {
                        SceneChangeManager.Instance.removeLockFromBefore(this);
                    }

                    // m_runtimeLoading
                    {
                        this.m_runtimeLoading = null;
                    }
                }
            }
        }