UniTask

🏆 个人愚见,没事写写笔记

🏆《博客内容》:Unity3D开发内容

🏆🎉欢迎 👍点赞✍评论⭐收藏

UniTask 是一个为 Unity 引擎量身打造的高性能、零分配(allocation-free)异步编程库,用于替代或增强 C# 原生的 Taskasync/await 在 Unity 环境中的使用。

🌟 为什么 Unity 需要 UniTask?

在 Unity 中直接使用 C# 的 async/await + Task 会遇到以下问题:

问题 说明
GC 压力大 Task 内部大量使用堆分配,频繁调用会导致垃圾回收(GC),引发卡顿
不支持协程上下文 无法自然地在主线程(Unity 主线程)中 await,容易出现跨线程访问 GameObject 的异常
缺乏 Unity 特有等待机制 无法直接 await WaitForSecondsNextFrameUntilRender 等 Unity 协程原语
异常处理不友好 Task 的异常若未观察(observed),会静默失败或延迟抛出

UniTask 正是为解决这些问题而生

🌟 怎么使用UniTask?

⚙️在使用 UniTask 时

等待:使用 await 可以 UniTask 的方法,

不等待:_=方法()或者方法.Forget()

1.等待 N 帧

1.1 等待下一帧

cs 复制代码
await UniTask.NextFrame();

1.2 等待固定更新

cs 复制代码
await UniTask.WaitForFixedUpdate();

1.3 等待时间(毫秒)

cs 复制代码
await UniTask.Delay(1000);

1.4 等待时间(秒)

cs 复制代码
await UniTask.Delay(TimeSpan.FromSeconds(1));

1.5 等待条件成立/等待条件不成立

cs 复制代码
    private int count = 0;
    private async UniTask Start()
    {
        Debug.Log("Start");
        await UniTask.WaitUntil(() => count > 0);//只有当上述条件满足后才会打印
        await UniTask.WaitWhile(() => count == 0);//只有当上述条件不满足后才会打印
        Debug.Log("Start End");
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            count++;
        }
    }

2.替代协程

cs 复制代码
 private async UniTask Start()
    {
        Debug.Log("Start");
        // _ = TestAsync(); //不等待,只是触发执行这个方法
        // TestAsync().Forget(); //不等待,只是触发执行这个方法,但是有UniTask的错误检测
        await TestAsync(); //等待
        Debug.Log("Start End");
    }

    private async UniTask TestAsync()
    {
        Debug.Log("TestAsync Start");
        await UniTask.Delay(TimeSpan.FromSeconds(2f));
        Debug.Log("TestAsync End");
    }

3.生命周期管理(防内存泄漏):当该物体销毁会终止方法

cs 复制代码
 private CancellationToken _Ct;
    private async UniTask Start()
    {
        _Ct = this.GetCancellationTokenOnDestroy();
        Debug.Log("Start");
        await TestAsync(_Ct); //等待
        Debug.Log("Start End");
    }

    private async UniTask TestAsync(CancellationToken CancellationToken)
    {

        Debug.Log("TestAsync Start");
        await UniTask.Delay(TimeSpan.FromSeconds(3f), cancellationToken: CancellationToken);
        Debug.Log("TestAsync End");
    }

4.进度

4.1 实现接口

cs 复制代码
public struct DebugProgress : IProgress<float>
{
    public void Report(float value)
    {
        Debug.Log($"Progress: {value * 100}%");
    }
}

4.2 将进度添加到.ToUniTask 的参数中

cs 复制代码
  public static async UniTask<string> HTTPGetAsync(string url, CancellationToken ct)
    {
        using var uwr = UnityWebRequest.Get(url);

        DebugProgress debugProgress = new DebugProgress();
        await uwr.SendWebRequest().ToUniTask(cancellationToken: ct, progress: debugProgress);

        if (uwr.result != UnityWebRequest.Result.Success)
        {
            var errorMsg = $"HTTP request failed: {uwr.error} (Status: {uwr.responseCode})";
            Debug.LogError(errorMsg);
            throw new System.Exception(errorMsg);
        }
        else
        {
            var response = uwr.downloadHandler.text;
            Debug.Log($"Response: {response}");
            return response;
        }
    }

🔎☀️🍀💥⚙️ ⚠️📧 📝 🛠️📌🌈🔥💡👍🖥️💬📚

🚀感谢:🎉欢迎 👍点赞✍评论⭐收藏

相关推荐
叶帆13 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君13 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子13 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
心前阳光14 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光14 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯14 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案14 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔14 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
玉夏14 天前
【Shader基础】UV 与纹理采样 Part1
unity·着色器·uv
zdr尽职尽责14 天前
Unity录像功能
学习·ui·unity·游戏引擎