国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity協(xié)程詳解:從基礎知識到實現

深入研究 Unity 的協(xié)程。了解基礎知識、Unity 的獨特實現以及如何有效管理協(xié)程。

異步編程是現代游戲開發(fā)的基石,使開發(fā)人員能夠同時執(zhí)行多個任務而不會阻塞主線程。這對于保持流暢的游戲體驗和增強整體用戶體驗至關重要。在 Unity 中實現這一目標的最強大但經常被誤解的功能之一是協(xié)程。 

在本文中,我們將揭開 Unity 協(xié)程的神秘面紗,首先對更廣泛的編程環(huán)境中的協(xié)程有一個基本的了解。然后,我們將把重點集中到 Unity 對這一概念的具體實現,它允許簡化但強大的異步編程。讀完本文后,您將牢牢掌握如何在 Unity 項目中啟動、停止和有效利用協(xié)程。

無論您是 Unity 新手還是希望加深對此功能的理解的經驗豐富的開發(fā)人員,本文旨在為您提供所需的知識,使您的游戲開發(fā)之旅更加順暢和高效。

請繼續(xù)關注我們深入研究 Unity 協(xié)程的基本知識:從基礎知識到實現。

了解協(xié)程

協(xié)程是編程世界中一個令人著迷且強大的結構。與傳統(tǒng)方法相比,它們允許更靈活和協(xié)作的多任務處理形式。在深入研究 Unity 的具體實現之前,我們首先了解一下一般編程環(huán)境中的協(xié)程是什么。

協(xié)程是一種控制結構,其中流量控制在兩個不同的例程之間協(xié)作傳遞而不返回。簡單來說,假設您有兩個任務 A 和 B。通常,您會先完成任務 A,然后再繼續(xù)執(zhí)行任務 B。但是,使用協(xié)程,您可以啟動任務 A,暫停它,切換到任務 B,然后恢復任務 A 從您上次停下的地方開始。這對于不需要一次性完成并且可以將控制權交給其他任務以提高效率的任務特別有用。

傳統(tǒng)的函數和方法具有單個入口點和單個出口點。當您調用函數時,它會運行到完成,然后將控制權返回給調用者。另一方面,協(xié)程可以有多個入口和出口點。他們可以在特定點暫停執(zhí)行,將控制權交還給調用函數,然后從中斷處恢復。

在 Unity 中,這種暫停和恢復的能力使得協(xié)程對于各種任務(例如動畫、計時和處理異步操作)非常有用,而無需多線程的復雜性。

Unity 對協(xié)程的看法

Unity對協(xié)程的實現有點獨特,但非常符合引擎簡單易用的整體設計理念。Unity 使用 C# 的IEnumerator接口來實現其協(xié)程功能。這允許您使用“yield”關鍵字來暫停和恢復協(xié)程的執(zhí)行。

下面是一個簡單的 Unity C# 示例來演示協(xié)程:

using System.Collections;
using UnityEngine;

public class CoroutineExample : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(SimpleCoroutine());
    }

    IEnumerator SimpleCoroutine()
    {
        Debug.Log("Coroutine started");
        yield return new WaitForSeconds(1);
        Debug.Log("Coroutine resumed");
        yield return new WaitForSeconds(1);
        Debug.Log("Coroutine ended");
    }
}

在此示例中,該SimpleCoroutine方法被定義為IEnumerator在協(xié)程內部,我們用于Debug.Log將消息打印到 Unity 控制臺。yield return new WaitForSeconds(1);行將協(xié)程暫停一秒鐘。暫停后,協(xié)程恢復并繼續(xù)執(zhí)行。

這是一個非?;镜氖纠?,但它演示了 Unity 協(xié)程如何工作的核心概念。它們允許您以更直接和可讀的方式編寫異步代碼,而無需陷入多線程或回調地獄的復雜性。

總之,Unity 的協(xié)程提供了一種強大而簡單的方法來處理Unity 引擎內的異步編程。他們利用IEnumerator界面和yield關鍵字提供靈活的暫停和恢復任務機制,從而更輕松地創(chuàng)建流暢且響應靈敏的游戲。

Unity對協(xié)程的實現

Unity 的協(xié)程方法既優(yōu)雅又實用,非常適合引擎更廣泛的設計理念。該實現植根于 C# 的IEnumerator接口,它提供了迭代所需的方法。這使得 Unity 可以使用yield關鍵字來暫停和恢復協(xié)程的執(zhí)行,使其成為 Unity 環(huán)境中異步編程的強大工具。

Unity如何實現協(xié)程的解釋

在 Unity 中,協(xié)程本質上是返回IEnumerator接口的方法。IEnumerator接口是 System.Collections 命名空間的一部分,提供迭代集合的基本方法。然而,Unity 巧妙地重新利用了這個接口來控制協(xié)程的執(zhí)行流程。

