目前,我正在做的是我正在打开Unity
,双击我编写的其中一个脚本,然后MonoDevelop
被打开,现在我必须结束统一并在MonoDevelop
我做 Run >> Run with >> Unity Debugger
。
在此Unity打开后,当我按下统一播放按钮时,调试会话开始。但只有一次。如果我在Unity
或MonoDevelop
中停止此会话,我必须重复这一整个过程,这非常繁琐。我必须打开Unity,关闭Unity,(我必须关闭它,因为下一步是 Run >> Run with >> Unity Debugger
将打开统一,如果统一已经打开我会收到错误说只有一个团结的实例可以一次打开一个项目)。
我要问的是:
有没有更好的工作流程可以让我摆脱Unity的这种繁琐的开关,每次我停止调试会话时我都会正常启动而不进行这些繁琐的重复工作?
感谢。
答案 0 :(得分:28)
在MonoDevelop的调试菜单中使用'Attach';你应该能够以这种方式附加到正在运行的Unity进程。 (您可能需要确保在Unity的首选项中启用了相应的选项。)
答案 1 :(得分:5)
另一种调试方法是使用:
Debug.LogError("foo");
或
Debug.LogWarning("foo");
另一个注意事项是您实际上可以将对象绑定到Log。这将导致编辑器在您迭代GameObjects列表时突出显示对象是问题。即:
Debug.LogWarning("this object broke", gameObject);
如果在控制台窗口中打开“错误暂停”,游戏将在满足LogError时自动暂停。但要注意,只要发生错误,它就会暂停。
答案 2 :(得分:4)
UnityVS现在正式成为微软的一部分,并作为vs 2010,12和13的附加组件提供。以下是链接到各种版本的MSDN博文:http://blogs.msdn.com/b/visualstudio/archive/2014/07/29/visual-studio-tools-for-unity-1-9.aspx
答案 3 :(得分:4)
我总是将默认的脚本编辑器(统一首选项 - >外部工具 - >外部脚本编辑器)更改为visual studio。这使您可以使用断点和预处理器宏来更轻松地进行调试。当你想开始调试时,在visual studio中按f5将它连接到unity,然后像正常一样播放,如果遇到断点,visual studio接管。
您无需更改任何其他内容,也无需像现在这样继续打开和关闭。
答案 4 :(得分:3)
你知道Unity“控制台”窗口吗?您应该可以从Menu / Windows / Console打开它。它将充当调试器,在预编译和运行时为您提供错误和警告。如果我误解了这个问题,请告诉我。
答案 5 :(得分:3)
最近,微软收购了Visual Studio的UnityVS插件的创建者SyntaxTree,所以它很快就会免费发布。 UnityVS是每个Unity3D开发人员必备的插件,因为它具有生产力以及Visual Studio中Unity3D游戏的能力或调试能力。
答案 6 :(得分:3)
在MonoDevelop中,窗户顶部附近有一个按钮,表示"连接到团结"。如果在播放场景之前执行此操作,MonoDevelop中设置的任何断点都将停止那里的主线程。
如果您只是想检查值,Debug.log(消息)会将数据直接打印到统一控制台。
这两种方法都可以在常规播放模式下使用。
答案 7 :(得分:1)
如果您的问题适合应用此问题,则使用Debug.Log()
在Unity中进行调试的最佳方式。
答案 8 :(得分:1)
我正在使用插件UnityVS,它可以使用Visual Studio调试Unity项目。 非常方便。
与UnityVS一起使用谷歌
答案 9 :(得分:1)
您可以使用MS Visual Studio社区查看并获取他们在其网站上提供的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集成了"让它工作"按钮一劳永逸; ))。
答案 10 :(得分:1)
内置Unity 5.5
视觉工作室工具,您只需点击一下即可附加统一并开始调试
,即在Edit > Preferences > External tools > External script editor > Visual studio
之后
答案 11 :(得分:0)
只需尝试使用要调试的 Visual Studio 打开 C# 脚本为此目的使用 Visual Studio 2017,只需使用调试器启动项目并在所需位置应用断点并运行项目。我认为它会解决您的问题并调试所需的代码
答案 12 :(得分:0)
您可以只放置一些print()或idono
答案 13 :(得分:0)
首先,必须将monodevelop或visual studio中存在的C#代码附加到Unity调试器,然后再按IDE monodevelop中的播放按钮,然后最后统一播放。
答案 14 :(得分:0)
尝试过视觉工作室?在那里,您可以将脚本附加在一起并进行调试。
答案 15 :(得分: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(公共语言运行时)。这意味着大多数情况下,如果变量和方法没有被乱码(称为混淆)替换,程序可以直接通过附加到可执行文件的调试器。
根据对话,Unity引擎不使用.NET CLR,而是使用嵌入引擎的单独(可能修改的)CLR。他们确实描述了这样做的方法,但我认为使用Unity编辑器更安全,更容易。
最后,有一些类似程序线程的东西没有开源,所以我怀疑任何外部工具都能找到代码的方法。即使它是纯粹的公共语言,我也非常怀疑,因为如果它是纯CL,则不需要在引擎中包含单独的(可能是定制的)CLR。
我认为整个误解是由于Unity使用的语言不完全是C#,而是一个看起来像C#的统一变体,它可能与C#兼容,但我不知道什么程度。所以," CLR"你在Unity编程实际上是统一引擎本身。 A" CLR"专注于在许多平台上渲染游戏而不是经典的C#CLR。
关于其他答案:
- MonoDevelop允许您像使用任何其他IDE一样使用断点和预处理器宏
- 至于使用日志的文本调试。当然这是可能的,但这是人们在"真正的调试"不可用。
答案 16 :(得分:0)
最简单的调试方法是使用Debug.log(""); 但是这确实会让你的性能降低,那么如何更轻松地调试呢?
这里的答案是:
要开始调试,请将鼠标按到编辑器的最左边(行号旁边),然后会出现一个红点,您刚刚创建了一个断点!
现在这不会做任何事情,但是,如果你现在去Unity并在编辑器窗口中按下播放会发生一些很好的事情......
在窗口的最底部,如果您打开本地窗口(如果没有,请转到视图>调试Windows>本地),您将看到本地实例中当前存在的所有变量及其断点被击中时的值。
要继续执行应用程序,只需按下MonoDevelop中的“播放”按钮。
您的脚本将继续执行(Unity的编辑器将不再被冻结)。当然,在这种情况下,脚本将在下一帧再次点击断点。因此,只需左键单击MonoDevelop中的断点并再次点击“播放”按钮,这样它就不会再次执行断点。
你可以用它做更多的事情,例如:
使用断点,可以使它们在满足某些条件时停止运行应用程序。例如,假设您要检查fSpeed变量达到10时的值是什么。为此,请按MonoDevelop中的“停止”按钮,右键单击断点,然后按“断点属性”。
将条件设置为“条件为真时断开”并将“条件表达式”设置为“fSpeed> = 10”,然后按OK。
将编辑器重新连接到Unity并按Unity中的“播放”按钮,当条件满足时,断点将触发并停止应用程序。
关于使用条件断点的注意事项:它们会导致性能问题,因为它必须在每次运行时验证表达式。
这通常应该比debug.log更好("");至少如果这是你想要的。
答案 17 :(得分:0)
我喜欢做的事情就是在Unity Editor中记录有用数据的快捷方式。例如,记录我所有活动成就的当前状态。
[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 + "%");
}
}
在编辑器脚本中执行此操作将显示一个菜单按钮以运行某些操作。
答案 18 :(得分:0)
使用debug.log(“Message”);用于调试
答案 19 :(得分:0)
您可以使用“运行”按钮(看起来像左上角的播放按钮)连接到Unity编辑器进行调试,但如果您没有以这种方式成功连接到Unity,则可能需要检查相应的插件已在加载项管理器首选项中启用。
视窗: 工具>加载项管理器> Unity>单声道软调试器支持Unity
OSX: Unity>加载项管理器> Unity>单声道软调试器支持Unity
(选择并单击“启用”。)
答案 20 :(得分:0)
有两种方法可以在统一中进行一次校验,一种是Log,它基本上是Unity内的控制台,另一种是调试器,VS和Mono都支持。 是的,你是非常正确的过程,通过调试点来检查a和b等的值是什么 所以这里是我的意见,只使用最适合你的东西我的意思是你不需要调试点只知道a和b的值只是记录它。 当需要调试点时,你已经知道了这个方法。