Game Dev Articles
Oct 5, 2026 · 9 min read · DMG Forge
Unity Dev Tools Documentation Best Practices: A Technical Guide to Reducing Friction
Documentation as Technical Debt Prevention Undocumented tools don't stay undocumented - they stay unused, or worse, misused in ways that corrupt scenes and break builds six weeks later. Unity dev tools documentation b...

Documentation as Technical Debt Prevention
Undocumented tools don't stay undocumented - they stay unused, or worse, misused in ways that corrupt scenes and break builds six weeks later. Unity dev tools documentation best practices exist because every custom editor window, inspector hack, or build pipeline script you write is a liability until someone besides you can operate it without asking. Treat documentation as part of the tool's compile step, not an afterthought you'll get to after the deadline.
The math is simple. A tool with no docs costs you an onboarding conversation every time a new team member touches it. Multiply that by every tool in your editor folder, and you're spending hours per sprint re-explaining things that a well-placed README would have answered. Undocumented internal tools are technical debt with compound interest - the longer they go unexplained, the more tribal knowledge accumulates around them, and tribal knowledge leaves the building when people do.
Good documentation also catches design flaws before they ship. If you can't explain your tool's API in three sentences, the API is probably wrong. Writing docs forces you to confront naming inconsistencies, unclear parameter order, and edge cases you hadn't considered - all cheaper to fix during the writing pass than after three other scripts depend on the broken version.
Structure Your Tool Docs Like Your Code
Your documentation should mirror your codebase's organization, not fight it. If your tool lives in Assets/Tools/BuildPipeline/, your docs should follow the same hierarchy - one markdown file per major class or system, not a single sprawling wiki page that nobody can navigate.
Use this structure as a baseline for any non-trivial Unity tool:
- Overview - what the tool does and why it exists, in two or three sentences
- Dependencies - other packages, assemblies, or tools this one requires
- Setup - the minimum steps to get it running in a fresh project
- API Reference - every public method, property, and event
- Examples - working code snippets, not pseudocode
- Known Limitations - what it doesn't handle and why
Keep this structure identical across every tool in your project. Consistency lets developers pattern-match: once someone learns how to read one tool's docs, they can navigate all of them without relearning a format. Inconsistent doc structures are a tax on every new reader, paid in full every single time.
Store docs next to the code they describe, inside the same folder or assembly definition, and commit them in the same pull request as the code change. Docs that live in a separate wiki drift out of sync almost immediately because nobody remembers to update a system they're not looking at.
API Reference: Naming and Signature Conventions
Unity's own API conventions exist for a reason - consistency reduces cognitive load. Your tool's public API should follow the same patterns Unity uses internally, so developers don't have to context-switch between "how Unity does it" and "how your tool does it."
Specific rules worth enforcing:
- PascalCase for public methods and properties, matching
MonoBehaviourand UnityEngine conventions. Don't mix in snake_case or camelCase for public members. - Verb-first method names that describe the action:
GenerateAtlas(), notAtlasGeneration(). A reader should know what a method does from its name alone, without opening the reference. - Consistent parameter ordering across overloads. If
BuildAsset(string path, bool force)exists, don't later shipBuildAsset(bool force, string path)for a related method. Order inconsistency is one of the most common sources of silent bugs in internal tools. - Document return values explicitly, including null cases. "Returns the generated
Texture2D, ornullif the source sprite has no valid bounds" is a complete sentence. "Returns a texture" is not documentation - it's a placeholder pretending to be documentation. - Flag nullable and optional parameters in the signature line itself, not buried in a paragraph below it. Developers scan signatures first and prose second.
Every public method needs three things in its reference entry: a one-line summary, a parameter table, and a return value description. Skip any one of these and you've shipped half a reference.
Setup Instructions That Actually Work
Setup documentation fails most often not because it's wrong, but because it assumes a starting state that doesn't match reality. "Import the package and press Generate" means nothing if the reader hasn't set the correct Scripting Backend, installed a required package, or configured a folder structure your tool expects silently.
Write setup instructions assuming a clean project with none of your prior context. Walk through this checklist before publishing any setup doc:
- State the Unity version range explicitly. "Tested on Unity 2022.3 LTS" is useful. "Works on recent Unity versions" is not - it will be wrong within two releases.
- List every package dependency with exact version numbers, pulled from your
manifest.json, not approximate ones. - Call out required project settings by exact field name - Color Space, Scripting Backend, Api Compatibility Level, Managed Stripping Level - anything your tool depends on that isn't Unity's default.
- Include the first-run verification step. After setup, what should the developer see if everything worked? A console log, a menu item, a generated asset - give them a concrete checkpoint, not "it should just work."
- Document the failure state separately. If setup fails, what's the most common cause, and what's the fix? One paragraph here saves a support thread later.
If your tool requires a specific assembly definition reference or a particular folder location to function, say so in step one, not buried in a troubleshooting section at the bottom. Readers who hit setup friction early abandon the tool before they reach your troubleshooting notes.
Example Code Blocks: Specificity Over Abstraction
Abstract examples teach nothing. A code block that reads tool.DoSomething(parameter) with a comment saying "replace with your values" forces the reader to reverse-engineer your intent from a signature alone. Specificity costs you ten extra minutes of writing and saves the reader an hour of guessing.
Compare these two approaches:
Vague - tells the reader nothing about real usage:
var result = assetProcessor.Process(input);
Specific - shows an actual working call with real types and real values:
var processor = new AssetProcessor(compressionLevel: 7, generateMipmaps: true);
Texture2D result = processor.Process(sourceSprite: playerIcon);
The second example tells the reader what types to expect, what a reasonable parameter value looks like, and what the named arguments are called - details a vague example strips out entirely.
Rules for example blocks:
- Use real variable names, not
foo,bar, ortemp. Name them the way you'd name them in production code. - Show the full context, including necessary
usingdirectives and the containing method signature if it affects behavior. - Include at least one example per common use case, not just the happy path. If a method behaves differently when called during
OnValidate()versus runtime, show both. - Never ship an example that doesn't compile. Copy it directly from a working test or scene, not from memory. A broken example in your docs is worse than no example - it burns trust in everything else you've written.
Version Tracking and Breaking Change Documentation
Every internal tool eventually changes its API, and every API change eventually breaks something downstream that nobody warned about. The fix isn't to stop changing your tools - it's to document changes with the same rigor you'd expect from a third-party package changelog.
Maintain a CHANGELOG.md alongside every tool, following a format like Keep a Changelog, with entries grouped by version:
- Added - new methods, properties, or features
- Changed - modified behavior that doesn't break existing calls
- Breaking - anything that requires the caller to update their code
- Deprecated - marked for removal, with a target version and a migration path
Breaking changes get their own line, every time, with no exceptions. "Renamed BuildAtlas() to GenerateAtlas(), update all call sites" is a one-line entry that prevents a confused teammate from filing a bug report about a "broken" tool that actually just changed names.
Tag your tool versions in source control to match changelog entries, so a developer debugging an issue can check out the exact version their scene was built against. Without version tags, "it worked in the old version" becomes an unfalsifiable claim nobody can investigate.
Maintaining Docs Alongside Tool Updates
Documentation that isn't maintained is worse than documentation that doesn't exist, because it actively misleads readers who trust it by default. Stale docs describing a removed parameter or a renamed method cost more debugging time than a blank page would, since the reader assumes the doc is correct and blames their own code first.
Enforce doc updates as part of your code review process, not as a separate task:
- Require a doc diff in the same pull request as any public API change. If the PR changes a method signature, it must also update the corresponding reference entry. Reviewers should block merges that skip this.
- Run a quarterly doc audit on tools with active development, checking example code against the current API to confirm it still compiles.
- Assign doc ownership per tool, not team-wide responsibility that nobody actually owns. A tool with a named maintainer gets its docs updated; a tool "owned by the team" gets ignored until it breaks.
A ten-minute doc update at the time of a code change prevents a half-day investigation when someone hits a stale example three months later. Treat documentation drift the same way you'd treat any other regression - as a bug, not a formatting nitpick.
Related Reading
Article complete
XP lands automatically when you reach the end.
Rate this article
Comments
Comments are held for moderation before appearing publicly.