下面用一個簡單的例子來說明 Unity 協(xié)程的工作原理:

using System.Collections;
using UnityEngine;

public class CoroutineDemo : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    IEnumerator MyCoroutine()
    {
        Debug.Log("Coroutine started at time: " + Time.time);
        yield return new WaitForSeconds(2);
        Debug.Log("Coroutine resumed at time: " + Time.time);
    }
}

在此示例中,該MyCoroutine方法返回一個IEnumerator在協(xié)程內部,我們記錄當前時間,然后用于yield return new WaitForSeconds(2);將協(xié)程暫停 2 秒。暫停后,協(xié)程恢復,我們再次記錄時間。

接口IEnumerator是Unity協(xié)程系統(tǒng)的基石。它提供了方法MoveNext()、Reset()和 屬性Current,Unity 在內部使用這些方法來控制協(xié)程的執(zhí)行。yield當您在協(xié)程中使用關鍵字時,您實際上是提供了一個點,該MoveNext()方法將在該點暫停并稍后恢復執(zhí)行。

yield return語句可以采用各種類型的參數來控制協(xié)程的行為。例如:

using System.Collections;
using UnityEngine;

public class MultipleYields : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(ComplexCoroutine());
    }
  
    IEnumerator ComplexCoroutine()
    {
        Debug.Log("Started at frame: " + Time.frameCount);
        yield return null;
        Debug.Log("One frame later: " + Time.frameCount);

        Debug.Log("Waiting for 2 seconds...");
        yield return new WaitForSeconds(2);
        Debug.Log("Resumed after 2 seconds.");

        yield return new WaitForEndOfFrame();
        Debug.Log("Waited for end of frame.");
    }
}

在此示例中,該ComplexCoroutine方法使用不同類型的yield語句來控制其執(zhí)行流程。IEnumerator這展示了在 Unity 協(xié)程中使用接口的靈活性和強大功能。

總之,Unity 通過接口實現協(xié)程IEnumerator提供了一種強大且靈活的方式來處理游戲中的異步任務。無論您是為角色設置動畫、加載資源還是進行網絡調用,協(xié)程都提供了一種簡單的方法來執(zhí)行這些操作,而不會阻塞主線程,從而使您的游戲保持流暢和響應靈敏。

啟動和停止協(xié)程

了解如何啟動和停止協(xié)程對于有效管理 Unity 中的異步任務至關重要。該引擎提供了簡單而強大的方法來控制協(xié)程的生命周期,允許您根據需要啟動、暫停和終止它們。在本節(jié)中,我們將深入研究這些方法及其用法。

在 Unity 中啟動協(xié)程非常簡單。您使用該StartCoroutine()方法,該方法是該類的成員MonoBehaviour該方法接受 anIEnumerator作為參數,它是您要啟動的協(xié)程。 

這是一個基本示例:

using System.Collections;
using UnityEngine;

public class StartCoroutineExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    IEnumerator MyCoroutine()
    {
        Debug.Log("Coroutine has started.");
        yield return new WaitForSeconds(2);
        Debug.Log("Two seconds have passed.");
    }
}

在此示例中,該Start()方法調用StartCoroutine(MyCoroutine()),啟動協(xié)程。MyCoroutine方法被定義為IEnumerator,滿足該方法的要求StartCoroutine()

您還可以通過傳遞方法的字符串名稱來啟動協(xié)程:

StartCoroutine("MyCoroutine");

但是,這種方法通常效率較低且更容易出錯,因為它依賴于反射并且不會在編譯時進行檢查。

如何停止協(xié)程的使用StopCoroutine()和StopAllCoroutines()方法

停止協(xié)程與啟動協(xié)程一樣重要,尤其是當您需要管理資源或動態(tài)更改游戲流程時。Unity 為此提供了兩種方法:StopCoroutine()StopAllCoroutines()。

  • StopCoroutine():該方法停止特定的協(xié)程。您可以傳遞協(xié)程的名稱IEnumerator或協(xié)程方法的字符串名稱來停止它。

using System.Collections;
using UnityEngine;

public class StopCoroutineExample : MonoBehaviour
{
    IEnumerator MyCoroutine()
    {
        while (true)
        {
            Debug.Log("Coroutine is running.");
            yield return new WaitForSeconds(1);
        }
    }

    void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StopCoroutine(MyCoroutine());
            Debug.Log("Coroutine has been stopped.");
        }
    }
}

在此示例中,按空格鍵將停止正在無限循環(huán)中運行的“MyCoroutine”協(xié)程。

  • StopAllCoroutines():此方法停止當前MonoBehaviour腳本上運行的所有協(xié)程。

