38

目前,我正在做的是打开Unity,双击我编写的脚本之一,然后MonoDevelop打开,现在我必须关闭统一,然后MonoDevelop我就这样做了Run >> Run with >> Unity Debugger

打开这个 Unity 后,当我按下统一的播放按钮时,调试会话开始。但只有一次。如果我在其中一个中停止此会话,Unity或者MonoDevelop我必须重新重复整个过程,这非常乏味。我必须打开 Unity,关闭 Unity,(我必须关闭它,因为下一步Run >> Run with >> Unity Debugger将打开 Unity,如果 Unity 已经打开,我会收到错误消息,说一次只能打开一个 Unity 实例)。

我要问的是:
有没有更好的工作流程可以让我从这种乏味的 Unity 开关中解脱出来,每次我停止调试会话时,我都会正常启动而不做这些乏味的重复?

4

22 回答 22

33

在 MonoDevelop 的调试菜单中使用“附加”;您应该能够以这种方式附加到正在运行的 Unity 进程。(您可能需要确保在 Unity 的首选项中打开了相应的选项)。

于 2012-06-10T22:00:19.163 回答
6

另一种调试方法是使用:

Debug.LogError("foo");

或者

Debug.LogWarning("foo"); 

另一个注意事项是您实际上可以将对象绑定到日志。如果您正在迭代游戏对象列表,这将导致编辑器突出显示对象问题。IE:

Debug.LogWarning("this object broke", gameObject);

如果您在控制台窗口中打开“错误暂停”,游戏将在遇到 LogError 时自动暂停。但请注意,只要抛出错误,它就会暂停。

于 2013-10-08T22:31:05.460 回答
6

我一直将默认脚本编辑器(统一首选项 -> 外部工具 -> 外部脚本编辑器)更改为 Visual Studio。这使您可以使用断点和预处理器宏来简化调试。当您想开始调试时,请在 Visual Studio 中按 f5 将其连接到 unity,然后正常播放,如果遇到断点,则 Visual Studio 会接管。

您不必更改任何其他内容,也不必像现在这样不断地打开和关闭事物。

于 2017-01-14T14:27:39.777 回答
5

UnityVS 现在正式成为 Microsoft 的一部分,可作为 vs 2010、12 和 13 的附加组件使用。这是 MSDN 博客文章链接到各个版本:http: //blogs.msdn.com/b/visualstudio/archive/2014 /07/29/visual-studio-tools-for-unity-1-9.aspx

于 2014-07-30T22:57:13.460 回答
3

最近,微软收购了 Visual Studio UnityVS 插件的创建者 SyntaxTree,所以它很快就会免费发布。UnityVS 是每个 Unity3D 开发人员必备的插件,因为它的生产力和在 Visual Studio 中调试 Unity3D 游戏的能力。

http://unityvs.com/

于 2014-07-14T16:30:46.273 回答
3

你知道 Unity 的“控制台”窗口吗?您应该可以从菜单/Windows/控制台打开它。它将充当调试器,在预编译和运行时为您提供错误和警告。如果我误解了这个问题,请告诉我。

于 2012-06-24T15:57:33.147 回答
3

在 MonoDevelop 中,窗口顶部附近有一个按钮,上面写着“附加到统一”。如果在播放场景之前执行此操作,则在 MonoDevelop 中设置的任何断点都会在此处停止主线程。

如果您只是想检查值,Debug.log(message) 会将数据直接打印到统一控制台。

这两个都可以在常规播放模式下使用。

于 2016-10-30T05:37:21.270 回答
2

最简单的调试方法是使用 Debug.log(""); 但这确实会降低您的性能,那么您如何更轻松地调试呢?

好吧,这是答案:

要开始调试,请将鼠标按到编辑器的最左边缘(行号旁边),然后会出现一个红点,您刚刚创建了一个断点! 在此处输入图像描述

这暂时不会做任何事情,但是,如果您现在转到 Unity 并在您的编辑器窗口中按播放,将会发生一些很棒的事情......</p>

