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); } }
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); }
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; }