@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
|
@@ -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` (`fp: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: 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 `fp: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: fp: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 (`fp: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 (`fp: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.
|
|
@@ -18,8 +18,8 @@ From the Unity field report, section 14 (agents making Unity games) and the owne
|
|
|
18
18
|
On what looks fine in its own captures: no sound (captures are silent), settings inherited from a
|
|
19
19
|
cloned project, UI that overflows only at the owner's phone shape, keyboard wording, a level that
|
|
20
20
|
breaks only when reached from the one before, and art that passes every gameplay gate while looking
|
|
21
|
-
like grey blockout (
|
|
22
|
-
removes (5 reverts in 24 hours on
|
|
21
|
+
like grey blockout (one game's Worlds 3 and 4). Then on taste: it adds decoration the owner
|
|
22
|
+
removes (5 reverts in 24 hours on one game) and grades its own art favourably. The answer to both is
|
|
23
23
|
evidence a person can judge: the real frame at full size against the target and the competitors.
|
|
24
24
|
|
|
25
25
|
## What the owner asked for again and again
|
|
@@ -28,7 +28,7 @@ evidence a person can judge: the real frame at full size against the target and
|
|
|
28
28
|
|---|---|
|
|
29
29
|
| "where we are? what's left? how long?" | a tracker updated by tools (step, status, who, clock time), with the session id on every entry |
|
|
30
30
|
| "did you sync to remote?" | push after green checks; rewrite status sections from repo state; a docs-freshness check at the end of each task |
|
|
31
|
-
| "
|
|
31
|
+
| "…as we did for other games" | carry every studio standard from the start and check parity with the sibling games: store fields, Restore placement |
|
|
32
32
|
| "no workarounds, remove all leftovers" | a leftover sweep and a comment lint after each change |
|
|
33
33
|
| "What actually you're asking me now?" | a report that ends with at most 3 numbered decisions, each with options, a default and a picture when it is visual |
|
|
34
34
|
| "go do it by yourself" (website, Firebase) | the list of what an agent may do (bundle id, profile, Firebase, an upload with approval) against what only a person does (app record, App Privacy, agreements, the first purchase tick, Submit) |
|
|
@@ -36,7 +36,7 @@ evidence a person can judge: the real frame at full size against the target and
|
|
|
36
36
|
## What earns trust in a build an agent made
|
|
37
37
|
|
|
38
38
|
The checks green, the launch with no flags clean, the smoke run reaching an ending on a stripped
|
|
39
|
-
build, the archive pre-flight passed, and the owner's own 15-minute session on a phone.
|
|
39
|
+
build, the archive pre-flight passed, and the owner's own 15-minute session on a phone. One game's
|
|
40
40
|
build 1 was "mostly liked" and still unshippable: a production gate (fresh install, every level
|
|
41
41
|
through the real flows, 7 kill-and-relaunch cycles, every setting persisted) found 4 more bugs behind
|
|
42
42
|
1,377 green tests. A hand-off with a dirty worktree is refused: commit by path first.
|
|
@@ -4,10 +4,6 @@ This skill turns a performance worry into a number measured in the player, befor
|
|
|
4
4
|
|
|
5
5
|
## Tools
|
|
6
6
|
|
|
7
|
-
- The studio's `com.joydle.core` (`fp:unity-game`, `studio-packages.md`): every
|
|
8
|
-
`BuildTools` build applies the size settings (stripping High, engine stripping, IL2CPP OptimizeSize);
|
|
9
|
-
`ProjectSettings/JoydleLz4hc.txt` turns on LZ4HC; `JoydleSplash` holds on black until the first
|
|
10
|
-
scene has loaded and 10 smooth frames pass.
|
|
11
7
|
- `npx @funpixel/tools unity probe --target mac|sim --path path.json`: the kit's in-player probe
|
|
12
8
|
(`com.funpixel.probe`, added by `unity probe install`; development builds only). It builds or reuses
|
|
13
9
|
the player through the Unity queue, plays the path, reads `ProfilerRecorder` per frame (frame, main,
|
|
@@ -29,10 +25,10 @@ This skill turns a performance worry into a number measured in the player, befor
|
|
|
29
25
|
| Frame rate | 60 fps locked on iPhone 11 (A13); 120 Hz on ProMotion only when cool; menus 30 fps | |
|
|
30
26
|
| Frames | first entry to a screen or level under 34 ms; none over 20 ms after warm-up; p99 at most 17.5 ms | `unity probe` |
|
|
31
27
|
| GC | 0 B per warm sim step or quiet frame | `alloc_quiet` |
|
|
32
|
-
| Draws, triangles | 120 and 250k per view (
|
|
28
|
+
| Draws, triangles | 120 and 250k per view (a 3D platformer) | |
|
|
33
29
|
| Behind a full-screen menu | 0 world cameras or passes; 1 pass in play | `invisible_work` |
|
|
34
30
|
| Look | `RenderSettings` and shared materials identical before and after each level and warm-up | `look_leak` |
|
|
35
|
-
| Unpacked `.app` | 2D 80 MB, 3D 100 MB, engine 45 MB, at most 2 MiB unexplained growth per build (proposed;
|
|
31
|
+
| Unpacked `.app` | 2D 80 MB, 3D 100 MB, engine 45 MB, at most 2 MiB unexplained growth per build (proposed; one 2D game is 133 MB) | `size_budget` |
|
|
36
32
|
| `Resources/` | 0 bytes of test-only or Editor-only files | `resources_hygiene` |
|
|
37
33
|
| Memory | 117–174 MB was measured; a budget is not in the report | |
|
|
38
34
|
|
|
@@ -40,24 +36,24 @@ Per tier (phone, tablet, Mac): `unity probe --tier`, from `probe.md`.
|
|
|
40
36
|
|
|
41
37
|
## Procedure
|
|
42
38
|
|
|
43
|
-
1. Measure in a player build, with `unity probe`. Editor draws read 134–151 against 74–114 in the player. Under URP draws read 0 in some players
|
|
39
|
+
1. Measure in a player build, with `unity probe`. Editor draws read 134–151 against 74–114 in the player. Under URP draws read 0 in some players, so read SetPass calls too.
|
|
44
40
|
2. Attribute each slow frame before fixing it: game work, GC, the host Mac, or your own screenshot. A `ScreenCapture` costs 100–130 ms, and it and a Mac at load 36 were blamed on the game twice; game work in those frames was 0.4–0.7 ms. The probe reports hitches with their own work and skips 4 frames after each capture.
|
|
45
41
|
3. Fix first-use stutters. Put every level id in the warm queue; warm glyphs, the first level's shaders (a ShaderVariantCollection, never `Shader.WarmupAllShaders`) and sounds behind the title; build the next level while a menu is up. Then run `look_leak`, since a warm-up can leave global state changed.
|
|
46
42
|
4. Turn off invisible work: no world drawn behind opaque menus, and menus at 30 fps.
|
|
47
43
|
5. Take allocations to 0 B. Use flat `struct` events in a reused list, no LINQ, closures or string building per frame, and rebuild text only on change. Measure in a release player, since 30–200 B per frame in the dev player is engine-side.
|
|
48
|
-
6. Load: hold the splash on black until the scene is loaded and 10 smooth frames pass (1 s minimum, 3 s cap
|
|
49
|
-
7. Heat and battery: poll thermal state and Low Power Mode every 2 s. Hot or Low Power drops render scale from 0.83 to 0.66; critical caps matches at 30 fps; 120 Hz only when cool, falling back with a doubling back-off. Keep MSAA fixed, because changing it at runtime recompiled every pipeline state in
|
|
44
|
+
6. Load: hold the splash on black until the scene is loaded and 10 smooth frames pass (1 s minimum, 3 s cap). Async-preload each screen's textures while loading, and prewarm a throwaway run behind the title: one game's Play tap went from 87 to 1.9 ms.
|
|
45
|
+
7. Heat and battery: poll thermal state and Low Power Mode every 2 s. Hot or Low Power drops render scale from 0.83 to 0.66; critical caps matches at 30 fps; 120 Hz only when cool, falling back with a doubling back-off. Keep MSAA fixed, because changing it at runtime recompiled every pipeline state in one game (a 1.5 s frame). Turn off Unity's own thermal frame-rate adjust: two controllers on one knob.
|
|
50
46
|
8. Size: measure the unpacked `.app` from the archive, with a delta against the last build. Apply the size settings (stripping High, engine stripping, IL2CPP OptimizeSize), then LZ4HC. Keep test files out of `Resources/`: the Unity test runner drops `PerformanceTestRun*.json` there, and it ships.
|
|
51
47
|
9. Report every claim as before and after. The owner's direction ("ensure the performance is top") became `frame_budget` and `invisible_work` in every round.
|
|
52
48
|
The fixes that gave the most, each with its before and after: `fixes.md`.
|
|
53
49
|
|
|
54
50
|
## Worked example
|
|
55
51
|
|
|
56
|
-
|
|
52
|
+
A port from three.js, the whole seed-7 run. Over 17,246 frames, frames over 34 ms went from 17 to 2 and the worst frame from 98.4 to 19.0 ms; p99 was 18.2 ms. Warming shaders, pipeline states and the Vase grab on the first frames took the worst frame of the "tide" (a moment the report does not define) from 249 to 18.6 ms. The last 48 ms hitch was a missing glyph, and the last allocation was a "+N" badge string; the game holds 0 B over 600 frames. The quality governor now judges the median of 90 frames, so one hitch no longer drops a resolution rung.
|
|
57
53
|
|
|
58
54
|
## Common mistakes
|
|
59
55
|
|
|
60
|
-
- A short warm list.
|
|
61
|
-
- A warm-up that leaves global state changed.
|
|
62
|
-
- Reading "Complete build size": in
|
|
63
|
-
- Test files in `Resources/`.
|
|
56
|
+
- A short warm list. One game warmed World 1 only, so World 2 started with a 398 ms hitch.
|
|
57
|
+
- A warm-up that leaves global state changed. One game's left fog and sky altered and every launch flashed violet for about 1 s; another kept references, so movers drew frozen.
|
|
58
|
+
- Reading "Complete build size": in one game it was the Xcode project.
|
|
59
|
+
- Test files in `Resources/`. One game's release export carried about 1 MB of test reference meshes.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Measuring the player: com.funpixel.probe and funtools unity probe
|
|
2
2
|
|
|
3
|
-
Five games each wrote a probe of their own
|
|
3
|
+
Five games each wrote a probe of their own (`HitchProbe`, `PerfProbe`, `PerfRecorder`, `PerfProbe` and `Hitch`, and one more). One of them also wrote a 661-line `RemotePlay.cs` for input over TCP. The kit now ships one package with both halves. Don't write another probe; give the package your game's facts instead.
|
|
4
4
|
|
|
5
5
|
## Getting it into a project
|
|
6
6
|
|
|
7
|
-
`npx @funpixel/tools unity probe install --project <dir>` adds one line to `Packages/manifest.json` and prints it. The line is a `file:` path to the kit's copy, relative to `Packages/`, the way
|
|
7
|
+
`npx @funpixel/tools unity probe install --project <dir>` adds one line to `Packages/manifest.json` and prints it. The line is a `file:` path to the kit's copy, relative to `Packages/`, the way a game references a local package. Pass `--git <url> --ref <tag>` for a pinned git URL; an unpinned one is refused. `--tests` also lists the package under `testables`; leave it off on a game whose test count is a baseline. `unity probe uninstall` takes the line out. Nothing is installed silently: `probe`, `play` and `capture` refuse a project without the line and say how to add it.
|
|
8
8
|
|
|
9
9
|
What reaches a store build: nothing. The player assembly (`Funpixel.Probe.Player`) has define constraints `DEVELOPMENT_BUILD || UNITY_EDITOR || FUNPIXEL_PROBE` and `!FUNPIXEL_NO_PROBE`. The game calls `FunpixelProbe`, whose methods are `[Conditional]`, so in a release build the calls and their arguments are compiled away. `FUNPIXEL_PROBE` exists only for the capture build (below), and the package's build guard fails any build whose Player Settings carry it.
|
|
10
10
|
|
|
@@ -53,7 +53,7 @@ Left out, and counted: the first 30 frames of the path, every capture frame and
|
|
|
53
53
|
| tablet | 17.5 ms | 20 ms | 34 ms | 160 | 200 | 400k | 256 B | 1536 MB |
|
|
54
54
|
| mac | 17.5 ms | 20 ms | 34 ms | 400 | 400 | 4M | 256 B | 3072 MB |
|
|
55
55
|
|
|
56
|
-
The frame numbers are `frame_budget`; draws and triangles are
|
|
56
|
+
The frame numbers are `frame_budget`; draws and triangles are one game's per view; SetPass and memory are another's tiers. The GC line allows the 30–200 B a development player allocates in the engine. Judge 0 B (`alloc_quiet`) in a release player or in tests. A Mac target is judged as `mac`, and a Simulator as `phone` or `tablet` by its device name. `--tier` and `--budget '{"draws": 200}'` (or a file, one budget per tier) override this.
|
|
57
57
|
|
|
58
58
|
Three states, as on the web: a number the player did not report is "not observed", never a pass. A run under 120 measured frames does not judge frame time.
|
|
59
59
|
|
|
@@ -68,7 +68,7 @@ A Simulator, or a Mac at load 36 or more, adds single long frames the game did n
|
|
|
68
68
|
- `play key Space`, `play pad south` and `play act "stick 1 0 800"`;
|
|
69
69
|
- `play state`, `play ui` (every pressable thing with its rect), `play views` and `play scene Level2`;
|
|
70
70
|
- `play shot --out f.png`, upright at full resolution;
|
|
71
|
-
- `play record --seconds 10`: frames plus a WAV of the game's own mix, through Unity's offline `AudioRenderer` after
|
|
71
|
+
- `play record --seconds 10`: frames plus a WAV of the game's own mix, through Unity's offline `AudioRenderer` after one game's `Recorder.cs`, joined into an MP4 when ffmpeg is there;
|
|
72
72
|
- `play end`.
|
|
73
73
|
|
|
74
74
|
Input goes in as Input System device state (touch, mouse with `--mouse`, keyboard, pad), so it takes the path a finger takes.
|
|
@@ -8,7 +8,7 @@ now has one of each, shared by every session of this user on the Mac.
|
|
|
8
8
|
## Unity: `funtools unity run`
|
|
9
9
|
|
|
10
10
|
```
|
|
11
|
-
funtools unity run -- -nographics -buildTarget iOS -executeMethod
|
|
11
|
+
funtools unity run -- -nographics -buildTarget iOS -executeMethod Setup.BuildSimulator
|
|
12
12
|
funtools unity run --project ../my-game -- -nographics -runTests -testPlatform EditMode -testResults results.xml
|
|
13
13
|
funtools unity jobs
|
|
14
14
|
```
|
|
@@ -12,14 +12,14 @@ starts Unity, and prints each finding with its fix. One line per trap it catches
|
|
|
12
12
|
- Git LFS pointer files where binaries belong (FSBTool "Failed decoding audio clip", blank textures): fails, names the repository to pull in.
|
|
13
13
|
- `activeInputHandler: 0`, the old Input Manager alone, on an iOS or Android project (no touch in a player build): fails.
|
|
14
14
|
- `UnityEngine.Input` calls on a project set to the Input System only (each throws): fails.
|
|
15
|
-
- The Input System hooked at `AfterAssembliesLoaded` (throws on iOS;
|
|
15
|
+
- The Input System hooked at `AfterAssembliesLoaded` (throws on iOS; hook on first read): warns.
|
|
16
16
|
- TextMesh Pro used with no Essential Resources (`CreateFontAsset` returns null): fails; a batch-mode ImportPackage of them (hangs): warns.
|
|
17
|
-
- A camera in a scene or made in code with nothing adding an AudioListener (a silent build
|
|
17
|
+
- A camera in a scene or made in code with nothing adding an AudioListener (a silent build): warns.
|
|
18
18
|
- `Shader.WarmupAllShaders` (segfaults with URP keyword spaces; warm a ShaderVariantCollection): fails on URP.
|
|
19
19
|
- A GLB glTFast cannot decode (meshopt, Draco or Basis without its decoder package, WebP ever): fails, because it imports as nothing.
|
|
20
20
|
- `Shader.Find` of a project shader nothing references (null in a build): warns.
|
|
21
21
|
- `enableWordWrapping`, a bare `new RenderParams{}`, runtime `QualitySettings.antiAliasing`, `-quit` with `-runTests`: warn.
|
|
22
|
-
- ProjectSettings drifted from the project's setup method (
|
|
22
|
+
- ProjectSettings drifted from the project's setup method (one game's iOS graphics APIs went back to automatic three times): warns; build through `Setup.Configure`.
|
|
23
23
|
- A build module a target needs (Mac IL2CPP and Windows were missing): warns with the Unity Hub line.
|
|
24
24
|
- No distribution certificate, Xcode account or App Store Connect key on an iOS project (each blocks TestFlight): warns.
|
|
25
25
|
|
|
@@ -29,31 +29,30 @@ starts Unity, and prints each finding with its fix. One line per trap it catches
|
|
|
29
29
|
says nothing about it (`fp:art`, Unity page).
|
|
30
30
|
- glTFast decodes textures embedded in a GLB to RGBA32; its "latest" tag pointed at an experimental
|
|
31
31
|
7.0, so pin 6.20 (`fp:3d`, Unity page).
|
|
32
|
-
- `UnityRuntime.framework`'s plist says iOS 15.0 and its binary 16.0: ITMS-90208
|
|
32
|
+
- `UnityRuntime.framework`'s plist says iOS 15.0 and its binary 16.0: ITMS-90208: stamp each embedded framework's minimum OS with the app's in a post-process step.
|
|
33
33
|
- High stripping removes an assembly reached only through `RuntimeInitializeOnLoadMethod`, and Unity
|
|
34
|
-
ignores a package's own `link.xml` (
|
|
34
|
+
ignores a package's own `link.xml` (hand that file to the linker yourself).
|
|
35
35
|
- TMP outline and underlay variants of materials made at runtime are stripped, and so are
|
|
36
36
|
`shader_feature` variants: use `multi_compile_local`.
|
|
37
37
|
- TMP lives in uGUI 2.x, not a package of its own; its Essential Resources still go in `Assets/TextMesh Pro`.
|
|
38
38
|
- Burst can time out under heavy host load; never ship that export.
|
|
39
39
|
- Re-importing an atlas regenerates sprite ids, and a PNG of a new size keeps the old sprite rect, so
|
|
40
40
|
Unity drops the sprite.
|
|
41
|
-
- iOS caches launch storyboards by name across updates: rename the storyboard
|
|
41
|
+
- iOS caches launch storyboards by name across updates: rename the storyboard.
|
|
42
42
|
- A project can be URP with `GraphicsSettings` saying none: the monorepo games assign the URP asset only
|
|
43
|
-
in `QualitySettings` (`m_CustomRenderPipeline: {fileID: 0}`), while
|
|
44
|
-
|
|
45
|
-
the one that is.
|
|
43
|
+
in `QualitySettings` (`m_CustomRenderPipeline: {fileID: 0}`), while others set it in
|
|
44
|
+
`GraphicsSettings`. Read both before calling a project built-in.
|
|
46
45
|
- A WebGL build compressed with Brotli fails on a phone over the Mac's LAN address
|
|
47
46
|
(`ERR_CONTENT_DECODING_FAILED`: Brotli needs https or localhost): serve it with `funtools serve`,
|
|
48
47
|
which falls back to gzip there.
|
|
49
48
|
- Addressables bundles built uncompressed (for a CDN to Brotli) weigh about twice as much from a
|
|
50
|
-
server that sends them raw (
|
|
49
|
+
server that sends them raw (one game's Room 1: 99.7 MB against 47.3 MB). `funtools serve`
|
|
51
50
|
compresses them on the fly as a CDN would, so its sizes and load times are what a player gets;
|
|
52
51
|
`--no-compress` shows the raw weight.
|
|
53
52
|
|
|
54
53
|
## Runtime
|
|
55
54
|
|
|
56
|
-
- Mono never sees `simctl launch` arguments: read them natively
|
|
55
|
+
- Mono never sees `simctl launch` arguments: read them natively.
|
|
57
56
|
- PlayerPrefs reads the launch-argument domain first: a flag `-coins` shadows the save key `coins`.
|
|
58
57
|
- A Unity API call in a field initializer throws: move it to `Start`.
|
|
59
58
|
- `OnApplicationPause(true)` also fires on resign-active (Control Center, Siri, call banners, Face ID).
|
|
@@ -64,7 +63,7 @@ starts Unity, and prints each finding with its fix. One line per trap it catches
|
|
|
64
63
|
- `Screen.cutouts` allocates on every call: read it when the screen changes.
|
|
65
64
|
- `preserveAspect` fits around the pivot; a `Slider` stretches to the row height; stretch anchors
|
|
66
65
|
plus a non-zero `sizeDelta` double the width.
|
|
67
|
-
- The first scene load can eat about 1 s of a startup animation (
|
|
66
|
+
- The first scene load can eat about 1 s of a startup animation (wait for it before one starts).
|
|
68
67
|
- Unity 6 renamed the draw-call profiler counter, so an old probe reads 0.
|
|
69
68
|
- C# `Math.Round` is banker's rounding, `List.Sort` is unstable, `Math.Sin` differs from V8 on about
|
|
70
69
|
6% of inputs and a naive hypot on about 40% (`references/from-a-web-game.md`).
|
|
@@ -75,7 +74,7 @@ starts Unity, and prints each finding with its fix. One line per trap it catches
|
|
|
75
74
|
- `Object.Destroy` does nothing in edit-mode captures: use `DestroyImmediate`.
|
|
76
75
|
- `CaptureScreenshotIntoRenderTexture` is upside down on Metal, and `ScreenCapture` stalls the next
|
|
77
76
|
frames.
|
|
78
|
-
- Frames a judge scores come from a capture rig, not the Editor (
|
|
77
|
+
- Frames a judge scores come from a capture rig, not the Editor (Oct 2026):
|
|
79
78
|
- a player build with a scripting define that turns the launch flags on and is not a development
|
|
80
79
|
build, because a development build stamps its watermark and console into every frame;
|
|
81
80
|
- `-shotscale 2` (passed to `ScreenCapture.CaptureScreenshot`'s supersize) for a full-resolution phone
|
|
@@ -97,7 +96,7 @@ starts Unity, and prints each finding with its fix. One line per trap it catches
|
|
|
97
96
|
- TMP dynamic font assets are rewritten by every batch run and conflict on every merge: keep shipped
|
|
98
97
|
fonts static, or clear them after captures.
|
|
99
98
|
- The root `.gitignore`'s `*.csproj` silently drops hand-written test and server projects.
|
|
100
|
-
- A copied project keeps its source's identity:
|
|
99
|
+
- A copied project keeps its source's identity: one game's `.gitattributes` names its source's
|
|
101
100
|
paths, its Android id is still Unity's template `com.UnityTechnologies…urpblank`, and standalone ids
|
|
102
101
|
are left as `com.DefaultCompany.2D-URP`. Check the ids and `.gitattributes` against the game's name.
|
|
103
102
|
|