在此处输入图像描述

在窗口的最底部,如果您打开了 locals 窗口(如果没有,请转到 View > Debug Windows > Locals),您将看到当前存在于本地实例中的所有变量及其在被击中的断点。

要继续执行应用程序,只需按 MonoDevelop 中的“播放”按钮。

您的脚本将继续执行(Unity 的编辑器将不再被冻结)。当然,在这种情况下,脚本将在下一帧再次命中断点。因此,只需左键单击 MonoDevelop 中的断点并再次单击 Play 按钮,它就不会再次执行断点。

你可以用它做更多的事情,例如:

使用断点,您可以使它们在满足某些条件时停止应用程序的运行。例如,假设您想检查 fSpeed 变量达到 10 时的值。为此,请按 MonoDevelop 中的 Stop 按钮,然后右键单击断点,然后按 Breakpoint Properties。

在此处输入图像描述

将条件设置为“条件为真时中断”并将“条件表达式”设置为“fSpeed >= 10”,然后按 OK。

将编辑器重新附加到 Unity 并按下 Unity 中的“播放”按钮,当满足条件时,断点将触发并停止应用程序。

关于使用条件断点的说明:它们会导致性能问题,因为它必须在每次运行时验证表达式。

这通常应该比 debug.log(""); 至少如果这是你想要的。

于 2017-12-19T15:40:27.023 回答
1

我正在使用插件 UnityVS,它可以使用 Visual Studio 调试 Unity 项目。非常方便。

使用 UnityVS 进行谷歌搜索

于 2014-02-28T09:40:23.200 回答
1

Debug.Log()如果您的问题适合应用此方法,则在 Unity中进行调试的最佳方法。

于 2012-10-04T20:42:02.750 回答
1

您可以使用 MS Visual Studio Community 查看并获得他们也在其网站上提供的 Unity 集成。我最近尝试过它,它很棒,您可以使用可用的最佳 IDE 之一获得几乎完整的调试功能。与 Unity 搭配使用,您可以获得一些不错的生产力提升,不仅在调试能力方面,而且在功能集方面。

如果您想查看它,这里是 IDE 社区版本的链接:https ://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx

这里也是我提到的 Unity 集成的链接:https ://www.visualstudio.com/features/unitytools-vs

希望它有所帮助,一位开发人员将我从 Mono 转换过来,老实说,我对这种设置非常满意(除非某些 IDE 集成了“使其工作”按钮一劳永逸;))。

于 2015-08-14T09:06:42.703 回答
1

借助Unity 5.5内置的 Visual Studio 工具,您只需单击一下即可附加 Unity 并开始调试

即之后Edit > Preferences > External tools > External script editor > Visual studio

于 2017-02-16T14:57:26.683 回答
0

统一调试有两种方法,一种是通过日志,它基本上是 Unity 中的控制台,另一种是 Debugger,它是 VS 和 Mono 都支持。是的,您是对的,通过调试点检查 a 和 b 等的值是什么,这是非常糟糕的过程,所以我认为只使用最适合您的东西,我的意思是您不需要调试点,只需要知道a 和 b 的值只需记录它。当需要调试点时,您已经知道该方法。

于 2015-01-10T11:40:26.157 回答
0

只需尝试使用要调试的 Visual Studio 打开 C# 脚本 使用 Visual Studio 2017 即可,只需使用调试器启动项目并在所需位置应用断点并运行项目。我认为它将解决您的问题并调试所需的代码

于 2021-03-10T14:17:29.880 回答
0

Unity 文档——在 Unity 中调试 C# 代码提供了在编辑器和播放器中调试 C# 代码的完整方法。

于 2021-08-23T02:30:46.130 回答
0

