Repository navigation
Unity Mod Workflow
Select the actual game executable, not a launcher, then click Analyze Unity runtime.
Runtime detection uses player markers:
- Mono:
<Game>_Data\Managed\Assembly-CSharp.dll. - IL2CPP:
GameAssembly.dllplusglobal-metadata.dat. - IL2CPP takes precedence when both marker sets exist.
The inspector also determines architecture, Unity version where available, target framework, modular/monolithic Unity references, BepInEx flavor, optional framework evidence, and build readiness.
If BepInEx is missing or incomplete, close the game and click Install BepInEx + initialize. Automatic provisioning supports x64 games and installs the packaged BepInEx 6 runtime matching Mono or IL2CPP.
The Studio launches the game and waits for BepInEx disk logging. IL2CPP readiness additionally requires generated interop assemblies. The game is closed normally when possible and force-closed only when necessary.
Optionally use Install EDI with a standalone folder containing Edi.exe. Existing destination Gallery contents are preserved.
Choose an empty folder for Generate mod project. Initial generation refuses to overwrite any generated filename.
The scaffold includes:
IntegrationMod.csproj
Plugin.cs
RuntimeObserver.cs
GamePreset.cs
EdiClient.cs
ActionNames.cs
README.md
scaffold.json
The generated project contains local game paths and is intended as a build workspace, not a portable release package.
Close the game and click Build + install. The Studio:
- Repairs project references for the currently inspected runtime.
- Refreshes generated runtime support and preset files.
- Runs
dotnet build --configuration Release. - Installs
IntegrationMod.dllinto an owned plugin directory. - Writes an ownership manifest beside the DLL.
Build + install refreshes these files:
IntegrationMod.csprojRuntimeObserver.csEdiClient.csGamePreset.csActionNames.csscaffold.json
Do not hand-edit them. Keep custom Harmony work in Plugin.cs or separate source files. Plugin.cs is preserved during repair/update.
For supported timed runtime sources, use this as the dominant integration loop:
- Start EDI and the game.
- Select the game window and start rolling capture.
- Click Watch discovery.
- Navigate to a target gallery or gameplay scene and let at least a couple of stable loops play.
- Select the newest matching timed event from the current playback and click Capture cycle while its frames remain buffered.
- Pause telemetry output, author the automatically trimmed scene, and click Save + lock.
- Resume output and repeat for the next scene.
Saving the captured cycle commits its candidate, object path, and duration mapping to the project. After authoring, close the game and rebuild/install to compile those mappings into the plugin.
Use Map selected manually for untimed candidates, one-off semantic events, or scenes you already authored through manual capture.
The Studio installs the plugin DLL plus its ownership manifest. Referenced Unity, game, Spine, PlayMaker, BepInEx, and interop assemblies are compile-only references and are not copied into the plugin directory.