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