Unity中销毁和禁用对Invoke和协程的调用的影响

Unity延迟调用全解析:从Invoke到UniTask的性能优化实战 在游戏开发中,延迟调用是实现时序逻辑的核心技术,它基于命令模式、状态机等设计模式,通过调度器管理异步任务的执行时机。这项技术的价值在于提升代码可读性、简化复杂流程控制,广泛应用于技能冷却、动画序列、资源加载等场景。本文聚焦Unity中的延迟调用实现,深入剖析协程与UniTask等方案,针对GC分配和CPU开销提供优化策略,帮助开发者在移动端等高要求环境中实现高性能代码。 阅读详情

在 Unity 开发中,我们经常需要在游戏对象的生命周期中进行一些异步操作,比如使用 Invoke 延时调用方法,或启动协程来处理复杂的逻辑。然而,当游戏对象被销毁或禁用时,这些操作会如何表现呢?

在这篇博客中,我将分享三种常见情况:延迟调用之前销毁游戏对象 和 延迟调用之前禁用游戏对象 和 延迟调用之前禁用当前脚本,并深入探讨它们对 Invoke 和协程执行的影响,以及如何避免由此引发的潜在问题。通过这些案例分析,你将更清晰地理解 Unity 中对象的生命周期管理,帮助你在项目中更有效地控制异步操作的执行。

情况一:延迟调用之前,游戏对象被Destroy

在此段代码中,游戏物体有两个延迟调用函数,一个是通过Invoke,另一个是通过协程,它们都是10秒后被调用,但是在5秒后物体就会被Destroy。

    void Start()
    {
        Invoke(nameof(invokeFunction),10f);
        StartCoroutine(coroutineFunction(10f));
        Destroy(gameObject, 5f);

    }
    public void invokeFunction()
    {
        print("invoke函数执行了");
    }
    public IEnumerator coroutineFunction(float time)
    {
        yield return new WaitForSeconds(time);
        print("coroutine函数执行了");
    }

结果:Invoke函数和协程都不会执行。

情况二:延迟调用之前,游戏对象被禁用

此段代码与上面那种情况区别就是5秒后不再Destroy,而是使物体失活。

    void Start()
    {
        Invoke(nameof(invokeFunction),10f);
        StartCoroutine(coroutineFunction(10f));
        StartCoroutine(EnableActive(5f));

    }
    public void invokeFunction()
    {
        print("invoke函数执行了");
    }
    public IEnumerator coroutineFunction(float time)
    {
        yield return new WaitForSeconds(time);
        print("coroutine函数执行了");
    }
    public IEnumerator EnableActive(float time)
    {
        yield return new WaitForSeconds(time);
        gameObject.SetActive(false);
    }

结果:Invoke函数会执行,协程不执行。

情况三:延迟调用之前,脚本被禁用。

测试代码如下。

    void Start()
    {
        Invoke(nameof(invokeFunction),10f);
        StartCoroutine(coroutineFunction(10f));
        StartCoroutine(EnableScriptActive(5f));


    }
    public void invokeFunction()
    {
        print("invoke函数执行了");
    }
    public IEnumerator coroutineFunction(float time)
    {
        yield return new WaitForSeconds(time);
        print("coroutine函数执行了");
    }
    public IEnumerator EnableScriptActive(float time)
    {
        yield return new WaitForSeconds(time);
        this.enabled = false;
    }

结果:Invoke函数和协程都会执行。

Unity 内部处理逻辑:

1. 游戏对象销毁(Destroy(gameObject))

当 Destroy(gameObject) 被调用时,Unity 会在指定的时间之后完全销毁该游戏对象,以及它上面所有的组件,包括脚本。

  • Invoke:游戏对象销毁后,所有由 Invoke 创建的函数调用都会被终止,因此 Invoke 的回调不会执行。
  • 协程:协程同样会在对象销毁时终止,所有关联的协程将停止,不会继续执行或恢复。

2. 游戏对象禁用(SetActive(false))

当你调用 SetActive(false) 禁用游戏对象时,该对象在场景中仍然存在,但它以及所有子对象都将被禁用(即非活动状态)。

  • Invoke:Invoke 方法是通过 Unity 的时间系统调度的,它不依赖于特定的 GameObject 或组件的激活状态。即使 GameObject 被禁用,Invoke 也会继续执行。

  • 协程:当 GameObject 被禁用时,所有附加在该 GameObject 上的脚本的协程都会被停止。因此,coroutineFunction 不会继续执行,也就不会打印 "coroutine函数执行了"。

