axiom-ios-games
iOS Games Router
You MUST use this skill for ANY game development, SpriteKit, SceneKit, RealityKit, or interactive simulation work.
When to Use
Use this router when:
- Building a new SpriteKit game or prototype (2D)
- Building a 3D game with SceneKit or RealityKit
- Implementing physics (collisions, contacts, forces, joints)
- Setting up game architecture (scenes, layers, cameras, ECS)
- Debugging SpriteKit, SceneKit, or RealityKit issues
- Optimizing game performance (draw calls, node counts, entity counts, batching)
- Managing game loop, delta time, or pause handling
- Implementing touch/input handling in a game context
- Integrating SpriteKit or RealityKit with SwiftUI
- Working with particle effects, texture atlases, or 3D models
- Looking up SpriteKit, SceneKit, or RealityKit API details
- Migrating from SceneKit to RealityKit
- Building AR games with RealityKit
Routing Logic
SpriteKit (2D)
Architecture, patterns, and best practices → /skill axiom-spritekit
- Scene graph model, coordinate systems, anchor points
- Physics engine: bitmask discipline, contact detection, body types
- Actions system: sequencing, grouping, named actions, timing
- Input handling: touches, coordinate conversion
- Performance: draw calls, batching, object pooling, SKShapeNode trap
- Game loop: frame cycle, delta time, pause handling
- Scene transitions and data passing
- SwiftUI integration (SpriteView, UIViewRepresentable)
- Metal integration (SKRenderer)
- Anti-patterns and code review checklist
- Pressure scenarios with push-back templates
API reference and lookup → /skill axiom-spritekit-ref
- All 16 node types with properties and performance notes
- SKPhysicsBody creation methods and properties
- Complete SKAction catalog (movement, rotation, scaling, fading, composition, physics)
- Texture and atlas management
- SKConstraint types and SKRange
- SKView configuration and scale modes
- SKEmitterNode properties and presets
- SKRenderer setup and SKShader syntax
Troubleshooting and diagnostics → /skill axiom-spritekit-diag
- Physics contacts not firing (6-branch decision tree)
- Objects tunneling through walls (5-branch)
- Poor frame rate (4 top branches, 12 leaves)
- Touches not registering (6-branch)
- Memory spikes and crashes (5-branch)
- Coordinate confusion (5-branch)
- Scene transition crashes (5-branch)
Automated scanning → Launch spritekit-auditor agent or /axiom:audit spritekit (physics bitmasks, draw call waste, node accumulation, action memory leaks, coordinate confusion, touch handling, missing object pooling, missing debug overlays)
SceneKit (3D — Deprecated)
SceneKit is soft-deprecated as of iOS 26. Use for maintenance of existing code only. New 3D projects should use RealityKit.
Maintenance and migration planning → /skill axiom-scenekit
- Scene graph architecture, coordinate system, transforms
- Rendering: SCNView, SceneView (deprecated), SCNViewRepresentable
- Geometry, PBR materials, shader modifiers
- Lighting, animation (SCNAction, SCNTransaction, CAAnimation bridge)
- Physics: bodies, collision categories, contact delegate
- Asset pipeline: Model I/O, USD/DAE/SCN formats
- ARKit integration (legacy ARSCNView)
- Migration decision tree (when to migrate vs maintain)
- Anti-patterns and pressure scenarios
API reference and migration mapping → /skill axiom-scenekit-ref
- Complete SceneKit → RealityKit concept mapping table
- Scene graph API: SCNScene, SCNNode, SCNGeometry
- Materials: lighting models, PBR properties, shader modifiers
- Lighting: all light types with properties
- Camera: SCNCamera properties
- Physics: body types, shapes, joints
- Animation: SCNAction catalog, timing functions
- Constraints: all constraint types
RealityKit (3D — Modern)
For non-game 3D content display (product viewers, AR try-on, spatial computing), the ios-graphics router also routes to these RealityKit skills.
Architecture, ECS, and best practices → /skill axiom-realitykit
- Entity-Component-System mental model and paradigm shift
- Entity hierarchy, transforms, world-space queries
- Built-in and custom components, component lifecycle
- System protocol, update ordering, event handling
- SwiftUI integration: RealityView, Model3D, attachments
- AR on iOS: AnchorEntity types, SpatialTrackingSession
- Interaction: ManipulationComponent, gestures, hit testing
- Materials: SimpleMaterial, PBR, Unlit, Occlusion, ShaderGraph, Custom
- Physics: collision shapes, groups/filters, events, forces
- Animation: transform, USD playback, playback control
- Audio: spatial, ambient, channel
- Performance: instancing, component churn, shape optimization
- Multiplayer: synchronization, ownership
- Anti-patterns and code review checklist
- Pressure scenarios
API reference and lookup → /skill axiom-realitykit-ref
- Entity API: properties, hierarchy, subclasses
- Complete component catalog with all properties
- MeshResource generators
- ShapeResource types and performance
- System protocol and EntityQuery
- Scene events catalog
- RealityView API: initializers, content, gestures
- Model3D API
- Material system: all types with full property listings
- Animation timing functions and playback control
- Audio components and playback
- RealityRenderer (Metal integration)
Troubleshooting and diagnostics → /skill axiom-realitykit-diag
- Entity not visible (8-branch decision tree)
- Anchor not tracking (6-branch)
- Gesture not responding (6-branch)
- Performance problems (7-branch)
- Material looks wrong (6-branch)
- Physics not working (6-branch)
- Multiplayer sync issues (5-branch)
Decision Tree
- Building/designing a 2D SpriteKit game? → axiom-spritekit
- How to use a specific SpriteKit API? → axiom-spritekit-ref
- SpriteKit broken or performing badly? → axiom-spritekit-diag
- Maintaining existing SceneKit code? → axiom-scenekit
- SceneKit API reference or migration mapping? → axiom-scenekit-ref
- Building new 3D game or experience? → axiom-realitykit
- How to use a specific RealityKit API? → axiom-realitykit-ref
- RealityKit entity not visible, gestures broken, performance? → axiom-realitykit-diag
- Migrating SceneKit to RealityKit? → axiom-scenekit (migration tree) + axiom-scenekit-ref (mapping table)
- Building AR game? → axiom-realitykit
- Physics contacts not working (SpriteKit)? → axiom-spritekit-diag (Symptom 1)
- Frame rate dropping (SpriteKit)? → axiom-spritekit-diag (Symptom 3)
- Coordinate/position confusion (SpriteKit)? → axiom-spritekit-diag (Symptom 6)
- Need the complete action list? → axiom-spritekit-ref (Part 3)
- Physics body setup reference? → axiom-spritekit-ref (Part 2)
- Entity not visible (RealityKit)? → axiom-realitykit-diag (Symptom 1)
- Gesture not responding (RealityKit)? → axiom-realitykit-diag (Symptom 3)
- Want automated SpriteKit code scan? → spritekit-auditor (Agent)
Anti-Rationalization
| Thought | Reality |
|---|---|
| "SpriteKit is simple, I don't need a skill" | Physics bitmasks default to 0xFFFFFFFF and cause phantom collisions. The bitmask checklist catches this in 2 min. |
| "I'll just use SKShapeNode, it's quick" | Each SKShapeNode is a separate draw call. 50 of them = 50 draw calls. axiom-spritekit has the pre-render-to-texture pattern. |
| "I can figure out the coordinate system" | SpriteKit uses bottom-left origin (opposite of UIKit). Anchor points add another layer. axiom-spritekit-diag Symptom 6 resolves in 5 min. |
| "Physics is straightforward" | Three different bitmask properties, modification rules inside callbacks, and tunneling edge cases. axiom-spritekit Section 3 covers all gotchas. |
| "The performance is fine on my device" | Performance varies dramatically across devices. axiom-spritekit Section 6 has the debug overlay checklist. |
| "SceneKit is fine for our new project" | SceneKit is soft-deprecated iOS 26. No new features, only security patches. axiom-scenekit has the migration decision tree. |
| "I'll learn RealityKit later" | Every line of SceneKit is migration debt. axiom-scenekit-ref has the concept mapping table so the transition is concrete, not abstract. |
| "ECS is overkill for a simple 3D app" | You're already using ECS — Entity + ModelComponent. axiom-realitykit shows how to scale from simple to complex. |
| "I don't need collision shapes for taps" | RealityKit gestures require CollisionComponent. axiom-realitykit-diag diagnoses this in 2 min vs 30 min guessing. |
| "I'll just use a Timer for game updates" | Timer-based updates miss frames and aren't synchronized with rendering. axiom-realitykit has the System pattern. |
Critical Patterns
axiom-spritekit:
- PhysicsCategory struct with explicit bitmasks (default
0xFFFFFFFFcauses phantom collisions) - Camera node pattern for viewport + HUD separation
- SKShapeNode pre-render-to-texture conversion
[weak self]in allSKAction.runclosures- Delta time with spiral-of-death clamping
axiom-spritekit-ref:
- Complete node type table (16 types with batching behavior)
- Physics body creation methods (circle cheapest, texture most expensive)
- Full action catalog with composition patterns
- SKView debug overlays and scale mode matrix
axiom-spritekit-diag:
- 5-step bitmask checklist (2 min vs 30-120 min guessing)
- Debug overlays as mandatory first diagnostic step
- Tunneling prevention flowchart
- Memory growth diagnosis via
showsNodeCounttrending
axiom-scenekit:
- Migration decision tree (new project → RealityKit, existing → maintain or migrate)
- USDZ asset conversion before migration (
xcrun scntool) - SceneView deprecation and SCNViewRepresentable replacement
- Pressure scenarios for "just use SceneKit" rationalization
axiom-scenekit-ref:
- Complete SceneKit → RealityKit concept mapping table
- All material lighting models and properties
- Full constraint catalog
axiom-realitykit:
- ECS mental shift table (scene graph thinking → ECS thinking)
- Custom component registration (
registerComponent()) - Read-modify-write pattern for component updates
- CollisionComponent required for all interaction
- System-based updates instead of timers
axiom-realitykit-ref:
- Complete component catalog with all properties
- MeshResource generators and ShapeResource types
- Scene events catalog
- Material system with all PBR properties
axiom-realitykit-diag:
- Entity visibility checklist (8 branches, 2-5 min vs 30-60 min)
- Gesture debugging (CollisionComponent first check)
- Performance diagnosis (entity count, resource sharing, component churn)
- Physics constraint: entities must share an anchor
Example Invocations
User: "I'm building a SpriteKit game"
→ Invoke: /skill axiom-spritekit
User: "My physics contacts aren't firing"
→ Invoke: /skill axiom-spritekit-diag
User: "How do I create a physics body from a texture?"
→ Invoke: /skill axiom-spritekit-ref
User: "Frame rate is dropping in my game"
→ Invoke: /skill axiom-spritekit-diag
User: "How do I set up SpriteKit with SwiftUI?"
→ Invoke: /skill axiom-spritekit
User: "What action types are available?"
→ Invoke: /skill axiom-spritekit-ref
User: "Objects pass through walls"
→ Invoke: /skill axiom-spritekit-diag
User: "I need to build a 3D game"
→ Invoke: /skill axiom-realitykit
User: "How do I add a 3D model to my SwiftUI app?"
→ Invoke: /skill axiom-realitykit
User: "My RealityKit entity isn't showing up"
→ Invoke: /skill axiom-realitykit-diag
User: "How do I set up physics in RealityKit?"
→ Invoke: /skill axiom-realitykit-ref
User: "I'm migrating from SceneKit to RealityKit"
→ Invoke: /skill axiom-scenekit + /skill axiom-scenekit-ref
User: "What's the RealityKit equivalent of SCNNode?"
→ Invoke: /skill axiom-scenekit-ref
User: "Should I use SceneKit for my new 3D project?"
→ Invoke: /skill axiom-scenekit
User: "Tap gestures don't work on my RealityKit entity"
→ Invoke: /skill axiom-realitykit-diag
User: "How do I set up ECS in RealityKit?"
→ Invoke: /skill axiom-realitykit
User: "My AR content isn't tracking"
→ Invoke: /skill axiom-realitykit-diag
User: "What materials are available in RealityKit?"
→ Invoke: /skill axiom-realitykit-ref
User: "How do I animate entities in RealityKit?"
→ Invoke: /skill axiom-realitykit-ref
User: "Memory keeps growing during gameplay"
→ Invoke: /skill axiom-spritekit-diag
User: "What particle emitter settings should I use for fire?"
→ Invoke: /skill axiom-spritekit-ref
User: "Can you scan my SpriteKit code for common issues?"
→ Invoke: spritekit-auditor agent