Unity插件 Unitask学习日志

news2024/11/15 5:40:09

Unity插件 Unitask学习日志

下载地址

https://github.com/Cysharp/UniTask

点击这里可以查阅中文文档
在这里插入图片描述
在Unity 2020,2021 中使用UPM下载会找不到,可以使用2022版本的unity可以在upm中找到。

安装方式:
下载zip之后解压,
在这里插入图片描述复制Plugins 到Unity项目中即可。
在这里插入图片描述

Content

  1. 使用Unitask 的最低版本是:Unity 2018.4.13f1.
    _ = DelayFrame_Test(100); 中的_= 在 丢弃 符号,不是没有意义的。用于忽略返回值的语法,通常用于那些不需要处理返回值的方法调用,但仍然希望调用该方法。

  2. 仅仅记录了github中文档的一小部分,文档的后面有“错误处理”,“超时处理”,“进度”,“线程切换” 等。详情请查阅github文档

  3. 写法是:

 private async UniTask 方法名称
 {
await 操作
}

 private async UniTask<T> 方法名称
 {
await 操作
retun 返回值
}

全部代码记录

using Cysharp.Threading.Tasks;
using System;
using System.Collections;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

public class UnitaskTest : MonoBehaviour
{

    public RotateCube goRotateCube;

    void Start()
    {
        Debug.Log("进入start方法");
        UniTask<string> ssst = DemoAsync();
        _ = DelayFrame_Test(100);
        _ = SendGetHttpRequest();
        _ = WaitUnityPlayerLoop();
        _ = ReplaceYield();
        _ = WaitForEndOfFrame();
        _ = WaitUntilCondition();
        _ = WaitUntilValueChangedCondition();
        _ = FooCoroutineEnumerator();
        Debug.Log("start方法结束");

    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.O))
        {
            goRotateCube.enabled = false;

        }
        if (Input.GetKeyDown(KeyCode.I))
        {
            goRotateCube.gameObject.transform.localPosition = new Vector3(1, 0, 0);
        }

    }



    private async UniTask<string> DemoAsync()
    {
        Debug.Log("Unitask进入 异步");
        var asset = await Resources.LoadAsync<TextAsset>("fulman");

        for (int i = 0; i < 500; i++)
        {
            GameObject.CreatePrimitive(PrimitiveType.Capsule);
        }
        Debug.Log("Unitask异步读取文件,创建物体结束");


        return (asset as TextAsset)?.text ?? throw new InvalidOperationException("Asset not found");

    }


    /// <summary>
    /// 等待100帧
    /// </summary>
    /// <returns></returns>
    private async UniTask DelayFrame_Test(int frameCount)
    {
        Debug.Log("等待100帧开始" + Time.frameCount);
        // 等待一个基于帧的延时操作(就像一个协程一样)
        await UniTask.DelayFrame(frameCount);
        Debug.Log("等待100帧结束" + Time.frameCount);
    }


    /// <summary>
    /// 异步发送http的get请求
    /// </summary>
    /// <returns></returns>
    private async UniTask<string> SendGetHttpRequest()
    {
        Debug.Log("异步发送http的get请求开始");
        string webText =
            (await UnityWebRequest.Get
            ("https://github.com/Cysharp/UniTask/blob/master/README_CN.md")
            .SendWebRequest()).downloadHandler.text;

        Debug.Log("异步发送http的get请求结束" + webText);
        return webText;

    }

    /// <summary>
    /// 等待一个Unity的生命周期
    /// </summary>
    /// <returns></returns>
    private async UniTask WaitUnityPlayerLoop()
    {
        Debug.Log("异步开始等待Unity的一个生命周期,LastInitialization");
        await UniTask.Yield(PlayerLoopTiming.LastInitialization);
        Debug.Log("异步结束等待Unity的一个生命周期,LastInitialization");
        var go = GameObject.CreatePrimitive(PrimitiveType.Capsule);
        go.transform.position = new Vector3(3, 0, 3);
    }


    /// <summary>
    /// Yield的替代,
    /// </summary>
    /// <returns></returns>
    private async UniTask ReplaceYield()
    {
        Debug.Log("UniTask.Yield当前帧数是start:" + Time.frameCount);
        //等下一帧执行
        await UniTask.Yield();
        Debug.Log("UniTask.Yield之后的帧数是end:" + Time.frameCount);

        Debug.Log("第二个开始");

        Debug.Log("NextFrame当前帧数是start:" + Time.frameCount);
        //等下一帧执行
        await UniTask.NextFrame();
        Debug.Log("NextFrame等待一帧之后end:" + Time.frameCount);

    }


    /// <summary>
    /// 等待这帧结束后进行操作
    /// </summary>
    /// <returns></returns>
    private async UniTask WaitForEndOfFrame()
    {
        Debug.Log("帧开始:" + Time.frameCount);

        await UniTask.WaitForEndOfFrame(this);

        Debug.Log("帧结束 :" + Time.frameCount);

    }


    /// <summary>
    /// 某个条件满足的时候触发
    /// </summary>
    /// <returns></returns>
    private async UniTask WaitUntilCondition()
    {
        Debug.Log("方块还在转圈");
        // yield return WaitUntil 替代方案
        //等待满足于某个条件的时候执行
        await UniTask.WaitUntil(() => goRotateCube.enabled == false);

        Debug.Log("方块不转圈啦!!!");
    }



    /// <summary>
    /// 当某个值改变的时候触发
    /// </summary>
    /// <returns></returns>
    private async UniTask WaitUntilValueChangedCondition()
    {
        Debug.Log("监听goRotateCube 是否改变位置");
        //开始监听goRotateCube 的X是否 改变位置
        await UniTask.WaitUntilValueChanged(goRotateCube, gorotatecube => goRotateCube.transform.localPosition.x);
        Debug.Log("监听到goRotateCube.transform.localPosition 位置改变");
        goRotateCube.gameObject.transform.localScale = new Vector3(2, 2, 2);

    }


    /// <summary>
    /// 可以等待一个协程
    /// </summary>
    /// <returns></returns>
    private async UniTask FooCoroutineEnumerator()
    {
        await SayHello100Times();
        Debug.Log("100次hello man说完啦!");
    }


    /// <summary>
    /// 说100次你好
    /// </summary>
    /// <returns></returns>
    private IEnumerator SayHello100Times()
    {
        yield return new WaitForSeconds(2);
        for (int i = 0; i < 100; i++)
        {
            Debug.Log("hello man");
        }
    }

    //可以等待一个task run
    private async void TaskRunTest()
    {
        int resule = await Task.Run(GetRandomNumber);
     }

    /// <summary>
    /// 获取一个随机数
    /// </summary>
    /// <returns></returns>
    private int GetRandomNumber()
    {
        int ran = UnityEngine.Random.Range(0, 100990);
        return ran;
    }
}

