亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Unity3d中的“await”如何不阻塞?

Unity3d中的“await”如何不阻塞?

C#
隔江千里 2023-08-20 15:39:46
這是我的代碼using System;using System.Collections;using System.Threading.Tasks;using UnityEngine;public class NewMonoBehaviour : MonoBehaviour{    // Start is called before the first frame update    [SerializeField]    GameObject player;    void Start()    {    }    // Update is called once per frame    async void Update()    {        if (Input.GetKeyDown("space"))        {            Debug.Log("Start");            await Task.Delay(3000);            Debug.Log("End");        }        if (Input.GetKey(KeyCode.A))        {            player.transform.Translate(new Vector3(-1,0,0) * Time.deltaTime);        }        if (Input.GetKey(KeyCode.D))        {            player.transform.Translate(new Vector3(1,0,0) * Time.deltaTime);        }    }}當我按下空格鍵時,即使延遲尚未結束,我也可以左右移動。此外,我可以反復按空格鍵以獲得StartStartStartEndEndEnd這就像我想要的那樣,但我想了解為什么。我想這個方法中的所有內容都會被阻止,直到 Task.Delay 完成。
查看完整描述

2 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

你已經完成了async整個Update()方法。


async void Update()

{//whatever needs to be done in a frame}

渲染Update方法異步運行,這樣 Unity 就不會等待它返回就繼續執行。它繼續調用Update()所有其他對象,執行其操作,渲染幀,直到async void Update()在同一對象上的下一幀上達到相同的效果。所以,它可以反應


if (Input.GetKey(KeyCode.A))

    {

        player.transform.Translate(new Vector3(-1,0,0) * Time.deltaTime);

    }

在后一幀上,即使前一幀Update()正在等待await Task.Delay(3000). 這就是您獲得結果的原因。


順便說一句,async void Update()恕我直言,這是一個壞主意,因為當各種Update()方法在意外的時間返回不同的值并在意外的時間修改變量時,您會得到意外的結果。我會保持Update()同步,并最終讓它調用一個async可以滿足您需要的方法。


查看完整回答
反對 回復 2023-08-20
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

異步編程并使用基于任務的異步模式 (TAP)

基于 .NET 任務的異步模型由 Task 和 Task 類型以及 C# 中的 async 和await 關鍵字公開

我意識到理解這些文檔并不總是那么容易;所以基本上發生的情況是,當您await在方法中時,返回值在調用中“保留”?await Update()。一旦等待完成,調用者將收到該值,這將在調用樹中向上級聯。

重要的是每個單獨的方法調用都變得異步。我認為它就像你給員工的工作卡。你可以不斷地給他們新卡,每次他們完成工作時,他們都會把卡還給你,你就做你必須做的事。員工可能會選擇先做簡單的事情,這樣您很可能會以不同的順序取回卡片,但這并不重要。


查看完整回答
反對 回復 2023-08-20
  • 2 回答
  • 0 關注
  • 254 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號