👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:unity每日一记
⭐🅰️推荐文章⭐
⭐【软件设计师高频考点暴击】
⭐【Unityc#专题篇】之c#系统化大礼包】
⭐【unity数据持久化】数据管理类_PlayerPrfs
⭐【unity本站最全系列】unity常用API大全一篇文章足以
⭐⭐
文章目录
- ⭐🅰️推荐文章⭐
- ⭐⭐
- 🎶 Unity协程
- 介绍和区别
- 协程主要作用
- 协程API相关
- 协程的本质
- ⭐🅰️系统路线学习点击跳转⭐
🎶 Unity协程
介绍和区别
Unity中的多线程
- Unity支持多线程,但是操作相关对象还得在主线程中实现,要注意关闭线程最后
- 但是可以作为复杂算法或逻辑运算计算的复线程,(线程是独立运行的管道)——专门用一个线程来做这些复杂的运算
协程和多线程的区别
- 1.协程不是多线程,并且在继承 Mononabehavar类下使用
- 2.多线程是和主线程区分开来的
- 3.协程是在主线程中运行的,只是分时分布将逻辑进行处理
协程主要作用
协程主要作用
1.延时调用
IEnumerator ChangeState() //协程迭代器的定义 { //暂停几秒(协程挂起) yield return new WaitForSeconds(2); //暂停两秒后再切入走路的动画 animator.Play("Walk");` }
2.和其他逻辑一起协同执行
,比如一些很耗时的工作,在这个协程中执行异步操作,比如下载文件,加载文件,异步生成怪物等
*资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。
3.分布分时执行复杂算法或繁杂逻辑
比如创建随机创建一万个球不卡帧
float time = 0; IEnumerator CreatCorutine( int number) { for (int i = 0; i < number; i++) { GameObject ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); ball.transform.position = new Vector3(Random.Range(0, 100), Random.Range(0, 100), Random.Range(0, 100)); if(i % 1000 == 0) { yield return new WaitForSeconds(1); } } } private void Update() { if(Input.GetKeyDown (KeyCode.Space)) { StartCoroutine(CreatCorutine(10000)); } }
协程API相关
协程的声明
- 返回值为IEnumerator类型及其子类
- 函数中通过 yield return 进行返回
// MyCoroutine为自定义协程名 IEnumerator MyCoroutine(int i, string str) { //分时分布执行。先打印i然后暂停1秒之后再打印3242 print(i); yield return new WaitForSeconds(1f); print("3242"); }
协程的开启和停止
-
开启
StartCoroutine(MyCoroutine(1, “123”));
-
关闭所有协程
StopAllCoroutines();
-
关闭指定协程
StopCoroutine(c1);
只有当组件失活时协程不会失活,对象失活时协程也会失活
void start() { 启动方法一 String: StartCoroutine("ChangeState"); //括号内的是协程名 启动方法二 函数: StartCoroutine(ChangeState()); 启动方法三 接口: //有参协程只能用该方法开启 IEnumerator ie = ChangeState(); StartCoroutine(ie); 停止方法一 String: StopCoroutine("ChangeState"); 停止方法二 函数: StopCoroutine(ChangeState()); 停止方法三 接口: StopCoroutine(ie); 停止方法四 协程: Coroutine c1 = StartCoroutine( ChangeState()); StopCoroutine(c1); 停止所有协程: StopAllCoroutines(); } -------------协程中的 yield------------ //1.下一帧执行 yield return 数字; yield return null; //在Update和LateUpdate之间执行 //表示在本帧帧末执行以下逻辑 yield return new WaitForEndOfFrame(); //2.等待指定秒后执行 yield return new WaitForSeconds(秒); //在Update和LateUpdate之间执行 //3.等待下一个固定物理帧更新时执行 yield return new WaitForFixedUpdate(); //在FixedUpdate和碰撞检测相关函数之后执行 //4.等待摄像机和GUI渲染完成后执行 yield return new WaitForEndOfFrame(); //在LateUpdate之后的渲染相关处理完毕后之后,截图功能放在这个后面执行 //5.一些特殊类型的对象 异步加载相关函数返回的对象 //一般在Update和LateUpdate之间执行 //6.跳出协程 yield break;
👨💻👍4.协程中的协程和有参协程
StartCoroutine("CreateBoss"); //启动协程 //协程1 功能实时实例化游戏物体 IEnumerator CreateBoss() { StartCoroutine(SetCreateCount(5)); while (true) //功能实时实例化游戏物体 { if (BossNum>=BossCount) { yield break; //在协程中break前面要加 yield } Instantiate(animator.gameObject); BossNum++; yield return new WaitForSeconds(2); } } //协程2 功能实时实例化游戏物体 IEnumerator SetCreateCount(int num) { BossCount =num; yield return null; //暂停一帧 --------------------- 此时如果这里只是暂停一帧的话, 那么上面调该有参协程的协程体中, 后面的语句并未生效,因为暂停一帧后, 后面的方法已经执行了, 所以此时的BossCount并不等于有参传递的5 (当然BossCount是全局变量) --------------------- }
---
协程的本质
协程的本质
- 1.本体为迭代器
- 2.协程调度器(可自己实现)
//Ieunmrator接口中的两个成员:MoveNext_移动下一个 Current——当前返回值 while(ie.MoveNext()) { print(ie.Current); }
⭐🅰️系统路线学习点击跳转⭐
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、
-
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章