Unity - 如何在无限循环的情况下停止播放模式?

Ign*_*rre 8 c# unity-game-engine

我只是犯了一个愚蠢的错误而且在里面void Update()而不是写if(var)我写的while(var)并且var从未修改过,所以我最终在我的内部编写了一个无限循环Update()

故事本身并不重要.重要的是我无法停止播放模式.实际上,在重新启动之前,我无法用Unity做任何其他事情.

所以我的问题是,有没有人知道如何优雅地停止Unity中的播放模式?是否有任何快捷方式或某些代码行强制超时?

我知道最好的方法是避免无限循环,但有些事情你可以做出愚蠢的错字.

额外注意:我一直在寻找这个问题的解决方案一段时间,遗憾的是没有成功.但是我找到了这个问题的副作用的解决方案.当你按下ctrl-alt-del时,你可以放弃你在场景中保存的所有东西(这可能是工作小时数).

所以当你点击播放时Unity会自动保存,并且Temp folder只要你在强制退出后没有再次运行Unity,场景备份就会出现.

小智 15

以下对我有用(@LinusR 的道具和扩展@Kinxil)这只是一个快速的分步说明。

如果您使用带有 Unity 工具的 Visual Studio,这应该对您有用。

找到循环:

  1. 打开 Visual Studio(如果尚未打开)
  2. 单击附加到 Unity(如果尚未附加)
  3. 单击Break All(暂停II符号)
  4. 打开调用堆栈线程立即窗口。(全部在调试?Windows?
  5. 查看调用堆栈,单击线程窗口中的线程
  6. 当您找到循环所在的线程时停止。(调用堆栈对此有帮助)
  7. 您必须在具有循环的线程上才能在立即窗口中执行必要的命令。

现在让我离开这里!:

[LinusR 的解决方案似乎是最防弹和通用的。]

用空值和其他一些选项打破循环

  1. 立即窗口中,将循环中使用的可空对象/字段/属性之一设置为空,例如Thread.SpinWait.SpinUntil(() => someObject.NeverTrue());
    • someObject = null;
    • Unity 将在此实例中再次响应(前提是 someObject 保持为 null)。
  2. 某些循环的替代方法是简单地中断和更改指令或值和/或将当前指令箭头(黄色箭头)拖出循环,尽管这可能无法实现,具体取决于循环的类型。
    • 想想循环是如何工作的;它多久执行一次?每帧都会被调用吗?等等。
  3. 什么都没用?在此处阅读其他答案,通过立即窗口发挥创意。将来,在 Unity 中始终启用Error Pause也是明智之举。


Lin*_*usR 11

我刚刚陷入了这种情况:意外的无限循环,在未保存工作的场景中陷入播放模式,Unity 无响应。

但是我很幸运能够打开 Monodevelop,尽管我主要使用 Sublime 来编写脚本。我按下了 Monodevelop 窗口左上角附近的按钮开始调试,然后按下暂停按钮。执行在我的无限循环中间的一条线上暂停。Windows 任务管理器确认 Unity 不再锁定 CPU。

在 Monodevelop 中,我能够找到obj下一行将尝试调用方法的对象,并使用“立即”窗口执行obj = null. 然后取消暂停。由于空指针错误,Unity 本身现在会解锁,我可以将其退出播放模式并保存我的工作。

(Unity 2017.4.1f1 个人版、Windows 10 家庭版 x64、Monodevelop 5.9.6)

请注意,我从阅读@Kinxil 的答案中得到了这个想法,但我不得不采取稍微不同的方法,因为没有“阻塞值”。我有一个for (;;)以前在协程内的循环,我将它更改为在 a 内,FixedUpdate()而不删除循环。:\ 所以导致异常是我能想到的唯一选择。


Jas*_*iti 6

解决方案

  1. 将您的 IDE 附加到 Unity
  2. 暂停执行
  3. 退出循环
  4. 可选择执行 Debug.Break() 以防止循环在下一次 Update() 再次进入
  5. 恢复执行
  6. 返回 Unity 编辑器

对于 Visual Studio

(我还没有测试过其他 IDE)

  1. 单击附加到 Unity
  2. 等待进程附加(有时需要一段时间)
  3. 单击 Break All(暂停II符号)
  4. 单击菜单调试?窗户?线程
  5. 单击包含您的源代码的线程(请参阅位置列)
  6. 在源代码(文本编辑器)中,将程序指针(黄色箭头)拖到源代码中的另一行,将其移到循环外。

可选地,如果循环位于某些 Update() 事件内,该事件将再次重新进入循环:

  1. 单击菜单调试?窗户?即时
  2. 键入UnityEngine.Debug.Break()即时窗口,然后按Enter内

最后恢复执行(播放按钮)并返回到 Unity 编辑器。Unity 现在应该处于“暂停”状态,您可以在其中检查出了什么问题或“停止”播放模式。


小智 6

对我来说,这奏效了。

如何摆脱无限循环

  1. 打开 Visual Studio。
  2. 单击顶部的“附加到 Unity”(如果尚未单击)
  3. 通过单击循环所在行号左侧的区域,向无限循环添加断点。
  4. 您将看到断点所在的黄色箭头。单击此箭头并将其拖动到循环外的某个位置(最好在此之后)
  5. 删除您当前的断点。
  6. 回到 unity,解冻很可能需要一秒钟,但解冻后,您应该可以单击播放按钮停止播放模式。
  7. 繁荣!避免了惊恐发作。