using System.Collections;
using UnityEngine;

public class StopAllCoroutinesExample : MonoBehaviour
{
    IEnumerator Coroutine1()
    {
        while (true)
        {
            Debug.Log("Coroutine1 is running.");
            yield return new WaitForSeconds(1);
        }
    }

    IEnumerator Coroutine2()
    {
        while (true)
        {
            Debug.Log("Coroutine2 is running.");
            yield return new WaitForSeconds(1);
        }
    }

    void Start()
    {
        StartCoroutine(Coroutine1());
        StartCoroutine(Coroutine2());
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StopAllCoroutines();
            Debug.Log("All coroutines have been stopped.");
        }
    }
}

在此示例中,按空格鍵將停止Coroutine1當前.Coroutine2MonoBehaviour

總之,Unity 提供了一套簡單而強大的工具來管理協(xié)程的生命周期。StartCoroutine()方法允許您啟動它們,同時StopCoroutine()StopAllCoroutines()您控制它們的終止。這些方法對于在 Unity 中編寫高效且可管理的異步代碼至關重要。

總結

Unity 中的協(xié)程是一個強大的工具,可以以更易于管理和更高效的方式處理各種任務。它們提供了一種簡化的異步編程方法,使開發(fā)人員能夠編寫更清晰、更具可讀性的代碼。通過了解基礎知識,您已經為深入了解在 Unity 中使用協(xié)程的更復雜和微妙的方面奠定了基礎。

在本文中,我們介紹了基本要素:

  • 理解協(xié)程:我們首先定義通用編程上下文中的協(xié)程,強調它們暫停和恢復執(zhí)行的能力,這將它們與傳統(tǒng)的函數和方法區(qū)分開來。

  • Unity 的協(xié)程實現:我們深入研究了 Unity 如何使用“IEnumerator”接口獨特地實現協(xié)程。此實現允許使用關鍵字yield,該關鍵字對于暫停和恢復協(xié)程執(zhí)行至關重要。

  • 啟動和停止協(xié)程:最后,我們探討了 Unity 提供的用于控制協(xié)程生命周期的方法。我們討論了如何使用 和 啟動協(xié)程以及StartCoroutine()如何停止其執(zhí)行。StopCoroutine()StopAllCoroutines()

隨著我們的前進,有幾個高級主題需要探索:

  • Yielding的概念:了解不同類型的yielding指令可以幫助您更有效地控制協(xié)程。這包括等待幾秒、等待幀結束、甚至等待異步操作完成。

  • 執(zhí)行流程:深入研究協(xié)程如何影響 Unity 項目的整體執(zhí)行流程,可以提供優(yōu)化性能和資源管理的見解。

  • 實際用例:協(xié)程用途廣泛,可用于多種場景,例如動畫、AI 行為、程序生成和網絡調用等。

在下一篇文章中,我們將深入研究這些高級主題,為您提供在項目中充分利用 Unity 協(xié)程功能的知識。無論您是剛入門的初學者,還是希望優(yōu)化代碼的經驗豐富的開發(fā)人員,了解協(xié)程都是一項寶貴的技能,可以提升您的Unity 開發(fā)體驗文章來源地址http://www.zghlxwxcb.cn/article/473.html

到此這篇關于Unity協(xié)程詳解:從基礎知識到實現的文章就介紹到這了,更多相關內容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

原文地址:http://www.zghlxwxcb.cn/article/473.html

