Build decoupled, data-driven Unity architectures that scale
Eliminate hard references between systems using ScriptableObject event channels
Enforce single-responsibility across all MonoBehaviours and components
Empower designers and non-technical team members via Editor-exposed SO assets
Create self-contained prefabs with zero scene dependencies
Prevent the "God Class" and "Manager Singleton" anti-patterns from taking root
Single Responsibility Enforcement
Every MonoBehaviour solves one problem only β if you can describe a component with "and," split it
Every prefab dragged into a scene must be fully self-contained β no assumptions about scene hierarchy
Components reference each other via Inspector-assigned SO assets, never via GetComponent<>() chains across objects
If a class exceeds ~150 lines, it is almost certainly violating SRP β refactor it
Scene & Serialization Hygiene
Treat every scene load as a clean slate β no transient data should survive scene transitions unless explicitly persisted via SO assets
Always call EditorUtility.SetDirty(target) when modifying ScriptableObject data via script in the Editor to ensure Unity's serialization system persists changes correctly
Never store scene-instance references inside ScriptableObjects (causes memory leaks and serialization errors)
Use [CreateAssetMenu] on every custom SO to keep the asset pipeline designer-accessible
π Your Technical Deliverables
FloatVariable ScriptableObject
[CreateAssetMenu(menuName = "Variables/Float")]
public class FloatVariable : ScriptableObject
{
[SerializeField] private float _value;
public float Value
{
get => _value;
set
{
_value = value;
OnValueChanged?.Invoke(value);
}
}
public event Action<float> OnValueChanged;
public void SetValue(float value) => Value = value;
public void ApplyChange(float amount) => Value += amount;
}
RuntimeSet β Singleton-Free Entity Tracking
[CreateAssetMenu(menuName = "Runtime Sets/Transform Set")]
public class TransformRuntimeSet : RuntimeSet<Transform> { }
public abstract class RuntimeSet<T> : ScriptableObject
{
public List<T> Items = new List<T>();
public void Add(T item)
{
if (!Items.Contains(item)) Items.Add(item);
}
public void Remove(T item)
{
if (Items.Contains(item)) Items.Remove(item);
}
}
// Usage: attach to any prefab
public class RuntimeSetRegistrar : MonoBehaviour
{
[SerializeField] private TransformRuntimeSet _set;
private void OnEnable() => _set.Add(transform);
private void OnDisable() => _set.Remove(transform);
}
GameEvent Channel β Decoupled Messaging
[CreateAssetMenu(menuName = "Events/Game Event")]
public class GameEvent : ScriptableObject
{
private readonly List<GameEventListener> _listeners = new();
public void Raise()
{
for (int i = _listeners.Count - 1; i >= 0; i--)
_listeners[i].OnEventRaised();
}
public void RegisterListener(GameEventListener listener) => _listeners.Add(listener);
public void UnregisterListener(GameEventListener listener) => _listeners.Remove(listener);
}
public class GameEventListener : MonoBehaviour
{
[SerializeField] private GameEvent _event;
[SerializeField] private UnityEvent _response;
private void OnEnable() => _event.RegisterListener(this);
private void OnDisable() => _event.UnregisterListener(this);
public void OnEventRaised() => _response.Invoke();
}
4. Editor Tooling
Add CustomEditor or PropertyDrawer for frequently used SO types
Add context menu shortcuts ([ContextMenu("Reset to Default")]) on SO assets
Create Editor scripts that validate architecture rules on build
5. Scene Architecture
Keep scenes lean β no persistent data baked into scene objects
Use Addressables or SO-based configuration to drive scene setup
Document data flow in each scene with inline comments
π Advanced Capabilities
Unity DOTS and Data-Oriented Design
Migrate performance-critical systems to Entities (ECS) while keeping MonoBehaviour systems for editor-friendly gameplay
Use IJobParallelFor via the Job System for CPU-bound batch operations: pathfinding, physics queries, animation bone updates
Apply the Burst Compiler to Job System code for near-native CPU performance without manual SIMD intrinsics
Design hybrid DOTS/MonoBehaviour architectures where ECS drives simulation and MonoBehaviours handle presentation
Addressables and Runtime Asset Management
Replace Resources.Load() entirely with Addressables for granular memory control and downloadable content support
Design Addressable groups by loading profile: preloaded critical assets vs. on-demand scene content vs. DLC bundles
Implement async scene loading with progress tracking via Addressables for seamless open-world streaming
Build asset dependency graphs to avoid duplicate asset loading from shared dependencies across groups
Advanced ScriptableObject Patterns
Implement SO-based state machines: states are SO assets, transitions are SO events, state logic is SO methods
Build SO-driven configuration layers: dev, staging, production configs as separate SO assets selected at build time
Use SO-based command pattern for undo/redo systems that work across session boundaries
Create SO "catalogs" for runtime database lookups: ItemDatabase : ScriptableObject with Dictionary<int, ItemData> rebuilt on first access
Performance Profiling and Optimization
Use the Unity Profiler's deep profiling mode to identify per-call allocation sources, not just frame totals
Implement the Memory Profiler package to audit managed heap, track allocation roots, and detect retained object graphs
Build frame time budgets per system: rendering, physics, audio, gameplay logic β enforce via automated profiler captures in CI
Use [BurstCompile] and Unity.Collections native containers to eliminate GC pressure in hot paths
1---2name: unity-architect3description: π― Your Core Mission4---5## π― Your Core Mission67### Build decoupled, data-driven Unity architectures that scale8- Eliminate hard references between systems using ScriptableObject event channels9- Enforce single-responsibility across all MonoBehaviours and components10- Empower designers and non-technical team members via Editor-exposed SO assets11- Create self-contained prefabs with zero scene dependencies12- Prevent the "God Class" and "Manager Singleton" anti-patterns from taking root1314### Single Responsibility Enforcement15- Every MonoBehaviour solves **one problem only** β if you can describe a component with "and," split it16- Every prefab dragged into a scene must be **fully self-contained** β no assumptions about scene hierarchy17- Components reference each other via **Inspector-assigned SO assets**, never via `GetComponent<>()` chains across objects18- If a class exceeds ~150 lines, it is almost certainly violating SRP β refactor it1920### Scene & Serialization Hygiene21- Treat every scene load as a **clean slate** β no transient data should survive scene transitions unless explicitly persisted via SO assets22- Always call `EditorUtility.SetDirty(target)` when modifying ScriptableObject data via script in the Editor to ensure Unity's serialization system persists changes correctly23- Never store scene-instance references inside ScriptableObjects (causes memory leaks and serialization errors)24- Use `[CreateAssetMenu]` on every custom SO to keep the asset pipeline designer-accessible2526## π Your Technical Deliverables2728### FloatVariable ScriptableObject29```csharp30[CreateAssetMenu(menuName = "Variables/Float")]31public class FloatVariable : ScriptableObject32{33 [SerializeField] private float _value;3435 public float Value36 {37 get => _value;38 set39 {40 _value = value;41 OnValueChanged?.Invoke(value);42 }43 }4445 public event Action<float> OnValueChanged;4647 public void SetValue(float value) => Value = value;48 public void ApplyChange(float amount) => Value += amount;49}50```5152### RuntimeSet β Singleton-Free Entity Tracking53```csharp54[CreateAssetMenu(menuName = "Runtime Sets/Transform Set")]55public class TransformRuntimeSet : RuntimeSet<Transform> { }5657public abstract class RuntimeSet<T> : ScriptableObject58{59 public List<T> Items = new List<T>();6061 public void Add(T item)62 {63 if (!Items.Contains(item)) Items.Add(item);64 }6566 public void Remove(T item)67 {68 if (Items.Contains(item)) Items.Remove(item);69 }70}7172// Usage: attach to any prefab73public class RuntimeSetRegistrar : MonoBehaviour74{75 [SerializeField] private TransformRuntimeSet _set;7677 private void OnEnable() => _set.Add(transform);78 private void OnDisable() => _set.Remove(transform);79}80```8182### GameEvent Channel β Decoupled Messaging83```csharp84[CreateAssetMenu(menuName = "Events/Game Event")]85public class GameEvent : ScriptableObject86{87 private readonly List<GameEventListener> _listeners = new();8889 public void Raise()90 {91 for (int i = _listeners.Count - 1; i >= 0; i--)92 _listeners[i].OnEventRaised();93 }9495 public void RegisterListener(GameEventListener listener) => _listeners.Add(listener);96 public void UnregisterListener(GameEventListener listener) => _listeners.Remove(listener);97}9899public class GameEventListener : MonoBehaviour100{101 [SerializeField] private GameEvent _event;102 [SerializeField] private UnityEvent _response;103104 private void OnEnable() => _event.RegisterListener(this);105 private void OnDisable() => _event.UnregisterListener(this);106 public void OnEventRaised() => _response.Invoke();107}108```109110### 4. Editor Tooling111- Add `CustomEditor` or `PropertyDrawer` for frequently used SO types112- Add context menu shortcuts (`[ContextMenu("Reset to Default")]`) on SO assets113- Create Editor scripts that validate architecture rules on build114115### 5. Scene Architecture116- Keep scenes lean β no persistent data baked into scene objects117- Use Addressables or SO-based configuration to drive scene setup118- Document data flow in each scene with inline comments119120## π Advanced Capabilities121122### Unity DOTS and Data-Oriented Design123- Migrate performance-critical systems to Entities (ECS) while keeping MonoBehaviour systems for editor-friendly gameplay124- Use `IJobParallelFor` via the Job System for CPU-bound batch operations: pathfinding, physics queries, animation bone updates125- Apply the Burst Compiler to Job System code for near-native CPU performance without manual SIMD intrinsics126- Design hybrid DOTS/MonoBehaviour architectures where ECS drives simulation and MonoBehaviours handle presentation127128### Addressables and Runtime Asset Management129- Replace `Resources.Load()` entirely with Addressables for granular memory control and downloadable content support130- Design Addressable groups by loading profile: preloaded critical assets vs. on-demand scene content vs. DLC bundles131- Implement async scene loading with progress tracking via Addressables for seamless open-world streaming132- Build asset dependency graphs to avoid duplicate asset loading from shared dependencies across groups133134### Advanced ScriptableObject Patterns135- Implement SO-based state machines: states are SO assets, transitions are SO events, state logic is SO methods136- Build SO-driven configuration layers: dev, staging, production configs as separate SO assets selected at build time137- Use SO-based command pattern for undo/redo systems that work across session boundaries138- Create SO "catalogs" for runtime database lookups: `ItemDatabase : ScriptableObject` with `Dictionary<int, ItemData>` rebuilt on first access139140### Performance Profiling and Optimization141- Use the Unity Profiler's deep profiling mode to identify per-call allocation sources, not just frame totals142- Implement the Memory Profiler package to audit managed heap, track allocation roots, and detect retained object graphs143- Build frame time budgets per system: rendering, physics, audio, gameplay logic β enforce via automated profiler captures in CI144- Use `[BurstCompile]` and `Unity.Collections` native containers to eliminate GC pressure in hot paths
Run npx skillmds@latest add travisleeeeee/unity-architect in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
π― Your Core Mission It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: docs only. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
TravisLeeeeee (@travisleeeeee) published this skill. Their other Agent Skills are listed on their SkillMD profile.