3. 脚本禁用(this.enabled = false)

当 this.enabled = false 禁用某个脚本时,游戏对象仍然是激活状态,但该脚本的执行会被部分暂停。具体来说:

  • Invoke:同样,Invoke 方法不受脚本启用状态的影响,它仍然会执行。

  • 协程:当脚本被禁用时,已经启动的协程会继续运行直到完成。这是因为协程一旦启动,就成为了独立的执行单元,不再直接依赖于脚本的启用状态。

Unity协程底层原理:从迭代器到引擎驱动的异步编程实现 在游戏开发中,异步编程是处理延迟执行、资源加载和状态管理的核心技术。其底层原理通常基于迭代器模式,通过状态机机制实现代码的暂停与恢复。这种技术通过引擎生命周期驱动,在单线程环境下模拟并发执行,为游戏逻辑提供了高效的时序控制方案。在Unity引擎中,协程正是基于C#的yield关键字和IEnumerator接口构建的迭代器状态机,由引擎在每帧特定阶段调用MoveNext()推进执行。理解这一原理不仅能优化性能,还能避免内存泄漏和逻辑错误,广泛应用于角色AI、UI动画、网络请求等场景。本文通过解析Unity协程 阅读详情

相关推荐

Unity协程原理深度解析:从C#迭代器到游戏开发实战应用

在游戏开发中,异步编程是处理延时任务和序列化操作的核心技术。其原理基于状态机模型,通过可暂停和恢复的执行流程,将复杂的时间驱动逻辑转化为线性的代码结构。这一技术为游戏开发带来了显著价值,它避免了传统Update循环中的状态管理混乱,提升了代码的可读性和可维护性。在应用场景上,它广泛应用于平滑动画过渡、游戏AI状态机、分帧资源加载以及高级定时器等关键模块。本文聚焦于Unity3D协程,深入剖析其基于C#迭代器(IEnumerator)的实现机制,并探讨如何通过yield return指令与Unity主循环协同

weixin_33826609的博客 437

unity 协称路上遇到的坑

在应用协程的时候遇到2个问题 1. 一个是运行到一半协程不执行了 2. 运行到一半报错了 第一个问题是: 协程所在脚本的物体上,这个物体删除之后协程会自动终止运行 第二个问题是:协程有延时等待的功能,当等待完继续执行的时候前面的物体报空了。 还有谁在协程方面遇到坑,可以提出来一起讨论

XX的博客 665

Unity定时器全解析:从Invoke到高性能管理器,避坑与选型指南