RotateCube 的代码,挂载于方块上,

using UnityEngine;

public class RotateCube : MonoBehaviour
{
    void Update()
    {
        // 绕Y轴旋转
        transform.Rotate(Vector3.up, 50 * Time.deltaTime);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

化工厂定位系统有哪些功能?

有伙伴了解化工厂定位系统吗&#xff1f;相信很多小伙伴都没有听说过&#xff0c;感觉离我们的生活比较远&#xff0c;事实上化工厂定位系统也是默默的在保护我们的安全。今天新锐科创就给大家介绍一下这个系统&#xff0c;让大家简单的了解一下。 大家都知道化工厂一直是一个比…

【LLM大模型】如何在LlamaIndex中使用RAG?

如何在LlamaIndex中使用RAG 什么是 Llama-Index LlamaIndex 是一个数据框架&#xff0c;用于帮助基于 LLM 的应用程序摄取、构建结构和访问私有或特定领域的数据。 如何使用 Llama-Index ? 基本用法是一个五步流程&#xff0c;将我们从原始、非结构化数据导向基于该数据生成…

本地部署 SenseVoice - 阿里开源语音大模型

本地部署 SenseVoice - 阿里开源语音大模型 1. 创建虚拟环境2. 克隆代码3. 安装依赖模块4. 启动 WebUI5. 访问 WebUI 1. 创建虚拟环境 conda create -n sensevoice python3.11 -y conda activate sensevoice 2. 克隆代码 git clone https://github.com/FunAudioLLM/SenseVoic…

【Linux进阶】文件系统2——MBR和GPT

1.磁盘的分区 因为如果你的磁盘被划分成两个分区&#xff0c;那么每个分区的设备文件名是什么&#xff1f; 在了解这个问题之前&#xff0c;我们先来复习一下磁盘的组成&#xff0c;因为现今磁盘的划分与它物理的组成很有关系。 我们谈过磁盘主要由碟片、机械手臂、磁头与主轴马…

C++Windows环境搭建(CLion)

文章目录 CLion下载安装CLion下载CLion安装新建项目 CLion下载安装 CLion下载 打开网址&#xff1a;https://www.jetbrains.com/clion/download/ 点击Download进行下载。 CLion安装 双击下载好的安装包&#xff1a; 进入到安装页面&#xff0c;点击下一步&#xff1a; 选…

【粉丝福利 | 第8期】值得收藏!推荐10个好用的数据血缘工具

⛳️ 写在前面参与规则&#xff01;&#xff01;&#xff01; ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论三次&#xff09; ⛳️本次送书1~4本【取决于阅读量&#xff0c;阅读量越多&#xff0c;送的越多】 目前市面上绝…

无人直播系统源码开发:功能~优势~开发方法

自动直播通常是指通过自动化技术来实现实时内容分发的过程&#xff0c;它结合了流媒体技术和人工智能&#xff08;如机器学习&#xff09;。以下是自动直播实现的基本步骤&#xff1a; 内容采集&#xff1a;通过摄像头、手机等设备捕捉实时画面&#xff0c;并通过编码将其转换成…

如何理解http与https协议,他们有什么区别?

写在前面的话&#xff0c;关于 HTTP 和 HTTPS 的问题&#xff0c;常常会被很多学习者忽略&#xff0c;HTTP、HTTPS 不就是网址的开头吗&#xff0c;有啥好了解的&#xff0c;浏览器的引擎实现了这个协议&#xff0c;在开发关系不大&#xff0c;但想要深入一些理解数据传输原理&…

NPDP有什么价值?究竟值不值得去考?

NPDP其实就是产品经理国际资格认证&#xff0c;是美国产品开发管理协会发起的&#xff0c;集理论、方法和实践一体&#xff0c;在新产品开发方面有一个很全面的知识体系。是国际公认的新产品开发专业认证&#xff0c;具有权威性。 NPDP能够很好地帮你在做新产品的道路上少走弯…

SpringSecurity中文文档(Servlet Method Security)

Method Security 除了在请求级别进行建模授权之外&#xff0c;Spring Security 还支持在方法级别进行建模。 您可以在应用程序中激活它&#xff0c;方法是使用EnableMethodSecurity 注释任何Configuration 类&#xff0c;或者将 < method-security > 添加到任何 XML 配…

RK3588开发笔记(四):基于定制的RK3588一体主板升级镜像

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140288662 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

多次执行相同的push问题(如何解决)

下面这个问题如何解决 1.为什么会出现这个问题 原因&#xff1a;push是一个promise&#xff0c;promise需要传递成功和失败两个参数&#xff0c;我们的push中没有传递。 goSearch() {//路由传参//第一种&#xff1a;字符串形式// this.$router.push(/search/this.keyword&quo…

【Linux进阶】文件系统3——目录树,挂载

前言 在Windows 系统重新安装之前&#xff0c;你可能会事先考虑&#xff0c;到底系统盘C盘要有多大容量&#xff1f;而数据盘D盘又要给多大容量等&#xff0c;然后实际安装的时候&#xff0c;你会发现其实C盘之前会有个100MB的分区被独立出来&#xff0c;所以实际上你就会有三个…

ATA-5420前置微小信号放大器如何进行半导体测试

半导体测试是电子行业中至关重要的环节&#xff0c;它对于保证产品质量、提高生产效率起着至关重要的作用。在半导体测试过程中&#xff0c;我们需要采用一系列的方法和原理来确保芯片的可靠性和性能稳定性&#xff0c;而前置微小信号放大器在半导体测试中起着至关重要的作用。…

C++ Qt 自制开源科学计算器

C Qt 自制开源科学计算器 项目地址 软件下载地址 目录 0. 效果预览1. 数据库准备2. 按键&快捷键说明3. 颜色切换功能(初版)4. 未来开发展望5. 联系邮箱 0. 效果预览 普通计算模式效果如下&#xff1a; 科学计算模式效果如下&#xff1a; 更具体的功能演示视频见如下链接…

Python酷库之旅-第三方库Pandas(012)

目录 一、用法精讲 28、pandas.HDFStore.keys函数 28-1、语法 28-2、参数 28-3、功能 28-4、返回值 28-5、说明 28-6、用法 28-6-1、数据准备 28-6-2、代码示例 28-6-3、结果输出 29、pandas.HDFStore.groups函数 29-1、语法 29-2、参数 29-3、功能 29-4、返回…

9.2 栅格图层符号化单波段灰度渲染

文章目录 前言单波段灰度QGis设置为单波段灰度二次开发代码实现单波段灰度 总结 前言 介绍栅格图层数据渲染之单波段灰度显示说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 单波段灰度 以“3420C_2010_327_RGB_LATLNG.tif”数据为例&#xff0c;在QGis中…

论坛系统--测试报告(部分)

前言 逆水行舟&#xff0c;不进则退&#xff01;&#xff01;&#xff01; 目录 项目背景 接口测试 性能测试 压力测试 UI测试 项目背景 项目名称&#xff1a; 论坛系统 项目概述&#xff1a; 论坛系统是一个基于Spring Boot和MySQL的Web应用程序…

Nginx理论篇与相关网络协议

Nginx是什么&#xff1f; Nginx是一款由C语言编写的高性能、轻量级的web服务器&#xff0c;一个线程能处理多个请求&#xff0c;支持万级并发。 优势&#xff1a;I/O多路复用。 I/O是什么&#xff1f; I指的是输入&#xff08;Input&#xff09;,O是指输出&#xff08;Outp…

poi-tl、aspose实现word中表在每页携带表头表尾

实现word中表在每页携带表头表尾&#xff08;第一版&#xff09; word中的表格如果只有一页时表头表尾都很好处理&#xff0c;当中间内容足够多时&#xff0c;表尾只会出现在最后一页&#xff0c;表头也只会出现在第一页&#xff0c;之前想过用word自带的页眉页尾来处理但是&a…