我认为问题所在是一种启动“统一构建的游戏可执行文件”并将调试器附加到它的方法。
类似于...
使用 gcc 创建调试符号,启用 DEBUG 构建应用程序并使用 gdb 启动可执行程序以对其进行调试。这样您就可以在不使用 IDE 的情况下启动调试会话。但那是在 C 中使用 gcc ......在 C# 中,附加的调试器不需要调试符号来查看代码,它在虚拟机上运行。

这里有一个关于如何做到这一点的公开对话:
https ://github.com/0xd4d/dnSpy/issues/393

一些不熟悉虚拟机语言的人的快速笔记。C# 在编译时会生成一种中间语言。与例如 C 语言相反,它产生机器代码,直接由 CPU 执行。在 C# 的情况下,这种中间语言称为公共语言(因为它对所有 .NET 语言如 VB.NET、C#.NET 和 C++.NET 都是通用的。这种中间语言不是由 CPU 直接执行,而是由虚拟机执行每个应用程序或进程实例化一次,称为CLR(Common Language Runtime)。这意味着大多数情况下,如果变量和方法没有被乱码替换(称为混淆),程序可以直接读取附加到可执行文件的调试器。

根据对话,unity 引擎不使用 .NET CLR,而是嵌入到引擎中的单独(可能修改的)CLR。他们确实描述了这样做的方法,但我认为使用 Unity 编辑器更安全、更容易。

无论如何,Unity 都是围绕编辑器构建的!例如,在编辑器上下文中,您可以在玩游戏时更改公共变量和引用,这不是“经典”编程方法。但它是一种经典的调试方法。

最后,像程序的线程这样的东西不是开源的,所以我怀疑任何外部工具都能够找到绕过代码的方法。即使它是纯公共语言,我也严重怀疑,因为如果它是纯 CL,则不需要在引擎中包含单独的(可能定制的)CLR。

在我看来,整个误解是由于 Unity 使用的语言不完全是 C#,而是一个看起来像 C# 的统一变体,它可能与 C# 兼容,但我不知道到什么程度。因此,您在 Unity 中编程的“CLR”实际上就是统一引擎本身。一个“CLR”专注于在许多平台上渲染游戏,而不是经典的 C# CLR。

关于其他答案:
- MonoDevelop 让您可以像使用任何其他 IDE 一样使用断点和预处理器宏。
- 至于使用日志的文本调试。当然这是可能的,但这是在“真正的调试”不可用时所做的。


于 2018-01-15T19:17:26.823 回答
0

你可以放一些 print() 或一些 idono

于 2020-03-24T18:16:49.297 回答
0

试过视觉工作室?在那里您可以将脚本附加到统一并调试它们。

于 2020-01-18T18:38:18.967 回答
0

首先,您必须将 monodevelop 或 Visual Studio 中存在的 C# 代码附加到 Unity 调试器,然后在 IDE monodevelop 中按下播放按钮,然后再在 unity 上播放它。

于 2020-01-29T14:22:16.027 回答
0

使用 debug.log("消息"); 用于调试

于 2016-07-02T04:05:24.790 回答
0

您可以使用运行按钮(看起来像左上角的播放按钮)连接到 Unity 编辑器进行调试,但如果您没有通过这种方式成功连接到 Unity,您可能需要检查是否启用了相应的插件在您的加载项管理器首选项中。

Windows:工具 > 插件管理器 > Unity > Mono Soft Debugger Support for Unity

OSX:Unity > Add-in Manager > Unity > Mono Soft Debugger Support for Unity

(选择并单击启用。)

于 2016-03-08T08:32:36.240 回答
0

我也喜欢在 Unity 编辑器中创建用于记录有用数据的快捷方式。例如记录我所有活跃成就的当前状态。

[MenuItem("My Game/Runtime debug/Achievement states")]
public static void LogAchievementStates ()
{
    foreach (AchievementState achievementState in Data.achievementStates)
    {
        Debug.Log ("Achievement " + achievementState.name + " is at " + achievementState.completion + "%");
    }
}

在编辑器脚本中执行此操作将显示一个菜单按钮来运行某些操作。

于 2016-08-04T16:13:13.900 回答