协程 IEnomerator

1.yield return 暂停协程,等当前帧结束,在下一帧继续执行
   yield break 结束协程
2.StartCoroutine()  启动协程
3.yield return new WaitForEndOfFrame()  在下一帧的OnGUI执行完了恢复继续执行
4.yield return new WaitForSeconds(n)  暂停协程,等n秒后继续执行
5.yield return new WaitForFixedUpdate() 在FixedUpdate之后执行
6.yield return StartCoroutine(另一个协程)  协程嵌套,在另一个协程结束后再执行当前协程

启动协程的方式:3个重载
StartCoroutine(协程名称(协程参数))
StartCoroutine("方法名称")
StartCoroutine("方法名称",方法参数) 用这种方法启动协程,参数只能是一个

停止协程的方式:
StopCoroutine(Coroutine)   Coroutine是协程返回的值对象
StopCoroutine(IEnumerator)  IEnumerator是协程接口对象
StopCoroutine("协程方法名称")  这种方式只能停止以字符串开始的协程,就是第二种启动协程
StopAllCoroutines          停止所有协程-慎用

跳出协程:
yield break

特殊协程
IEnumerator Start() 将Start改造成一个协程 在游戏开始时自动启动

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IEDemo : MonoBehaviour
{int NormalFunction(){//return的含义是【返回结果,并结束函数的执行】return 1;}//协同程序 --> 【特殊返回值类型(Ienumerator的方法】IEnumerator IEnumeratorDemo(){Debug.Log("1");//协程的返回值与普通方法的返回【区别】//最大区别,协程返回使用的关键字时[yield return]//返回任何东西都可以//协程中[至少要有一次]的yield return //yield return [已知值或变量] 的含义是//【暂停方法执行,等待当前帧结束,等待下一帧继续执行】yield return 1;Debug.Log(2);//停止协程的运行yield break;//暂停yield return null;Debug.Log(3);//暂停yield return "abc";Debug.Log(4);}IEnumerator WaitForSecondsDemo(){Debug.Log("Dog");//含义:暂停协程,等3秒之后,继续进行yield return  new WaitForSeconds(3);Debug.Log("Cat");}IEnumerator WaitForEndOfFrameDemo(){Debug.Log("abc");//在下一帧的Update执行完了恢复继续执行//yield return null;//含义:暂停协程,等下一帧再继续执行//在下一帧的OnGUI执行完了恢复继续执行yield return new WaitForEndOfFrame();Debug.Log("def");}IEnumerator WaitForSecondCircle(){int count = 0;while (true){yield return new WaitForSeconds(1);Debug.Log(++count);}}IEnumerator InvokeMethodPerSeconds(Action method,float seconds){while (true){//执行函数method();//等待时间yield return new WaitForSeconds(seconds);}}IEnumerator InvokeMethodPerFrame(Action method){while (true){method();yield return 0;}}private void Start(){//调用普通函数NormalFunction();//启动协同程序//第一种写法//StartCoroutine(IEnumeratorDemo());//第二种写法,分开写/*IEnumerator ie = IEnumeratorDemo();StartCoroutine(ie);*///StartCoroutine(WaitForEndOfFrameDemo());//StartCoroutine(WaitForSecondsDemo());//StartCoroutine(WaitForSecondCircle());/*StartCoroutine(InvokeMethodPerSeconds(() =>{Debug.Log("Hello World!");}, 2f));*/StartCoroutine(InvokeMethodPerFrame((() =>{Debug.Log("Hello Unity!");})));}}

Get方式:信息参数显示在URL中

Post方式:参数信息不显示在URL中

WWW

using System;
using System.Collections;
using System.IO;
using System.Net;
using UnityEditor;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine.Video;public class WWWDemo : MonoBehaviour
{[Header("原图组件")]public RawImage _rawImage;[Header("Image组件")]public Image _image;[Header("视频播放器")]public VideoPlayer _VideoPlayer;//声明一个视频片段private VideoClip _videoClip;private IEnumerator Start(){//yield return StartCoroutine(DownLoadText());//yield return StartCoroutine(DownloadNewsText());//yield return StartCoroutine(DownloadTexture());// yield return StartCoroutine(NewVisonDownload());yield return StartCoroutine(NewVersionDownloadVideo());}/// <summary>/// 下载文本/// </summary>/// <returns></returns>IEnumerator DownloadNewsText(){WWW www = new WWW("http://v.juhe.cn/toutiao/index?type=top&key=bd6d102ed7d4cdbe209c05d413eedcd3");//等待下载,第一种yield return www;//打印结果Debug.Log(www.text);}/// <summary>/// 新版本下载视频/// </summary>/// <returns></returns>IEnumerator NewVersionDownloadVideo(){//尝试加载视频片段_videoClip = Resources.Load<VideoClip>("welcome");//如果没有加载到,则去下载if (_videoClip==null){//创建网络请求对象UnityWebRequest webRequest = UnityWebRequest.Get("http://f.video.weibocdn.com/00341gCFgx07LoEZcDa7010412017MOB0E010.mp4?label=mp4_hd&template=852x480.25.0&trans_finger=62b30a3f061b162e421008955c73f536&media_id=4619091051479108&tp=8x8A3El:YTkl0eM8&us=0&ori=1&bf=3&ot=h&lp=00002KCE4n&ps=4pdsh0&uid=3ZoTIp&ab=3915-g1,966-g1,1493-g0,1192-g0,1191-g0,1046-g2,3601-g5,1258-g0&Expires=1619087600&ssig=V%2FxM%2B1IoMo&KID=unistore,video");//WebRequest webRequest = WebRequest.Create(//"http://f.video.weibocdn.com/00341gCFgx07LoEZcDa7010412017MOB0E010.mp4?label=mp4_hd&template=852x480.25.0&trans_finger=62b30a3f061b162e421008955c73f536&media_id=4619091051479108&tp=8x8A3El:YTkl0eM8&us=0&ori=1&bf=3&ot=h&lp=00002KCE4n&ps=4pdsh0&uid=3ZoTIp&ab=3915-g1,966-g1,1493-g0,1192-g0,1191-g0,1046-g2,3601-g5,1258-g0&Expires=1619087600&ssig=V%2FxM%2B1IoMo&KID=unistore,video");//发送网络请求,并等待下载webRequest.SendWebRequest();while (!webRequest.isDone){Debug.Log(webRequest.downloadProgress);yield return 0;}//获取视频文件的字节流byte[] bytes = webRequest.downloadHandler.data;//写入到本地File.WriteAllBytes(Application.dataPath + "/Resources/welcome.mp4",bytes);while (_videoClip == null){//刷新资源AssetDatabase.Refresh();//尝试加载视频片段_videoClip = Resources.Load<VideoClip>("welcome");yield return 0;}}//将下好的视频,设置到ViedeoPlayer组件中_VideoPlayer.clip = _videoClip;//播放视频_VideoPlayer.Play();}/// <summary>/// 新版本下载/// </summary>/// <returns></returns>/// 第一步、创建对象:UnityWebRequest/// Get:UnityWebRequest.Get(url)/// Post:UnityWebRequest.Post(url,参数列表)/// 第二步、发送web情况,并等待下载/// yield return data.SendWebRequest();/// 第三步、获取下载好的内容/// 内容分类:文本Text 直接用; 字节流Bytes 需要写入本地文件/// 第四步、如何写入到本地/// File.WriteAllBytes(文件的完整路径,比特数组)/// 【示例】/// File.WriteAllBytes(Application.dataPath + "/a.text",bytes);/// 第五步、如何从本地获取文件/// 1.文件IEnumerator NewVisonDownload(){UnityWebRequest data = UnityWebRequest.Get("http://v.juhe.cn/toutiao/index?type=top&key=bd6d102ed7d4cdbe209c05d413eedcd3");//发送web请求,并等待下载yield return data.SendWebRequest();//数据【字节流】byte[] bytes = data.downloadHandler.data;//将字节流写入到本地Resources文件夹中File.WriteAllBytes(Application.dataPath + "/Resources/a.text",bytes);//等一帧yield return 0;//刷新资源AssetDatabase.Refresh();//从Resources文件夹中读取文件Resources.Load<Text>("a");}/// <summary>/// 下载图片/// </summary>/// <returns></returns>IEnumerator DownloadTexture(){WWW www = new WWW("https://th.bing.com/th/id/R65398d6ad86129f9628c0ad80da4040c?rik=C3qNS9mZOQk%2b5A&riu=http%3a%2f%2fwww.shijuepi.com%2fuploads%2fallimg%2f200918%2f1-20091Q10420.jpg&ehk=QBNuJIbVP1qo%2bwUD3YzXcvL4H5iHivOHXUnzzRw%2bWfU%3d&risl=&pid=ImgRaw");//第二种,等待下载while (!www.isDone){Debug.Log("progress:" + www.progress);yield return 0;}/*//等待下载yield return www;*/#region 直接将纹理用RawImage进行渲染//设置图片的原始宽高_rawImage.GetComponent<RectTransform>().sizeDelta =new Vector2(www.texture.width,www.texture.height);//设置图片到RawImage中_rawImage.texture = www.texture;#endregion#region 使用Image去渲染,在此之前要将纹理转换为精灵Sprite sprite = Sprite.Create(www.texture, new Rect(Vector2.zero,new Vector2(www.texture.width,www.texture.height)),Vector2.zero);sprite.name = "sprite";//渲染_image.sprite = sprite;#endregion//如何把纹理转换成精灵}/// <summary>/// 下载视频/// </summary>/// <returns></returns>IEnumerator DownloadVideos(){WWW www = new WWW("");yield return www;//www.get}
}

Unity学习Day14--协程和WWW相关推荐

  1. Unity线程与协程

    文章目录 前言 一.unity真的不支持多线程吗? 1.unity中使用多线程 2.unity中多线程的停止 3.unity中使用多线程的问题 二.协同程序 1.协程的使用 2.协程的原理 总结 前言 ...

  2. Lua学习——Coroutine协程

    在菜鸟教程学习lua时,在coroutine这一章看到这么一段 coroutine.running就可以看出来,coroutine在底层实现就是一个线程. 当create一个coroutine的时候就 ...

  3. Unity C#笔记 协程详解(转)

    目录 什么是协程 多线程 协程 协程的使用场景 协程使用示例 Invoke的缺陷 协程语法 开启协程 终止协程 挂起 协程的执行原理 什么是协程 在Unity中,协程(Coroutines)的形式是我 ...

  4. unity如何解决协程开启频繁导致的程序卡顿

    unity如何解决协程开启频繁导致的程序卡顿 一.协程 协程并不会在Unity中开辟新的线程来执行,其执行仍然发生在主线程中.当我们有较为耗时的操作时,可以将该操作分散到几帧或者几秒内完成,而不用在一 ...

  5. Python 学习笔记 - 协程

    Python里面控制并发,除了多线程和多进程,还可以使用协程(CoRoutine).他是在一个线程内通过程序员人为的指定来进行切换 例1:通过switch()可以人为来回切换到另外一个函数:当所有函数 ...

  6. go学习 --- go协程

    一.go协程与go主线程 Go主线程:一个Go线程上,可以起多个协程,协程是轻量级的线程. 二.go协程特点 1.有独立的栈空间 2.共享程序堆空间 3.调度由用户控制 4.协程是轻量级的线程 三.入 ...

  7. python学习之-- 协程

    协程(coroutine) 也叫:微线程,是一种用户态的轻量级线程,就是在单线程下实现并发的效果. 优点: 1:无需线程上下文切换的开销.(就是函数之间来回切换) 2:无需原子操作锁定及同步的开销.( ...

  8. Unity 的协程的原理

    Unity是一款非常强大的游戏引擎,它支持多种编程语言,其中最常用的语言是C#.在Unity中,协程是一种非常强大的功能,它可以让我们在游戏中实现各种各样的效果.本文将详细介绍Unity协程的原理,并 ...

  9. unity,通俗解释什么是协程

    文章目录 一. 介绍 二. 举例子 三. 和多线程的区别 四. 常用函数 五. 脚本 一. 介绍 在Unity中,协程是一种轻量级的线程,可以在同一线程中执行多个任务,实现异步等待和延迟执行等效果.协 ...

  10. unity 协程特点

    协程 一. Unity中使用协程 1. 什么是协程 2. 如何使用 3. 协程的应用场景 创建补间动画 打字机效果 异步加载资源 4. 注意事项 二. Unity协程的底层原理 1. 协程本体:C#的 ...

最新文章

  1. 评测指标(metrics)
  2. 趋势畅想-搭载android系统的智能数码相机
  3. 计算机二级c语言考完多久出成绩,计算机二级C语言的成绩什么时候出来?
  4. kafka高可用集群原理
  5. 函数没有“as”子句;假定返回类型为 object。_TypeScript笔记(一)类型amp;接口...
  6. Android后台强制结束进程,Application入口或者activity回调的是哪个方法?
  7. matlab中表示拉普拉斯分布_深度优化局部拉普拉斯金字塔滤波器。
  8. python删除列表一段元素_Python基础--list列表删除元素
  9. python图形界面编程库_Python支持哪些图形界面的第三方库
  10. 微型计算机的硬件系统普遍采用,2016年9月计算机一级《MS Office》考题与答案
  11. 信号与系统 电子课本(郑君里)
  12. 7.7_adadelta
  13. C# list集合去重
  14. 阿里云-个人建网站从0到精通(三)-部署开发环境
  15. perl novel可变剪接识别(2)
  16. 移动硬盘如何合并磁盘
  17. 【Lighthouse教程】Win10远程连接同步代码
  18. Android硬件开发------计步传感器
  19. c++手机编程软件_今天小编推荐几款好用的手机编程APP!
  20. shell之大小写转换

热门文章

  1. android 电视 vob格式转换,佳佳Android视频格式转换器
  2. 最优秀最合理2019年移动便携图形工作站配置探讨
  3. MATLAB图像处理边缘检测
  4. 微信中怎么打开apk文件 微信跳转打开外部浏览器打开apk文件
  5. C#的DataTable详解
  6. python数据分析多元 线性回归
  7. FPGA的NIOS-II
  8. 计算机软件工程专业大学排名专科,2020软件工程专业大学排名一览表
  9. VR全景智慧城市虚拟现实三维的发展
  10. 常见分布的数学期望和方差