目录

一、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)网络应用的需求与传输…