{"id":1123,"date":"2025-05-07T12:00:24","date_gmt":"2025-05-07T12:00:24","guid":{"rendered":"https:\/\/varnagame.site\/?p=1123"},"modified":"2026-02-25T09:08:42","modified_gmt":"2026-02-25T09:08:42","slug":"%d0%bf%d1%80%d0%be-unitask","status":"publish","type":"post","link":"https:\/\/varnagame.site\/?p=1123","title":{"rendered":"\u041f\u0440\u043e UniTask"},"content":{"rendered":"\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435&nbsp;<a href=\"https:\/\/github.com\/Cysharp\/UniTask#upm-package\">\u043f\u0430\u043a\u0435\u0442 UPM<\/a>&nbsp;\u0441\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 git \u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432&nbsp;<a href=\"https:\/\/github.com\/Cysharp\/UniTask\/releases\">UniTask\/releases<\/a>&nbsp;.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\"><code>\/\/ extension awaiter\/methods can be used by this namespace\nusing Cysharp.Threading.Tasks;\n\n\/\/ You can return type as struct UniTask&lt;T&gt;(or UniTask), it is unity specialized lightweight alternative of Task&lt;T&gt;\n\/\/ zero allocation and fast excution for zero overhead async\/await integrate with Unity\nasync UniTask&lt;string&gt; DemoAsync()\n{\n    \/\/ \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 AsyncObject\n    var asset = await Resources.LoadAsync&lt;TextAsset&gt;(&quot;foo&quot;);\n    var txt = (await UnityWebRequest.Get(&quot;https:\/\/...&quot;).SendWebRequest()).downloadHandler.text;\n    await SceneManager.LoadSceneAsync(&quot;scene2&quot;);\n\n    \/\/ .WithCancellation \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 Cancel, GetCancellationTokenOnDestroy \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 GameObject\n    \/\/ \u043f\u043e\u0441\u043b\u0435 Unity 2022.2 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `destroyCancellationToken` \u0432 MonoBehaviour\n    var asset2 = await Resources.LoadAsync&lt;TextAsset&gt;(&quot;bar&quot;).WithCancellation(this.GetCancellationTokenOnDestroy());\n\n    \/\/ .ToUniTask \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 (\u0438 \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b), Progress.Create \u2014 \u044d\u0442\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 IProgress&lt;T&gt;\n    var asset3 = await Resources.LoadAsync&lt;TextAsset&gt;(&quot;baz&quot;).ToUniTask(Progress.Create&lt;float&gt;(x =&gt; Debug.Log(x)));\n\n    \/\/ await \u043a\u0430\u0434\u0440\u043e\u0432\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u0430\u043a \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\n    await UniTask.DelayFrame(100); \n\n    \/\/ \u0437\u0430\u043c\u0435\u043d\u0430  yield return new WaitForSeconds\/WaitForSecondsRealtime\n    await UniTask.Delay(TimeSpan.FromSeconds(10), ignoreTimeScale: false);\n    \n    \/\/ \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043b\u044e\u0431\u043e\u0439 \u0442\u0430\u0439\u043c\u0438\u043d\u0433(PreUpdate, Update, LateUpdate, etc...)\n    await UniTask.Yield(PlayerLoopTiming.PreLateUpdate);\n\n    \/\/\u0437\u0430\u043c\u0435\u043d\u0430 yield return null\n    await UniTask.Yield();\n    await UniTask.NextFrame();\n\n    \/\/ \u0437\u0430\u043c\u0435\u043d\u0430 WaitForEndOfFrame\n#if UNITY_2023_1_OR_NEWER\n    await UniTask.WaitForEndOfFrame();\n#else\n    \/\/ \u0442\u0440\u0435\u0431\u0443\u0435\u0442 MonoBehaviour(CoroutineRunner))\n    await UniTask.WaitForEndOfFrame(this); \/\/ this is MonoBehaviour\n#endif\n\n    \/\/ \u0437\u0430\u043c\u0435\u043d\u0430 of yield return new WaitForFixedUpdate(same as UniTask.Yield(PlayerLoopTiming.FixedUpdate))\n    await UniTask.WaitForFixedUpdate();\n\n\n    \/\/ waits for 3 second\n    await UniTask.Delay(3000); \n    \n    \/\/ \u0437\u0430\u043c\u0435\u043d\u0430 of yield return WaitUntil  (\u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043f\u043e\u043a\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043b\u043e\u0436\u043d\u043e)\n    await UniTask.WaitUntil(() =&gt; isActive == false);\n    \/\/                               (\u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043f\u043e\u043a\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0438\u0441\u0442\u0438\u043d\u043d\u043e)\n    await UniTask.WaitWhile(() =&gt; isActive == false);\n\n\n\n    \/\/ \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a WaitUntil  \n    await UniTask.WaitUntilValueChanged(this, x =&gt; x.isActive);\n\n    \/\/ \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b IEnumerator\n    await FooCoroutineEnumerator();\n\n    \/\/ \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443\n    await Task.Run(() =&gt; 100);\n\n    \/\/ \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0430 ThreadPool \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u043a\u043e\u0434\u043e\u043c\n    await UniTask.SwitchToThreadPool();\n\n    \/* work on ThreadPool *\/\n\n    \/\/ return to MainThread(same as `ObserveOnMainThread` in UniRx)\n    await UniTask.SwitchToMainThread();\n\n    \/\/ \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0435\u0431-\u0437\u0430\u043f\u0440\u043e\u0441\n    async UniTask&lt;string&gt; GetTextAsync(UnityWebRequest req)\n    {\n        var op = await req.SendWebRequest();\n        return op.downloadHandler.text;\n    }\n\n    var task1 = GetTextAsync(UnityWebRequest.Get(&quot;http:\/\/google.com&quot;));\n    var task2 = GetTextAsync(UnityWebRequest.Get(&quot;http:\/\/bing.com&quot;));\n    var task3 = GetTextAsync(UnityWebRequest.Get(&quot;http:\/\/yahoo.com&quot;));\n\n    \/\/ \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043a\u043e\u0440\u0442\u0435\u0436\u0430\n    var (google, bing, yahoo) = await UniTask.WhenAll(task1, task2, task3);\n\n    \/\/ \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 WhenAll, \u043a\u043e\u0440\u0442\u0435\u0436 \u043c\u043e\u0436\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n    var (google2, bing2, yahoo2) = await (task1, task2, task3);\n\n    \/\/ \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. (\u0438\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `UniTask` (\u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430), `UniTaskVoid` (\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438 \u0437\u0430\u0431\u044b\u0442\u044c)).\n    return (asset as TextAsset)?.text ?? throw new InvalidOperationException(&quot;Asset not found&quot;);\n}<\/code><\/pre><\/div>\n\n\n\n<p>\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\"><code>using Cysharp.Threading.Tasks;\nusing UnityEngine;\n\npublic class ExampleSample : MonoBehaviour\n{\n    private async UniTaskVoid Start()\n    {\n        try\n        {\n            await SomePossibleErrorTask();\n            _ = LoadSceneAsync();\n        }\n        catch (System.Exception ex)\n        {\n            Debug.LogError(&quot;An error occurred: &quot; + ex.Message);\n        }\n    }\n\n    private async UniTask SomePossibleErrorTask()\n    {\n        \/\/ \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\n    }\n\n    private async UniTask LoadSceneAsync()\n    {\n        await UniTask.Delay(3000); \/\/ waits for 3 second\n        UnityEngine.SceneManagement.SceneManager.LoadScene(&quot;NewScene&quot;);\n    }\n\n    private async UniTaskVoid WaitsForSecond()\n    {\n        await UniTask.Delay(1000); \/\/ waits for 1 second\n        Debug.Log(&quot;\u043f\u0440\u043e\u0448\u043b\u0430 \u043e\u0434\u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0430!&quot;);\n    }\n\n    private async UniTaskVoid WaitsFrame()\n    {\n        await UniTask.WaitForEndOfFrame();\n        Debug.Log(&quot;\u042d\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043a\u0430\u0434\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f.&quot;);\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\"><code>  public void ()\n    {\n        UniTask.Void(async () =&gt;\n        {\n             await UniTask.SwitchToMainThread(); \/\/UniTask.SwitchToMainThread() \u2014 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a Unity\n             try\n             {\n                Debug.Log(&quot;\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435&quot;);\n             }\n             catch (Exception ex)\n             {\n                Debug.Log(&quot;\u043e\u0448\u0438\u0431\u043a\u0430&quot;);\n             }\n        });\n    }<\/code><\/pre><\/div>\n\n\n\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435: https:\/\/github.com\/Cysharp\/UniTask<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435&nbsp;\u043f\u0430\u043a\u0435\u0442 UPM&nbsp;\u0441\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 git \u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432&nbsp;UniTask\/releases&nbsp;. \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435: https:\/\/github.com\/Cysharp\/UniTask<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,10,20],"tags":[],"_links":{"self":[{"href":"https:\/\/varnagame.site\/index.php?rest_route=\/wp\/v2\/posts\/1123"}],"collection":[{"href":"https:\/\/varnagame.site\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/varnagame.site\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/varnagame.site\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/varnagame.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1123"}],"version-history":[{"count":17,"href":"https:\/\/varnagame.site\/index.php?rest_route=\/wp\/v2\/posts\/1123\/revisions"}],"predecessor-version":[{"id":1591,"href":"https:\/\/varnagame.site\/index.php?rest_route=\/wp\/v2\/posts\/1123\/revisions\/1591"}],"wp:attachment":[{"href":"https:\/\/varnagame.site\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/varnagame.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/varnagame.site\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}