@funpixel/tools 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bench/handlers/bake_emissive.py +2 -2
- package/bench/handlers/decimate.py +2 -2
- package/bench/handlers/fracture.py +1 -1
- package/bench/handlers/normalize_transform.py +3 -3
- package/bench/handlers/render_views.py +2 -2
- package/bench/handlers/views.py +6 -6
- package/dist/cli.js +8 -9
- package/dist/commands/feedback.js +5 -5
- package/dist/commands/init.js +1 -1
- package/dist/direct/read.js +1 -1
- package/dist/doctor/unity-checks.js +5 -5
- package/dist/doctor/unity-history.js +17 -33
- package/dist/feedback/ab.js +0 -40
- package/dist/gen/unity.js +3 -3
- package/dist/mcp/server.js +2 -1
- package/dist/pipeline/pipeline.js +6 -6
- package/dist/playtest/moments.js +1 -1
- package/dist/playtest/report.js +1 -1
- package/dist/production/mirror.js +2 -2
- package/dist/sim/curve.js +3 -3
- package/dist/spec/scaffold.js +1 -1
- package/dist/studio/pitch.js +1 -1
- package/dist/unity/probe/install.js +1 -1
- package/dist/vendor/verify/src/page/actors.js +2 -2
- package/dist/vendor/verify/src/page/capture_view.js +2 -2
- package/dist/vendor/verify/src/page/dressing.js +1 -1
- package/dist/vendor/verify/src/page/frame_honesty.js +1 -1
- package/dist/vendor/verify/src/page/front_door.js +2 -2
- package/dist/vendor/verify/src/page/grounding.js +3 -3
- package/dist/vendor/verify/src/page/hud.js +3 -3
- package/dist/vendor/verify/src/page/layout.js +5 -5
- package/dist/vendor/verify/src/page/life_anim.js +6 -6
- package/dist/vendor/verify/src/page/mechanic_check.js +1 -1
- package/dist/vendor/verify/src/page/phone_check.js +2 -2
- package/dist/vendor/verify/src/page/recorder.js +2 -2
- package/dist/vendor/verify/src/page/surfaces.js +2 -2
- package/dist/vendor/verify/src/page/world_actors.js +3 -3
- package/package.json +2 -2
- package/plugins/README.md +16 -0
- package/plugins/claude/README.md +2 -3
- package/plugins/claude/agents/art-director.md +2 -2
- package/plugins/claude/commands/playtest.md +2 -2
- package/plugins/claude/hooks/brief.md +1 -1
- package/plugins/claude/hooks/guidance.json +1 -1
- package/plugins/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/claude/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/claude/skills/3d/references/bake-off.md +3 -3
- package/plugins/claude/skills/3d/references/characters.md +1 -1
- package/plugins/claude/skills/3d/references/hero-route.md +5 -5
- package/plugins/claude/skills/3d/references/level-spec.md +1 -1
- package/plugins/claude/skills/3d/references/levels.md +3 -3
- package/plugins/claude/skills/3d/references/light-and-places.md +3 -3
- package/plugins/claude/skills/3d/references/painted-target.md +7 -7
- package/plugins/claude/skills/3d/references/three-loading.md +4 -4
- package/plugins/claude/skills/3d/references/unity.md +13 -13
- package/plugins/claude/skills/art/references/animation.md +1 -1
- package/plugins/claude/skills/art/references/cast.md +3 -3
- package/plugins/claude/skills/art/references/effects.md +2 -2
- package/plugins/claude/skills/art/references/frames.md +6 -6
- package/plugins/claude/skills/art/references/judging-frames.md +8 -8
- package/plugins/claude/skills/art/references/look.md +4 -4
- package/plugins/claude/skills/art/references/pipeline.md +2 -2
- package/plugins/claude/skills/art/references/prompts.md +4 -4
- package/plugins/claude/skills/art/references/ui.md +15 -15
- package/plugins/claude/skills/art/references/unity.md +14 -14
- package/plugins/claude/skills/audio/references/adaptive-music.md +4 -4
- package/plugins/claude/skills/audio/references/engine.md +2 -2
- package/plugins/claude/skills/audio/references/measure.md +1 -1
- package/plugins/claude/skills/audio/references/unity.md +20 -19
- package/plugins/claude/skills/game-feel/SKILL.md +4 -4
- package/plugins/claude/skills/game-feel/references/contact.md +6 -6
- package/plugins/claude/skills/game-feel/references/unity.md +18 -23
- package/plugins/claude/skills/game-logic/SKILL.md +3 -3
- package/plugins/claude/skills/game-logic/references/balance.md +2 -2
- package/plugins/claude/skills/game-logic/references/depth.md +2 -2
- package/plugins/claude/skills/game-logic/references/escalation.md +5 -5
- package/plugins/claude/skills/game-logic/references/probes.md +10 -10
- package/plugins/claude/skills/game-logic/references/unity.md +28 -28
- package/plugins/claude/skills/game-spine/SKILL.md +1 -1
- package/plugins/claude/skills/game-spine/references/performance.md +2 -2
- package/plugins/claude/skills/game-spine/references/replay.md +11 -11
- package/plugins/claude/skills/game-spine/references/room-api.md +1 -1
- package/plugins/claude/skills/game-spine/references/sdk.md +1 -1
- package/plugins/claude/skills/gdd/SKILL.md +2 -2
- package/plugins/claude/skills/gdd/references/as-built.md +2 -2
- package/plugins/claude/skills/gdd/references/design-measures.md +2 -2
- package/plugins/claude/skills/gdd/references/design-note.md +1 -1
- package/plugins/claude/skills/gdd/references/first-look.md +1 -1
- package/plugins/claude/skills/gdd/references/floors.md +2 -2
- package/plugins/claude/skills/gdd/references/gameplay-contract.md +1 -1
- package/plugins/claude/skills/gdd/references/genre-puzzle.md +4 -4
- package/plugins/claude/skills/gdd/references/genre-racing.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-rpg.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-shooter.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-survival.md +2 -2
- package/plugins/claude/skills/gdd/references/invent-first.md +3 -3
- package/plugins/claude/skills/gdd/references/level-and-fun.md +11 -11
- package/plugins/claude/skills/gdd/references/pages.md +2 -5
- package/plugins/claude/skills/gdd/references/plan-at-size.md +5 -5
- package/plugins/claude/skills/gdd/references/production-tiers.md +11 -11
- package/plugins/claude/skills/gdd/references/sections.md +7 -7
- package/plugins/claude/skills/gdd/references/spec-folder.md +3 -3
- package/plugins/claude/skills/gdd/references/the-path.md +3 -4
- package/plugins/claude/skills/gdd/references/world-and-identity.md +4 -4
- package/plugins/claude/skills/gdd/references/worth.md +4 -4
- package/plugins/claude/skills/mobile-ui/SKILL.md +3 -3
- package/plugins/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/claude/skills/mobile-ui/references/phone-check.md +1 -1
- package/plugins/claude/skills/mobile-ui/references/recipes.md +1 -1
- package/plugins/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/claude/skills/mobile-ui/references/unity.md +23 -23
- package/plugins/claude/skills/publishing/references/compose.md +1 -1
- package/plugins/claude/skills/publishing/references/server-build.md +1 -1
- package/plugins/claude/skills/store/SKILL.md +3 -3
- package/plugins/claude/skills/store/references/app-store.md +1 -1
- package/plugins/claude/skills/store/references/google-play.md +2 -2
- package/plugins/claude/skills/store/references/ios-release.md +19 -20
- package/plugins/claude/skills/store/references/money.md +2 -2
- package/plugins/claude/skills/store/references/purchases-and-review.md +18 -18
- package/plugins/claude/skills/store/references/readiness-page.md +1 -1
- package/plugins/claude/skills/store/references/readiness.md +3 -3
- package/plugins/claude/skills/store/references/unity-store.md +9 -12
- package/plugins/claude/skills/unity-game/SKILL.md +28 -35
- package/plugins/claude/skills/unity-game/references/agent-ops.md +9 -9
- package/plugins/claude/skills/unity-game/references/fixes.md +21 -21
- package/plugins/claude/skills/unity-game/references/from-a-web-game.md +17 -17
- package/plugins/claude/skills/unity-game/references/handing-off.md +4 -4
- package/plugins/claude/skills/unity-game/references/performance.md +10 -14
- package/plugins/claude/skills/unity-game/references/probe.md +4 -4
- package/plugins/claude/skills/unity-game/references/shared-mac.md +1 -1
- package/plugins/claude/skills/unity-game/references/traps.md +13 -14
- package/plugins/claude/skills/verifying/references/bar.md +1 -1
- package/plugins/claude/skills/verifying/references/fidelity.md +11 -11
- package/plugins/claude/skills/verifying/references/mobile-qa.md +10 -10
- package/plugins/claude/skills/verifying/references/playtest.md +14 -14
- package/plugins/claude/skills/verifying/references/unity.md +11 -11
- package/plugins/claude/skills/world-and-story/SKILL.md +1 -1
- package/plugins/claude/skills/world-and-story/references/atmosphere.md +4 -4
- package/plugins/claude/skills/world-and-story/references/living-world.md +2 -2
- package/plugins/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/claude/skills/world-and-story/references/story-at-size.md +2 -2
- package/plugins/claude/skills/world-and-story/references/voice.md +1 -1
- package/plugins/codex/AGENTS.md +1 -1
- package/plugins/codex/README.md +1 -1
- package/plugins/codex/hooks/brief.md +1 -1
- package/plugins/codex/hooks/guidance.json +1 -1
- package/plugins/codex/hooks/host.md +1 -1
- package/plugins/codex/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/codex/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/codex/skills/fp-art-director/SKILL.md +2 -2
- package/plugins/codex/skills/fp-art-director/references/codex.md +1 -1
- package/plugins/codex/skills/fp-audio-director/references/codex.md +1 -1
- package/plugins/codex/skills/fp-critic/references/codex.md +1 -1
- package/plugins/codex/skills/fp-lane/references/codex.md +1 -1
- package/plugins/codex/skills/fp-level-designer/references/codex.md +1 -1
- package/plugins/codex/skills/fp-mobile-qa-seat/references/codex.md +1 -1
- package/plugins/codex/skills/fp-player/references/codex.md +1 -1
- package/plugins/codex/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/codex/skills/fp-qa-lead/references/codex.md +1 -1
- package/plugins/codex/skills/fp-studio/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/codex/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/codex/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/codex/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/codex/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/codex/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/codex/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/codex/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/codex/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/codex/skills/funpixel-art/references/look.md +4 -4
- package/plugins/codex/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/codex/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/codex/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/codex/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/codex/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/codex/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/codex/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/codex/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/codex/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/codex/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/codex/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/codex/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/codex/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/codex/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/codex/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/codex/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/codex/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/codex/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/codex/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/codex/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/codex/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/codex/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/codex/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/codex/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/codex/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/codex/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/codex/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/codex/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/codex/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/codex/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/codex/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/codex/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/codex/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/codex/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/codex/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/codex/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/codex/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/codex/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/codex/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/codex/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/codex/skills/funpixel-store/references/money.md +2 -2
- package/plugins/codex/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/codex/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/codex/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/codex/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/codex/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/codex/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/codex/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/codex/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/codex/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/codex/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/codex/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/codex/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/codex/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/codex/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/codex/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/codex/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/codex/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/codex/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/codex/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/codex/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/codex/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/codex/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/codex/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/cursor/README.md +1 -1
- package/plugins/cursor/agents/art-director.md +2 -2
- package/plugins/cursor/commands/playtest.md +2 -2
- package/plugins/cursor/hooks/brief.md +1 -1
- package/plugins/cursor/hooks/guidance.json +1 -1
- package/plugins/cursor/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/cursor/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/cursor/rules/funpixel-brief.mdc +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/cursor/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/cursor/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/cursor/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/cursor/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/cursor/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/cursor/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/cursor/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/cursor/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/cursor/skills/funpixel-art/references/look.md +4 -4
- package/plugins/cursor/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/cursor/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/cursor/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/cursor/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/cursor/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/cursor/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/cursor/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/cursor/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/cursor/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/cursor/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/cursor/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/cursor/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/cursor/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/cursor/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/cursor/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/cursor/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/cursor/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/cursor/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/cursor/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/cursor/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/cursor/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/cursor/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/cursor/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/cursor/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/cursor/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/cursor/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/cursor/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/cursor/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/cursor/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/cursor/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/cursor/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/cursor/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/cursor/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/cursor/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/cursor/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/cursor/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/cursor/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/cursor/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/cursor/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/cursor/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/cursor/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/cursor/skills/funpixel-store/references/money.md +2 -2
- package/plugins/cursor/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/cursor/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/cursor/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/cursor/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/cursor/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/cursor/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/cursor/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/cursor/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/cursor/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/cursor/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/cursor/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/cursor/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/cursor/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/cursor/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/cursor/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/cursor/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/cursor/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/cursor/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/cursor/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/cursor/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/cursor/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/cursor/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/cursor/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/cursor/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/kiro/AGENTS.md +1 -1
- package/plugins/kiro/README.md +1 -1
- package/plugins/kiro/hooks/brief.md +1 -1
- package/plugins/kiro/hooks/guidance.json +1 -1
- package/plugins/kiro/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/kiro/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/kiro/skills/fp-art-director/SKILL.md +2 -2
- package/plugins/kiro/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/kiro/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/kiro/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/kiro/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/kiro/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/kiro/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/kiro/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/kiro/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/kiro/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/kiro/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/kiro/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/kiro/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/kiro/skills/funpixel-art/references/look.md +4 -4
- package/plugins/kiro/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/kiro/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/kiro/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/kiro/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/kiro/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/kiro/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/kiro/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/kiro/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/kiro/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/kiro/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/kiro/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/kiro/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/kiro/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/kiro/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/kiro/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/kiro/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/kiro/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/kiro/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/kiro/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/kiro/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/kiro/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/kiro/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/kiro/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/kiro/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/kiro/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/kiro/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/kiro/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/kiro/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/kiro/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/kiro/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/kiro/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/kiro/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/kiro/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/kiro/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/kiro/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/kiro/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/kiro/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/kiro/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/kiro/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/kiro/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/kiro/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/kiro/skills/funpixel-store/references/money.md +2 -2
- package/plugins/kiro/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/kiro/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/kiro/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/kiro/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/kiro/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/kiro/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/kiro/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/kiro/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/kiro/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/kiro/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/kiro/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/kiro/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/kiro/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/kiro/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/kiro/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/kiro/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/kiro/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/kiro/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/kiro/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/kiro/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/kiro/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/kiro/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/kiro/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/kiro/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/robin/README.md +1 -1
- package/plugins/robin/claude/README.md +2 -3
- package/plugins/robin/claude/agents/art-director.md +2 -2
- package/plugins/robin/claude/commands/playtest.md +2 -2
- package/plugins/robin/claude/hooks/brief.md +1 -1
- package/plugins/robin/claude/hooks/guidance.json +1 -1
- package/plugins/robin/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/robin/claude/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/robin/claude/skills/3d/references/bake-off.md +3 -3
- package/plugins/robin/claude/skills/3d/references/characters.md +1 -1
- package/plugins/robin/claude/skills/3d/references/hero-route.md +5 -5
- package/plugins/robin/claude/skills/3d/references/level-spec.md +1 -1
- package/plugins/robin/claude/skills/3d/references/levels.md +3 -3
- package/plugins/robin/claude/skills/3d/references/light-and-places.md +3 -3
- package/plugins/robin/claude/skills/3d/references/painted-target.md +7 -7
- package/plugins/robin/claude/skills/3d/references/three-loading.md +4 -4
- package/plugins/robin/claude/skills/3d/references/unity.md +13 -13
- package/plugins/robin/claude/skills/art/references/animation.md +1 -1
- package/plugins/robin/claude/skills/art/references/cast.md +3 -3
- package/plugins/robin/claude/skills/art/references/effects.md +2 -2
- package/plugins/robin/claude/skills/art/references/frames.md +6 -6
- package/plugins/robin/claude/skills/art/references/judging-frames.md +8 -8
- package/plugins/robin/claude/skills/art/references/look.md +4 -4
- package/plugins/robin/claude/skills/art/references/pipeline.md +2 -2
- package/plugins/robin/claude/skills/art/references/prompts.md +4 -4
- package/plugins/robin/claude/skills/art/references/ui.md +15 -15
- package/plugins/robin/claude/skills/art/references/unity.md +14 -14
- package/plugins/robin/claude/skills/audio/references/adaptive-music.md +4 -4
- package/plugins/robin/claude/skills/audio/references/engine.md +2 -2
- package/plugins/robin/claude/skills/audio/references/measure.md +1 -1
- package/plugins/robin/claude/skills/audio/references/unity.md +20 -19
- package/plugins/robin/claude/skills/game-feel/SKILL.md +4 -4
- package/plugins/robin/claude/skills/game-feel/references/contact.md +6 -6
- package/plugins/robin/claude/skills/game-feel/references/unity.md +18 -23
- package/plugins/robin/claude/skills/game-logic/SKILL.md +3 -3
- package/plugins/robin/claude/skills/game-logic/references/balance.md +2 -2
- package/plugins/robin/claude/skills/game-logic/references/depth.md +2 -2
- package/plugins/robin/claude/skills/game-logic/references/escalation.md +5 -5
- package/plugins/robin/claude/skills/game-logic/references/probes.md +10 -10
- package/plugins/robin/claude/skills/game-logic/references/unity.md +28 -28
- package/plugins/robin/claude/skills/game-spine/SKILL.md +1 -1
- package/plugins/robin/claude/skills/game-spine/references/performance.md +2 -2
- package/plugins/robin/claude/skills/game-spine/references/replay.md +11 -11
- package/plugins/robin/claude/skills/game-spine/references/room-api.md +1 -1
- package/plugins/robin/claude/skills/game-spine/references/sdk.md +1 -1
- package/plugins/robin/claude/skills/gdd/SKILL.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/as-built.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/design-measures.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/design-note.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/first-look.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/floors.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/gameplay-contract.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/genre-puzzle.md +4 -4
- package/plugins/robin/claude/skills/gdd/references/genre-racing.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-rpg.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-shooter.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-survival.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/invent-first.md +3 -3
- package/plugins/robin/claude/skills/gdd/references/level-and-fun.md +11 -11
- package/plugins/robin/claude/skills/gdd/references/pages.md +2 -5
- package/plugins/robin/claude/skills/gdd/references/plan-at-size.md +5 -5
- package/plugins/robin/claude/skills/gdd/references/production-tiers.md +11 -11
- package/plugins/robin/claude/skills/gdd/references/sections.md +7 -7
- package/plugins/robin/claude/skills/gdd/references/spec-folder.md +3 -3
- package/plugins/robin/claude/skills/gdd/references/the-path.md +3 -4
- package/plugins/robin/claude/skills/gdd/references/world-and-identity.md +4 -4
- package/plugins/robin/claude/skills/gdd/references/worth.md +4 -4
- package/plugins/robin/claude/skills/mobile-ui/SKILL.md +3 -3
- package/plugins/robin/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/robin/claude/skills/mobile-ui/references/phone-check.md +1 -1
- package/plugins/robin/claude/skills/mobile-ui/references/recipes.md +1 -1
- package/plugins/robin/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/robin/claude/skills/mobile-ui/references/unity.md +23 -23
- package/plugins/robin/claude/skills/publishing/references/compose.md +1 -1
- package/plugins/robin/claude/skills/publishing/references/server-build.md +1 -1
- package/plugins/robin/claude/skills/store/SKILL.md +3 -3
- package/plugins/robin/claude/skills/store/references/app-store.md +1 -1
- package/plugins/robin/claude/skills/store/references/google-play.md +2 -2
- package/plugins/robin/claude/skills/store/references/ios-release.md +19 -20
- package/plugins/robin/claude/skills/store/references/money.md +2 -2
- package/plugins/robin/claude/skills/store/references/purchases-and-review.md +18 -18
- package/plugins/robin/claude/skills/store/references/readiness-page.md +1 -1
- package/plugins/robin/claude/skills/store/references/readiness.md +3 -3
- package/plugins/robin/claude/skills/store/references/unity-store.md +9 -12
- package/plugins/robin/claude/skills/unity-game/SKILL.md +28 -35
- package/plugins/robin/claude/skills/unity-game/references/agent-ops.md +9 -9
- package/plugins/robin/claude/skills/unity-game/references/fixes.md +21 -21
- package/plugins/robin/claude/skills/unity-game/references/from-a-web-game.md +17 -17
- package/plugins/robin/claude/skills/unity-game/references/handing-off.md +4 -4
- package/plugins/robin/claude/skills/unity-game/references/performance.md +10 -14
- package/plugins/robin/claude/skills/unity-game/references/probe.md +4 -4
- package/plugins/robin/claude/skills/unity-game/references/shared-mac.md +1 -1
- package/plugins/robin/claude/skills/unity-game/references/traps.md +13 -14
- package/plugins/robin/claude/skills/verifying/references/bar.md +1 -1
- package/plugins/robin/claude/skills/verifying/references/fidelity.md +11 -11
- package/plugins/robin/claude/skills/verifying/references/mobile-qa.md +10 -10
- package/plugins/robin/claude/skills/verifying/references/playtest.md +14 -14
- package/plugins/robin/claude/skills/verifying/references/unity.md +11 -11
- package/plugins/robin/claude/skills/world-and-story/SKILL.md +1 -1
- package/plugins/robin/claude/skills/world-and-story/references/atmosphere.md +4 -4
- package/plugins/robin/claude/skills/world-and-story/references/living-world.md +2 -2
- package/plugins/robin/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/robin/claude/skills/world-and-story/references/story-at-size.md +2 -2
- package/plugins/robin/claude/skills/world-and-story/references/voice.md +1 -1
- package/plugins/robin/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/robin/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/robin/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/robin/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/robin/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/robin/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/robin/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/robin/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/robin/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/robin/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/robin/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/robin/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/robin/skills/funpixel-art/references/look.md +4 -4
- package/plugins/robin/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/robin/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/robin/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/robin/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/robin/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/robin/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/robin/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/robin/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/robin/skills/funpixel-brief/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/robin/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/robin/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/robin/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/robin/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/robin/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/robin/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/robin/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/robin/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/robin/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/robin/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/robin/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/robin/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/robin/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/robin/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/robin/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/robin/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/robin/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/robin/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/robin/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/robin/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/robin/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/robin/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/robin/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/robin/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/robin/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/robin/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/robin/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/robin/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/robin/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/robin/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/robin/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/robin/skills/funpixel-store/references/money.md +2 -2
- package/plugins/robin/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/robin/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/robin/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/robin/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/robin/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/robin/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/robin/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/robin/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/robin/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/robin/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/robin/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/robin/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/robin/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/robin/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/robin/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/robin/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/robin/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/robin/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/robin/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/robin/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/robin/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/robin/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/robin/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/bake-off.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/characters.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/hero-route.md +5 -5
- package/templates/common/.agents/skills/funpixel-3d/references/level-spec.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/levels.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/painted-target.md +7 -7
- package/templates/common/.agents/skills/funpixel-3d/references/three-loading.md +4 -4
- package/templates/common/.agents/skills/funpixel-3d/references/unity.md +13 -13
- package/templates/common/.agents/skills/funpixel-art/references/animation.md +1 -1
- package/templates/common/.agents/skills/funpixel-art/references/cast.md +3 -3
- package/templates/common/.agents/skills/funpixel-art/references/effects.md +2 -2
- package/templates/common/.agents/skills/funpixel-art/references/frames.md +6 -6
- package/templates/common/.agents/skills/funpixel-art/references/judging-frames.md +8 -8
- package/templates/common/.agents/skills/funpixel-art/references/look.md +4 -4
- package/templates/common/.agents/skills/funpixel-art/references/pipeline.md +2 -2
- package/templates/common/.agents/skills/funpixel-art/references/prompts.md +4 -4
- package/templates/common/.agents/skills/funpixel-art/references/ui.md +15 -15
- package/templates/common/.agents/skills/funpixel-art/references/unity.md +14 -14
- package/templates/common/.agents/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/templates/common/.agents/skills/funpixel-audio/references/engine.md +2 -2
- package/templates/common/.agents/skills/funpixel-audio/references/measure.md +1 -1
- package/templates/common/.agents/skills/funpixel-audio/references/unity.md +20 -19
- package/templates/common/.agents/skills/funpixel-game-feel/SKILL.md +4 -4
- package/templates/common/.agents/skills/funpixel-game-feel/references/contact.md +6 -6
- package/templates/common/.agents/skills/funpixel-game-feel/references/unity.md +18 -23
- package/templates/common/.agents/skills/funpixel-game-logic/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-game-logic/references/balance.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-logic/references/depth.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/templates/common/.agents/skills/funpixel-game-logic/references/probes.md +10 -10
- package/templates/common/.agents/skills/funpixel-game-logic/references/unity.md +28 -28
- package/templates/common/.agents/skills/funpixel-game-spine/SKILL.md +1 -1
- package/templates/common/.agents/skills/funpixel-game-spine/references/performance.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-spine/references/replay.md +11 -11
- package/templates/common/.agents/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/templates/common/.agents/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/SKILL.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/as-built.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/design-note.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/first-look.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/floors.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/templates/common/.agents/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/templates/common/.agents/skills/funpixel-gdd/references/pages.md +2 -5
- package/templates/common/.agents/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/templates/common/.agents/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/templates/common/.agents/skills/funpixel-gdd/references/sections.md +7 -7
- package/templates/common/.agents/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/templates/common/.agents/skills/funpixel-gdd/references/the-path.md +3 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/worth.md +4 -4
- package/templates/common/.agents/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/templates/common/.agents/skills/funpixel-publish/references/compose.md +1 -1
- package/templates/common/.agents/skills/funpixel-publish/references/server-build.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-store/references/app-store.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/references/google-play.md +2 -2
- package/templates/common/.agents/skills/funpixel-store/references/ios-release.md +19 -20
- package/templates/common/.agents/skills/funpixel-store/references/money.md +2 -2
- package/templates/common/.agents/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/templates/common/.agents/skills/funpixel-store/references/readiness-page.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/references/readiness.md +3 -3
- package/templates/common/.agents/skills/funpixel-store/references/unity-store.md +9 -12
- package/templates/common/.agents/skills/funpixel-unity-game/SKILL.md +28 -35
- package/templates/common/.agents/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/templates/common/.agents/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/templates/common/.agents/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/templates/common/.agents/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/templates/common/.agents/skills/funpixel-unity-game/references/performance.md +10 -14
- package/templates/common/.agents/skills/funpixel-unity-game/references/probe.md +4 -4
- package/templates/common/.agents/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/templates/common/.agents/skills/funpixel-unity-game/references/traps.md +13 -14
- package/templates/common/.agents/skills/funpixel-verify/references/bar.md +1 -1
- package/templates/common/.agents/skills/funpixel-verify/references/fidelity.md +11 -11
- package/templates/common/.agents/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/templates/common/.agents/skills/funpixel-verify/references/playtest.md +14 -14
- package/templates/common/.agents/skills/funpixel-verify/references/unity.md +11 -11
- package/templates/common/.agents/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/templates/common/.agents/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/templates/common/.agents/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/templates/common/.agents/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/templates/common/.agents/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/templates/common/.agents/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/templates/common/AGENTS.md +1 -1
- package/templates/common/src/platform.ts +1 -1
- package/templates/common/src/probe-human.ts +3 -3
- package/templates/common/src/save.ts +1 -1
- package/templates/common/test/platform.test.ts +1 -1
- package/templates/three-world/src/budget.ts +1 -1
- package/templates/three-world/src/cutouts.ts +2 -2
- package/templates/three-world/src/game.ts +1 -1
- package/templates/three-world/src/models.ts +1 -1
- package/unity/com.funpixel.probe/Runtime/Player/Args.cs +1 -1
- package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/Capture.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/Inject.cs +1 -2
- package/unity/com.funpixel.probe/Runtime/Player/Probe.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs +1 -1
- package/plugins/claude/skills/unity-game/references/studio-packages.md +0 -127
- package/plugins/codex/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/cursor/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/kiro/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/robin/claude/skills/unity-game/references/studio-packages.md +0 -127
- package/plugins/robin/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/templates/common/.agents/skills/funpixel-unity-game/references/studio-packages.md +0 -127
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
# iOS release for a Unity game
|
|
2
2
|
|
|
3
|
-
A Unity iOS build can upload "successfully" and still be broken, because most release failures are silent. Across nine games, four reached TestFlight with no sound, Firebase never started in release builds (3 broken uploads), one upload drew ITMS-90208 by email afterwards, and
|
|
3
|
+
A Unity iOS build can upload "successfully" and still be broken, because most release failures are silent. Across nine games, four reached TestFlight with no sound, Firebase never started in release builds (3 broken uploads), one upload drew ITMS-90208 by email afterwards, and one game was pulled from review twice. This skill orders the checks so each failure shows on the Mac first.
|
|
4
4
|
|
|
5
5
|
## Tools
|
|
6
6
|
|
|
7
|
-
- The
|
|
8
|
-
`funtools unity run -- -nographics -buildTarget iOS -executeMethod
|
|
7
|
+
- The game's own build method,
|
|
8
|
+
`funtools unity run -- -nographics -buildTarget iOS -executeMethod Setup.BuildTestFlight`: it
|
|
9
9
|
applies the size settings, signing and a unique build number, and refuses to build without
|
|
10
|
-
`Assets/_Game/Art/Icon/app_icon.png`;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
(Knockout Lap's `Build.IosDevice`).
|
|
10
|
+
`Assets/_Game/Art/Icon/app_icon.png`; a device and a Simulator build beside it. A post-process
|
|
11
|
+
step stamps every framework's minimum OS and the encryption key, and the linker is handed what
|
|
12
|
+
High stripping would remove.
|
|
14
13
|
- Xcode: `xcodebuild archive` (automatic signing), then `xcodebuild -exportArchive` (manual signing;
|
|
15
14
|
`destination: upload` uploads it): 15–25 minutes.
|
|
16
15
|
- App Store Connect (ASC), on the web or its API: bundle ids, profiles, processing, listings.
|
|
@@ -35,30 +34,30 @@ No script changes the signing identity, team, bundle id or `ITSAppUsesNonExemptE
|
|
|
35
34
|
|
|
36
35
|
## Procedure
|
|
37
36
|
|
|
38
|
-
1. Build only when HEAD equals origin/main and the tree is clean. TestFlight builds came from an unmerged branch (
|
|
39
|
-
2. Keep the Simulator's churn out of commits. Simulator builds rewrite `iPhoneSdkVersion` to 988 and dirty AudioManager, TMP font assets and URP global settings; `git commit -a` swept them in on
|
|
40
|
-
3. Confirm the build settings: IL2CPP, managed stripping High, strip engine code, code generation OptimizeSize, iOS 16.0, iPhone only (
|
|
41
|
-
4. Preserve what High stripping removes. Anything reached only at runtime (collider types for `CreatePrimitive`, the game's own assemblies) needs the game's `link.xml`; Unity ignores a package's own, so
|
|
37
|
+
1. Build only when HEAD equals origin/main and the tree is clean. TestFlight builds came from an unmerged branch (one game's icon was missing on main), and two review builds from uncommitted reimports (190 `.wav.meta` files, 4 TMP font assets), so main was not what Apple reviewed. Until `build_from_main` exists, compare by hand.
|
|
38
|
+
2. Keep the Simulator's churn out of commits. Simulator builds rewrite `iPhoneSdkVersion` to 988 and dirty AudioManager, TMP font assets and URP global settings; `git commit -a` swept them in on one game.
|
|
39
|
+
3. Confirm the build settings: IL2CPP, managed stripping High, strip engine code, code generation OptimizeSize, iOS 16.0, iPhone only (the build method sets them), LZ4HC. Signing: the build method sets the team and automatic signing; archive with `-allowProvisioningUpdates` and the ASC key, export manually with the Apple Distribution certificate and the bundle's App Store profile (`asc_profiles.py`). Never cloud-managed signing: it needs an Admin API key.
|
|
40
|
+
4. Preserve what High stripping removes. Anything reached only at runtime (collider types for `CreatePrimitive`, the game's own assemblies) needs the game's `link.xml`; Unity ignores a package's own, so an Editor step hands that file to the linker. Pass for `il2cpp_preserve`: every assembly with `RuntimeInitializeOnLoadMethod` is present in il2cppOutput. Pass for `tmp_variants`: TMP `OUTLINE_ON` and `UNDERLAY_ON` kept, no `shader_feature` in runtime materials.
|
|
42
41
|
5. Empty `Resources/` of test files (`resources_hygiene`: 0 bytes). The Unity test runner drops `PerformanceTestRun*.json` into `Assets/Resources`, which ships.
|
|
43
42
|
6. Close any Editor on the project, run `funtools doctor`, then build, export and archive. Read the whole output: `| tail` hid a failing compile check.
|
|
44
43
|
7. Read the export log before archiving (`export_log`: 0 errors, Burst timeouts included). Burst can time out under heavy host load; that export does not ship.
|
|
45
|
-
8. Pre-flight the archive (`ios_preflight`): framework plist minimum OS equals the binary's, app icon present, audio on. Before the first TestFlight of a release, a fresh read-only agent does a publisher and story-consistency review: 6 blockers in
|
|
44
|
+
8. Pre-flight the archive (`ios_preflight`): framework plist minimum OS equals the binary's, app icon present, audio on. Before the first TestFlight of a release, a fresh read-only agent does a publisher and story-consistency review: 6 blockers in one game, 30 issues in another.
|
|
46
45
|
9. Check what the archive holds (`archive_contents`): a known string per level in `.app/Data`, the plist, a new CFBundleVersion. One archive on disk held Letter 1 only.
|
|
47
|
-
10. Measure the unpacked `.app` from the archive (`size_budget`), not Unity's "Complete build size". Proposed budget: 2D ≤ 80 MB, 3D ≤ 100 MB, engine ≤ 45 MB, unexplained change ≤ 2 MiB per build;
|
|
46
|
+
10. Measure the unpacked `.app` from the archive (`size_budget`), not Unity's "Complete build size". Proposed budget: 2D ≤ 80 MB, 3D ≤ 100 MB, engine ≤ 45 MB, unexplained change ≤ 2 MiB per build; one 2D game is over it at 133 MB. `texture_audit` passes at 0 unwhitelisted RGBA32 or non-power-of-two mipmapped textures and RGBA32 under 1 MB in total.
|
|
48
47
|
11. Upload with approval, then watch processing in App Store Connect. An upload that reports success can still fail by email (ITMS-90208).
|
|
49
48
|
12. Submit in two hands. The API builds the draft; a person ticks the first IAP on the version page and presses Submit. The Game Center drafts the API leaves: not in the report.
|
|
50
49
|
13. After a metadata-only rejection, new screenshots uploaded through the API do not clear it: a person edits and saves the version, then resubmits.
|
|
51
|
-
14. A server-side minimum version compares the build number, not `CFBundleShortVersionString`: that is 1.0.0 on every TestFlight build, so
|
|
50
|
+
14. A server-side minimum version compares the build number, not `CFBundleShortVersionString`: that is 1.0.0 on every TestFlight build, so one game's kill switch could not tell them apart.
|
|
52
51
|
|
|
53
52
|
## Worked example
|
|
54
53
|
|
|
55
|
-
|
|
54
|
+
A puzzle game's first upload, 25 Sep. The upload succeeded, then Apple emailed ITMS-90208: Unity 6000.6's `UnityRuntime.framework` says iOS 15.0 in its plist and 16.0 in its binary. The fix went into the shared package (a post-build step stamps every framework) and the upload script's pre-flight. Another game's TestFlight build then carried Unity's default icon and its next upload was refused, so the build method now refuses without `app_icon.png`. The same pre-flight later refused `m_DisableAudio: 1`, a setting a third game inherited from a cloned project.
|
|
56
55
|
|
|
57
56
|
## Common mistakes
|
|
58
57
|
|
|
59
|
-
- No AudioListener on a code-made camera: four games reached TestFlight silent, and Simulator captures hide it (`funtools doctor` warns
|
|
58
|
+
- No AudioListener on a code-made camera: four games reached TestFlight silent, and Simulator captures hide it (`funtools doctor` warns).
|
|
60
59
|
- Firebase reached only through `RuntimeInitializeOnLoadMethod` was stripped from release in every game: 3 broken uploads.
|
|
61
|
-
- Submitting through the API alone: it dropped
|
|
62
|
-
- Trusting "Complete build size":
|
|
63
|
-
- Stripped TMP variants: outlined numbers drew as cream blobs in
|
|
64
|
-
- Firebase C++ 13.17 has no arm64 Simulator slice, so every Firebase game failed to link for the Simulator; each game links null stubs (304 in
|
|
60
|
+
- Submitting through the API alone: it dropped one game's first IAP and left Game Center drafts, and the game was pulled from review twice.
|
|
61
|
+
- Trusting "Complete build size": One game's "1.08 GB" was the Xcode project; the archive was 123 MB.
|
|
62
|
+
- Stripped TMP variants: outlined numbers drew as cream blobs in one game's player build.
|
|
63
|
+
- Firebase C++ 13.17 has no arm64 Simulator slice, so every Firebase game failed to link for the Simulator; each game links null stubs (304 in one game), detected by `SIMULATOR_UDID`, because a Simulator reports a real device model.
|
|
@@ -4,7 +4,7 @@ A decision guide, not a market report: which way a game makes money, what the ev
|
|
|
4
4
|
fits a platform and a feel. The model and every price are the owner's decision (step 0 of the work); this page
|
|
5
5
|
gives them the numbers to decide with, and the GDD records the choice in its Scope (skill `funpixel-gdd`).
|
|
6
6
|
|
|
7
|
-
Numbers as of Oct 2026, from
|
|
7
|
+
Numbers as of Oct 2026, from one racer's study (design/research/monetisation.md in that game's repository,
|
|
8
8
|
researched 9 Oct 2026). Each figure keeps its source and date; **(snippet)** means it was seen only in a
|
|
9
9
|
search-result summary, not on the page itself. Revenue from AppMagic, Sensor Tower and Steam trackers is a
|
|
10
10
|
third-party estimate, not a company report. Read a source again before a price or a forecast is final.
|
|
@@ -55,7 +55,7 @@ shocks and things taken away, and too little free game.
|
|
|
55
55
|
|
|
56
56
|
## Worked example: a racer that sells no power
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
A racer (Unity, iOS and Android first; modules unlock by play, never bought) chose, on 9 Oct 2026:
|
|
59
59
|
- **Mobile launch:** free with rewarded ads first; interstitials capped, never on a retry and removed by any
|
|
60
60
|
purchase; remove-ads at $2.99–3.99 bundled with a starter trail so the buyer sees something; cosmetics at
|
|
61
61
|
$0.99–2.99.
|
|
@@ -6,11 +6,11 @@ sell by in the first place: [readiness](readiness.md), `references/money.md`.
|
|
|
6
6
|
|
|
7
7
|
## If review rejects anyway
|
|
8
8
|
|
|
9
|
-
| Guideline |
|
|
10
|
-
|
|
11
|
-
| 2.1(b) |
|
|
12
|
-
| 2.3.3 |
|
|
13
|
-
| 2.3.7 |
|
|
9
|
+
| Guideline | Cause | Fix |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| 2.1(b) | Purchase behind gameplay; reviewer on iPad could not find it | Step 2 |
|
|
12
|
+
| 2.3.3 | Screenshots hid the real HUD and controls | Step 9 |
|
|
13
|
+
| 2.3.7 | "free" in the subtitle | Step 11 |
|
|
14
14
|
|
|
15
15
|
After a metadata-only rejection, new screenshots uploaded through the API do not clear it; a person
|
|
16
16
|
edits and saves the version, then resubmits. Messages to App Review stay short.
|
|
@@ -19,20 +19,20 @@ edits and saves the version, then resubmits. Messages to App Review stay short.
|
|
|
19
19
|
|
|
20
20
|
| Kind | Sells | Examples |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| Casual | Coins, hints, boosters |
|
|
23
|
-
| Premium | Free first chapter and one non-consumable, Family Sharing on |
|
|
22
|
+
| Casual | Coins, hints, boosters | four games |
|
|
23
|
+
| Premium | Free first chapter and one non-consumable, Family Sharing on | three games, at $2.99 and $4.99 |
|
|
24
24
|
|
|
25
|
-
Unity IAP 5.4.3 (StoreKit 2) through
|
|
25
|
+
Unity IAP 5.4.3 (StoreKit 2) through one shared purchase service, one-off products only, no server
|
|
26
26
|
receipt validation, no ads in premium games. Restore runs only from a tap (a launch-time restore shows
|
|
27
27
|
an Apple sign-in prompt); prices come only from the store's localised string; failure text is plain
|
|
28
28
|
and a cancel says nothing.
|
|
29
29
|
|
|
30
30
|
## What the starter wires, switched off
|
|
31
31
|
|
|
32
|
-
`IAdService` with no release implementation (
|
|
33
|
-
only) and the pacing rules;
|
|
32
|
+
`IAdService` with no release implementation (test ads in development builds
|
|
33
|
+
only) and the pacing rules; the purchase service with Restore in Settings and the purchase screen from the
|
|
34
34
|
first launch; a `.storekit` file for Xcode runs; one purchase gate at the first line of `StartLevel`;
|
|
35
|
-
telemetry muted by every dev flag; a store interface even when 1.0 sells nothing
|
|
35
|
+
telemetry muted by every dev flag; a store interface even when 1.0 sells nothing.
|
|
36
36
|
|
|
37
37
|
## Ads
|
|
38
38
|
|
|
@@ -47,9 +47,9 @@ Pacing, coded and off:
|
|
|
47
47
|
|
|
48
48
|
| Kind | Interstitial | Rewarded |
|
|
49
49
|
|---|---|---|
|
|
50
|
-
| Puzzle | from level 15, every third level
|
|
51
|
-
| Idle | only after big unlocks, never in the first 5 minutes, at most one per 3 minutes | 2× cash and offline 2×
|
|
52
|
-
| Versus | every third match after day one | double chest, timer skip with a daily cap
|
|
50
|
+
| Puzzle | from level 15, every third level | +3 balls |
|
|
51
|
+
| Idle | only after big unlocks, never in the first 5 minutes, at most one per 3 minutes | 2× cash and offline 2× |
|
|
52
|
+
| Versus | every third match after day one | double chest, timer skip with a daily cap |
|
|
53
53
|
|
|
54
54
|
Never ads in a premium game, and never a No Ads purchase while no network ships. The only retention
|
|
55
55
|
evidence is a teardown of Head Ball 2 from the owner's recording: ads took 44% of a session against
|
|
@@ -57,10 +57,10 @@ evidence is a teardown of Head Ball 2 from the owner's recording: ads took 44% o
|
|
|
57
57
|
|
|
58
58
|
## Privacy and analytics
|
|
59
59
|
|
|
60
|
-
Firebase Analytics and Crashlytics in every game through
|
|
60
|
+
Firebase Analytics and Crashlytics in every game through one telemetry boundary; events `level_start`,
|
|
61
61
|
`level_end`, `tutorial_complete`, `shop_open`, `unlock_card_view`, `unlock_tap`, plus each game's own.
|
|
62
|
-
No advertising identifier, no tracking prompt, ad personalisation pinned off (
|
|
63
|
-
does all three). App Privacy (website only) declares Device ID, Purchase History, Coarse Location,
|
|
62
|
+
No advertising identifier, no tracking prompt, ad personalisation pinned off (the shared Firebase
|
|
63
|
+
setup does all three). App Privacy (website only) declares Device ID, Purchase History, Coarse Location,
|
|
64
64
|
Product Interaction and Crash Data: not linked, no tracking; Purchase History only where there is a
|
|
65
65
|
purchase. The docs said "Data Not Collected" until Firebase shipped, and one draft missed Purchase
|
|
66
66
|
History. No age gate and no Kids category; the ratings came out 9+ and 12+ (fantasy violence). No
|
|
@@ -70,5 +70,5 @@ dashboard review is recorded in any session.
|
|
|
70
70
|
|
|
71
71
|
What the first week watched was App Review's state: three games sat in "Waiting for Review" for over a
|
|
72
72
|
week after a resubmit. No content ships without a store release (no remote bundles or remote config;
|
|
73
|
-
|
|
73
|
+
one game's Addressables are built into the app, with no remote catalog), and a server's minimum-version check must compare the build number: the version string
|
|
74
74
|
is 1.0.0 on every TestFlight build.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# The readiness page
|
|
2
2
|
|
|
3
3
|
One page per store, in the game's own look (or the studio's, for several games), written to
|
|
4
|
-
`design/pages/<store>-readiness.html`. The shape that worked (
|
|
4
|
+
`design/pages/<store>-readiness.html`. The shape that worked (a Google Play readiness page for four games):
|
|
5
5
|
|
|
6
6
|
1. **Header:** the studio, the store, the date checked; the games by name; one line of what the page
|
|
7
7
|
is based on (the repository at a named commit, the toolchain, the store's pages read that day, a
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Store readiness
|
|
2
2
|
|
|
3
|
-
"Can it go on the store?" is answered by an audit, not a guess. The model that worked (
|
|
4
|
-
Google Play readiness, 8 Oct 2026, four games) reads the repository and the toolchain, reads the
|
|
3
|
+
"Can it go on the store?" is answered by an audit, not a guess. The model that worked (a
|
|
4
|
+
Google Play readiness audit, 8 Oct 2026, four games) reads the repository and the toolchain, reads the
|
|
5
5
|
store's current policy pages, and writes one page: a verdict in a sentence, each game at a glance,
|
|
6
6
|
a matrix of every area by game, the store's rules that apply now, the work in order with who does
|
|
7
7
|
each part, the effort, the risks and the questions only the owner can answer.
|
|
@@ -86,7 +86,7 @@ they carry; before the page is final, read each store's current page and correct
|
|
|
86
86
|
|
|
87
87
|
## Worked example
|
|
88
88
|
|
|
89
|
-
Four Unity games for Google Play (
|
|
89
|
+
Four Unity games for Google Play (8 Oct 2026): no Android build ever made, Unity IAP already
|
|
90
90
|
on Play Billing 9 (Play requires 8+), analytics in all four while two listings said "no analytics".
|
|
91
91
|
Verdict: none can upload today, none is blocked. A shared Android foundation first (an AAB pinned to
|
|
92
92
|
API 36, one upload key, the AD_ID permission removed, one back handler), then 2–8 days per game; the
|
|
@@ -4,9 +4,6 @@ Four of eight first submissions were rejected (guideline 2.1(b) twice, 2.3.3, 2.
|
|
|
4
4
|
|
|
5
5
|
## Tools
|
|
6
6
|
|
|
7
|
-
- The studio's `com.joydle.core` (`funpixel-unity-game`, `references/studio-packages.md`):
|
|
8
|
-
`IapService(catalog, grant)` with `Init()`, `Buy(id)`, `Restore(done)` and `Price(id)`;
|
|
9
|
-
`Ads.CreateDefault(font)` and `Ads.Available`; `Telemetry` with `com.joydle.firebase` as its sink.
|
|
10
7
|
- `npx @funpixel/tools store init --store ios` writes `store/answers.json` (listing, products, the
|
|
11
8
|
SDK list, review notes); `npx @funpixel/tools store lint --store ios` checks lengths, price words and
|
|
12
9
|
the privacy answers against the SDKs. App Store Connect (web or API) takes the listing.
|
|
@@ -31,13 +28,13 @@ Four of eight first submissions were rejected (guideline 2.1(b) twice, 2.3.3, 2.
|
|
|
31
28
|
|
|
32
29
|
## Procedure
|
|
33
30
|
|
|
34
|
-
1. Sell only what the binary holds (`iap_truth`). Every IAP id needs an App Store Connect product and an entry point, and copy names nothing unbuilt. Store copy promised modes that existed only as data, and a Supporter IAP had nothing to buy (guideline 3.1.1). No ad network is live, so hide No Ads (four such IAPs had to be held): while
|
|
31
|
+
1. Sell only what the binary holds (`iap_truth`). Every IAP id needs an App Store Connect product and an entry point, and copy names nothing unbuilt. Store copy promised modes that existed only as data, and a Supporter IAP had nothing to buy (guideline 3.1.1). No ad network is live, so hide No Ads (four such IAPs had to be held): while no ad network is available, every ad button is hidden. Put one purchase gate at the first line of `StartLevel`, and a store interface even when 1.0 sells nothing (report §12).
|
|
35
32
|
2. Put Buy within two taps of the title on a fresh install (`iap_reach`): an Unlock row in Settings next to Restore, plus a title-screen entry. Name the path in the review notes.
|
|
36
|
-
3. Make Restore real (`restore_real`). It calls `RestoreTransactions` only from a tap, because a launch-time restore shows an Apple sign-in prompt, and it ends in "restored" or "nothing to restore". App Review always taps Restore;
|
|
37
|
-
4. Show prices only from
|
|
38
|
-
5. Grant a pending order exactly once (`iap_pending_once`). Unity IAP 5 routes pending orders to `OnPurchasePending`;
|
|
33
|
+
3. Make Restore real (`restore_real`). It calls `RestoreTransactions` only from a tap, because a launch-time restore shows an Apple sign-in prompt, and it ends in "restored" or "nothing to restore". App Review always taps Restore; one game's only fetched purchases and spun for 45 s.
|
|
34
|
+
4. Show prices only from the store's localised string. Failure text is plain; a cancel says nothing.
|
|
35
|
+
5. Grant a pending order exactly once (`iap_pending_once`). Unity IAP 5 routes pending orders to `OnPurchasePending`; a shared purchase service granted them again from the fetch too, until the fix of 7 Oct (it now grants once per transaction). A game built before it needs a new build.
|
|
39
36
|
6. Buy end to end before review. Products never load on the Simulator without a StoreKit configuration, and no game bought an IAP end to end before submitting; a person checks IAP and Restore on a device.
|
|
40
|
-
7. Derive App Privacy from the SDKs linked (`store lint`: declared ⊇ collected). With
|
|
37
|
+
7. Derive App Privacy from the SDKs linked (`store lint`: declared ⊇ collected). With Firebase Analytics and Crashlytics the games declare Device ID, Coarse Location, Product Interaction and Crash Data, plus Purchase History where there is an IAP: not linked, no tracking, no tracking prompt (with the advertising identifier turned off). A person enters them.
|
|
41
38
|
8. Pick the icon small. 1024×1024 RGB, no alpha (check with `sips`); one big idea, judged at 60 and 40 px against competitors. Make candidates with `npx @funpixel/tools gen image "<the idea>" --size 1024x1024 --out design/icons/` (metered, after `npx @funpixel/tools login`; a generator's default may be 9:16); the pick goes to `Assets/_Game/Art/Icon/app_icon.png`.
|
|
42
39
|
9. Compose 5–8 screenshots at 6.9": 1320×2868 portrait or 2868×1320 landscape, from real captures taken at game-state markers in the log. `store_shots` passes when sizes are exact, the real HUD is visible, no tutorial UI shows and each caption is true of its frame. How capture bursts are taken: not in the report.
|
|
43
40
|
10. Validate any video before it is shared or uploaded. `recording_check`: 0 frame gaps over 34 ms, audio ≥ 44.1 kHz. `preview_validate`: 15–30 s, ≤ 30 fps, bt709 tags, square pixels, AAC ≤ 256 kb/s; after upload, `previewImage.width > 0`.
|
|
@@ -47,12 +44,12 @@ Rejections by guideline, what 1.0 sold and the ad plan: `purchases-and-review.md
|
|
|
47
44
|
|
|
48
45
|
## Worked example
|
|
49
46
|
|
|
50
|
-
|
|
47
|
+
One game's App Preview: 25 s, 1920×886, cuts about every 1.5 s. App Store Connect showed a red "!" on it twice. The causes were an sRGB colour tag where bt709 is required, non-square pixels, and audio at 263 kb/s against the 256 cap. Setting the poster time through the API then made the preview image 0×0. What held: validate with `ffprobe`, upload, read back `previewImage.width > 0`, leave the poster frame alone.
|
|
51
48
|
|
|
52
49
|
## Common mistakes
|
|
53
50
|
|
|
54
|
-
- Resubmitting fast instead of linting first:
|
|
55
|
-
- Icons by prompt alone:
|
|
51
|
+
- Resubmitting fast instead of linting first: three games each went back to "Waiting for Review" for over a week.
|
|
52
|
+
- Icons by prompt alone: one game spent $21.46 over 7 rounds before a pick, round one at 720×1280 from the 9:16 default, no competitor benchmark until round 4. Another's bake-off cost $5.95.
|
|
56
53
|
- A Restore label whose hit area covers the shop card: taps on products showed "Restoring purchases" in four games.
|
|
57
54
|
- "Data Not Collected" left in the docs after Firebase shipped in all games.
|
|
58
|
-
- A Simulator recording shown before it was measured:
|
|
55
|
+
- A Simulator recording shown before it was measured: one game's `simctl recordVideo` clip had 19 gaps up to 0.85 s and 24 kHz audio.
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: funpixel-unity-game
|
|
3
|
-
description: Use when making a game in Unity (new from the starter, a port of a web game, a clone of a sibling), measuring or improving its frame time, memory, battery, load time or size, or running several agents on Unity projects on one Mac. Covers
|
|
3
|
+
description: Use when making a game in Unity (new from the starter, a port of a web game, a clone of a sibling), measuring or improving its frame time, memory, battery, load time or size, or running several agents on Unity projects on one Mac. Covers rules in C# tested outside the Editor, settings by script, launch flags, parity, player-side probes and Simulator leases.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Making a game in Unity
|
|
7
7
|
|
|
8
8
|
Games rebuilt from web builds played end to end 2 hours after kickoff. What goes wrong is silent:
|
|
9
9
|
all four first games reached TestFlight with no sound, cloned projects inherited a sibling's
|
|
10
|
-
settings, and Simulator timings measured the host. This skill
|
|
11
|
-
|
|
12
|
-
the shared Mac to their references.
|
|
10
|
+
settings, and Simulator timings measured the host. This skill makes each of these a failed check
|
|
11
|
+
at scaffold, and routes the measuring and the shared Mac to their references.
|
|
13
12
|
|
|
14
13
|
## Tools
|
|
15
14
|
|
|
16
|
-
- The studio's packages, `com.joydle.core` and `com.joydle.firebase`, are optional (Floe Jam uses
|
|
17
|
-
neither): adding them and what each settles, `references/studio-packages.md`.
|
|
18
15
|
- `funtools gen <kind> "…" --unity .` (after `funtools login`): pictures, sounds, music and models
|
|
19
16
|
into `Assets/_Game/Generated/` with import settings, metered; never a provider call with a `.env` key.
|
|
20
17
|
- `funtools unity run -- -nographics -executeMethod Setup.Configure`: your editor script, queued
|
|
@@ -43,41 +40,38 @@ the shared Mac to their references.
|
|
|
43
40
|
landscape), devices (a phone game: iPhone only for 1.0, oldest iPhone 11 at a locked
|
|
44
41
|
60 fps), the business model (skill `funpixel-store`, `references/money.md`), a content
|
|
45
42
|
minimum, which visual elements carry rules, and the name on the App Store. Targets: iOS
|
|
46
|
-
first, Android
|
|
47
|
-
|
|
48
|
-
3. Add what the game uses:
|
|
49
|
-
unless it stays built-in
|
|
43
|
+
first, Android; WebGL without Firebase, whose C++ SDK has no web build; Mac and Windows by the
|
|
44
|
+
game's own build methods.
|
|
45
|
+
3. Add what the game uses: Input System 1.20.0, uGUI 2.6.0, URP 17.6.0
|
|
46
|
+
unless it stays built-in, glTFast 6.20.0 for 3D ("latest" was an
|
|
50
47
|
experimental 7.0). Remove collab-proxy, learn and visual scripting. Import TMP Essential
|
|
51
48
|
Resources.
|
|
52
49
|
4. Lay out `Assets/_Game/` as `Scripts/Core`, `Scripts/Game`, `Editor`, `Tests/Editor` (or
|
|
53
50
|
`Tests/EditMode`), `Art`, `Fonts`, `Scenes`, plus `design/`, `store/` and a README. The rules go
|
|
54
51
|
in `Scripts/Core`, an asmdef with `noEngineReferences: true`; the rest stays in Assembly-CSharp
|
|
55
|
-
(the monorepo games) or splits into Game, View and World asmdefs
|
|
52
|
+
(the monorepo games) or splits into Game, View and World asmdefs. Add `CoreTests~`
|
|
56
53
|
for `dotnet test` and un-ignore its project (`!**/CoreTests~/*.csproj`): the root `.gitignore`
|
|
57
|
-
drops every `*.csproj`. Play Mode tests get an asmdef of their own (
|
|
54
|
+
drops every `*.csproj`. Play Mode tests get an asmdef of their own (`Tests/Play`).
|
|
58
55
|
5. Generate the one scene from code: a camera and one `GameDriver` (input, sim, each event to every
|
|
59
|
-
presenter once, render), so agents rebuild it headless and never conflict on a scene.
|
|
60
|
-
|
|
56
|
+
presenter once, render), so agents rebuild it headless and never conflict on a scene. Add the
|
|
57
|
+
AudioListener a code-made camera lacks; hold `audio_runtime`: 1
|
|
61
58
|
listener, 48 kHz, music within 3 s (of the splash's end, if one plays).
|
|
62
|
-
6. Set every setting in `Setup.Configure`:
|
|
63
|
-
|
|
59
|
+
6. Set every setting in `Setup.Configure`: company name, bundle id, version, IL2CPP, a fixed
|
|
60
|
+
orientation, Unity splash off, the Android API levels and ARM64, then colour
|
|
64
61
|
space, 48 kHz audio, render scale 1, ProMotion, accelerometer off, physics auto-simulation off with
|
|
65
|
-
your own sim, and
|
|
62
|
+
your own sim, and LZ4HC compression. Build through it. Keep a per-game manifest
|
|
66
63
|
(orientation, bundle id, colour space, a unique productGUID, audio on, render scale) to diff against.
|
|
67
64
|
7. Register the bundle id, the profile and (with Firebase) one Firebase project per game at scaffold; agents may,
|
|
68
65
|
with approval (who does what: funpixel-store).
|
|
69
66
|
8. Add dev-only launch flags for every screen and state, `-tour`, `-smoke` (plays to an ending, writes
|
|
70
|
-
`smoke.txt`) and the probe (`unity probe install`), read through one wrapper
|
|
71
|
-
unless `Debug.isDebugBuild
|
|
67
|
+
`smoke.txt`) and the probe (`unity probe install`), read through one wrapper that returns nothing
|
|
68
|
+
unless `Debug.isDebugBuild`, with analytics muted
|
|
72
69
|
while a flag is on. Keep flag names apart from save keys: `-coins` shadows the PlayerPrefs key
|
|
73
70
|
`coins`. Judged frames: `references/traps.md`.
|
|
74
|
-
9.
|
|
75
|
-
Settings from the first build
|
|
76
|
-
10. Never make a splash or a "Funpixel presents" card.
|
|
77
|
-
|
|
78
|
-
it plays before the first scene holding the game's audio, skipped in the Editor and on any `-flag`
|
|
79
|
-
(`-splash` forces it); title music waits on `JoydleSplash.Playing`; credits name that studio.
|
|
80
|
-
11. Plug content in through a registry, so parallel agents add files: Pocket Crew's branches
|
|
71
|
+
9. Wire purchases and ads switched off: the catalog with Buy and Restore in
|
|
72
|
+
Settings from the first build, no ads in release, a `.storekit` file for Xcode runs.
|
|
73
|
+
10. Never make a splash or a "Funpixel presents" card.
|
|
74
|
+
11. Plug content in through a registry, so parallel agents add files: one game's branches
|
|
81
75
|
without one cost 43 hand-resolved merge hunks.
|
|
82
76
|
12. Give each agent its own worktree and Simulator; one Editor per project, closed by its
|
|
83
77
|
opener (`references/agent-ops.md`).
|
|
@@ -94,17 +88,16 @@ Other day-one rules:
|
|
|
94
88
|
|
|
95
89
|
## Worked example
|
|
96
90
|
|
|
97
|
-
|
|
91
|
+
A new 2D puzzle game (URP 2D, Linear, portrait):
|
|
98
92
|
Playable on the Simulator in about 1.5 hours; 600 levels by reverse removal, solvable by
|
|
99
|
-
construction, 29 tests. The first TestFlight on day 1 was silent (no AudioListener,
|
|
100
|
-
`Sfx`), and its `-setcoins` flag worked in release builds (no dev gate, step 8).
|
|
93
|
+
construction, 29 tests. The first TestFlight on day 1 was silent (no AudioListener), and its `-setcoins` flag worked in release builds (no dev gate, step 8).
|
|
101
94
|
|
|
102
95
|
## Common mistakes
|
|
103
96
|
|
|
104
|
-
- Cloning a sibling:
|
|
105
|
-
`m_DisableAudio: 1`, and
|
|
106
|
-
- URP `m_RenderScale: 0.8`:
|
|
107
|
-
-
|
|
108
|
-
- Ungated debug flags:
|
|
109
|
-
- Rebuilding a web game from its design doc instead of its shipped code:
|
|
97
|
+
- Cloning a sibling: two games launched in portrait, one inherited
|
|
98
|
+
`m_DisableAudio: 1`, and one still carries a sibling's `.gitattributes` paths.
|
|
99
|
+
- URP `m_RenderScale: 0.8`: one game drew soft.
|
|
100
|
+
- Patching one game's copy of shared code instead of the shared package.
|
|
101
|
+
- Ungated debug flags: an unlock flag granted paid floors in one game's release build.
|
|
102
|
+
- Rebuilding a web game from its design doc instead of its shipped code: one port's improvised
|
|
110
103
|
fixes were torn out (`references/from-a-web-game.md`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Several agents on one Mac
|
|
2
2
|
|
|
3
|
-
Unity allows one Editor per project and every game here was built on one Mac with no CI, so parallel agents share a lock, the Simulators and the host's load. When they also shared a Simulator or scratch folder, runs were invalidated. When liveness meant "the process exists", a performance agent on
|
|
3
|
+
Unity allows one Editor per project and every game here was built on one Mac with no CI, so parallel agents share a lock, the Simulators and the host's load. When they also shared a Simulator or scratch folder, runs were invalidated. When liveness meant "the process exists", a performance agent on one game sat idle about 8 hours overnight. This skill gives each agent its own resources and makes progress measurable.
|
|
4
4
|
|
|
5
5
|
## Tools
|
|
6
6
|
|
|
@@ -26,29 +26,29 @@ build: `handing-off.md`.
|
|
|
26
26
|
|
|
27
27
|
1. Claim four things before the first build: a worktree, a leased Simulator, a remote-play port and a scratch folder. `sim_isolation` passes when the Simulator id, port and folder are unique per agent.
|
|
28
28
|
2. Send every batch run through `funtools unity run`, and run the engine-free tests between them. One batch run (1–2 min) per project serialised parallel agents, and a half-written file broke other agents' compiles until each had its own build folder.
|
|
29
|
-
3. One Editor per project, opened by the agent that needs it (`--open`, with the bridge) and closed by it (`funtools unity editor close`), never by another. With none open, batch through the queue. MCP for Unity got 0 calls in 29 sessions under a no-Editor rule: no `.mcp.json`, `settings.local.json` disables it, only
|
|
29
|
+
3. One Editor per project, opened by the agent that needs it (`--open`, with the bridge) and closed by it (`funtools unity editor close`), never by another. With none open, batch through the queue. MCP for Unity got 0 calls in 29 sessions under a no-Editor rule: no `.mcp.json`, `settings.local.json` disables it, only one game lists `com.coplaydev.unity-mcp` (unpinned, `#main`).
|
|
30
30
|
4. Run anything over a minute in the background. Background agents stalled on the 600 s stream watchdog during foreground Unity and Xcode steps. Read the whole output; `| tail` hid a failing compile check and a commit went through.
|
|
31
31
|
5. Judge a running agent by progress (`agent_liveness`): files under the game changed in the last 30 minutes, or a Unity or `xcodebuild` process at work.
|
|
32
32
|
6. Expect host load to change results. Parallel sessions caused a Burst timeout in one export and slowed another session's 363-test suite from 10–15 to about 27 minutes, so read export logs before trusting a build made under load.
|
|
33
33
|
7. Stage by path. A broad commit glob staged another session's 18 files. Keep `git stash pop` and pattern `pkill` out of agent scripts; both hit work that was not the agent's (see Common mistakes).
|
|
34
34
|
8. Commit and push as work lands, and keep nothing in scratch or /tmp. `lfs_audit` passes at 0 tracked binaries over 500 KB outside LFS, 0 untracked paid art and 0 unpushed LFS objects; about 840 MB of paid generations lived on one Mac.
|
|
35
35
|
9. Publish status at milestones, merged, with the session id on every entry: a network drop killed three sessions and nobody knew which was which. The owner asked "where we are? what's left? how long?" every 20–60 minutes in long sessions; answer from a tracker updated by tools (step, status, who, clock time), not memory.
|
|
36
|
-
10. Sync before saying it is synced. The owner asked "did you sync to remote?" on
|
|
36
|
+
10. Sync before saying it is synced. The owner asked "did you sync to remote?" on three games. Push after green checks, rewrite status sections from repo state, and run a docs-freshness check at the end of each task.
|
|
37
37
|
11. Show nothing unverified: `ffprobe` gaps = 0 before sharing a video, and read a published page back. After a change, show the real draw path with the real HUD at full resolution, the player log's exception count, before and after numbers, and the all-screens sheet for UI work; never the Scene view.
|
|
38
|
-
12. After each change, sweep for leftovers: a workaround, a dead flag, a comment that says `(was …`, a date or "the owner". The owner
|
|
39
|
-
13. End a report with at most 3 numbered decisions, each with options, a default, and a picture when it is visual. The owner
|
|
38
|
+
12. After each change, sweep for leftovers: a workaround, a dead flag, a comment that says `(was …`, a date or "the owner". The owner: "no workarounds, remove all leftovers". Never delete an "unused" asset unasked: an agent deleted 20 files the game loads by name.
|
|
39
|
+
13. End a report with at most 3 numbered decisions, each with options, a default, and a picture when it is visual. The owner: "What actually you're asking me now?"
|
|
40
40
|
14. At hand-back, stop what you started (`agent_hygiene`): `funtools sim release` each lease, then your Unity batch processes, child processes and monitors, and only your own. Never quit Simulator.app or run `xcrun simctl shutdown all`.
|
|
41
41
|
|
|
42
42
|
## Worked example
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
One game's performance pass, overnight. The agent stalled twice on the stream watchdog and then sat about 8 hours idle; its login had expired. The heartbeat only checked that the agent existed. The probe that would have caught it is `find -mmin -30` under the game folder plus `pgrep Unity|xcodebuild`: no changed file and no build process for 30 minutes means stalled.
|
|
45
45
|
|
|
46
46
|
## Common mistakes
|
|
47
47
|
|
|
48
|
-
- Sharing a Simulator or scratch folder
|
|
48
|
+
- Sharing a Simulator or scratch folder: invalidated runs, a tap in another agent's app, an install that killed the coordinator's remote-play session; quitting Simulator.app or `shutdown all` killed other agents' runs three times.
|
|
49
49
|
- A repo-wide status Stop hook (studio-wide): it forced a publish on every turn, fired on other sessions' files, hit the 200/day publish cap; the agent could not edit its own settings.
|
|
50
|
-
- `git stash pop` in a script (
|
|
50
|
+
- `git stash pop` in a script (a seam fix, 30 Sep): an unquoted zsh `$FILES` stashed nothing, and the pop applied and dropped a stash that was not the agent's.
|
|
51
51
|
- `pkill -f` by pattern (Atlas session, 4 Oct): it killed other agents' runs.
|
|
52
|
-
- Uncommitted work:
|
|
52
|
+
- Uncommitted work: one port lived 11+ hours uncommitted, and 79 files of a size pass were nearly lost.
|
|
53
53
|
- Infrastructure in /tmp: a restart wiped a Caddy config and build 22 shipped pointing at a dead tunnel.
|
|
54
54
|
- Simulators left running: 5 at about 200% CPU, and a stale app ran 8.8 hours.
|
|
@@ -5,36 +5,36 @@ From the Unity field report, sections 3 (lighting and materials), 6 (post-proces
|
|
|
5
5
|
|
|
6
6
|
## Fixes, before and after
|
|
7
7
|
|
|
8
|
-
| Fix | Before → after |
|
|
9
|
-
|
|
10
|
-
| Split GLBs, ASTC for model textures | data 315 → 61 MB (app 386 → 106 MB with the size settings) |
|
|
11
|
-
| Size settings (stripping High, engine stripping, IL2CPP OptimizeSize) | engine 66–69 → 40–42 MB |
|
|
12
|
-
| LZ4HC player data (about 25 minutes of work) | 126 → 94 MB installed |
|
|
13
|
-
| Shaders, pipeline states and the Vase grab warmed on the first frames | worst frame of the tide 249 → 18.6 ms |
|
|
14
|
-
| A throwaway run prewarmed behind the title | Play tap 87 → 1.9 ms |
|
|
15
|
-
| Glyph warm-up | 183–266 ms (
|
|
16
|
-
| No world drawn behind opaque menus; menus at 30 fps | 759 M → 0 3D px/s; CPU 94 → 32 ms/s; GC 52 → 2.4 KB/s |
|
|
17
|
-
| A blur that stopped re-rendering the world (it did 20 times a second) | about a third of all draws gone |
|
|
18
|
-
| Instanced sets culled, cheap shadow proxies, far LODs | World 1 376–448k → 116–224k triangles |
|
|
19
|
-
| The next level built while a menu is up; every level warmed | 82–99 ms (and 398 ms) → under 34 ms |
|
|
20
|
-
| A quality governor that judges the median of 90 frames, not the mean | one hitch no longer drops a resolution rung |
|
|
8
|
+
| Fix | Before → after |
|
|
9
|
+
|---|---|
|
|
10
|
+
| Split GLBs, ASTC for model textures | data 315 → 61 MB (app 386 → 106 MB with the size settings) |
|
|
11
|
+
| Size settings (stripping High, engine stripping, IL2CPP OptimizeSize, every game) | engine 66–69 → 40–42 MB |
|
|
12
|
+
| LZ4HC player data (about 25 minutes of work) | 126 → 94 MB installed |
|
|
13
|
+
| Shaders, pipeline states and the Vase grab warmed on the first frames | worst frame of the tide 249 → 18.6 ms |
|
|
14
|
+
| A throwaway run prewarmed behind the title | Play tap 87 → 1.9 ms |
|
|
15
|
+
| Glyph warm-up | 183–266 ms (one game), 50–270 ms (another) → 17–20 ms first use |
|
|
16
|
+
| No world drawn behind opaque menus; menus at 30 fps | 759 M → 0 3D px/s; CPU 94 → 32 ms/s; GC 52 → 2.4 KB/s |
|
|
17
|
+
| A blur that stopped re-rendering the world (it did 20 times a second) | about a third of all draws gone |
|
|
18
|
+
| Instanced sets culled, cheap shadow proxies, far LODs | World 1 376–448k → 116–224k triangles |
|
|
19
|
+
| The next level built while a menu is up; every level warmed | 82–99 ms (and 398 ms) → under 34 ms |
|
|
20
|
+
| A quality governor that judges the median of 90 frames, not the mean | one hitch no longer drops a resolution rung |
|
|
21
21
|
|
|
22
22
|
## The phone pipeline the games used
|
|
23
23
|
|
|
24
24
|
- No light probes or lightmaps in any game; mostly unlit or emissive materials.
|
|
25
|
-
-
|
|
26
|
-
Post-processing is off on
|
|
27
|
-
-
|
|
25
|
+
- One game's phone pipeline: no realtime shadows, MSAA 4×, HDR off, SRP Batcher on.
|
|
26
|
+
Post-processing is off on it and on another.
|
|
27
|
+
- One game keeps bloom and ACES tone mapping in a night volume: an emissive strength of 3.5 blew
|
|
28
28
|
the bloom out (down to 2.2), and the HDR glow washed out the price text.
|
|
29
|
-
-
|
|
29
|
+
- One game's URP bloom and depth-of-field shaders were found stripped from its builds: check a
|
|
30
30
|
post effect in the player build, not the Editor.
|
|
31
|
-
-
|
|
31
|
+
- One port carries three.js's physical shading over in HLSL with quality tiers that drop shadows and
|
|
32
32
|
render scale on a hot or Low Power phone. Shed load through render scale, never MSAA (step 7).
|
|
33
33
|
- No millisecond cost of any post effect was measured on a device.
|
|
34
34
|
|
|
35
35
|
## Load
|
|
36
36
|
|
|
37
|
-
Boot to title 0.32 s (
|
|
38
|
-
launch (
|
|
39
|
-
uses no Addressables (
|
|
37
|
+
Boot to title 0.32 s (one game); title interactive in 0.22 s and floor 1 playable 3.0 s after
|
|
38
|
+
launch (another). About 14 MB of textures still load synchronously at boot in the second, which
|
|
39
|
+
uses no Addressables (a third game's views branch loads each room through them). A lobby frame of 50 ms went once each screen's textures were preloaded
|
|
40
40
|
while loading. Memory measured 117–174 MB in use; there is no memory budget yet.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# A Unity game from a web game
|
|
2
2
|
|
|
3
3
|
Five of the nine Unity games started as Funpixel web games (Pixi or three.js) and were rebuilt in
|
|
4
|
-
Unity. That rebuild is hours of work when it has a fixed contract.
|
|
4
|
+
Unity. That rebuild is hours of work when it has a fixed contract. Two of them
|
|
5
5
|
each had a bit-exact C# core checked against golden traces recorded from the web sim, and both
|
|
6
|
-
played end to end on the Simulator about 2 hours after kickoff.
|
|
6
|
+
played end to end on the Simulator about 2 hours after kickoff. A third had a moving spec: it
|
|
7
7
|
logged 85 entries in its iOS phase, agents built seven fixes from one-line descriptions, and their
|
|
8
8
|
versions were torn out when the web game's author shipped different code. This page keeps the
|
|
9
9
|
rebuild on the contract: shipped web code, goldens and `parity.md`. Field report sections 0, 1, 2
|
|
@@ -35,13 +35,13 @@ and 10, and its dead ends.
|
|
|
35
35
|
the web sim under node, and capture reference frames of the web game at phone sizes. The
|
|
36
36
|
project adds `design/web-ref` and `parity.md`.
|
|
37
37
|
2. Fix the content minimum before the rebuild. The owner asked for "at least 5 different levels":
|
|
38
|
-
|
|
38
|
+
one game grew from 1 letter to 5 in about 7 hours, another from 4 levels to 26.
|
|
39
39
|
3. Fix colour space on day one to match the source renderer. Pixi and three.js without a linear
|
|
40
|
-
composer blend in gamma:
|
|
41
|
-
|
|
40
|
+
composer blend in gamma: four of the ports are Gamma. The one whose web build used a linear
|
|
41
|
+
composer stays Linear.
|
|
42
42
|
4. Rebuild the Core first, in an asmdef with `noEngineReferences: true`. Copy web numbers verbatim
|
|
43
|
-
into `Scripts/Core/Config.cs`, carry every web test over 1:1 to NUnit (
|
|
44
|
-
cases), and load the web's level JSON from `Resources/Data`.
|
|
43
|
+
into `Scripts/Core/Config.cs`, carry every web test over 1:1 to NUnit (one port: 98 of 98
|
|
44
|
+
cases), and load the web's level JSON from `Resources/Data`. One port's core had 229 tests
|
|
45
45
|
about 50 minutes after kickoff.
|
|
46
46
|
5. Apply the determinism kit while writing it, because C# and V8 disagree silently:
|
|
47
47
|
|
|
@@ -58,7 +58,7 @@ and 10, and its dead ends.
|
|
|
58
58
|
`DateTime.Now` outside the shims; until it exists, search for them.
|
|
59
59
|
6. Replay the goldens. Pass is 0 diffs at zero tolerance, and the same hash under IL2CPP. Where the
|
|
60
60
|
web's own math is not reproducible, bit-exact is not the rule: V8's libm (fdlibm `sin`, `log10`) is
|
|
61
|
-
compiled with fused multiply-adds on arm64, which C# cannot match bit for bit.
|
|
61
|
+
compiled with fused multiply-adds on arm64, which C# cannot match bit for bit. One port (Oct 2026)
|
|
62
62
|
compares at a relative tolerance of 1e-9 with identical events, frames and results (80 runs), and
|
|
63
63
|
records it as a `parity.md` row.
|
|
64
64
|
7. Record every deviation as a `parity.md` row and a default-off `Rules` flag, then check that
|
|
@@ -68,10 +68,10 @@ and 10, and its dead ends.
|
|
|
68
68
|
|
|
69
69
|
| Reuse | What |
|
|
70
70
|
|---|---|
|
|
71
|
-
| As it is | sim rules, tests, tuning, level JSON (
|
|
71
|
+
| As it is | sim rules, tests, tuning, level JSON (one port: 1,515 numbers bit-identical), save formats (33 fixtures of one port loaded byte-identical), sprite art, audio clips, key art |
|
|
72
72
|
| After conversion | WebP to PNG; WOFF2 to TTF with full fonts; meshopt and WebP GLBs decoded; loops rebuilt as OGG at exact sample counts; Web Audio synths re-rendered offline in C# |
|
|
73
73
|
| Redo | every view, HUD and menu (UGUI in code), input, haptics, app lifecycle, shaders, store art, icon, the IAP and economy layer |
|
|
74
|
-
| No path yet | online play: the kit's relay client is the JavaScript SDK (`funpixel-game-spine`), with no C# client. The one online Unity game
|
|
74
|
+
| No path yet | online play: the kit's relay client is the JavaScript SDK (`funpixel-game-spine`), with no C# client. The one online Unity game vendors LiteNetLib with its own `Server~` and `Api~` matchmaker |
|
|
75
75
|
|
|
76
76
|
9. Build the views in parallel behind the written APIs. One frame owner, `GameDriver`, runs
|
|
77
77
|
input, `sim.Update(dt)`, each `SimEvent` to every presenter, then `Render(alpha)`, so every
|
|
@@ -82,7 +82,7 @@ and 10, and its dead ends.
|
|
|
82
82
|
|
|
83
83
|
## Worked example
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
A port from three.js (about 20,000 lines) to URP 3D, Gamma, portrait:
|
|
86
86
|
1. A bit-exact core checked against goldens: seed 1 ended on the web's hash 1936916133.
|
|
87
87
|
2. 358 core tests run with `dotnet test`.
|
|
88
88
|
3. The web's 41 procedural audio cues were re-rendered offline in C#, correlation 0.999998
|
|
@@ -92,17 +92,17 @@ The Hot Gates, from three.js (about 20,000 lines) to URP 3D, Gamma, portrait:
|
|
|
92
92
|
|
|
93
93
|
## Common mistakes
|
|
94
94
|
|
|
95
|
-
- Improvising fixes:
|
|
95
|
+
- Improvising fixes: one port's agents built 8 props, a chain shockwave, a countdown, a
|
|
96
96
|
recolour and a 4 s PA delay that were torn out, and 3 of 6 earlier fixes were never re-audited
|
|
97
97
|
and still differed from the web.
|
|
98
98
|
- `Math.Round` in the Core: banker's rounding drew 2 sparks where the web drew 3 (game not in the
|
|
99
99
|
report).
|
|
100
|
-
- Tidying art that encodes a rule: an agent "cleaned up"
|
|
100
|
+
- Tidying art that encodes a rule: an agent "cleaned up" one game's goal sill, which held the
|
|
101
101
|
balance up.
|
|
102
|
-
- Linear colour space on a Pixi game: overlays about 2× too strong in
|
|
102
|
+
- Linear colour space on a Pixi game: overlays about 2× too strong in one game until it
|
|
103
103
|
switched to Gamma.
|
|
104
104
|
- Web MP3s as loops: they ran 1,245–1,997 samples long.
|
|
105
|
-
- Importing a web GLB undecoded: glTFast imports it as nothing with no error;
|
|
105
|
+
- Importing a web GLB undecoded: glTFast imports it as nothing with no error; one game's 12
|
|
106
106
|
heads "did not import at all".
|
|
107
|
-
- A UI with its own catch-up loop:
|
|
108
|
-
- An ignored `.csproj`:
|
|
107
|
+
- A UI with its own catch-up loop: One game's seal pick never reached audio or FX.
|
|
108
|
+
- An ignored `.csproj`: One game's tests could not run from a fresh clone.
|