Beispiel #1
0
        public async void TestCoroutineGeneric()
        {
            var co = Coroutine2.Start <int>(CoTestCoroutineGeneric);
            var i  = 0;

            co.OnYield += (obj) =>
            {
                if (obj is int)
                {
                    var ret = (int)obj;
                    Assert.AreEqual(ret, i);  // 约4秒
                    i++;
                }
            };

            await Task.Run(() =>
            {
                // 堵塞,等待协程完成
                while (!co.IsFinished)
                {
                    // Blocking
                }
                Assert.AreEqual(100, co.Result);
            });
        }
    IEnumerator LoadSceneAsync(string encodedLoadParams)
    {
        UnloadBundles();

        yield return(StartCoroutine(UnloadAllScenes()));

        if (encodedLoadParams.StartsWith(scenePrefix))
        {
            var sceneName = encodedLoadParams.Substring(scenePrefix.Length);
            Debug.Log("Scene provided: " + sceneName);
            yield return(StartCoroutine(WaitMinTime()));

            SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
            OnGameLoaded();
            yield return(null);
        }
        else
        {
            Debug.Log("Bundles provided: " + encodedLoadParams);
            var bundleLocations = GetBundleUrls(encodedLoadParams);

            // First load assets
            if (bundleLocations.Length > 1)
            {
                for (var i = 0; i < bundleLocations.Length - 1; i++)
                {
                    Coroutine2 <AssetBundle> futureAssetBundle = new Coroutine2 <AssetBundle>(this, LoadBundle(bundleLocations[i]));
                    yield return(futureAssetBundle.coroutine);
                }
            }

            // Next load the scene
            var sceneBundle    = bundleLocations[bundleLocations.Length - 1];
            var bundleLocation = sceneBundle;

            Coroutine2 <AssetBundle> futureSceneBundle = new Coroutine2 <AssetBundle>(this, LoadBundle(bundleLocation));
            yield return(futureSceneBundle.coroutine);

            var bundle = futureSceneBundle.result;

            if (!bundle.isStreamedSceneAssetBundle)
            {
                Debug.LogError("Bundle is not a streamed scene asset bundle");
                yield return(null);
            }

            var sceneName = GetFirstSceneInBundle(bundle);
            if (sceneName == "")
            {
                Debug.LogError("No scene found in bundle");
                yield return(null);
            }

            yield return(StartCoroutine(WaitMinTime()));

            SceneManager.LoadScene(sceneName);
            OnGameLoaded();
            yield return(null);
        }
    }
Beispiel #3
0
        IEnumerator Co2(CoroutineResult <string> result, object arg)
        {
            for (var i = 0; i < 100; i++)
            {
                yield return(i);
            }
            result.Result = "TestString";

            var co = Coroutine2.Start <long>(Co3);

            yield return(co);

            Assert.AreEqual(long.MaxValue, co.Result);
        }
Beispiel #4
0
        IEnumerator CoTestCoroutineGeneric(CoroutineResult <int> result, object arg)
        {
            // 25 tick
            for (var i = 0; i < 25; i++)
            {
                yield return(i);
            }
            var co2 = Coroutine2.Start <string>(Co2);

            yield return(co2);

            Assert.AreEqual("TestString", co2.Result);

            result.Result = 100;
        }