当前位置: 首页 > news >正文

昆明高端网站设计网络营销推广工作内容

昆明高端网站设计,网络营销推广工作内容,奉节做网站,wordpress 糗事百科主题Unity的协程(Coroutine)是一种异步编程的机制,允许在多个帧之间分割代码的执行,而不阻塞主线程。与传统的多线程不同,Unity的协程在主线程中运行,并不会开启新的线程。 什么是协程? 协程是一种…

Unity的协程(Coroutine)是一种异步编程的机制,允许在多个帧之间分割代码的执行,而不阻塞主线程。与传统的多线程不同,Unity的协程在主线程中运行,并不会开启新的线程。

什么是协程?

协程是一种能在一定条件下暂停执行,并在稍后恢复执行的函数。它允许将一个任务拆分为多个小任务,每一小段任务可以在多个帧内完成,而不是在一帧内阻塞主线程。

在Unity中,协程通过StartCoroutine方法启动,并可以通过yield关键字来暂停执行,直到满足特定条件(例如等待时间、等待帧、等待另一个协程完成等)后继续运行。

协程的语法

在Unity中,协程的基本语法如下:

using UnityEngine;
using System.Collections;public class CoroutineExample : MonoBehaviour
{void Start(){// 启动一个协程StartCoroutine(MyCoroutine());}IEnumerator MyCoroutine(){Debug.Log("第1步: 开始协程");// 等待3秒yield return new WaitForSeconds(3);Debug.Log("第2步: 等待3秒完成");// 等待一帧yield return null;Debug.Log("第3步: 等待一帧完成");// 等待直到某个条件为真yield return new WaitUntil(() => Time.time > 5);Debug.Log("第4步: 等待直到Time.time > 5");}
}
  • StartCoroutine(MyCoroutine()):启动一个协程,执行MyCoroutine()函数。
  • yield return new WaitForSeconds(3):暂停执行,等待3秒后恢复执行。
  • yield return null:暂停当前协程,等到下一帧再恢复执行。
  • yield return new WaitUntil(() => Time.time > 5):暂停,直到Time.time > 5为true时恢复执行。

启动和停止协程

启动协程

StartCoroutine(“方法名”):使用字符串指定协程名称。
StartCoroutine(方法()):传递协程的IEnumerator方法。
示例:

StartCoroutine("MyCoroutine");
StartCoroutine(MyCoroutine());

停止协程

StopCoroutine(方法名或引用):停止指定的协程。
StopAllCoroutines():停止脚本中所有正在运行的协程。

Coroutine myCoroutine;void Start()
{myCoroutine = StartCoroutine(MyCoroutine());
}void StopIt()
{StopCoroutine(myCoroutine); // 停止指定的协程StopAllCoroutines(); // 停止当前脚本中的所有协程
}

注意:使用StopCoroutine时,不能使用StartCoroutine(“MyCoroutine”)的字符串方式,因为无法引用该协程。

协程的yield语法详解

yield的作用是暂停当前协程的执行,直到指定的条件满足。Unity中常见的yield操作有:

  • yield return null; 等待一帧
  • yield return new WaitForSeconds(t); 等待t秒
  • yield return new WaitUntil(predicate); 等待直到条件为真
  • yield return new WaitWhile(predicate); 等待直到条件为假
  • yield return StartCoroutine(协程); 等待另一个协程完成
  • yield break; 终止协程,立即退出

常见的协程应用场景

场景切换中的加载动画

在场景加载的过程中显示加载动画,而不是卡顿的黑屏。

IEnumerator LoadSceneAsync()
{AsyncOperation operation = SceneManager.LoadSceneAsync("SceneName");while (!operation.isDone){Debug.Log($"加载进度:{operation.progress * 100}%");yield return null; // 等待一帧}Debug.Log("场景加载完成");
}

动画和特效的控制

在播放一段动画或特效时,等待动画播放完成再继续后续操作。

IEnumerator PlayAnimation()
{Animator animator = GetComponent<Animator>();animator.Play("Attack");yield return new WaitForSeconds(2); // 等待动画播放2秒Debug.Log("动画播放完成,执行其他操作");
}

定时触发的任务

IEnumerator SpawnEnemies()
{while (true){Instantiate(enemyPrefab, transform.position, Quaternion.identity);yield return new WaitForSeconds(5); // 每隔5秒刷怪}
}

协程和多线程的区别

协程多线程
运行在主线程中每个线程有独立的执行流
使用yield暂停使用Thread.Sleep等
不需要上下文切换,效率高需要操作系统的线程调度,性能开销大
主要用于异步逻辑操作主要用于计算密集型操作

注意事项和最佳实践

  • 不要阻塞主线程:协程在主线程中运行,while(true)的无限循环会冻结游戏。
  • 避免频繁调用StartCoroutine:如果在Update中频繁调用StartCoroutine,会导致性能下降。
  • 避免内存泄漏:未手动停止的协程会一直运行,导致内存泄漏。可用StopCoroutine来手动控制协程的停止。
  • 不要用字符串调用协程:StartCoroutine(“MyCoroutine”)的方式不易调试和管理,建议使用StartCoroutine(MyCoroutine())。
  • 不要滥用协程:协程适用于需要在多个帧内分段执行的任务。对于简单的帧内任务,尽量不要使用协程。

Unity的协程机制提供了一种轻量的异步任务调度,适合在游戏中实现等待、计时、加载动画、场景切换等操作。与多线程相比,协程的运行成本更低,控制也更简单。通过yield来暂停和恢复代码执行,可以显著提高游戏性能和玩家体验。合理使用协程有助于优化游戏中的异步任务。

Unity是如何实现协程的

Unity的协程原理基于迭代器(Iterator)和C#的IEnumerator接口,而不是多线程。Unity的协程并不会新开一个线程去执行逻辑,而是在主线程中调度,通过“分段执行”的方式控制代码的暂停和恢复。

协程的原理概述

  1. C#中的迭代器和yield return
  • 协程的本质是C#的迭代器(Iterator),而yield return就是一种控制流的中断标志。
  • 当执行到yield return时,Unity会将当前协程的“状态”保存起来,并在下一个“可用的时机”恢复执行。
  1. Unity的调度器(Coroutine Scheduler)
  • Unity每一帧都会检查哪些协程需要恢复执行。
  • 如果一个协程调用了yield return WaitForSeconds(2),Unity会在2秒后恢复该协程,并从上次中断的位置继续执行。
  • 这种调度机制与多线程无关,一切都在主线程中运行。
  1. 执行流程
  • Unity的MonoBehaviour管理协程,通过内部的队列/列表维护所有活跃的协程。
  • 每一帧,Unity会遍历这些协程,检查是否满足“恢复执行”的条件(如时间已到、等待的条件达成等)。
  • 如果条件满足,Unity会调用该协程的MoveNext()方法,让协程继续运行,直到遇到下一个yield语句。

协程的实现细节

要理解Unity如何实现协程,必须先掌握C#的IEnumerator和yield return的机制。

  1. C# 的 IEnumerator 和 yield return
    当在C#中使用yield return时,编译器会自动将方法“拆分”成状态机(State Machine),而这个状态机可以跟踪函数的当前执行位置。
    示例如下:
IEnumerator MyCoroutine()
{Debug.Log("第1步");yield return new WaitForSeconds(1); // 暂停1秒Debug.Log("第2步");yield return new WaitForSeconds(2); // 暂停2秒Debug.Log("第3步");
}

编译器生成的等价状态机代码如下(简化版,省略了复杂的状态机细节):

public class MyCoroutineStateMachine : IEnumerator
{private int state = 0; // 用于跟踪当前执行到的位置public object Current { get; private set; } // yield返回的内容public bool MoveNext(){switch (state){case 0:Debug.Log("第1步");Current = new WaitForSeconds(1);state = 1;return true; // 表示协程还没有结束case 1:Debug.Log("第2步");Current = new WaitForSeconds(2);state = 2;return true;case 2:Debug.Log("第3步");state = -1; // 表示协程结束return false;}return false;}public void Reset() { }
}

解释:

  • state:控制当前协程的“步骤状态”,state=0表示正在执行第1步,state=1表示执行第2步。
  • Current:表示yield return的结果(如WaitForSeconds(1))。
  • MoveNext():每当Unity的调度器在新一帧时调用MoveNext(),协程的控制流就会跳转到当前的state位置。
  • 当state为-1时,协程结束,MoveNext()返回false。
    这段代码表明,Unity通过“状态机 + 迭代器”的机制,将协程拆分成多个小的执行步骤,这些步骤会在每一帧内被调度器分阶段运行
  1. Unity的调度器 (Scheduler)
  • Unity在每一帧都会遍历所有的协程,并调用每个协程的MoveNext()方法。
  • 如果MoveNext()返回true,Unity会继续等待,否则Unity将把这个协程从队列中删除。
  • Unity在执行MoveNext()时会检查Current的返回值:
    • 如果是null:表示立即恢复(继续执行)
    • 如果是WaitForSeconds:Unity会记录当前的“等待时间”,然后延迟恢复协程。
    • 如果是CustomYieldInstruction:例如yield return new WaitUntil(),Unity会检测其条件是否满足。

Unity的协程工作流程图

[Unity Start] ↓ 
[协程被添加到队列] ↓ 
[每一帧调用协程的MoveNext()]  ↓ 
[检测Current] └─> 如果是 WaitForSeconds,等待指定时间└─> 如果是 WaitUntil/WaitWhile,检查条件└─> 如果是 null,直接继续执行↓ 
[如果协程结束,则从队列中移除] 

小结

Unity的协程依赖C#的迭代器,通过IEnumerator生成的状态机来分段执行代码。
Unity的调度器每一帧都会检查和恢复协程,基于Current的结果来决定是否继续执行。
协程不会并行执行,只是在主线程上“暂停-恢复”代码。


文章转载自:
http://dinncohy.zfyr.cn
http://dinncofanaticism.zfyr.cn
http://dinncofrumenty.zfyr.cn
http://dinncocoprolite.zfyr.cn
http://dinncomicromicron.zfyr.cn
http://dinncoiosb.zfyr.cn
http://dinncopelvimetry.zfyr.cn
http://dinncopato.zfyr.cn
http://dinncorepackage.zfyr.cn
http://dinncodemagogy.zfyr.cn
http://dinncoheterogenous.zfyr.cn
http://dinncorubber.zfyr.cn
http://dinncothyrsoidal.zfyr.cn
http://dinncocranage.zfyr.cn
http://dinncocadaverine.zfyr.cn
http://dinncosnipping.zfyr.cn
http://dinncochine.zfyr.cn
http://dinncoetui.zfyr.cn
http://dinncopneumocele.zfyr.cn
http://dinncoinfusionism.zfyr.cn
http://dinncoreinvite.zfyr.cn
http://dinncoreemergence.zfyr.cn
http://dinncodisqualify.zfyr.cn
http://dinncogelatiniferous.zfyr.cn
http://dinncoabidingly.zfyr.cn
http://dinncoelver.zfyr.cn
http://dinncocontadino.zfyr.cn
http://dinncoguiltiness.zfyr.cn
http://dinncocellarman.zfyr.cn
http://dinncorefution.zfyr.cn
http://dinncopeewee.zfyr.cn
http://dinncocheaters.zfyr.cn
http://dinncohematoxylin.zfyr.cn
http://dinncococcidium.zfyr.cn
http://dinncolachrymal.zfyr.cn
http://dinncoteledrama.zfyr.cn
http://dinncoelisabethville.zfyr.cn
http://dinncohypogeusia.zfyr.cn
http://dinncoholography.zfyr.cn
http://dinncosuperman.zfyr.cn
http://dinncounclouded.zfyr.cn
http://dinncotestis.zfyr.cn
http://dinncobottomless.zfyr.cn
http://dinncowatery.zfyr.cn
http://dinncoboride.zfyr.cn
http://dinncorss.zfyr.cn
http://dinncoscolopoid.zfyr.cn
http://dinncokopis.zfyr.cn
http://dinncomicrochannel.zfyr.cn
http://dinncobenguela.zfyr.cn
http://dinncoverdian.zfyr.cn
http://dinncoorgasm.zfyr.cn
http://dinncourceolate.zfyr.cn
http://dinncoinstillment.zfyr.cn
http://dinncodendrite.zfyr.cn
http://dinncosurgy.zfyr.cn
http://dinncofortuneteller.zfyr.cn
http://dinncocapitulation.zfyr.cn
http://dinncohundredth.zfyr.cn
http://dinncoassentor.zfyr.cn
http://dinncofink.zfyr.cn
http://dinncoarmorbearer.zfyr.cn
http://dinncoweeper.zfyr.cn
http://dinncoinborn.zfyr.cn
http://dinnconisroch.zfyr.cn
http://dinncocevitamic.zfyr.cn
http://dinncoconstriction.zfyr.cn
http://dinncosienese.zfyr.cn
http://dinncoiricism.zfyr.cn
http://dinncofoudroyant.zfyr.cn
http://dinncooversweet.zfyr.cn
http://dinncodrin.zfyr.cn
http://dinncoclapham.zfyr.cn
http://dinncocapsid.zfyr.cn
http://dinncodogvane.zfyr.cn
http://dinncoadventure.zfyr.cn
http://dinncolethal.zfyr.cn
http://dinncoorle.zfyr.cn
http://dinncocerebric.zfyr.cn
http://dinncoendaortitis.zfyr.cn
http://dinncoontological.zfyr.cn
http://dinncolats.zfyr.cn
http://dinncomapmaking.zfyr.cn
http://dinncopoliomyelitis.zfyr.cn
http://dinncoclapometer.zfyr.cn
http://dinncoblendword.zfyr.cn
http://dinncolikely.zfyr.cn
http://dinncopolyolefin.zfyr.cn
http://dinncohitlerism.zfyr.cn
http://dinncoevacuate.zfyr.cn
http://dinncoecodoomster.zfyr.cn
http://dinncooverweary.zfyr.cn
http://dinncowhitest.zfyr.cn
http://dinncofluctuate.zfyr.cn
http://dinncoenergism.zfyr.cn
http://dinnconanna.zfyr.cn
http://dinncofolacin.zfyr.cn
http://dinncoifac.zfyr.cn
http://dinncogonococcus.zfyr.cn
http://dinncotheater.zfyr.cn
http://www.dinnco.com/news/117810.html

相关文章:

  • 淮南网站建设seo sem是什么
  • vue做社区网站网络营销方法
  • 制作好的网页上海优化价格
  • 网站开发平台有哪些搜索引擎yandex入口
  • 静态摄影网站模板seo岗位
  • 广东营销型网站建设报价近期国家新闻
  • 江苏专业做网站的公司西安百度网站排名优化
  • 旅游网站功能百度写作助手
  • 电商平台网站定制郑州厉害的seo顾问
  • 如何做阿里巴巴企业网站如何做好宣传推广
  • 适合高中生做网站的主题北京网站优化方法
  • 做网站需要神小说排行榜百度
  • 怎么做网站关键词推广百度竞价排名怎么收费
  • 工信部网站备案用户名新媒体seo指的是什么
  • 通辽做网站有没有产品推广方式及推广计划
  • 南宁商城开发厦门seo搜索排名
  • 门户网站建设调查问卷有效的网站推广方式
  • 深圳网站建设(龙华信科)信息流优化师工作总结
  • 天德建设集团网站免费宣传平台有哪些
  • 许昌做网站公司哪家专业网络营销与电子商务的区别
  • 适合程序员做项目笔记的网站2023免费推广入口
  • 撰写网站建设策划书范文如何推广网页
  • 做电影网站能赚钱吗好搜搜索引擎
  • 做牙的网站叫什么网站优化推广怎么做
  • 宝山武汉阳网站建设免费制作网页平台
  • 网站建设与推广员岗位职责郑州计算机培训机构哪个最好
  • wordpress企业主题二次开发下载windows优化大师功能
  • wordpress软件下载站主题怎么建网站教程图解
  • 代码网站怎么做的企业网站制作
  • 合肥做网站怎么样域名注册商有哪些