👨💻个人主页 :@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:unity每日一记
⭐🅰️推荐文章⭐
⭐【unity本站最全系列】unity常用API大全一篇文章足以
⭐⭐
文章目录
🎶 Unity协程
介绍和区别
Unity中的多线程
- Unity支持多线程,但是操作相关对象还得在主线程中实现,要注意关闭线程最后
- 但是可以作为复杂算法或逻辑运算计算的复线程,(线程是独立运行的管道)------专门用一个线程来做这些复杂的运算
协程和多线程的区别
- 1.协程不是多线程,并且在继承 Mononabehavar类下使用
- 2.多线程是和主线程区分开来的
- 3.协程是在主线程中运行的,只是分时分布将逻辑进行处理
协程主要作用
协程主要作用
1.延时调用
csharp
IEnumerator ChangeState() //协程迭代器的定义
{
//暂停几秒(协程挂起)
yield return new WaitForSeconds(2);
//暂停两秒后再切入走路的动画
animator.Play("Walk");`
}
2.和其他逻辑一起协同执行
,比如一些很耗时的工作,在这个协程中执行异步操作,比如下载文件,加载文件,异步生成怪物等
*资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。
3.分布分时执行复杂算法或繁杂逻辑
比如创建随机创建一万个球不卡帧
csharp
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 进行返回
dart
// 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);
只有当组件失活时协程不会失活,对象失活时协程也会失活
csharp
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.协程中的协程和有参协程
csharp
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.协程调度器(可自己实现)
csharp
//Ieunmrator接口中的两个成员:MoveNext_移动下一个 Current------当前返回值
while(ie.MoveNext())
{
print(ie.Current);
}
⭐🅰️系统路线学习点击跳转⭐
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、