Benefits of using Visual StudioA more sophisticated C# development environment.Think smart autocompletion, computer-assisted changes to source files, smart syntax highlighting and more. The difference between Community, Express and ProVisualStudio C# is an Integrated Development Environment (IDE) tool from Microsoft.Visual Studio now comes in three editions, (free to use) (paid) and (paid).
Nov 13, 2018 - You don't actually need a debugger attached to see the output of Debug.Log calls. All of that output will go to the player log. You may also want. Jun 13, 2017 I'm having a hard time getting breakpoint debugging working for unity with and android device. I've tried with both visual studio code and monodevelop. In android: I.
A comparison of feature differences between versions is available on the.Unity’s Visual Studio integration allows you to create and maintain Visual Studio project files automatically. Also, VisualStudio will open when you double click on a script or on an error message in the Unity console. Using Visual Studio with UnityFollow these steps to configure the Unity Editor to use Visual Studio as its default IDE:In Unity, go to Edit Preferences, and make sure that Visual Studio is selected as your preferred external editor. External Tool SettingsNext, doubleclick a C# file in your project.
Visual Studio should automatically open that file for you.You can edit the file, save, and switch back to Unity to test your changes. A few things to watch out for.Even though Visual Studio comes with its own C# compiler, and you can use it to check if you have errors in your c# scripts A piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in any way you like. See in, Unity still uses its own C# compiler to compile your scripts. Using the Visual Studio compiler is still quite useful, because it means you don’t have to switch to Unity all the time to check if you have any errors or not.Visual Studio’s C# compiler has some more features than Unity’s C# compiler currently supports. This means that some code (especially newer c# features) will not throw an error in Visual Studio but will in Unity.Unity automatically creates and maintains a Visual Studio.sln and.csproj file.
Whenever somebody adds/renames/moves/deletes a file from within Unity, Unity regenerates the.sln and.csproj files. You can add files to your solution from Visual Studio as well. Unity will then import those new files, and the next time Unity creates the project files again, it will create them with this new file included. You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:You've told us there are code samples on this page which don't work.
If you know how to fix it, or have something better we could use instead, please let us know:You've told us there is information missing from this page. Please tell us more about what's missing:You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:You've told us this page has a problem.
Please tell us more about what's wrong.
But you're desperate, or perhaps maybe you're just the curious sort. Either way, your questions would be answered if you could just tell what the heck was going on inside that Unity function. You're wondering how to get Visual Studio to let you debug code within Unity's core libraries themselves.That's precisely what we're going to do.This isn't for the faint of heart — we'll be decompiling, recompiling, and patching Unity assemblies. However, after you've done it once, it's not quite as tricky as it sounds. With this under our belts it can make debugging complex Unity systems (like UnityEngine.UI) a breeze.When we're done, we'll be able to step through code inside of the Unity Engine, set breakpoints, and even inspect local and static variables of the editor itself! As always, if you have questions or comments, drop me a line on and I'll do my best to help out. A few notes before we begin. This only allows us to debug parts of Unity that were written in C# (Managed assemblies).
We won't be able to debug into Unity's C implementation any time soon. This is a fairly important caveat. While quite a few of Unity's systems are written in C# (the UI system, most of the Editor), high-performance systems like the renderer and physics engine are in C and off limits for this method.Remember that any reverse-engineering of software can quickly enter a.
Be responsible with how you use this information.Foreword Readers looking for a quick tutorial can and the next, however it really is necessary reading if you're looking for a better understanding of Unity.First things first, let's clarify a few things. Unity doesn't use Microsoft's implementation of.NET, it uses Mono.
Mono is an, cross-platform implementation of.NET. Mono lets Unity run on Mac and Linux, and is also the reason why standard assembly debugging tools you may have found before don't work on Unity.When C# is compiled a.dll file is produced containing IL, an that is only understood by the.NET 2.0 Runtime. When you want to run this compiled code, the Mono Runtime (which understands.Net 2.0 IL) reads the IL and executes the code. I'm glossing over the bulk of this here, but this explanation should suffice.
ILSpy is a great tool for exploring what the IL looks like for a.NET assembly. However, note that the.NET Runtime is distinct from the.NET Framework. The.NET Framework provides the libraries and tools that you'd use in your actual C# code. The.NET Runtime is the program actually executing your code.The runtime Unity uses is.NET 2.0. The framework version that Unity uses is a bit opaque. Again, it's not using Microsoft's.NET Framework, but a Mono-provided one. The Mono.NET Framework mirrors the.NET 3.5 Framework , and is compiled for the.NET 2.0 Runtime as we talked about above.
See for information regarding different levels of.NET provided by Microsoft. Mono attempts to re-implement.NET as closely as possible. You can see evidence of this in Unity's configuration panel, although Unity uses the word Runtime confusingly here. This can be read as ' What libraries should my scripting have access to?'
' What general backend to use?' , and ' What IL/Runtime version should we compile against?' .One final note here.
The.NET 2.0 Runtime is from 2008. Unity uses it over the modern.NET 4.0 Runtime for a variety of reasons not worth getting into here.
This is the main reason the vast majority of C# and.NET libraries will not work with Unity. Most.NET developers have moved long past 2.0.As you can tell keeping runtime/framework numbers straight in your head can be a bit daunting. I like to think of IL as a distinct programming language, and Unity uses the 2.0 version of that language.
Feel free to bookmark this post or the links here if you ever need a refresher. You can also use to find out what Runtime version an assembly uses.The Mono DebuggerYou might not know this, but whenever you debug your Unity game in the editor, you're actually debugging the Unity Editor itself. The Unity Editor and your game are run as a single application. When your game hard crashes (segfaults, etc), so does the Unity Editor, and vice-versa.Debugging managed code is a bit more flexible than debugging something like C. Thanks to Mono's debugger being a, we can attach the debugger whenever we want to the running Unity process, without having to restart the application. This architecture is great for Unity because we can attach and detach the debugger to the process at will.
Imagine how painful it would be to have to restart Unity in order to attach a debugger. The downside is that Visual Studio has very little control over the application under debug: it can only send and receive information through the Soft Debugger Interface and try to display something that makes sense.This architecture is why the Visual Studio debugger for Unity is a little awkward and flaky. All of the debugging is actually happening within Unity/Mono — Visual Studio just provides the UI. Presumably you have a target DLL in mind.
For this tutorial I'll be debugging into UnityEngine.UI.dll. This dll contains all of the code for the 2D Canvas and UI system. The assembly is found on my system at:C:Program FilesUnityEditorDataUnityExtensionsUnityGUISystemUnityEngine.UI.dllWe would like to do the following:. We need to decompile the target DLL so we have C# code to look at when we're debugging. Unity DLLs don't come with Debug symbols, so we'll need to generate a PDB for our target DLL, and point it at the source code from step 1. Unity runs on Mono, not the Microsoft Runtime, so we need to convert the PDB file to Mono's MDB format.After the above, we'll be able to set a breakpoint in Visual Studio and step through the Unity UI code! Required Tools:.
Visual Studio 2015 or 2017. Community or Professional. Either for Visual Studio or.I'd personally recommend.NET Reflector for this tutorial because its decompiler is a tad easier to use. After this tutorial, you'll be able to use either for further debugging.Making the dll debuggableIf we went ahead with the three steps outlined above, we'd run into problems at #2.
Only assemblies that contain a Debug Directory entry in the header can be referenced from a PDB symbols file. The debug directory provides identifiers that let the debugger know which symbol files point to which assemblies. Unity doesn't include a Debug Directory in any of its assemblies, so we'll have to do some gymnastics to add one.Our strategy sounds drastic, but works surprisingly well.
We decompile UnityEngine.UI.dll to IL, then recompile it back to an assembly using the '/debug' flag. Now that the DLL has a debug directory, we can use more standard tools to generate C# source code for viewing. I used RedGate's.NET Reflector plugin for Visual Studio, although you should be able to accomplish something similar using Resharper and DotPeek.You'll want to refresh the Visual Studio.sln files at this point to make sure it picks up the new DLL created above. Close Unity, and delete all of the.sln/.cs files in your project directory, as well as the Library folder.Then re-open Unity, and double click a script to get it to re-generate the solution. Converting to the mono formatIf we weren't running on Mono, we'd be done here. The Mono debugger is soft, as mentioned earlier, so the actual logic to run the debugging happens within Mono itself (within the Unity application), not in Visual Studio.
Visual Studio simply talks to the Mono Debugger over a channel and displays what it gets back.Because of this, our symbol files need to be in a format that the Mono debugger can understand. This format is the. As a stroke of luck, Unity provides a tool just for this purpose!
It's called pdb2mbd.bat. It's good to clear the Library folder and.sln files again just for good measure.When you restart Unity, it should have loaded the MDB file for your patched library. With this, we can now set a breakpoint in Visual Studio, again using either Resharper or RedGate (whichever you used for the earlier steps).Visual Studio will complain about not being able to find the source, but this is actually just due to a weird interaction with the Mono debugger.
When the line is actually hit, the breakpoint will load properly and the code will show up!Here's an example of debugging UnityEngine.UI.Button::Press.