Repository navigation
Release notes
v1.1.0
Pairs with URKit v0.4.0. It still loads on an older loader, but the
caller-index speed-up below is in the loader, not here.
Click to select
Click the screen, select the GameObject under the cursor. World objects are
measured from Renderer.bounds (or Collider.bounds when they're invisible
but solid) and projected through the rendering camera; Canvas elements are
measured as rects in their canvas's own space, which may not use the same
camera. Both become screen rectangles, ranked by the order Unity paints them,
so UI wins ties against the world.
The Unity 6 editor skin
The overlay is styled after the Unity 6 dark editor: flat greys, square
corners, 1px near-black rules, #2C5D87 selection, plus the toolbar strip,
component header band and label/field property rows that give Unity its layout
rhythm.
Method Trace: methods that were inlined away
IL2CPP compiles ahead of time and the C++ compiler inlines aggressively, so a
small managed method often keeps an entry point nothing branches to — the code
runs inside its callers. Hooking that entry point installed cleanly and never
fired, which is why tracing such a method showed nothing while the game called
it constantly.
The tracer now finds the inlined copies by fingerprinting the absolute
addresses the body references, and hooks those instead. Methods whose entry
point is too short to host a hook are watched from their call sites, where the
arguments are still in registers. Ships with an x86-64 length decoder and a
fixture-driven test suite.
Caller names: 25 s to 0.34 s
The caller column showed raw addresses like GameAssembly.dll+0x2C83C7A for
the first ~25 seconds of every trace, then "fixed itself" when the whole-domain
method index finished. Two causes, both gone:
- The index built a full
MethodInfoper method just to extract an address and
a name — and that construction drops any method whose signature it can't
fully describe, so those callers could never be named no matter how often you
rebuilt. It now reads both straight off the metadata and skips nothing. - The rest was in the loader: see URKit v0.4.0's
MethodPointerchange.
119,329 methods across 16,357 classes: 5735 ms of walk time down to 64 ms,
24.6 s wall down to 0.34 s. Every caller in a fresh trace is named about a
second after you start it.
Also:
- The index starts when you install a trace, not when the first raw address
reaches the panel. enclosing_indexed_method()gave up on addresses above every indexed entry,
which is exactly where the entry below is the answer.- Argument cells said "object - its value could not be read" for values still
queued behind the decoder's frame budget. They now say "not decoded yet"; a
genuine failure still reads as unreadable.
Running alongside another URKit mod
The Explorer and a generated mod used to be mutually exclusive in practice.
Half of that is fixed in URKit v0.4.0; the Explorer carried the other half.
is_imgui_platform_window() used the IMGUI_CONTEXT property, which Dear
ImGui also stamps on the game's main window, so once another mod initialized
its backend the Explorer treated the game window as a viewport and skipped
focus and capture cleanup. It now checks the window class. The ImGui Win32
backend is also compiled through third_party/imgui_win32_module_scope.cpp so
the viewport window class belongs to this module, and the
UpdatePlatformWindows() frame stamp is kept current on the one path that
returned early past NewFrame().
IL2CPP stripping
- A build that only assigns
localRotationships without
set_localEulerAngles. Euler values are now converted natively and written
through the quaternion property, which survives because the engine uses it. - Shortcut wrappers for
Debug,Screenand friends.
Tests
Five new suites: camera_math, unity_euler, pick_geometry, x86_decode
and inline_site_resolution. 16 in total, all green.
Upgrading
Drop the new DLL in Mods/ and update the loader to URKit v0.4.0. Nothing else
in your setup changes.
UnityRuntimeExplorer Walkthrough
A quick guide on how to use UnityExplorer with URKit.
Support
If you find the project useful and would like to support its development:
Buy Me a Coffee