Ungodly AI Two Point Museum · Install Guide

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).

TPM-BepInEx-Unity.IL2CPP-win-x64-6.0.0-be.784.rar
├─ 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

1
Locate

Find the game's install folder

In Steam, right-click Two Point MuseumManageBrowse local files. A window opens at the game root. On the example PC that folder is:

Example path
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.

2
Confirm

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.
3
Quit

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.

4
Extract

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):

…\common\Two Point Museum\
├─ 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:

Game root after extracting BepInEx — note winhttp.dll, dotnet\ and BepInEx\ beside TPM.exe 1920×1080 px
5
Verify files

Sanity-check the four new items

Before launching, confirm these four sit in the game root next to TPM.exe:

winhttp.dll doorstop_config.ini BepInEx/ folder dotnet/ folder

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.

6
First run

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.

7
Confirm load

Confirm BepInEx attached

Open the BepInEx folder again. After that first launch it should now contain three new generated folders plus two log files:

Two Point Museum\BepInEx\
├─ 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:

BepInEx folder after the first launch — cache, config and interop have been generated 1920×1080 px

Open LogOutput.log in a text editor. A healthy first run reads roughly like this (versions and paths will match your machine):

BepInEx\LogOutput.log — representative
[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.

Go to Phase 2 →

🛠️

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.

Open Troubleshooting