首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

协程不执行setActive(false)

协程是一种轻量级的线程,它可以在程序中实现并发执行的效果。与传统的线程相比,协程具有更小的开销和更高的执行效率。

在Unity游戏开发中,协程常用于处理一些需要延迟执行或需要在后台执行的任务。协程可以通过yield语句来暂停执行,并在指定的时间或条件满足时恢复执行。

在给定的问答内容中,提到了协程不执行setActive(false)。根据这个描述,可以推测这里可能是在讨论Unity中的协程与游戏对象的激活状态之间的关系。

在Unity中,setActive(false)用于将游戏对象设置为非激活状态,即隐藏该对象及其子对象。而协程默认是在主线程中执行的,当协程执行到yield语句时,会暂停执行并等待下一帧或指定的时间。在协程中执行setActive(false)时,由于协程暂停执行,游戏对象的激活状态不会立即改变。

如果想要在协程中执行setActive(false),可以使用Unity提供的协程工具类WaitForEndOfFrame。这个工具类可以等待当前帧的渲染结束后再执行下一帧的操作。通过在协程中使用WaitForEndOfFrame,可以确保在协程中执行setActive(false)时,游戏对象的激活状态会在下一帧生效。

以下是一个示例代码:

代码语言:csharp
复制
using UnityEngine;

public class CoroutineExample : MonoBehaviour
{
    private GameObject targetObject;

    private void Start()
    {
        targetObject = GameObject.Find("TargetObject");
        StartCoroutine(HideObjectCoroutine());
    }

    private IEnumerator HideObjectCoroutine()
    {
        yield return new WaitForEndOfFrame(); // 等待当前帧渲染结束

        targetObject.SetActive(false); // 设置游戏对象为非激活状态

        // 其他协程操作...
    }
}

在上述示例中,通过在协程中使用WaitForEndOfFrame,确保了在协程中执行setActive(false)时,游戏对象的激活状态会在下一帧生效。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云协程:腾讯云提供的协程服务,用于实现高效的并发执行。
  • 腾讯云游戏开发:腾讯云提供的游戏开发解决方案,包括云服务器、云存储、云数据库等服务,可满足游戏开发中的各种需求。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Kotlin 启动 ③ ( 组合并发 | 挂起函数串行执行 | 组合并发执行挂起函数 )

文章目录 一、挂起函数串行执行 二、组合并发执行挂起函数 一、挂起函数串行执行 ---- 在体中 , 连续使用多个挂起函数 , 这些函数的执行是顺序执行的 , 挂起函数 1 执行完毕后 , 才执行...setContentView(R.layout.activity_main) runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成 ...: 最终执行结果为 577 ms , 00:14:00.962 I 两个返回值相加 3 00:14:00.963 I 挂起函数执行耗时 577 ms 二、组合并发执行挂起函数 ----...如果想要两个挂起函数并发执行 , 并且同时需要两个函数的返回值 , 则使用 async 构建器 , 启动两个协 , 在体中执行两个并发函数 ; 代码示例 : package kim.hsl.coroutine...: 启动两个 async , 并发执行两个挂起函数 , 耗时 355 ms , 达到了并发执行减少执行时间的目的 ; 00:18:50.081 I 两个返回值相加 3 00:18:50.081

69320

