Unity基礎學習(五)Mono中的重要內容(1)延時函數

目錄

一、Mono中的延時函數Invoke

1. Invoke作用:延遲指定時間后執行一次函數。API:

2. InvokeRepeating作用:延遲后開始重復執行函數。API:

3. CancelInvoke作用:停止所有延時函數,或停止指定函數的延時執行。API:

4. IsInvoking作用:檢查是否有延時函數正在運行。API:

二、?Update 循環 + 計時器實現延時

三、異步 async/await(需 .NET 4.x+)


一、Mono中的延時函數Invoke

1. Invoke
作用:延遲指定時間后執行一次函數。
API:

void Invoke(string methodName, float time);

methodName:要執行的函數名(字符串形式)。
time:延遲時間(秒)

示例:

void Start()
{// 3秒后執行 Shoot 函數Invoke("Shoot", 3f);
}void Shoot()
{Debug.Log("發射子彈!");
}

注意事項:
函數名必須為字符串且嚴格匹配。
無法直接傳遞參數,需通過成員變量間接實現。

2. InvokeRepeating
作用:延遲后開始重復執行函數。
API:

void InvokeRepeating(string methodName, float delay, float repeatRate);

methodName:函數名(字符串)。
delay:第一次執行的延遲時間。
repeatRate:后續每次執行的間隔時間。

void Start()
{// 延遲2秒后,每隔1秒生成一個敵人InvokeRepeating("SpawnEnemy", 2f, 1f);
}void SpawnEnemy()
{Debug.Log("敵人生成!");
}

注意:若需停止重復執行,需手動調用 CancelInvoke。?

3. CancelInvoke
作用:停止所有延時函數,或停止指定函數的延時執行。
API:

void CancelInvoke(); ? ? ? ? ? ? ?// 停止所有延時函數
void CancelInvoke(string methodName); // 停止指定函數名的延時

