Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 禁用游戏对象,但继续运行协同程序_C#_Unity3d_Coroutine_Unity5 - Fatal编程技术网

C# 禁用游戏对象,但继续运行协同程序

C# 禁用游戏对象,但继续运行协同程序,c#,unity3d,coroutine,unity5,C#,Unity3d,Coroutine,Unity5,我有一个BonusController脚本作为奖励游戏对象的一个组件。此奖励必须在碰撞时销毁,但必须持续几秒钟。我已经为此启动了协同程序,但是脚本停止了执行,我想这是因为我将游戏对象设置为非活动状态。以下是BonusController的代码: 如何删除对象而不停止协同程序脚本的执行?您不能禁用网格渲染器和碰撞器吗?这样,游戏对象将仍然存在,但用户将无法看到它。您无法拉动您所站的地面: 只需在使用2D方法时禁用SpriteRenderer。并使对象保持活动状态并启用 { StartCor

我有一个BonusController脚本作为奖励游戏对象的一个组件。此奖励必须在碰撞时销毁,但必须持续几秒钟。我已经为此启动了协同程序,但是脚本停止了执行,我想这是因为我将游戏对象设置为非活动状态。以下是BonusController的代码:


如何删除对象而不停止协同程序脚本的执行?

您不能禁用网格渲染器和碰撞器吗?这样,游戏对象将仍然存在,但用户将无法看到它。

您无法拉动您所站的地面:

只需在使用2D方法时禁用SpriteRenderer。并使对象保持活动状态并启用

{
    StartCoroutine(speedUp(1));
    //gameObject.SetActive (false);
    GetComponent<SpriteRenderer> ().enabled = false;
    GetComponent<Collider2D> ().enabled = false;
    // Above line will deactivate the first collider it will find.
}

IEnumerator speedUp(float seconds)
{
    Debug.Log("before");
    yield return new WaitForSeconds(seconds);
    Debug.Log("after"); // <--- This is never called
}

为了在一段时间后销毁对象,请在屈服后在协程内调用destroy

yield return WaitForSeconds(second);
Destroy(this);

现在,它已被正确销毁,并将释放内存,而不是仍然存在,不可见,但会占用资源。

不要这样做-好消息是,您可以给Destroy一个time参数,意思是等待那么长时间。但无论如何都不要这样做——事实上,你可以控制“一个协同程序是否停止运行”,这正是OP想要知道的。这是编程统一的一个基本和常见方面。出于好奇,你为什么不破坏它呢?是否存在这样的情况:留下一堆实例会对性能造成损害?谢谢你的澄清,顺便说一句。当然,在Unity开发中,有很多情况下你会使用Destroy甚至DestroyImmediate。在本案例中,教学问题是OP和任何阅读者都需要理解这样一个概念,即您可以简单而具体地禁用对象/组件,以及为调用重复而禁用该对象/组件的各种原因。。。1禁用整个游戏对象-InvokeRepeating不停止2仅禁用脚本组件-InvokeRepeating不停止,但用于协同程序。。。3禁用整个游戏对象-协同程序不会停止,如果重新启用整个游戏对象,它也不会返回4仅禁用脚本组件-协同程序不会停止。最后5,如果您破坏了组件或整个游戏对象,并且停止了调用重复和协同路由。不要忘记禁用整个游戏对象->设置活动,仅禁用组件->。启用简言之,在四种组合中,如果禁用整个游戏对象,即设置活动假,则会停止协同路由。在所有其他禁用的情况下,调用和协同路由都会一直持续下去。我从来都不知道为什么那个案子会有不同的结果。在所有情况下,如果完全销毁组件或对象,则会停止所有调用/协同路由。
yield return WaitForSeconds(second);
Destroy(this);