Install
$ agentstack add skill-firzus-agent-skills-unity6-aaa-best-practices ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Unity 6 AAA Best Practices
Act as a senior Unity 6 developer shipping a production game. Apply the DO/DON'T rules below by default; deviate only with an explicit, stated reason. These practices target the Unity 6 line (6000.x). Default to 6.3 LTS as the conservative production baseline and 6.5 as the latest feature set; assume a current release unless the project is explicitly locked on an older 6.x. Several defaults changed across the 6.x cycle: the unlearn list below corrects habits from older Unity versions that are now wrong, and the version map pins each major capability to the release that shipped it (attribution drifts a lot in older blog posts).
Version map (when each capability actually shipped)
| Capability | Shipped in | Notes | | --- | --- | --- | | Render Graph, GPU Resident Drawer, GPU occlusion, STP, Awaitable, Build Profiles, runtime data binding | 6.0 | Foundations of the Unity 6 era | | World-space UI Toolkit | 6.2 | Panel Settings → world-space render mode | | Render Graph = only path (URP Compatibility Mode removed), UI Shader Graph + USS filters, UI Test Framework, SVG as core module, [SerializeField] fields-only (compile error) | 6.3 (LTS) | First LTS since 6.0; URP_COMPATIBILITY_MODE define removed in 6.4 | | ECS (Entities/Collections/Mathematics/Entities Graphics) as Core packages, EntityId deprecates InstanceID, DirectStorage, PVRTC removed | 6.4 | | | EntityId replaces InstanceID (obsolete int InstanceID APIs now compile errors), Built-in RP + dynamic batching deprecated, Advanced Text Generator = default, Panel Renderer replaces UI Document, on-tile post-processing, WebAssembly 2023 default | 6.5 | Plan the InstanceID migration carefully; legacy .rigidbody/.camera accessors were already gone (5.x), warnings just promoted to errors |
Treat "6.2+ can do X" claims with suspicion: SVG-as-core, the Render-Graph-only path, and UITK custom shaders are 6.3, not 6.2.
For implementing Figma designs as UI Toolkit interfaces, use the figma-to-unity skill. This skill covers what is Unity-specific.
Unlearn list (old habits that are now wrong)
| Old habit (pre-Unity 6) | Do instead | | --- | --- | | UGUI for new UI (menus, HUD, world-space) | UI Toolkit with a USS-token design system | | Manual per-frame UI sync (label.text = ... in Update) | Runtime data binding (DataBinding, [CreateProperty]) | | Coroutines by default; raw .NET Task in engine code | Awaitable with CancellationToken (or UniTask for advanced flows) | | Input.GetAxis / Input.GetKey | Input System action maps | | Resources/ folder loading | Addressables with AssetReference | | Static batching + CPU occlusion as draw-call strategy | GPU Resident Drawer + GPU occlusion culling (URP/HDRP) | | Legacy ScriptableRenderPass.Execute custom passes | Render Graph passes (only path in 6.3+) | | One global define list, hand-edited per platform | Build Profiles (per-profile settings, defines, scene lists) | | Hand-rolled object pools | UnityEngine.Pool (ObjectPool, CollectionPool) | | Built-in Render Pipeline for new projects (deprecated in 6.5) | URP (cross-platform/stylized) or HDRP (high-fidelity PC/console) | | GetInstanceID() / int instance ids, MaterialPropertyBlock to vary one material | EntityId (obsolete int APIs are compile errors in 6.5) / per-renderer RSUV (SetShaderUserValue, GRD-safe) | | GameObject.rigidbody / .camera / AddComponent("Name") legacy accessors | GetComponent() / AddComponent() (legacy forms gone since 5.x; residual warnings became errors in 6.5) | | Installing Entities/Collections/Mathematics as packages | Built-in Core packages (ship with the Editor since 6.4; Unity.Mathematics is a built-in module in 6.5) | | [SerializeField] on properties/methods | [field: SerializeField] (anything else is a compile error since 6.3) |
Golden rules
- UI = UITK + design system + MVP. All new UI goes to UI Toolkit —
screen-space and world-space (world-space since 6.2). Build a design system: USS variables (--token-name) for colors, spacing, and typography, composed into theme TSS files. Display data through MVP/MVVM: UXML/USS is the view, a presenter wires queries and runtime bindings, models are plain C# / ScriptableObjects. Never put game logic in VisualElement subclasses. On 6.5+, prefer Panel Renderer over UI Document and let the Advanced Text Generator (default) own text. See [ui.md](./ui.md).
- Architecture = composition + asmdefs + data-driven. Plain C# services
behind thin MonoBehaviour adapters; assembly definitions along architectural seams with one-way dependencies; ScriptableObjects for shared config and event channels. See [architecture.md](./architecture.md). For folder layout, naming, and file conventions, see [project-structure.md](./project-structure.md).
- Assets = Addressables + presets + additive scenes. Never
Resources/.
Enforce import settings with folder presets committed to VCS. Structure levels as bootstrap + persistent managers + additive content scenes. See [assets.md](./assets.md).
- Performance = measure, then zero allocs + GPU-driven rendering. Profile
on target hardware before optimizing. Zero per-frame managed allocations in steady state. Pool everything spawned at runtime. Enable GPU Resident Drawer on large scenes. See [performance.md](./performance.md).
- Pipeline = IL2CPP releases, CI on every PR, tests that gate merges.
Git + LFS with text serialization, GameCI or Build Automation with Library caching, edit-mode tests as the default. See [workflow.md](./workflow.md).
- Multiplayer = pick the netcode stack early, design for authority. Choose
Netcode for GameObjects 2.x (general) or Netcode for Entities (DOTS scale), decide client/server vs distributed authority up front, and stand up the Multiplayer roles / Dedicated Server split from the start. See [multiplayer.md](./multiplayer.md).
Domain index
| Domain | Reference | | --- | --- | | UI Toolkit, design tokens, data binding, MVP/MVVM, UGUI cases | [ui.md](./ui.md) | | ScriptableObjects, asmdefs, Awaitable/UniTask, DOTS/Jobs/Burst | [architecture.md](./architecture.md) | | Folder layout, naming, type prefixes, namespace↔folder, GUID-safe renames | [project-structure.md](./project-structure.md) | | Addressables, import presets, scenes, prefab workflows | [assets.md](./assets.md) | | Profiling, GC discipline, pooling, GPU Resident Drawer, URP/HDRP | [performance.md](./performance.md) | | Input System, audio/middleware, version control, CI, builds, testing | [workflow.md](./workflow.md) | | Netcode (NGO 2.x / Netcode for Entities), authority, dedicated server, transport | [multiplayer.md](./multiplayer.md) |
How to apply
When writing or reviewing Unity code:
- [ ] Does any new UI use UGUI without a stated reason? -> UITK + tokens + MVP
- [ ] Any per-frame allocation, Find*, GetComponent, or LINQ in Update? -> fix
- [ ] Any Resources.Load or string-based asset path? -> Addressables
- [ ] Any coroutine/Task where Awaitable fits? -> Awaitable + CancellationToken
- [ ] Any direct device polling? -> Input System action maps
- [ ] Any Instantiate/Destroy churn? -> UnityEngine.Pool
- [ ] New logic testable in edit mode? -> plain C# in its own asmdef + tests
- [ ] Asset/folder naming off-convention or per-type subfolders? -> PascalCase + type prefix, organize by feature
- [ ] File holds multiple types or namespace mismatches its folder? -> one type per file, namespace mirrors path
- [ ] Renaming/moving assets without their .meta (or without git mv)? -> move the pair, keep GUID/LFS intact
- [ ] Any GetInstanceID()/int instance id, or MaterialPropertyBlock on batched objects? -> EntityId / per-renderer RSUV
- [ ] [SerializeField] on a property/method, or legacy .rigidbody/.camera accessors? -> [field: SerializeField] / GetComponent
- [ ] Custom render pass on the removed URP Compatibility path? -> Render Graph (only path since 6.3)
- [ ] Networked feature with no chosen authority model/netcode stack? -> decide early (multiplayer.md)
When the user's choice conflicts with these rules, state the rule, the cost of deviating, and proceed only if they confirm.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Firzus
- Source: Firzus/agent-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.