void Update()
{if (Input.GetKeyDown(KeyCode.Space)){// 停止所有延時函數CancelInvoke();// 或僅停止 SpawnEnemy 的延時CancelInvoke("SpawnEnemy");}
}

即使函數未在運行,調用 CancelInvoke 也不會報錯。?

4. IsInvoking
作用:檢查是否有延時函數正在運行。
API:

bool IsInvoking(); ? ? ? ? ? ? ?// 檢查是否有任何延時函數在執行
bool IsInvoking(string methodName); // 檢查指定函數是否在延時執行中

void Update()
{if (IsInvoking("SpawnEnemy")){Debug.Log("正在生成敵人...");}
}

關鍵特性與注意事項
對象狀態影響:
腳本或對象失活(SetActive(false))時,延時函數仍會執行。
對象被銷毀(Destroy)或腳本被移除時,延時函數自動終止。

函數要求:
必須為本腳本中聲明的無參函數。
函數名需完全匹配(區分大小寫)。

參數傳遞限制:
無法直接傳參,可通過類成員變量間接實現:

private int _bulletType;void Start()
{_bulletType = 2;Invoke("Shoot", 1f);
}void Shoot()
{Debug.Log("發射類型為 " + _bulletType + " 的子彈");
}

二、?Update 循環 + 計時器實現延時

原理:在 Update 中通過累加 Time.deltaTime 手動控制計時器,觸發目標函數。
優點:靈活性高,可中途修改延遲時間或邏輯。
缺點:需自行管理計時器,代碼量稍多。

using UnityEngine;public class TimerExample : MonoBehaviour
{private float _delay = 2f;//延時時間private float _timer;//定時器private bool _hasTriggered;//是否處于延時間隔中void Update(){if (!_hasTriggered)//不處于延時間隔中{_timer += Time.deltaTime;//改變定時器 直到達到指定延時if (_timer >= _delay){DoSomething();_hasTriggered = true;}}}void DoSomething(){Debug.Log("2秒后執行!");}
}

例如實現一個可重復計時的定時器:

using UnityEngine;
using System;/// <summary>
/// 可重復觸發的定時器(基于游戲時間)
/// </summary>
public class GameTimer
{// 定時器觸發事件public event Action OnTimerTriggered;private float _interval;      // 觸發間隔(秒)private float _nextTriggerTime; // 下次觸發時間private bool _isActive;       // 定時器是否激活private bool _isRepeating;    // 是否重復觸發/// <summary>/// 初始化定時器/// </summary>/// <param name="interval">觸發間隔(秒)</param>/// <param name="isRepeating">是否重復</param>public GameTimer(float interval, bool isRepeating){_interval = interval;_isRepeating = isRepeating;}/// <summary>/// 啟動/重啟定時器/// </summary>public void Start(){_isActive = true;_nextTriggerTime = Time.time + _interval;}/// <summary>/// 停止定時器/// </summary>public void Stop(){_isActive = false;}/// <summary>/// 每幀更新定時器狀態/// </summary>public void Update(){if (!_isActive || Time.time < _nextTriggerTime) return;// 觸發事件OnTimerTriggered?.Invoke();if (_isRepeating){// 更新下次觸發時間(避免誤差累積)_nextTriggerTime = Time.time + _interval;}else{Stop();}}
}

?測試:

using UnityEngine;public class TimerExample : MonoBehaviour
{private GameTimer _gameTimer;private FrameTimer _frameTimer;void Start(){// 創建每5秒觸發一次的重復定時器(精準時間)_gameTimer = new GameTimer(5f, true);_gameTimer.OnTimerTriggered += HandleGameTimer;_gameTimer.Start();// 創建每1秒觸發一次的重復定時器(幀累積)_frameTimer = new FrameTimer(1f, true);_frameTimer.OnTimerTriggered += HandleFrameTimer;_frameTimer.Start();}void Update(){_gameTimer.Update();_frameTimer.Update();}void HandleGameTimer(){Debug.Log($"精準定時器觸發,當前時間:{Time.time}");}void HandleFrameTimer(){Debug.Log($"幀累積定時器觸發,運行時間:{Time.time}");}void OnDestroy(){_gameTimer.Stop();_frameTimer.Stop();}
}

三、異步 async/await(需 .NET 4.x+)

? ? ? ? 這個是多線程的知識,主線程也是線程嘛,都可以直接作用。后面再詳細介紹關于Task類的知識,這里簡單了解即可。只需要知道 這樣子也可以延時,后面我們學了協同,那個也可以延時。

async 修飾符:標記方法為異步方法,允許內部使用 await。
await 關鍵字:暫停當前異步方法的執行,直到其等待的任務完成,期間釋放控制權給調用者。

原理:使用 C# 原生異步語法,通過 Task.Delay 實現延時。

優點:代碼簡潔,支持復雜異步邏輯。

缺點:需 Unity 2018+ 并啟用 .NET 4.x 運行時版本。

環境配置

Player Settings -> Configuration -> Scripting Runtime Version -> .NET 4.x Project Settings -> Player -> Api Compatibility Level -> .NET 4.x 新版本可能不叫這個名字選.NET Framwork也是一樣的

using UnityEngine;
using System.Threading.Tasks;public class AsyncAwaitExample : MonoBehaviour
{async void Start(){Debug.Log("開始等待...");await Task.Delay(2000); // 毫秒單位Debug.Log("2秒后執行!");// 注意:此處代碼仍在主線程執行}
}

注意事項
若需操作 Unity 對象(如 GameObject),需在主線程執行,避免使用 Task.Run。
與協程不同,async/await 不依賴 Unity 的生命周期,但需處理對象銷毀時的 Task 終止。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81866.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81866.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81866.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

180KHz 60V 5A開關電流升壓/升降壓型DC-DC轉換器XL4019升降壓芯片

介紹 XL6019是一款專為升壓、升降壓設計的 單片集成電路&#xff08;升壓和降壓是由外圍電路拓撲確定的&#xff09;&#xff0c;可工作在DC5V到40V輸入電 壓范圍&#xff0c;低紋波&#xff0c;內置功率MOS。XL6019內 置固定頻率振蕩器與頻率補償電路&#xff0c;簡化了電 路…

如何暢通需求收集渠道,獲取用戶反饋?

要暢通需求收集渠道、有效獲取用戶反饋&#xff0c;核心在于多樣化反饋入口、閉環反饋機制、用戶分層管理、反饋數據結構化分析等四個方面。其中&#xff0c;多樣化反饋入口至關重要&#xff0c;不同用戶有不同的溝通偏好&#xff0c;只有覆蓋多個反饋路徑&#xff0c;才能捕捉…

Python結合ollama和stramlit開發聊天機器人

Python結合ollama和stramlit開發聊天機器人 一、環境準備1、streamlit安裝2、langchain安裝3、ollama的安裝 二、Ollama平臺聊天機器人實現1、需求2、模型調用3、前端實現頁面呈現代碼實現 三、詳細代碼地址四、參考資源 一、環境準備 1、streamlit安裝 # 通過 pip 安裝 pip …

java jdbc執行Oracle sql文件

執行代碼 import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.DriverManager;import org.apache.ibatis.jdbc.ScriptRunner;public class ExecSqlFileController {pu…

[Java實戰]Spring Boot整合MinIO:分布式文件存儲與管理實戰(三十)

[Java實戰]Spring Boot整合MinIO&#xff1a;分布式文件存儲與管理實戰&#xff08;三十&#xff09; 一、MinIO簡介與核心原理 MinIO 是一款高性能、開源的分布式對象存儲系統&#xff0c;兼容 Amazon S3 API&#xff0c;適用于存儲圖片、視頻、日志等非結構化數據。其核心特…

開發指南115-CSS中選擇器關系

1、選擇后代 可以用選擇器1 選擇器2&#xff08;中間用空格分隔&#xff09;來表達&#xff0c;也可以在大括號里通過包含關系來表達 舉例 .a .b 舉例.a { .b{} } 注意css本身并不支持嵌套的寫法&#xff0c;是scss等提供的擴展能力。 2、選擇直系后代 選擇器1 > 選擇器2&a…

創建型:抽象工廠模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 實現案例 3、優缺點分析 4、適用場景 1、核心思想 目的&#xff1a;統一管理相關對象的創建&#xff0c;確保產品兼容性。優先用于需要強約束產品兼容性的場景&#xff08;如UI主題、跨平臺適配&#xff09; 概念&#…

乘最多水的容器 | 算法 | 給定一個整數數組。有n條垂線。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

在我們日常生活中&#xff0c;蓄水似乎是一個極為樸素的物理行為&#xff1a;兩堵墻之間&#xff0c;注入水&#xff0c;看誰能裝得更多。可如果換個角度&#xff0c;從算法的視角去看這個問題&#xff0c;它會變得怎樣&#xff1f;你是否意識到&#xff0c;這樣一個簡單的問題…

無人機避障——深藍學院浙大Ego-Planner規劃部分

ESDF-free&#xff1a; 被這種類型的障礙物死死卡住的情況&#xff1a; 在一定范圍內建立ESDF&#xff1a; Ego-Planner框架&#xff1a; 找到{p,v} pair&#xff1a; 【注意】&#xff1a;首先根據在障礙物內航跡上的點Q&#xff0c;以及與它相鄰但不在障礙物內的兩個點&#…

零基礎設計模式——大綱匯總

零基礎學設計模式 - 大綱 前言 本教程旨在幫助零基礎的同學快速入門設計模式&#xff0c;理解其核心思想和應用場景。我們將通過清晰的講解和簡單的示例&#xff0c;逐步引導你掌握常用的設計模式。 第一部分&#xff1a;設計模式入門 什么是設計模式&#xff1f; 設計模式…

leetcode 92. Reverse Linked List II

題目描述 92. Reverse Linked List II 是第206題的進階版206. Reverse Linked List 思路很簡單&#xff0c;但一次性通過還是有點難度的。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(n…

CUDA的設備,流處理器(Streams),核,線程塊(threadblock),線程,網格(?gridDim),塊(block)和多gpu設備同步數據概念

CUDA的設備,流處理器&#xff0c;核&#xff0c;線程塊&#xff08;threadblock&#xff09;&#xff0c;線程&#xff0c;網格&#xff08;?gridDim&#xff09;&#xff0c;塊&#xff08;block&#xff09;和多gpu設備同步數據概念 CUDA的設備,流處理器&#xff0c;核&…

spring5-配外部文件-spEL-工廠bean-FactoryBean-注解配bean

spring配外部文件 我們先在Spring里配置一個數據源 1.導c3p0包,這里我們先學一下hibernate持久化框架&#xff0c;以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…

Feature Toggle 不再亂:如何設計一個干凈、安全、可控的特性開關系統?

網羅開發 &#xff08;小紅書、快手、視頻號同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

技術分享:大數據挖掘平臺架構設計與行業應用實踐

在數字化轉型浪潮下&#xff0c;企業數據規模呈指數級增長。如何構建高效的數據挖掘體系&#xff0c;實現數據價值變現&#xff0c;成為技術團隊面臨的重要課題。本文將深入探討大數據挖掘平臺的核心架構、關鍵技術及行業應用實踐。 一、平臺架構設計 1. 數據采集層 支持多源異…

計算機視覺與深度學習 | EMD-KPCA-LSTM、EMD-LSTM、LSTM回歸預測對比,多輸入單輸出(Matlab完整程序和數據)

以下是針對EMD-KPCA-LSTM、EMD-LSTM和LSTM回歸預測對比的完整可運行MATLAB實現。包含數據生成、特征處理、模型構建和性能評估全流程,并提供關鍵代碼注釋和注意事項。 完整代碼實現(含數據生成) %% 清理環境 clear; clc; close all; warning off;%% 生成模擬數據(正弦波+噪…

Axure應用交互設計:動態面板嵌套實現超強體驗感菜單表頭

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝!如有幫助請訂閱專欄! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:動態面板嵌套 主要內容:利用動態面板多層嵌套實現菜單表頭 應用場景:廣泛應用于表單表…

HarmonyOS 鴻蒙應用開發基礎:父組件和子組件的通信方法總結

在鴻蒙開發中&#xff0c;ArkUI聲明式UI框架提供了一種現代化、直觀的方式來構建用戶界面。然而&#xff0c;由于其聲明式的特性&#xff0c;父組件與子組件之間的通信方式與傳統的命令式框架有所不同。本文旨在詳細探討在ArkUI框架中&#xff0c;父組件和子組件通信的方法總結…

深度學習模塊縫合拼接方法套路+即插即用模塊分享

前言 在深度學習中&#xff0c;模型的設計往往不是從頭開始&#xff0c;而是通過組合不同的模塊來構建。這種“模塊縫合”技術&#xff0c;就像搭積木一樣&#xff0c;把不同的功能模塊拼在一起&#xff0c;形成一個強大的模型。今天&#xff0c;我們就來聊聊四種常見的模塊縫…

計算機網絡(2)——應用層

1.應用層概述 應用層(Application Layer)屬于計算機網絡體系結構中的最頂層&#xff0c;直接面向用戶&#xff0c;提供各種網絡服務和應用程序的接口 本文主要的學習內容如下&#xff1a; (1)網絡應用進程通信方式 客戶端-服務器方式點對點方式混合方式 (2)網絡應用的需求與傳輸…