协程到底是什么呢?我们应该怎么使用? 什么是协程协程就是一段可以在函数内部进行暂停之后再从暂停位置继续往下进行的函数。不会影响主线程。普通函数从头执行到尾一气呵成。voidTest(){Debug.Log(A);Debug.Log(B);Debug.Log(C);}协程函数可以在打印完“A”以后先暂停1秒在此期间主进程不受到任何影响在1秒等待结束以后再打印“B”…以此类推。IEnumeratorTestCor(){Debug.Log(A);yieldreturnnewWaitForSecondsRealtime(1f);// 在这里主动暂停Debug.Log(B);yieldreturnnewWaitForSecondsRealtime(1f);// 再暂停一次Debug.Log(C);}其中yield return就是暂停标记只会影响当前协程函数。协程有什么用呢在软件开发过程中经常会涉及到分段执行逻辑比如倒计时、异步加载场景等。如果使用普通函数中间没有办法暂停等待而且写在普通方法里还会容易引起主线程堵塞等问题造成游戏界面卡顿、游戏卡死等。这时候我们就可以使用协程函数来解决这类含有“时序逻辑”的功能在函数内部进行暂停等待条件满足以后再从暂停出继续执行后面的代码。例如我们再游戏初始页面的“忠告场景”通常会停留3秒然后再加载下一个场景画面这时候我们用协程就可以完美解决问题。IEnumeratorWaitAndLoadScene(){yieldreturnnewWaitForSecondsRealtime(waitTime);SceneManager.LoadScene(next_SceneName);}等待动画执行完毕再开启交互IEnumeratorShowPanel(){animator.Play(PanelIn);// 等待动画播放完成yieldreturnnewWaitUntil(()animator.GetCurrentAnimatorStateInfo(0).normalizedTime1);tipText.gameObject.SetActive(true);}协程如何使用启动协程//传入迭代器StartCoroutine(TestCoroutine());StartCoroutine只会启动一次协程实例后续的暂停、恢复都是在同一个协程内部进行的不用每次重新调用。停止协程如果需要中途终止协程需要提前接收协程引用通过引用停止。privateCoroutinemyCor;voidStart(){// 保存协程引用myCorStartCoroutine(TestCoroutine());}voidStop(){// 通过引用精准停止StopCoroutine(myCor);}注意挂载该脚本的GameObject执行SetActive(false)或者Destroy()物体身上所有正在运行的协程都会被强制终止。协程方法定义IEnumerator 协程方法名(){// 业务逻辑yieldreturnxxx;// 暂停标记}协程实例_隐私政策弹窗倒计时实现效果隐私弹窗同意按钮初始不可点击文字依次显示 同意(5秒)、同意(4秒) … 同意(1秒)倒计时走完后文字变成同意、按钮可以点击。usingUnityEngine;usingUnityEngine.UI;usingSystem.Collections;usingUnityEngine.SceneManagement;publicclassPrivacyPopup:MonoBehaviour{[Header(同意按钮)]publicButtonagreeBtn;[Header(按钮上的文字组件)]publicTextbtnText;[Header(倒计时总时长)]publicinttotalTime5;voidStart(){agreeBtn.onClick.AddListener((){SceneManager.LoadScene(SceneName);});StartCoroutine(StartCountDown());}// 协程返回IEnumeratoryield return 暂停等待IEnumeratorStartCountDown(){//进入协程//关闭同意按钮的交互agreeBtn.interactablefalse;//查询t是否0如果满足要求 进入for循环for(intttotalTime;t0;t--){//同意按钮上的文案显示出剩余描述btnText.text$同意 ({t}秒);//暂停一秒yieldreturnnewWaitForSecondsRealtime(1f);//一秒结束以后 当前循环体执行完毕执行for的t--然后再返回判断}// 循环结束倒计时走完btnText.text同意;agreeBtn.interactabletrue;//执行到这里时这个协程就彻底结束了}// 【拒绝按钮点击事件】publicvoidOnRefuse(){Debug.Log(拒绝协议退出应用);Application.Quit();}}常用yield return指令// 1. 等待指定时长受游戏时间缩放Time.timeScale影响游戏暂停时计时停止yieldreturnnewWaitForSeconds(1f);// 2. 等待指定真实时间不受Time.timeScale影响弹窗倒计时优先选这个yieldreturnnewWaitForSecondsRealtime(1f);// 3. 等待到下一帧渲染完毕之后继续执行yieldreturnnull;// 4. 等待条件满足括号内表达式返回true才往下走yieldreturnnewWaitUntil(()isLoadComplete);// 5. 等待另外一个协程全部执行完成之后再继续当前协程协程嵌套yieldreturnOtherCoroutine();本专栏记录Unity新手小白的学习成长之路愿和大家一同钻研、共同进步。文章若有疏漏或错误欢迎各位大佬在评论区指正我会及时勘误优化。觉得内容对你有帮助不妨点个关注后续持续更新Unity实用干货本文部分内容由 AI 辅助整理生成