我只是犯了一个愚蠢的错误而且在void Update()
内而不是写if(var)
我写了while(var)
而且var
从未修改过,所以我结束了在我的Update()
故事本身并不重要。重要的是我无法停止播放模式。实际上,在重新启动之前,我无法用Unity做任何其他事情。
所以我的问题是,有没有人知道如何优雅地停止Unity中的播放模式?是否有任何快捷方式或某些代码行强制超时?
我知道最好的方法是避免无限循环,但有些事情你可以做出愚蠢的错字。
额外注意:我一直在寻找这个问题的解决方案,但遗憾的是没有成功。但是我找到了这个问题的副作用的解决方案。当您按下ctrl-alt-del时,您可以放弃在场景中保存的所有内容(可能需要数小时)。
所以当你点击播放时Unity会自动保存,并且场景备份在Temp folder
,只要你在强制退出后没有再次运行Unity。
答案 0 :(得分:4)
对我来说,这行得通。
如何摆脱无限循环
答案 1 :(得分:1)
我刚刚遇到这种情况:意外无限循环,在未保存的工作场景中陷入播放模式,Unity无响应。
但我很幸运能够让Monodevelop开放,尽管我主要使用Sublime进行脚本编写。我按下按钮开始在Monodevelop窗口左上角附近调试,然后点击暂停按钮。执行暂停在我的无限循环中间的一条线上。 Windows任务管理器确认Unity不再锁定CPU。
在Monodevelop中,我能够找到一个对象obj
,下一行将尝试进行方法调用,并使用"立即"窗口执行obj = null
。然后取消暂停。 Unity本身现在因为空指针错误而解锁,我可以将其从播放模式中删除并保存我的工作。
(Unity 2017.4.1f1 Personal,Windows 10 Home x64,Monodevelop 5.9.6)
注意,我从阅读@Kinxil的答案中得到了这个想法,但我不得不采取略微不同的方法,因为没有"阻止值"。我有一个先前在协程中的for (;;)
循环,我将其更改为FixedUpdate()
内部,而不删除循环。 :\因此导致异常是我能想到的唯一选择。
答案 2 :(得分:1)
令人遗憾的是,虚幻引擎在很大程度上非常擅长检测无限循环并在它们出现时退出,但Unity几乎从未出现过。很难找出发生了什么,因为?+
在帧完成之前不会触发,所以你无法看到发生了什么。尝试查看正在发生的事情的解决方法是使用某种类似的限制器:
\\%
当然,这是一个更简单的例子,因为Debug.Log
循环很容易变成无限循环,但是如果你有一个可以发生的地方的球场,你可以在那里设置一个限制器。
这仅用于调试目的,因此您无需通过任务管理器取消它。理想情况下,您可以找出问题所在并删除限制器。
几天前我有一个无限循环,我不知道它出错的地方,所以我只是注释掉了代码然后取消注释掉它直到它再次破坏,并且能够找出它来自哪里。
答案 3 :(得分:1)
以下内容对我有用(对@LinusR的支持,并通过@Kinxil的扩展),这只是一个快速的分步说明。
[LinusR的解决方案似乎是最防弹和最通用的。]
Thread.SpinWait.SpinUntil(() => someObject.NeverTrue());
someObject = null;
答案 4 :(得分:1)
解决方案
对于Visual Studio
(我尚未测试其他IDE)
(可选)如果循环位于某个Update()事件内部,该事件将再次重新进入循环:
2019-12-02T03:35:44.0496478Z {"@t":"2019-12-02T03:35:44.0301714Z","@m":"The path provided is invalid.","@i":"05178f7d","@l":"Error","SourceContext":"ArtifactTool.Program","UtcTimestamp":"2019-12-02 03:35:44.030Z"}
2019-12-02T03:35:44.0776082Z ##[error]Error: An unexpected error occurred while trying to push the package. Exit code(16) and error({"@t":"2019-12-02T03:35:43.3152933Z","@m":"ApplicationInsightsTelemetrySender will correlate events with X-TFS-Session 23e076ea-5122-4c06-b92a-2aef5974defd","@i":"8778ba0f","SourceContext":"ArtifactTool.Commands.UPackPublishCommand","UtcTimestamp":"2019-12-02 03:35:43.315Z"}
,然后按Enter 最后恢复执行(“播放”按钮)并返回Unity编辑器。 现在,Unity应该处于“已暂停”状态,您可以在其中检查出了什么问题或“停止”了播放模式。
答案 5 :(得分:0)
愚蠢的回答:不要做无限循环。提供给你的无限循环疼痛会告诉你不要再这样做了。
Rocket启动器可能性:将Unity绑定到Visual Studio或Mono Develop,使用暂停按钮并手动修改阻止值以使其停止。
否则,您可以通过进程终止来使其变脏。