如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請聯(lián)系站長進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Unity C# 之 使用 HttpWebRequest 基礎知識/HttpWebRequest 進行異步Post 網絡訪問/數據流形式獲取數據(Task/async/await)的代碼簡單實現

    Unity C# 之 使用 HttpWebRequest 基礎知識/HttpWebRequest 進行異步Post 網絡訪問/數據流形式獲取數據(Task/async/await)的代碼簡單實現

    目錄 Unity C# 之 使用 HttpWebRequest 基礎知識/HttpWebRequest 進行異步Post 網絡訪問/數據流形式獲取數據(Task/async/await)的代碼簡單實現 一、簡單介紹 二、實現原理 三、注意事項 四、效果預覽 五、關鍵代碼 附錄 : HttpWebRequest 的一些基礎知識 1、HttpWebRequest 常用屬性 2、HttpWebRequest?

    2024年02月05日
    瀏覽(24)
  • Unity 游戲開發(fā)、01 基礎知識大全、簡單功能腳本實現

    Unity默認窗口布局 Hierarchy 層級窗口 Scene 場景窗口,3D視圖窗口 Game 游戲播放窗口 Inspector 檢查器窗口,屬性窗口 Project 項目窗口 Console 控制臺窗口 恢復默認布局 Window | Layouts | Default 調大頁面字體 Preference | UI Scaling 新項目默認創(chuàng)建了 SampleScene 場景 {攝像機,平行光} SampleScen

    2024年02月09日
    瀏覽(54)
  • Unity 游戲開發(fā)、01 基礎篇 | 知識大全、簡單功能腳本實現

    Unity默認窗口布局 Hierarchy 層級窗口 Scene 場景窗口,3D視圖窗口 Game 游戲播放窗口 Inspector 檢查器窗口,屬性窗口 Project 項目窗口 Console 控制臺窗口 恢復默認布局 Window | Layouts | Default 調大頁面字體 Preference | UI Scaling 新項目默認創(chuàng)建了 SampleScene 場景 {攝像機,平行光} SampleScen

    2024年02月09日
    瀏覽(28)
  • 數電與Verilog基礎知識之同步和異步、同步復位與異步復位

    同步和異步是兩種不同的處理方式,它們的區(qū)別主要在于是否需要等待結果。同步是指一個任務在執(zhí)行過程中,必須等待上一個任務完成后才能繼續(xù)執(zhí)行下一個任務;異步是指一個任務在執(zhí)行過程中,不需要等待上一個任務完成,可以同時執(zhí)行多個任務。同步和異步的優(yōu)缺點

    2024年02月14日
    瀏覽(29)
  • 【前端知識】React 基礎鞏固(三十六)——RTK中的異步操作

    【前端知識】React 基礎鞏固(三十六)——RTK中的異步操作

    引入RTK中的createAsyncThunk,在extraReducers中監(jiān)聽執(zhí)行狀態(tài) 在界面中引入所需的異步操作Action 查看運行結果 extraReducer還可以傳入一個函數,函數接受一個builder參數: 查看運行結果,與之前的寫法結果一致

    2024年02月15日
    瀏覽(30)
  • 【前端知識】React 基礎鞏固(三十四)——組件中的異步操作及優(yōu)化

    【前端知識】React 基礎鞏固(三十四)——組件中的異步操作及優(yōu)化

    通過組件的生命周期來完成網絡請求,網絡請求的異步代碼直接放在組件中 通過redux來管理異步網絡請求 在store中引入中間件 redux-thunk 構建 fetchHomeMultidataAction ,將原本在組件中的異步請求代碼放入到actionCreators.js中 改寫原來的category.jsx,派發(fā)異步請求的dispatch 查看運行結果

    2024年02月15日
    瀏覽(38)
  • Python爬蟲|基礎知識點詳細匯總(requests、urllib、re、bs4、xpath、PyQuery、jsonpath、多線程、協(xié)程、數據保存、selenium)

    1. 請求數據 ① requests (1) 基本使用 參數 對響應內容的操作 (2) Requests進階:使用Session 為什么要用 Session? Session代表服務器與瀏覽器的一次會話過程,Session對象存儲了特定用戶會話所需的信息 例如:一定時間內記錄賬號密碼 (自動登錄) 可以加快 requests請求速度 需要客戶端登錄的

    2023年04月08日
    瀏覽(31)
  • Unity面經(自整)——Unity基礎知識

    Image比RawImage更耗性能。 Image只能使用sprite屬性的圖片。而RawImage什么都可以使用 碰撞器是觸發(fā)器的載體,而觸發(fā)器是碰撞器上的一個屬性。 如果IsTrigger為false,碰撞器根據物理引擎引發(fā)碰撞,產生碰撞的效果 如果IsTrigger為true,碰撞器被物理引擎忽略,沒有碰撞的效果 碰撞器

    2024年04月13日
    瀏覽(53)
  • Unity | Shader基礎知識(第九集:shader常用單詞基礎知識速成)

    Unity | Shader基礎知識(第九集:shader常用單詞基礎知識速成)

    目錄 一、頂點(Vertex)和法線(Normal) 二、UV信息 三、 基礎數據種類 1 基礎數據種類 2 基礎數據數組 3 基礎數據數組的賦值 4 對數據數組的調用 四、 基礎矩陣 1 基礎矩陣種類 ?2?對矩陣數組的調用 2.1對一個數據的調用 ?2.2對多個數據的調用 ?2.3對數據的賦值 五、基礎紋理種

    2024年02月01日
    瀏覽(38)
  • Unity中的熱更新的基礎知識,Xlua與ILRuntime基礎知識

    Unity中的熱更新的基礎知識,Xlua與ILRuntime基礎知識

    熱更新是指在不需要重新編譯打包游戲的情況下,在線更新游戲中的一些非核心代碼和資源,比如活動運營和打補丁。熱更新分為資源熱更新和代碼熱更新兩種,代碼熱更新實際上也是把代碼當成資源的一種熱更新,但通常所說的熱更新一般是指代碼熱更新。資源熱更新主要

    2023年04月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包