addressables-design
Source-anchored design rules for Unity Addressables 1.22.3/2.9.1
Advise on Unity performance red flags
Claude Code
$ npx -y skills add Besty0728/Unity-Skills --skill performance --agent claude-code
Codex
$ npx skills add Besty0728/Unity-Skills --skill performance -a codex -y
Cursor
$ npx skills add Besty0728/Unity-Skills --skill performance -a cursor -y
Gemini CLI
$ npx skills add Besty0728/Unity-Skills --skill performance -a gemini-cli -y
GitHub Copilot
$ npx skills add Besty0728/Unity-Skills --skill performance -a github-copilot -y
OpenCode
$ npx skills add Besty0728/Unity-Skills --skill performance -a opencode -y
Windsurf
$ npx skills add Besty0728/Unity-Skills --skill performance -a windsurf -y
name: unity-performance description: Advise on Unity performance red flags
Documentation only: no REST skills. Use for a high-signal review of likely Unity performance issues. Focus on red flags, not speculative micro-optimizations.
Three counter-intuitive traps where something that seems free is expensive. Each cost is paid for the *possibility* of work, not for work actually performed, which is why profilers rarely catch them directly.
A component whose `Update` *can* mutate `transform.position` pays the cost whether or not the branch runs: dirty-flag and serialization systems treat write permission as a reason to poll every frame. Likewise, a `[SerializeField]` field that is never modified at runtime still sits on the serialization path. The fix is to **remove the permission**, not tighten the branch: split the rarely-needed writer into its own component and `AddComponent` it only when needed. *Source: `NetcodeSamples/HelloNetcode/2_Intermediate/07_Optimization/Optimization.md`: "a system with the possibility of writing to a component, regardless of whether it writes to it or not, will always have to be serialized".*
Seeding N RNG instances with `baseSeed + i` gives N *similar* streams: patrol paths line up, spawn jitter clumps, loot rolls cluster. Hash the index before seeding:
// Wrong: N correlated streams
for (int i = 0; i < N; i++) rngs[i] = new System.Random(baseSeed + i);
// Correct: the hash decorrelates adjacent seeds
for (int i = 0; i < N; i++)
rngs[i] = new System.Random((int)((uint)baseSeed * 2654435761u ^ (uint)i));`Unity.Mathematics.Random.CreateFromIndex(i)` applies this internally and is preferred when the math package is available. *Source: `Dots101/Entities101/Assets/HelloCube/3. Prefabs/SpawnSystem.cs:37-39` and its comment.*
`Debug.Log` is **not** stripped in Player builds; only methods marked `[Conditional("UNITY_EDITOR")]` (such as `Debug.DrawLine`) have their arguments elided at the call site. A log line with interpolation or helper calls therefore runs every frame in shipped games:
// Wrong: GetPlayerInfo() and string interpolation execute in release
Debug.Log($"Player {GetPlayerInfo()} at {Time.time}");
// Better: guard the whole expression
if (Debug.isDebugBuild) Debug.Log($"Player {GetPlayerInfo()} at {Time.time}");Same principle as the write-permission rule: the runtime pays for the *possibility* of work, not only for the work.
REST API-based AI-driven Unity Editor Automation Engine Let AI control Unity scenes directly through Skills 🎉 We are now indexed by DeepWiki! Got questions? Check out the AI-generated docs → The current official maintenance baseline is Unity 2022.3+.
Source-anchored design rules for Unity Addressables 1.22.3/2.9.1
Manage Addressables groups, entries, profiles and content builds (com.unity.addressables, reflection-based)
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.