Quick answer: A good asset name answers what/which/variant without opening the file: a consistent pattern like category_name_variant_state (enemy_goblin_red_walk), one casing convention (snake_case travels best), zero-padded numbers (_01 not _1), and no spaces or special characters anywhere. The convention you pick matters far less than picking one before asset fifty.
A good asset name answers what/which/variant without opening the file: a consistent pattern like category_name_variant_state (enemy_goblin_red_walk), one casing convention (snake_case travels best), zero-padded numbers (_01 not _1), and no spaces or special characters anywhere. The convention you pick matters far less than picking one before asset fifty. That's the short version — the sections below get into the how, the why, and the mistakes worth dodging.
Anatomy of a name that works
The proven shape orders from general to specific: type or category first (chr/env/ui or full words), then the thing, then variant, then state or purpose — chr_goblin_red_walk, ui_button_confirm_pressed, env_tree_pine_03. General-first means alphabetical sorting groups related assets automatically, and search-by-prefix finds families instantly.
Suffix the technical role where it matters (textures: _albedo, _normal; audio: _loop vs _oneshot) so pipelines and humans can both route files by name alone. Engines' batch tools and your own scripts get dramatically simpler when names are parseable.
The boring rules that prevent real bugs
Spaces and special characters break build scripts, command lines, and some platforms' packaging — snake_case (or a consistently applied alternative) avoids the whole class. Case-sensitivity differs across OSes: two files differing only by case is a Linux/Windows incident waiting; a single casing convention makes it impossible. Zero-pad sequences (_01.._12) or alphabetical order scrambles after nine.
Never let meaning live only in folders: when frame_03.png escapes its directory (and it will — exports, bug reports, atlases), goblin_walk_03.png still says what it is.
Adoption is a tooling problem, not a memo problem
Write the convention in a one-page README with examples per asset type — then make compliance cheap: export presets and templates that produce correct names, a validation script (or engine import hook) that flags violations, and rename offenders on sight before they breed copies.
Retrofit pragmatically: rename going forward and on-touch rather than big-bang renaming a live project (references break). The convention pays off most exactly where it's hardest to retrofit — which is the argument for the day-one decision.
Your future self is a stranger — leave notes
Six months from now you will not remember why that magic number is 0.73 or which scene is safe to delete. Project knowledge that lives only in your head evaporates on contact with a break, a jam, or a day job crunch.
Keep one running NOTES file: decisions made, things that look unused but aren't, how to do the fiddly release steps. Five minutes of writing per week buys you days of re-discovery later.
Boring tools are a superpower
Every hour spent fighting your own pipeline is an hour not spent on the game. The goal of tooling isn't sophistication — it's that builds, backups, and versioning become so boring you forget they exist. Set them up once, automate them, and let them run.
The test is simple: if your machine died tonight, how long until you're working again? If the answer is 'an hour', your tooling is good. If it's 'I'd lose a week', fix that before adding any feature.
Close the loop with real players
Advice gets you to a sensible starting point; only real player behavior tells you if it worked. Ship the change, then watch what actually happens — the reports that come in, the errors that spike or vanish, the place sessions end.
Make that loop short. When a player can report a bug in ten seconds and you see it with logs attached, you stop guessing what to fix next. Tight feedback loops are the closest thing indie development has to a cheat code.
Putting it to work
Don't try to act on all of this at once. Pick the one change that costs you the least and pays the most this week, do it, and see what actually happens before reaching for the next.
Most of this rewards steadiness over intensity. A small improvement made every week, checked against how real players respond, outruns any single burst of effort — in this corner of game development and every other one.
If your machine died tonight, you should be working again by morning. Build toward that.