?????個人主頁:@元宇宙-秩沅
????? hallo 歡迎 點(diǎn)贊?? 收藏? 留言?? 加關(guān)注?!
????? 本文由 秩沅 原創(chuàng)
????? 收錄于專欄:unity每日一記
????推薦文章?
?【軟件設(shè)計師高頻考點(diǎn)暴擊】
?【Unityc#專題篇】之c#系統(tǒng)化大禮包】
?【unity數(shù)據(jù)持久化】數(shù)據(jù)管理類_PlayerPrfs
?【unity本站最全系列】unity常用API大全一篇文章足以
??
?? Unity協(xié)程
介紹和區(qū)別
Unity中的多線程
- Unity支持多線程,但是操作相關(guān)對象還得在主線程中實(shí)現(xiàn),要注意關(guān)閉線程最后
- 但是可以作為復(fù)雜算法或邏輯運(yùn)算計算的復(fù)線程,(線程是獨(dú)立運(yùn)行的管道)——專門用一個線程來做這些復(fù)雜的運(yùn)算
協(xié)程和多線程的區(qū)別
- 1.協(xié)程不是多線程,并且在繼承 Mononabehavar類下使用
- 2.多線程是和主線程區(qū)分開來的
- 3.協(xié)程是在主線程中運(yùn)行的,只是分時分布將邏輯進(jìn)行處理
協(xié)程主要作用
協(xié)程主要作用
1.延時調(diào)用
IEnumerator ChangeState() //協(xié)程迭代器的定義
{
//暫停幾秒(協(xié)程掛起)
yield return new WaitForSeconds(2);
//暫停兩秒后再切入走路的動畫
animator.Play("Walk");`
}
2.和其他邏輯一起協(xié)同執(zhí)行
,比如一些很耗時的工作,在這個協(xié)程中執(zhí)行異步操作,比如下載文件,加載文件,異步生成怪物等
*資源加載一般是一個比較耗時的操作,如果直接放在主線程中會導(dǎo)致游戲卡頓,通常會放到異步線程中去執(zhí)行。
3.分布分時執(zhí)行復(fù)雜算法或繁雜邏輯
比如創(chuàng)建隨機(jī)創(chuàng)建一萬個球不卡幀
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));
}
}
協(xié)程API相關(guān)
協(xié)程的聲明
- 返回值為IEnumerator類型及其子類
- 函數(shù)中通過 yield return 進(jìn)行返回
// MyCoroutine為自定義協(xié)程名
IEnumerator MyCoroutine(int i, string str)
{
//分時分布執(zhí)行。先打印i然后暫停1秒之后再打印3242
print(i);
yield return new WaitForSeconds(1f);
print("3242");
}
協(xié)程的開啟和停止
-
開啟
StartCoroutine(MyCoroutine(1, “123”)); -
關(guān)閉所有協(xié)程
StopAllCoroutines(); -
關(guān)閉指定協(xié)程
StopCoroutine(c1);
只有當(dāng)組件失活時協(xié)程不會失活,對象失活時協(xié)程也會失活
void start()
{
啟動方法一 String:
StartCoroutine("ChangeState"); //括號內(nèi)的是協(xié)程名
啟動方法二 函數(shù):
StartCoroutine(ChangeState());
啟動方法三 接口: //有參協(xié)程只能用該方法開啟
IEnumerator ie = ChangeState();
StartCoroutine(ie);
停止方法一 String:
StopCoroutine("ChangeState");
停止方法二 函數(shù):
StopCoroutine(ChangeState());
停止方法三 接口:
StopCoroutine(ie);
停止方法四 協(xié)程:
Coroutine c1 = StartCoroutine( ChangeState());
StopCoroutine(c1);
停止所有協(xié)程:
StopAllCoroutines();
}
-------------協(xié)程中的 yield------------
//1.下一幀執(zhí)行
yield return 數(shù)字;
yield return null;
//在Update和LateUpdate之間執(zhí)行
//表示在本幀幀末執(zhí)行以下邏輯
yield return new WaitForEndOfFrame();
//2.等待指定秒后執(zhí)行
yield return new WaitForSeconds(秒);
//在Update和LateUpdate之間執(zhí)行
//3.等待下一個固定物理幀更新時執(zhí)行
yield return new WaitForFixedUpdate();
//在FixedUpdate和碰撞檢測相關(guān)函數(shù)之后執(zhí)行
//4.等待攝像機(jī)和GUI渲染完成后執(zhí)行
yield return new WaitForEndOfFrame();
//在LateUpdate之后的渲染相關(guān)處理完畢后之后,截圖功能放在這個后面執(zhí)行
//5.一些特殊類型的對象 異步加載相關(guān)函數(shù)返回的對象
//一般在Update和LateUpdate之間執(zhí)行
//6.跳出協(xié)程
yield break;
???????4.協(xié)程中的協(xié)程和有參協(xié)程
StartCoroutine("CreateBoss"); //啟動協(xié)程
//協(xié)程1 功能實(shí)時實(shí)例化游戲物體
IEnumerator CreateBoss()
{
StartCoroutine(SetCreateCount(5));
while (true) //功能實(shí)時實(shí)例化游戲物體
{
if (BossNum>=BossCount)
{
yield break; //在協(xié)程中break前面要加 yield
}
Instantiate(animator.gameObject);
BossNum++;
yield return new WaitForSeconds(2);
}
}
//協(xié)程2 功能實(shí)時實(shí)例化游戲物體
IEnumerator SetCreateCount(int num)
{
BossCount =num;
yield return null; //暫停一幀
---------------------
此時如果這里只是暫停一幀的話,
那么上面調(diào)該有參協(xié)程的協(xié)程體中,
后面的語句并未生效,因?yàn)闀和R粠螅?后面的方法已經(jīng)執(zhí)行了,
所以此時的BossCount并不等于有參傳遞的5
(當(dāng)然BossCount是全局變量)
---------------------
}
---
協(xié)程的本質(zhì)
協(xié)程的本質(zhì)
- 1.本體為迭代器
- 2.協(xié)程調(diào)度器(可自己實(shí)現(xiàn))
//Ieunmrator接口中的兩個成員:MoveNext_移動下一個 Current——當(dāng)前返回值
while(ie.MoveNext())
{
print(ie.Current);
}
????系統(tǒng)路線學(xué)習(xí)點(diǎn)擊跳轉(zhuǎn)?
?【Unityc#專題篇】之c#進(jìn)階篇】
?【Unityc#專題篇】之c#核心篇】
?【Unityc#專題篇】之c#基礎(chǔ)篇】
?【Unity-c#專題篇】之c#入門篇】
?【Unityc#專題篇】—進(jìn)階章題單實(shí)踐練習(xí)
?【Unityc#專題篇】—基礎(chǔ)章題單實(shí)踐練習(xí)
?【Unityc#專題篇】—核心章題單實(shí)踐練習(xí)
你們的點(diǎn)贊?? 收藏? 留言?? 關(guān)注?是我持續(xù)創(chuàng)作,輸出優(yōu)質(zhì)內(nèi)容的最大動力!、文章來源:http://www.zghlxwxcb.cn/news/detail-751499.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-751499.html
到了這里,關(guān)于【Unity每日一記】“調(diào)皮的協(xié)程”,協(xié)程和多線程的區(qū)別在哪里的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!