Phase One · The Loader
Installing BepInEx 6 (IL2CPP)
Phase one is the loader — a BepInEx 6 IL2CPP build pre-configured for Two Point Museum. You'll extract TPM-BepInEx-Unity.IL2CPP-win-x64-6.0.0-be.784.rar straight into the game folder, run the game once so it builds its interop assemblies, then confirm it took. Nothing to configure, no plugin yet — just the host.
ℹ️Why this exact loader
Two Point Museum is an IL2CPP Unity game: its C# was compiled to native code and
bundled into GameAssembly.dll. A standard Mono BepInEx 5 cannot attach to that — and a
generic BepInEx download still leaves you to match versions and edit the loader config yourself. This
archive removes all of that: it's a BepInEx 6 IL2CPP build configured specifically for
Two Point Museum — the right x64 IL2CPP branch (6.0.0-be.784), with a
bundled .NET 6 runtime, Il2CppInterop, its Doorstop loader pre-set, and its Unity support libraries
pinned to the game's exact engine (6000.0.63). Drop it in as-is; it's the only kind
that will load the Ungodly AI plugin.
Inspect the crate
What's inside the loader archive
Open TPM-BepInEx-Unity.IL2CPP-win-x64-6.0.0-be.784.rar and you'll see this — a complete BepInEx already set up
for Two Point Museum. Everything here gets merged into your game root in Step 4; nothing needs
renaming, and nothing needs configuring (the highlighted pieces are the ones
already tuned to this game).
├─ winhttp.dll # the proxy DLL that boots Doorstop ├─ doorstop_config.ini # pre-set for this game — points Doorstop at BepInEx + dotnet, IL2CPP enabled ├─ .doorstop_version # 4.5.0 ├─ changelog.txt ├─ dotnet/ # bundled .NET 6 runtime — coreclr.dll, mscorlib.dll … (188 files) └─ BepInEx/ ├─ core/ # BepInEx + Il2CppInterop + Cpp2IL assemblies (38 files) ├─ patchers/ # empty — preloader patchers live here ├─ plugins/ # empty — YOUR mod goes here in Phase 2 └─ unity-libs/ └─ 6000.0.63.zip # version-matched to THIS game's Unity 6000.0.63
The walkthrough
Install it in seven stops
Find the game's install folder
In Steam, right-click Two Point Museum → Manage → Browse local files. A window opens at the game root. On the example PC that folder is:
F:\SteamLibrary\steamapps\common\Two Point Museum\
Yours will differ by drive and library, but the folder name is always
Two Point Museum and it always contains TPM.exe.
Confirm it's the IL2CPP build
In that folder, check these three exist. Their presence is what makes this an IL2CPP game and tells you the IL2CPP loader is the right one:
TPM.exe— the launcher (~667 KB).GameAssembly.dll— the game's native-compiled code (very large, ~340 MB).TPM_Data\— the Unity data folder.
Fully close the game
Make sure Two Point Museum isn't running (and isn't mid-update in Steam). Files like
winhttp.dll can't be written while the game holds them.
Extract the archive into the game root
Open TPM-BepInEx-Unity.IL2CPP-win-x64-6.0.0-be.784.rar in WinRAR or 7-Zip and extract its contents
directly into the game folder — the same folder as
TPM.exe. The simplest way: drag the archive into the game folder,
then Extract Here.
⚠️Don't nest it
You want winhttp.dll sitting next to TPM.exe,
not inside a new TPM-BepInEx… subfolder. If your extractor made a folder named after the
archive, open it and move everything up one level into the game root.
When it's done, the game root should look exactly like this (the four green items are what the archive just added):
├─ BepInEx/ # NEW — the loader ├─ dotnet/ # NEW — bundled .NET 6 runtime ├─ D3D12/ # game's own ├─ DLCs/ # game's own ├─ LicensingInfo/ # game's own ├─ TPM_Data/ # game's own (Unity data) ├─ .doorstop_version # NEW ├─ baselib.dll # game's own ├─ changelog.txt # NEW (BepInEx) ├─ checksum_manifest_md5.txt # game's own ├─ doorstop_config.ini # NEW ├─ GameAssembly.dll # game's own (IL2CPP native code) ├─ TPM.exe # launch THIS ├─ UnityCrashHandler64.exe # game's own ├─ UnityPlayer.dll # game's own ├─ version.txt # game's own └─ winhttp.dll # NEW — the hook that loads BepInEx
Here's that exact state in File Explorer — click to view it full size:
Sanity-check the four new items
Before launching, confirm these four sit in the game root next to
TPM.exe:
If any are missing or buried in a subfolder, redo Step 4. That's the single most common reason BepInEx "does nothing" on first launch.
Launch once and let it build interop
Start Two Point Museum normally (through Steam, or by running
TPM.exe). Let it reach the main menu and sit for a minute,
then quit to desktop.
On this first run, BepInEx does its one-time heavy lifting: it unpacks the Unity base libs and generates the Il2Cpp interop assemblies — the managed "mirror" of the game's native classes that every plugin (including Ungodly AI) is compiled against. This can take a little longer than a normal boot and may show a console window; that's expected.
⏳Be patient on this one boot
Interop generation only happens once (and again after a game update). Don't kill the process while
it's working — if you interrupt it, delete BepInEx\interop and
BepInEx\cache and launch again.
Confirm BepInEx attached
Open the BepInEx folder again. After that first launch it should now contain three
new generated folders plus two log files:
├─ cache/ # NEW on first run — type/assembly cache ├─ config/ # NEW on first run — BepInEx.cfg is created here ├─ core/ # from the archive ├─ interop/ # NEW on first run — generated Il2Cpp proxies ★ the key one ├─ patchers/ # from the archive (empty) ├─ plugins/ # your mod goes here in Phase 2 ├─ unity-libs/ # from the archive ├─ ErrorLog.log # NEW on first run └─ LogOutput.log # NEW on first run — read this to confirm the load
That's the real folder after a clean first run — click to enlarge:
Open LogOutput.log in a text editor. A healthy first run reads roughly like this
(versions and paths will match your machine):
[Message: BepInEx] BepInEx 6.0.0-be.784 (TPM / Unity 6000.0.63)
[Info : BepInEx] CLR runtime version: 6.0.x
[Message: BepInEx] Preloader started
[Info :Il2CppInterop] Generating Il2Cpp interop assemblies
[Info :Il2CppInterop] Wrote interop assemblies to ...\BepInEx\interop
[Message: BepInEx] Chainloader initialized
[Info : BepInEx] 0 plugins to load # expected — no mod installed yet
✓Phase 1 complete
If you see interop + config folders and a LogOutput.log that
ends with the chainloader loading 0 plugins, the loader is working perfectly — it
just has nothing to load. That's exactly the moment to install the mod.
Next: install the mod
With the loader proven, Phase 2 is short — one DLL into one folder, then launch and press F6.
Boot didn't change anything?
No console, no logs, no new folders — that's almost always a misplaced winhttp.dll. The
Troubleshooting desk walks through every cause.