【Kotlin 启动 ② ( 多程控制 | launch 执行顺序控制 | Job#join() 函数 | async 执行顺序控制 | Deferred#await() 函数 )

87183425 一、launch 执行顺序控制 ---- 如果需要通过 launch 构建器 启动多个协 , 后面的需要等待前面的执行完毕 , 在启动靠后的 , 实现方案如下 :...调用 Job#join() 函数 , 可以挂起 , 等待 launch 中体内的任务执行完毕 , 再执行后面的任务 ; 代码示例 : 下面的代码中 , 先执行 launchJob ,...(100) Log.i(TAG, "launchJob 执行完毕") } // 挂起 , 等待执行完毕会后再执行后面的任务 launchJob.join...") } } } } 二、async 执行顺序控制 ---- 如果需要通过 async 构建器 启动多个协 , 后面的需要等待前面的执行完毕...该函数是挂起函数 , 不会阻塞主线程 ; /** * 在阻塞线程的情况下等待该值的完成,并在延迟的计算完成时恢复, * 返回结果值,如果取消了延迟,则抛出相应的异常。

98320
  • 【Kotlin 取消 ③ ( finally 释放资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的任务 | 构造超时取消的任务 )

    文章目录 一、释放资源 二、使用 use 函数执行 Closeable 对象释放资源操作 三、使用 withContext(NonCancellable) 构造无法取消的任务 四、使用 withTimeoutOrNull...函数构造超时取消的任务 一、释放资源 ---- 如果 中途取消 , 期间需要 释放占有的资源 ; 如果执行任务中 , 需要 执行 关闭文件 , 输入输出流 等操作 , 推荐使用...") } } } 执行结果 : 即使是取消协任务后 , 在抛出 JobCancellationException 异常后 , finally 中的代码在最后也被执行了 ;...(1000) Log.i(TAG, "释放占用的资源完毕") } } 如果在取消后 , finally 代码块的代码肯定会执行 , 但是如果 finally 中 delay...${result}") } } } 执行结果 : 23:34:35.778 I 任务执行开始 23:34:36.794 I 上述任务的返回值为 null

    1.3K10

    为什么 Java 坚持多线程选择

    先说结论:是非常值得学习的概念,它是多任务编程的未来。但是Java全力推进这个事情的动力并不大。 先返回到问题的本源。当我们希望引入,我们想解决什么问题。...你可以理解为NIO + woker thread大致就是一套“”,只不过没有实现在语法层面,写起来优雅而已。问题是,你的场景真的处理了并发几十万,上百万的连接吗? 再说创建/销毁线程的开销。...你会发现即便你用vert.x或者kotlin的,归根到底也是要靠线程池工作的。...可以说,Java这个生态里尽管没有“”这个第一级别的概念,但是要解决问题的工具并不缺。 Java仅仅是没有解决”“在Java中的定义,以及“写得优雅“这个问题。...如果底层用的还是线程池,两个协还是通过共享内存通讯,那么多线程该出什么bug,多照样出。

    1.7K20

    unity update _Unity 的原理

    ,即共享堆也共享栈,进程由操作系统调度 线程拥有自己独立的栈和共享的堆,共享堆共享栈,线程亦有操作系统调度(标准线程是这样的) 和线程一样共享堆共享栈,由程序员在的代码里面显示调度...2、Unity中执行的原理 先贴上一张unity主线的框架运行图: 在Unity运行时,调用就是开启了一个IEnumerator(迭代器),开始执行,在执行到yield return之前和其他的正常的程序没有差别...Unity生命周期对的影响: 通过设置MonoBehaviour脚本的enabled对是没有影响的,但如果gameObject.SetActive(false) 则已经启动的则完全停止了,即使在...3、的主要应用 不是只能做一些简单的延迟,如果只是单纯的暂停几秒然后在执行就完全没有必要开启一个线程。...这是我们就可以使用了,是每帧LateUpdate之前执行yield return 之前的代码,LateUpdate之后执行yield return 之后的代码(可以用过上面的小例子看出)。

    97110

    C#

    Unity中执行原理 UnityGems.com给出了的定义: A coroutine is a function that is executed partially and, presuming...即是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。 Unity在每一帧(Frame)都会去处理对象上的。...Unity主要是在Update后去处理(检查的条件是否满足) ?...life.png 整理得到: 通过设置MonoBehaviour脚本的enabled对是没有影响的,但如果 gameObject.SetActive(false) 则已经启动的则完全停止了,即使在...当下次调用迭代器函数时执行从该位置重新启动。 Unity在每帧做的工作就是:调用 (迭代器)MoveNext() 方法,如果返回 true ,就从当前位置继续往下执行

    1.9K20

    unity简介

    当我们调用一个方法想要让一个物体缓慢消失时,除了在Update中执行相关操作外,Unity还提供了更加便利的方法,这便是。...也可以在指定的时间或事件后继续执行,而不影响上一次执行的就结果,提供了极大地便利性和实用性。 在每次执行时都会新建一个(伪)新线程来执行,而不会影响主线程的执行情况。...后一种则可以通过StopCoroutine来结束对正在执行的调用。...如:yield return new WaitWhile(() => frame < 10); 当某一个脚本中的执行过程中,如果我们将该脚本的enable设置为false不会停止。...只有将挂载该脚本的物体设置为SetActive(false)时才会停止。 Unity在调用StartCoroutine()后不会等待中的内容返回,会立即执行后续代码。

    84820

    Android面试题之Kotlin 的挂起、执行和恢复过程

    挂起和恢复时保存的状态和上下文 1.1 状态信息 的状态信息主要包括: 局部变量:函数当前执行到的位置以及所有局部变量的值。...挂起点:挂起的位置,这个位置通常是代码中的一个挂起点(suspend函数)。 调用栈:它对应当前执行堆栈帧,可以看作是对函数调用链的保存。...异步工作器:包含了执行环境和工作状态。 取消状态:是否被取消或处于取消状态。 2. 状态与上下文的保存形式 2.1 堆栈帧 在挂起时,会将当前的堆栈帧转换为对象并存储在堆中。...挂起函数会将 Continuation 对象传递给的调度器。 3.2 挂起和释放线程 调度器会暂停当前执行,把线程控制权交给调度器管理的线程池或其他任务,从而释放当前线程。 4....在其他线程执行完后的通知机制 5.1 异步任务完成通知 当在新的线程中执行完任务(比如完成网络请求等异步任务)时,执行环境会调用 Continuation 的 resumeWith 方法: continuation.resumeWith

    16910

    【Kotlin 】Flow 异步流 ⑤ ( 流的上下文 | 上下文保存 | 查看流发射和收集的 | 不能在不同执行流的发射和收集操作 | 修改流发射的上下文 | flowOn函数 )

    文章目录 一、流的上下文 1、上下文保存 2、流收集函数原型 3、流发射函数原型 4、代码示例 - 查看流发射和收集的 5、代码示例 - 不能在不同执行相同流的发射和收集操作 二、修改流发射的上下文...中的代码 , 收集元素操作在执行 , 流构建器 也同样在相同的中运行 ; 流收集元素 和 发射元素 在相同的上下文中 的 属性 , 称为 上下文保存 ; 2、流收集函数原型 Flow#collect...: 最终执行时 , 流构建器和流收集 都是在 主线程中执行的 , 这是 由 runBlocking 构建器 将 主线程 包装后的 ; 2022-12-23 14:29:06.315 17484...在流构建器中 , 将代码定义在如下执行 , 使用 Dispatchers.IO 调度器 , 也就是在子线程中执行 ; withContext(Dispatchers.IO){} 在流收集时..., 在 使用 runBlocking 将主线程包装后的 中 , 收集元素 , 在主线程中执行 ; runBlocking {} 代码示例 : package kim.hsl.coroutine

    92110

    C# 匿名回调方法在循环体中使用的注意事项

    value.Split('|'); 4 List s_inss = new List(); 5 6 view.selection.SetActive...(false); 32 }); 33 } 34 } 上面的代码中,i和si打印的结果是不同的: ?...然而很多时候我们需要的是当时的循环变量值,虽然在回调方法执行的时候这个循环体早已执行完成,但我们可以通过在循环体内回调方法外单独存储一个循环增量i的值,也即是上面的si,这样在后面的方法回调时便可以按照当时的增量...至于这个现象产生的原因,查阅后发现是因为C#后台为我们在回调方法执行之前就提前存储了该回调方法使用的外部变量。...(感觉跟的挂起有点像) 也得益于这样的机制,在一些方法内部书写回调方法可以使一些复杂的逻辑极快的实现完成,避免了重复的传递参数和记录全局变量。

    1.2K30

    一.的概念

    07.08自我总结 一.的概念 :是单线程下的并发,又称微线程,纤。英文名Coroutine。是一种用户态的轻量级线程,即是由用户程序自己控制调度的。...的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启来尽可能提高效率 #2....本质是单个线程,因而一旦出现阻塞,将会阻塞整个线程 二.的应用 1.greenlet模块 创建 g = greenlet.greenlet(方法) 只定义执行 如果需要传参传参 在执行中进行传参...g = switch(参数) 且switch这个函数是个阻塞函数,如果上述进程没有进行完毕不会往下运行下去,switch还会命令该执行 如果再方法中有switch如下 from greenlet...queue=True, **kwargs): 默认处理是全部都打开,只要他们发生io操作就进行其他切换

    52620

    lua--、异常处理、面向对象

    一、 是单核的,是一个线程下执行的,所以每一时刻只会有一个在运行。线程一般由cpu调度,由用户调用 1....的暂停和继续 还可以通过代码暂停执行和继续执行 2.1 暂停 coroutine.yield:暂停 在定义的function中,执行暂停方法: -- 暂停、继续 cor3 = coroutine.create...返回值和入参 执行也有返回值,并且每次执行结束或暂停都有返回值,每次继续都有不同的入参 3.1 执行结束返回值 一个正常执行结束,如果指定return,那么默认会返回一个true: -- 执行结束返回值...,那么将返回false: -- 执行结束返回值 cor4 = coroutine.create( function() print("结束啦")...处理异常 如果处理异常,那么程序将会退出,处理异常有两种方式 3.1 pcall pcall可以测试函数的执行,第一个参数为函数名,后面参数为入参,如果没有异常,那么返回true和函数返回值,否则返回

    62720

    Kotlin 学习笔记(四)—— 的基础知识,面试官的最爱了~

    + coroutineExceptionHandler) { // 执行操作 } 这段代码用到了 GlobalScope.launch,代表是个顶级作用域的推荐在 Android 开发中使用...当挂起函数结束后程序恢复运行时,这时执行的线程就是执行挂起函数的线程。即挂起函数由哪个线程执行,后续就在哪个线程执行。...(默认初始态) true false false Completing(瞬时状态) true false false Cancelling(瞬时状态) false false true Cancelled...(最终态) false true true Completed(最终态) false true false 通常默认情况下,是用 CoroutineStart.DEFAULT 来启动一个,这时被创建后直接启动...官方注释有个状态流转图,如下所示: Job 接口的主要方法有如下几个: public fun start(): Boolean:启动,返回 true 表示启动成功;返回 false 表示已经被启动或已经执行完成

    1.5K30

    c++20的学习记录(一): 初探co_await和std::coroutine_handle

    它们是不同的函数,所以共享局部变量。 二、C++20的 C++20在语言层面上支持,这极大地改进编写事件驱动代码的过程。...这篇文章会先探索C++20,之后会举例说明这个事件驱动如何用优雅地完成。 2.1 粗略地说,是可以互相调用但不共享堆栈的函数,因此可以在任何时候灵活地暂停执行以进入不同的。...这里注意到,步骤 3 中的方法返回时不会将控制权返回给。仅当调用步骤 2 中的可调用函数时,才会恢复执行。...与 C 指针一样,一旦句柄被销毁,引用同一句柄将指向垃圾内存(野指针)并在调用时表现出未定义的行为。句柄对于的整个执行都是有效的,即使控制多次流入和流出也是如此。...比如说我将return false改成return true。这个例子的就不会停止。会一直打印: 当然,改写 await_suspend恢复(或不挂起)当前来实现相同的效果。

    1.2K10

    《Kotin 极简教程》第9章 轻量级线程:(2)《Kotlin极简教程》正式上架:

    因为,我们有两个任务在并发的执行。 从概念上讲, async跟launch类似, 它启动一个, 它与其他并发地执行。...,而阻塞线程;如果延迟任务完成, 则返回结果值或引发相应的异常。...(最终状态) false true true false Cancelled (最终状态) false true true true 9.9 上下文与调度器 到这里,我们已经看到了下面这些启动的方式...9.9.1 调度和线程 上下文包括一个调度程序, 它可以指定由哪个线程来执行。调度器可以将执行调度到一个线程池,限制在特定的线程中;也可以不作任何限制,让它无约束地运行。...并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 是组织好的代码流程, 需要线程来承载运行, 线程是的资源, 但不会直接使用线程, 直接利用的是执行器(Interceptor

    1.2K20

    Go并发编程

    (){} // 开启执行这个函数 go func(){} } go的入口函数是main函数,相当于主线程,其内部调用的其他函数才能开启,而main函数执行完后,不管函数是否执行完了...,都会停止 下面事例,结果有时候都会输出,有时候只有main函数的输出语句,因为开启需要时间,开启time.Sleep休眠,给运行时间,结果都会打印,这种方式推荐 func firstGoroutine...,我们再main函数中添加了time.sleep的操作,但是真实开发场景中,我们无法估计执行完的时间,也就无法设定time.sleep,所以这种方式只适用于平时的测试,下面有两种方式来定位什么时候执行完了...使用信道标识 也就是在所有执行完成之后,在发送一个true,在主中如果获取到了true标识,就说明子执行完成了 import "fmt" // 如果注释掉下面带//符号的三行, 就只会输出...为什么需要Context goroutine开启后,我们是无法强制关闭它的,一般关闭的原因有如下的方式: 执行完成,自己结束后退出,正常关闭 主进程异常,导致被迫退出,异常关闭,需要优化代码

    55500
    领券