🔍 An in-game UI for exploring, debugging and modifying Unity games.
✔️ Supports most Unity versions from 5.2 to 2021+ (IL2CPP and Mono).
⚡ Thunderstore releases: BepInEx Mono | BepInEx IL2CPP | MelonLoader IL2CPP
Release | IL2CPP | Mono |
---|---|---|
BIE 6.X | ✅ link | ✅ link |
BIE 5.X | ✖️ n/a | ✅ link |
- Take the
UnityExplorer.BIE.[version].dll
file and put it inBepInEx\plugins\
Note: BepInEx 6 is obtainable via BepisBuilds
Release | IL2CPP | Mono |
---|---|---|
ML 0.4+ | ✅ link | ✅ link |
- Take the
UnityExplorer.ML.[version].dll
file and put it in theMods\
folder created by MelonLoader.
IL2CPP | Mono |
---|---|
✅ link | ✅ link |
The standalone release can be used with any injector or loader of your choice, but it requires you to load the dependencies manually: HarmonyX, and the IL2CPP version also requires that you set up an Il2CppAssemblyUnhollower runtime.
- Load the required libs - HarmonyX, and Il2CppAssemblyUnhollower if IL2CPP
- Load the UnityExplorer DLL
- Create an instance of Unity Explorer with
UnityExplorer.ExplorerStandalone.CreateInstance();
- Optionally subscribe to the
ExplorerStandalone.OnLog
event to handle logging if you wish
These are some common fixes to issues which are present in some games, please create an issue in this repository if these fixes don't work.
This can be caused by a number of issues, but most commonly by the Event System.
- Open the UnityExplorer config file. See the "Settings" section below if you're unsure where it is.
- For the "Disable EventSystem Override" option, set the value to
true
- Restart the game.
- Open the UnityExplorer config file. See the "Settings" section below if you're unsure where it is.
- For the "Startup Delay" option, set the value to something higher, at least as long as it takes to reach the main menu of the game.
- Restart the game.
- Use the Scene Explorer tab to traverse the active scenes, as well as the DontDestroyOnLoad and HideAndDontSave objects.
- The "HideAndDontSave" scene contains objects with that flag, as well as Assets and Resources which are not in any scene but behave the same way.
- You can use the Scene Loader to easily load any of the scenes in the build (may not work for Unity 5.X games)
- Use the Object Search tab to search for Unity objects (including GameObjects, Components, etc), C# Singletons or Static Classes.
- Use the UnityObject search to look for any objects which derive from
UnityEngine.Object
, with optional filters - The singleton search will look for any classes with a typical "Instance" field, and check it for a current value. This may cause unexpected behaviour in some IL2CPP games as we cannot distinguish between true properties and field-properties, so some property accessors will be invoked.
- Use the UnityObject search to look for any objects which derive from
The inspector is used to see detailed information on objects of any type and manipulate their values, as well as to inspect C# Classes with static reflection.
- The GameObject Inspector (tab prefix
[G]
) is used to inspect aGameObject
, and to see and manipulate its Transform and Components.- You can edit any of the input fields in the inspector (excluding readonly fields) and press Enter to apply your changes. You can also do this to the GameObject path as a way to change the GameObject's parent. Press the Escape key to cancel your edits.
- note: When inspecting a GameObject with a Canvas, the transform controls may be overridden by the RectTransform anchors.
- The Reflection Inspectors (tab prefix
[R]
and[S]
) are used for everything else- Automatic updating is not enabled by default, and you must press Apply for any changes you make to take effect.
- Press the
▼
button to expand certain values such as strings, enums, lists, dictionaries, some structs, etc - Use the filters at the top to quickly find the members you are looking for
- For
Texture2D
objects, there is aView Texture
button at the top of the inspector which lets you view it and save it as a PNG file. Currently there are no other similar helpers yet, but I may add more at some point for Mesh, Sprite, Material, etc
- The C# Console uses the
Mono.CSharp.Evaluator
to define temporary classes or run immediate REPL code. - You can execute a script automatically on startup by naming it
startup.cs
and placing it in theUnityExplorer\Scripts\
folder (this folder will be created where you placed the DLL file). - See the "Help" dropdown in the C# console menu for more detailed information.
- The Hooks panel allows you to hook methods at the click of a button for debugging purposes.
- Simply enter any class (generic types not yet supported) and hook the methods you want from the menu.
- You can edit the source code of the generated hook with the "Edit Hook Source" button. Accepted method names are
Prefix
(which can returnbool
orvoid
),Postfix
,Finalizer
(which can returnException
orvoid
), andTranspiler
(which must returnIEnumerable<HarmonyLib.CodeInstruction>
). You can define multiple patches if you wish.
- The "Mouse Inspect" dropdown on the main UnityExplorer navbar allows you to inspect objects under the mouse.
- World: uses Physics.Raycast to look for Colliders
- UI: uses GraphicRaycasters to find UI objects
- You can change the settings via the "Options" tab of the menu, or directly from the config file.
- BepInEx:
BepInEx\config\com.sinai.unityexplorer.cfg
- MelonLoader:
UserData\MelonPreferences.cfg
- Standalone
{DLL_location}\UnityExplorer\config.ini
- BepInEx:
For Visual Studio:
- Clone the repository and run
git submodule update --init --recursive
to get the submodules. - Open the
src\UnityExplorer.sln
project. - Build
mcs
(Release/AnyCPU, you may need to runnuget restore mcs.sln
), and if using IL2CPP then buildIl2CppAssemblyUnhollower
(Release/AnyCPU) as well. - Build the UnityExplorer release(s) you want to use, either by selecting the config as the Active Config, or batch-building.
If you fork the repository on GitHub you can build using the dotnet workflow:
- Click on the Actions tab and enable workflows in your repository
- Click on the "Build UnityExplorer" workflow, then click "Run Workflow" and run it manually, or make a new commit to trigger the workflow.
- Take the artifact from the completed run.
- ManlyMarco for Runtime Unity Editor [license], the ScriptEvaluator from RUE's REPL console was used as the base for UnityExplorer's C# console.
- denikson (aka Horse) for mcs-unity [no license], used as the
Mono.CSharp
reference for the C# Console. - HerpDerpenstine for MelonCoroutines [license], they were included for standalone IL2CPP coroutine support.
UnityExplorer is in no way associated with Unity Technologies. "Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere.