> For the complete documentation index, see [llms.txt](https://docs.parsue.io/aceland-unity-packages/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.parsue.io/aceland-unity-packages/core-packages/injection/editor-tools.md).

# Editor Tools

[![Sponsor](https://img.shields.io/badge/Sponsor-%E2%9D%A4-db61a2?logo=githubsponsors\&logoColor=white)](https://github.com/sponsors/parsue) [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord\&logoColor=white)](https://discord.gg/XsCYGnYzuc)

AceLand Injection ships a set of Editor windows and menu commands that let you **see** and **verify** your container without leaving Unity — visualise the dependency graph, run validation, inspect what the Source Generator produced, and repair analyzer import settings.

All commands live under the **Tools ▸ AceLand ▸ Injection** menu, plus one entry under the **GameObject** menu for creating a scope.

{% hint style="warning" %}
**The Editor Tools are paid.** The Core Runtime — Bootstrap, dependency-ordered initialization, the quit pipeline and player-loop scheduling — is **free forever**; your game compiles, builds and runs without any license. The Editor experience on this page (Graph, Validation, Diagnostics, Mermaid export, and analyzer repair) unlocks with an active **AceLand Injection** license — buy it as a **subscription** or a **one-time purchase**, whichever you prefer.

* **Subscription / free trial:** [subscription.parsue.io/l/injection](https://subscription.parsue.io/l/injection)
* **One-time purchase (own it forever):** [subscription.parsue.io/l/injection\_permanent](https://subscription.parsue.io/l/injection_permanent)
* Both options unlock the **same** Editor tools + Discord supporter role, and use the same five seat/member tiers.
* **What a license includes & how it works** (open-core, activation, seats, Discord, billing): see the [Open Core & Editor Tools](/aceland-unity-packages/open-and-paid/open-core-and-paid-editor-tools.md) docs.

Without an active license the build **never fails** — auto-validate simply skips, and these Editor windows show a short activation page instead of the tool.
{% endhint %}

{% hint style="info" %}
**Licensing is optional and installed on demand.**

<img src="https://1789393248-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F63jnasUumLZW6LY8UgAR%2Fuploads%2Fe8mcWIKZur1qvdFbNZHR%2Fimage.png?alt=media&amp;token=c47f4724-bbdf-4dcb-90f6-8e82db19a452" alt="" data-size="original">

As of v1.0.1 the licensing layer (`com.aceland.licensing`) is **no longer a hard dependency** — it is not installed with Injection. Everything on this page still degrades safely without it: menus and windows simply show a short **"Install AceLand Licensing"** prompt instead of the tool, and the build gate skips. Click that prompt and Injection adds the Licensing package via UPM (by git URL, so it works even in a fresh project); once Unity recompiles, the real activation flow lights up automatically.
{% endhint %}

{% hint style="info" %}
**Powered by the shared AceLand Licensing Core.** Once installed, the activation, trial, seat-binding and license-window mechanism is not implemented in this package — it lives in the reusable **`com.aceland.licensing`** Core (a single precompiled, obfuscated `AceLand.Licensing.Editor.dll`) that every paid AceLand product links against. Injection only ships a small product policy (`ProductId = aceland_injection`, display name, subscribe URL, trial days, seats) and registers it with the Core at Editor load. State is kept **per product**, so running multiple paid AceLand packages in the same project never clashes.
{% endhint %}

***

### Menu reference

#### Under Menu

\<Tools ▸ AceLand ▸ Injection>

<table data-search="false"><thead><tr><th>Menu</th><th width="210.4000244140625">Shortcut</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Graph</strong></td><td><code>Ctrl/Cmd + Shift + G</code></td><td>Opens the interactive dependency <strong>Graph</strong> window.</td></tr><tr><td><strong>Validation</strong></td><td><code>Ctrl/Cmd + Shift + I</code></td><td>Opens the <strong>Validation</strong> window (the same check the build gate runs).</td></tr><tr><td><strong>Diagnostics</strong></td><td>—</td><td>Logs how many generated injector plans exist and checks the analyzer import settings.</td></tr><tr><td><strong>Open Generated Code Folder</strong></td><td>—</td><td>Reveals <code>Temp/GeneratedCode</code> so you can read the emitted plans.</td></tr><tr><td><strong>Export Graph (Mermaid)</strong></td><td>—</td><td>Writes a Markdown file with a Mermaid graph per enabled Build Settings scene.</td></tr><tr><td><strong>Copy Current Scene Graph (Mermaid)</strong></td><td>—</td><td>Copies the active scene's graph as Mermaid to the clipboard.</td></tr><tr><td><strong>Fix Analyzer Import Settings</strong></td><td>—</td><td>Repairs the Source Generator DLL's import flags.</td></tr></tbody></table>

#### Under Create GameObject Menu

\<GameObject ▸ AceLand> \<Hierarchy (right click) ▸ AceLand>

\| Menu | Shortcut | What it does | | **Injection Scope** | — | Creates a new `InjectionScope` GameObject in the scene. |

***

### Graph window

<figure><img src="https://1789393248-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F63jnasUumLZW6LY8UgAR%2Fuploads%2FWTwpgDg6ftOOQOJSsYFu%2FInjection_gif_graph_Injection_Graph.gif?alt=media&amp;token=36772ebe-3515-4323-b2f5-502d047b2322" alt=""><figcaption></figcaption></figure>

The Graph window is a node-based view of your container: one group per scope, a node per registration, and edges for the dependencies between them. Missing bindings are highlighted in red, so a broken wire-up is visible at a glance.

{% hint style="info" %}
Open it with `Ctrl/Cmd + Shift + G`, or from **Tools ▸ AceLand ▸ Injection ▸ Graph**.
{% endhint %}

Key controls in the toolbar:

<table><thead><tr><th width="178.199951171875">Control</th><th>Purpose</th></tr></thead><tbody><tr><td><strong>Live</strong></td><td>While in Play Mode, mirror the real runtime container instead of a static scene scan.</td></tr><tr><td><strong>Auto Refresh</strong></td><td>Poll the live container so the graph updates as scopes are created / disposed.</td></tr><tr><td><strong>Auto Scan</strong></td><td>In Edit Mode, rescan automatically when the scene hierarchy changes.</td></tr><tr><td><strong>Group by Package</strong></td><td>Cluster nodes by the package that declares them.</td></tr><tr><td><strong>Errors Only</strong></td><td>Hide everything except unresolved / broken bindings.</td></tr><tr><td><strong>Search</strong></td><td>Filter nodes by name.</td></tr></tbody></table>

Select any node to open the inspector on the right, which lists its contract(s), lifetime, owner scope and the dependencies it consumes.

***

### Validation window

The Validation window runs the exact same check as the build gate (see [Tooling](/aceland-unity-packages/core-packages/injection/tooling.md)): it resolves every in-scope scene and prefab against the container and reports any binding that cannot be satisfied. Run it manually while you work so you catch missing registrations long before you hit **Build**.

{% hint style="info" %}
Open it with `Ctrl/Cmd + Shift + I`, or from **Tools ▸ AceLand ▸ Injection ▸ Validation**. The scope and filters it uses come from **Project Settings ▸ AceLand Packages ▸ Injection**.
{% endhint %}

***

### Exporting graphs

Two commands turn the graph into shareable **Mermaid** text — perfect for pasting into GitBook, GitHub, Notion or a pull-request description:

* **Export Graph (Mermaid)** — saves a `.md` file containing one Mermaid diagram per enabled Build Settings scene.
* **Copy Current Scene Graph (Mermaid)** — copies the active scene's diagram to the clipboard. (Save the scene first; an unsaved scene has no path to scan.)

```mermaid
graph RL
  subgraph Global["Global"]
    score["ScoreService<br/>Singleton"]
    save["SaveService<br/>Singleton"]
  end
  score --> save
```

***

### Diagnostics & the generated code

**Diagnostics** logs how many generated injector plans are currently registered. If the count is zero, everything is falling back to reflection (still correct, just slower) — and the log will tell you *why*, usually because the analyzer DLL has the wrong import flags.

**Open Generated Code Folder** reveals `Temp/GeneratedCode`, where you can read exactly what the Source Generator emitted for each type.

{% hint style="warning" %}
If Diagnostics reports **0 plans** and flags the analyzer import settings, run **Fix Analyzer Import Settings** and restart Unity. This sets the `RoslynAnalyzer` label and turns off the "Any Platform" / "Editor" compatibility flags that stop Unity from feeding the DLL to the compiler.
{% endhint %}

***

### Creating an Injection Scope

Use **GameObject ▸ AceLand ▸ Injection Scope** to drop a new `InjectionScope` into the active scene. Attach installers to it (or point it at `ScriptableObjectInstaller` assets) to define what that scope registers. See [Scopes & Containers](/aceland-unity-packages/core-packages/injection/scopes-and-containers.md) for how scopes nest and inherit from the global container.

***

### Best Practices

* Keep the **Graph** window docked while wiring up a scene — red nodes tell you what's missing before you press Play.
* Run **Validation** (`Ctrl/Cmd + Shift + I`) before committing; pair it with the build gate for CI.
* When plans "aren't working", start with **Diagnostics** — it usually points straight at the analyzer import settings.
* Export Mermaid graphs into your `gitbook_doc~` pages to document real scene wiring.