在游戏开发中,定时器是实现延迟、周期性和序列化操作的核心基础组件,其原理基于时间片轮询或事件调度机制。理解不同定时机制的底层原理,对于构建稳定、高效的游戏逻辑至关重要。从简单的基于字符串反射的Invoke,到利用迭代器状态机的协程(Coroutine),再到基于Time.time的自管理计时器,每种技术方案在性能开销、控制精度和代码可读性上各有取舍。例如,协程虽能优雅地处理序列逻辑,但需警惕其潜在的GC(垃圾回收)压力,避免因频繁创建YieldInstruction对象导致性能卡顿。在需要管理大量实体(如弹

weixin_30335353的博客 705

Unity小技巧——延时销毁GameObject

当我们希望延迟一段时间销毁GameObject,Component,或者 asset 的时候可以利用下面的函数来实现。 不用自己再去实现延迟计时操作。 Destroy(Object obj, float t = 0.0F); 第二个参数单位为秒,物体将在t秒后被销毁。 using UnityEngine; public class ScriptExample : M...

UnityAsk 1万+

Unity射线检测与协程的基础使用

一条射线碰撞到多个碰撞体; 延迟函数: Destroy(object,float time);time时间之后销毁object类型; Invoke延迟执行函数,通过方法名延迟调用对应函数; 注意:当此脚本或者当前脚本所在的游戏物体失活,延迟函数依然会执行; 但是当前脚本或者游戏物体被销毁,延迟函数就不会执行; 取消延迟函数:CanceInvoke(); 如果不传参数,那么就会取消当前代码内的所有延迟函数; 如果传参数,就是取消对应函数延迟调用; 延迟重复调用 InvokeRepeating(str.

LilyCoder的博客 338

不用买VR设备!用UE5内置模拟器开发虚拟现实项目的完整教程

本文提供了一套无需购买昂贵VR硬件的虚拟现实开发最佳实践方案。详细介绍了如何利用虚幻引擎5内置的XR模拟器,从零开始配置开发环境、模拟操作、构建场景并实现核心交互逻辑。通过这套纯软件方案,开发者可以高效学习VR开发核心,大幅降低入门门槛和成本。

weixin_29019241的博客 621

unity学习笔记——协程

协程方法的一些规则: 1、返回值是IEnumerator (注意:不是IEnumerable) 2、返回参数时使用yield return ;(任意选择要返回的参数) 3、使用StartCoroutine(method())调用协程方法 协程方法执行顺序:协程方法开启后,会继续运行下面的代码,不会等到协程方法运行结束才继续执行。 下面是一段典型的协程代码: using System.Collections; using System.Collections.Generic; using ...

weixin_42827671的博客 2003

超分算法 SwinIR: Image Restoration Using Swin Transformer

这篇文章结构比较简单,如果看过Swin-Transformer的话就没什么难点了。作者引入Swin-T结构应用于低级视觉任务,包括图像超分辨率重建、图像去噪、图像压缩伪影去除。网络由一个浅层特征提取模块、深层特征提取模块、重建模块构成。重建模块对不同的任务使用不同的结构。浅层特征提取就是一个3×3的卷积层。深层特征提取是k个RSTB块和一个卷积层构成。RSTB(Res- SwinIR: Image Restoration Using Swin Transformer[ICCV 2021]Abstract1.

qq_45122568的博客 1万+

Unity协程相关_学习笔记

初见协程

qq_36129846的博客 3340

银河麒麟v10(x86_64)升级openssh实操成功

本文详细介绍了在银河麒麟V10系统上将OpenSSH从8.2p1升级至9.9p2版本的全过程。主要内容包括:系统环境确认、安装telnet备用连接、备份配置、卸载旧版本、安装新版本、服务配置与验证等关键步骤。特别强调了安全注意事项,如必须安装telnet作为备用连接、重要配置备份等。升级后提供了安全加固建议,包括修改SSH端口、禁用root登录等。文章还包含详细的故障排查方法和恢复方案,确保升级过程安全可靠。通过本教程,用户可以顺利完成OpenSSH版本升级,提升系统安全性。

淘淘小窝 1091

基于卷积神经网络的人脸识别算法

摘要:近年来,随着科学技术的不断发展,人脸识别技术日渐成熟,使得人脸识别技术的使用率不断增大。例如:门禁、ATM机、公安系统以及新兴起的人机交互等领域,都应用到了人脸识别系统。在人脸识别研究领域中,深度学习扮演着重要的角色。由于深度学习的人脸识别技术凭借其识别率高、识别快等特点,逐渐成为整个领域的主流技术。在众多深度学习算法中,以卷积神经网络为代表的人脸识别系统得到了广泛应用,主要研究内容如下:首先,通过对经典损失函数进行研究,对比每种损失函数的特点,然后根据A-Softmax函数进行改进,借助Margin

yyq2263511327的博客 1万+

关于gameobject销毁,文件enabled = false ,,协程执行情况的测试

using UnityEngine; using System.Collections; public class colliderCnt : MonoBehaviour {     // Use this for initialization     Collider[] collider;     void Start () {         collider = Get

lynon的专栏 1251

YOLO11改进|卷积篇|引入SPDConv

YOLO11中添加SPDConv卷积

A1983Z的博客 3697

Unity延迟调用全解析:从Invoke、协程到性能优化与实战管理

在Unity游戏开发中,延迟调用是实现时序控制、动画序列和周期性逻辑的核心基础技术。其原理本质上是基于Unity引擎的主线程生命周期,在主线程的特定阶段(如Update之后)调度和执行预设的代码块,从而实现“等待”与“分帧”的效果。这项技术的核心价值在于提升代码的可读性、可维护性,并优化性能,避免阻塞主线程。其应用场景广泛,涵盖UI动画、敌人AI行为、资源异步加载回调等。本文将深入探讨两种主流实现方式:Invoke与协程(Coroutine)。Invoke虽然API简单,但依赖字符串反射,存在类型安全隐患和

weixin_30675247的博客 420

嵌入式系统开发笔记112:通过有人云测试MQTT

项目中使用到“有人”公司的WH-LTE-7S0模块,本文讲解通过有人云进行MQTT测试的方法。

snmplink的博客 999

深入理解SQL注入中的union select 1,2,3....

UNION 用于合并两个查询的结果集

渗透之路,攻防之间皆学问 2万+

Unity 协程

延迟函数: Destroy(object,float time);time时间之后销毁object类型; Invoke延迟执行函数,通过方法名延迟调用对应函数; 注意:当此脚本或者当前脚本所在的游戏物体失活,延迟函数依然会执行; 但是当前脚本或者游戏物体被销毁,延迟...

weixin_30305735的博客 187

fbx bip互转 测试OK

fbx bip互转

jacke121的专栏 518

小白_Unity引擎_Invoke

1 //异步函数 : 在一个方法执行时调用另一个方法. 2 //而被调用的方法或者其中的某些语句不是立刻执行,而是过一段时间后才执行。 3 //MonoBehaviour 提供了两种异步方法: 4 //调用 (Invoke) 5 //协程 ( Coroutine) 6 7 ...

A1185222867的博客 347

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Unity Invoke 深度解析:底层机制、协程对比与避坑指南

在游戏开发中,延迟调用与定时任务是常见需求,Unity 引擎提供了 MonoBehaviour.Invoke 这一轻量级方案。其原理基于引擎内部的延迟调用列表,通过字符串匹配方法名,在每帧更新循环中检查时间并触发回调。技术价值在于无需协程或额外计时器即可实现简单延迟,适用于技能冷却、UI 延迟等低频场景。然而,字符串匹配易导致静默失败,且不支持参数传递与精确取消。与协程相比,Invoke 代码更简洁但灵活性不足。实际应用中需注意对象池残留、timeScale 影响及性能开销。本文深入拆解 Invoke 的底

weixin_32943857的博客 226

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Unity协程实战指南:从Invoke替代到复杂异步流程控制

在游戏开发中,异步编程是处理复杂时序逻辑的核心技术。其原理是通过非阻塞的方式管理任务执行流程,允许程序在等待操作完成时继续执行其他任务,从而提升响应性和资源利用率。这项技术的核心价值在于将复杂的多步骤流程组织成清晰、线性的代码,极大地提升了代码的可读性、可维护性和调试效率。在Unity引擎中,协程(Coroutine)是实现异步编程的官方推荐方案,它基于迭代器模式,允许开发者使用`yield return`语句将跨越多帧的任务写成看似同步的代码。协程在游戏开发中的应用场景极为广泛,包括但不限于复杂动画序列编

weixin_30911451的博客 373

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Unity Invoke延迟调用详解:原理、避坑与最佳实践

在游戏开发中,延迟调用是实现定时逻辑的基础技术,其核心原理是通过计时器在指定时间后触发方法。Unity的MonoBehaviour.Invoke提供了一种轻量级的延迟调用机制,无需协程或第三方库,即可实现延迟执行、重复调用和取消操作。合理使用Invoke能显著提升代码可读性和开发效率,尤其适用于UI延迟关闭、简单冷却计时等低频场景。然而,它受Time.timeScale影响、不支持参数传递,且方法名以字符串形式传递易出错。理解其底层机制和适用边界,能帮助开发者在对象池管理、状态切换等工程实践中规避常见陷阱,

weixin_33793620的博客 126

【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理了新的内容,并对之前的版本中有些模糊的地方进行了纠正。 所以本篇文章就来整理一下Unity基础篇的面试题,说不准就会面试的时候就会遇到!

努力前行,总会成为自己心中的那道光 5万+

Unity——Mono中的重要内容

记忆点:继承MONO的脚本里面有三个重要的函数(眼线斜)延时:用来指定多长时间运行一次某函数,处理简单需要延时的功能。线程:用来同时运行某函数,主要用于算法的同步计算协程:用来指定某时间段,函数的某部分执行,主要用于防止卡住与卡顿。

2401_83430690的博客 643

Unity协程实战:10大高频场景与避坑指南

在Unity游戏开发中,协程是实现异步逻辑和分帧处理的核心工具。其本质是基于单线程的迭代器模式,通过yield return指令将代码执行权交还给引擎,在后续帧的特定阶段恢复,从而在不阻塞主线程的前提下,优雅地编排跨帧操作。这一机制在游戏开发中价值显著,能有效解决如延时触发、资源异步加载、复杂状态机序列等常见需求,避免在Update中手动管理计时器和状态标志的繁琐与混乱。本文聚焦于yield return、WaitUntil等关键指令,结合分帧处理与GC优化等热词,深入解析网络请求序列、状态机管理、分帧寻路

weixin_30730053的博客 409
上一篇: C#和C++中浅拷贝的异同
下一篇: 学习C# 引用传递与ref关键字:与 C++ 的对比分析
反派英雄_
博客等级 码龄5年 281粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值