👨💻个人主页:@元宇宙-秩沅
👨💻 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秒之后再打印3242print(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#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、