nccgs 1.0.0
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/.claude/agents/nccgs-accessibility-specialist.md +26 -0
- package/.claude/agents/nccgs-adversarial-reviewer.md +26 -0
- package/.claude/agents/nccgs-ai-programmer.md +26 -0
- package/.claude/agents/nccgs-analytics-engineer.md +26 -0
- package/.claude/agents/nccgs-art-direction-lead.md +26 -0
- package/.claude/agents/nccgs-audio-direction-lead.md +26 -0
- package/.claude/agents/nccgs-creative-director.md +26 -0
- package/.claude/agents/nccgs-documentation-manager.md +26 -0
- package/.claude/agents/nccgs-economy-designer.md +26 -0
- package/.claude/agents/nccgs-engine-programmer.md +26 -0
- package/.claude/agents/nccgs-game-design-lead.md +26 -0
- package/.claude/agents/nccgs-game-designer.md +26 -0
- package/.claude/agents/nccgs-gameplay-programmer.md +26 -0
- package/.claude/agents/nccgs-level-designer.md +26 -0
- package/.claude/agents/nccgs-live-ops-designer.md +26 -0
- package/.claude/agents/nccgs-localization-lead.md +26 -0
- package/.claude/agents/nccgs-narrative-lead.md +26 -0
- package/.claude/agents/nccgs-network-programmer.md +26 -0
- package/.claude/agents/nccgs-performance-analyst.md +26 -0
- package/.claude/agents/nccgs-producer.md +26 -0
- package/.claude/agents/nccgs-production-coordinator.md +23 -0
- package/.claude/agents/nccgs-programming-lead.md +26 -0
- package/.claude/agents/nccgs-prototyper.md +26 -0
- package/.claude/agents/nccgs-qa-engineer.md +26 -0
- package/.claude/agents/nccgs-qa-lead.md +26 -0
- package/.claude/agents/nccgs-release-engineer.md +26 -0
- package/.claude/agents/nccgs-release-lead.md +26 -0
- package/.claude/agents/nccgs-security-engineer.md +26 -0
- package/.claude/agents/nccgs-sound-designer.md +26 -0
- package/.claude/agents/nccgs-systems-designer.md +26 -0
- package/.claude/agents/nccgs-technical-architect.md +26 -0
- package/.claude/agents/nccgs-technical-artist.md +26 -0
- package/.claude/agents/nccgs-technical-director.md +26 -0
- package/.claude/agents/nccgs-tools-programmer.md +26 -0
- package/.claude/agents/nccgs-ui-programmer.md +26 -0
- package/.claude/agents/nccgs-unity-build-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-content-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-implementer.md +26 -0
- package/.claude/agents/nccgs-unity-rendering-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-systems-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-ui-specialist.md +26 -0
- package/.claude/agents/nccgs-ux-designer.md +26 -0
- package/.claude/agents/nccgs-verification-engineer.md +26 -0
- package/.claude/agents/nccgs-world-builder.md +26 -0
- package/.claude/agents/nccgs-writer.md +26 -0
- package/.claude/nccgs/THIRD_PARTY_NOTICES.md +13 -0
- package/.claude/nccgs/VERSION +1 -0
- package/.claude/nccgs/constitution.md +131 -0
- package/.claude/nccgs/hooks/agent-audit.mjs +10 -0
- package/.claude/nccgs/hooks/common.mjs +41 -0
- package/.claude/nccgs/hooks/post-compact.mjs +1 -0
- package/.claude/nccgs/hooks/pre-compact.mjs +8 -0
- package/.claude/nccgs/hooks/protect-git.mjs +22 -0
- package/.claude/nccgs/hooks/protect-write.mjs +17 -0
- package/.claude/nccgs/hooks/session-start.mjs +15 -0
- package/.claude/nccgs/hooks/session-stop.mjs +7 -0
- package/.claude/nccgs/protocols/agent-contract.md +34 -0
- package/.claude/nccgs/protocols/context-packets.md +13 -0
- package/.claude/nccgs/protocols/evidence.md +15 -0
- package/.claude/nccgs/protocols/model-routing.md +22 -0
- package/.claude/nccgs/protocols/orchestration.md +26 -0
- package/.claude/nccgs/protocols/unity-boundary.md +11 -0
- package/.claude/nccgs/settings.fragment.json +77 -0
- package/.claude/nccgs/studio.json +347 -0
- package/.claude/nccgs/tools/configure-models.mjs +39 -0
- package/.claude/nccgs/unity-skills-manifest.json +727 -0
- package/.claude/nccgs/workflow-catalog.json +317 -0
- package/.claude/rules/nccgs-canonical-docs.md +19 -0
- package/.claude/rules/nccgs-editor-tools.md +12 -0
- package/.claude/rules/nccgs-localization.md +12 -0
- package/.claude/rules/nccgs-networking.md +13 -0
- package/.claude/rules/nccgs-performance.md +14 -0
- package/.claude/rules/nccgs-rendering.md +16 -0
- package/.claude/rules/nccgs-security.md +13 -0
- package/.claude/rules/nccgs-tests.md +18 -0
- package/.claude/rules/nccgs-ui.md +14 -0
- package/.claude/rules/nccgs-unity-assets.md +21 -0
- package/.claude/rules/nccgs-unity-code.md +22 -0
- package/.claude/skills/accessibility-review/SKILL.md +14 -0
- package/.claude/skills/architecture-decision/SKILL.md +14 -0
- package/.claude/skills/asset-audit/SKILL.md +14 -0
- package/.claude/skills/audit/SKILL.md +16 -0
- package/.claude/skills/audit/references/dimensions.md +46 -0
- package/.claude/skills/balance-review/SKILL.md +14 -0
- package/.claude/skills/bug-triage/SKILL.md +14 -0
- package/.claude/skills/build-live-game/SKILL.md +317 -0
- package/.claude/skills/build-live-game/references/achievements.md +779 -0
- package/.claude/skills/build-live-game/references/apis.md +280 -0
- package/.claude/skills/build-live-game/references/authentication.md +437 -0
- package/.claude/skills/build-live-game/references/battlepass.md +860 -0
- package/.claude/skills/build-live-game/references/cloud-code.md +563 -0
- package/.claude/skills/build-live-game/references/cloud-save.md +474 -0
- package/.claude/skills/build-live-game/references/deployment.md +216 -0
- package/.claude/skills/build-live-game/references/player-account.md +813 -0
- package/.claude/skills/build-live-game/references/remote-config.md +96 -0
- package/.claude/skills/build-live-game/references/tooling.md +431 -0
- package/.claude/skills/closure/SKILL.md +14 -0
- package/.claude/skills/code-review/SKILL.md +14 -0
- package/.claude/skills/compatibility-review/SKILL.md +14 -0
- package/.claude/skills/context-pack/SKILL.md +14 -0
- package/.claude/skills/dependency-review/SKILL.md +14 -0
- package/.claude/skills/design/SKILL.md +20 -0
- package/.claude/skills/design-review/SKILL.md +14 -0
- package/.claude/skills/evidence-review/SKILL.md +14 -0
- package/.claude/skills/hotfix/SKILL.md +14 -0
- package/.claude/skills/implement-in-app-purchases/README.md +233 -0
- package/.claude/skills/implement-in-app-purchases/SKILL.md +158 -0
- package/.claude/skills/implement-in-app-purchases/references/api-notes.md +562 -0
- package/.claude/skills/implement-in-app-purchases/references/codeless-catalog.md +331 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-adapty.md +268 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-revenuecat.md +275 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
- package/.claude/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +204 -0
- package/.claude/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +198 -0
- package/.claude/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +356 -0
- package/.claude/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +446 -0
- package/.claude/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +680 -0
- package/.claude/skills/implement-in-app-purchases/references/platform-notes.md +204 -0
- package/.claude/skills/implement-in-app-purchases/references/pre-check.md +205 -0
- package/.claude/skills/incident-recovery/SKILL.md +14 -0
- package/.claude/skills/initialize-ai-navigation/SKILL.md +95 -0
- package/.claude/skills/initialize-ai-navigation/references/navigation-system.md +794 -0
- package/.claude/skills/levelplay-unity-integration/CHANGELOG.md +57 -0
- package/.claude/skills/levelplay-unity-integration/README.md +74 -0
- package/.claude/skills/levelplay-unity-integration/SKILL.md +1126 -0
- package/.claude/skills/levelplay-unity-integration/references/banner-api.md +920 -0
- package/.claude/skills/levelplay-unity-integration/references/best-practices.md +536 -0
- package/.claude/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
- package/.claude/skills/levelplay-unity-integration/references/initialization-api.md +630 -0
- package/.claude/skills/levelplay-unity-integration/references/interstitial-api.md +899 -0
- package/.claude/skills/levelplay-unity-integration/references/ios-setup.md +491 -0
- package/.claude/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
- package/.claude/skills/levelplay-unity-integration/references/privacy-settings.md +608 -0
- package/.claude/skills/levelplay-unity-integration/references/rewarded-api.md +902 -0
- package/.claude/skills/localization/SKILL.md +135 -0
- package/.claude/skills/localization/references/api-notes.md +76 -0
- package/.claude/skills/localization/resources/L10nBatchProcessor.cs +69 -0
- package/.claude/skills/localization/resources/LocalizedFontAsset.cs +18 -0
- package/.claude/skills/localize-game/SKILL.md +14 -0
- package/.claude/skills/migrate-project/SKILL.md +21 -0
- package/.claude/skills/migrate-project/references/procedure.md +63 -0
- package/.claude/skills/milestone-review/SKILL.md +14 -0
- package/.claude/skills/new-unity-project/SKILL.md +179 -0
- package/.claude/skills/optimize-audio/SKILL.md +199 -0
- package/.claude/skills/optimize-audio/resources/audio-import-api.md +146 -0
- package/.claude/skills/optimize-audio/resources/platform-settings.md +48 -0
- package/.claude/skills/optimize-text-mesh-pro/SKILL.md +182 -0
- package/.claude/skills/optimize-web/SKILL.md +393 -0
- package/.claude/skills/optimize-web/resources/WebOptimizer.cs +21 -0
- package/.claude/skills/optimize-web/resources/toktx-examples.sh +11 -0
- package/.claude/skills/performance-audit/SKILL.md +14 -0
- package/.claude/skills/physics-3d-collision/SKILL.md +442 -0
- package/.claude/skills/physics-3d-collision/references/troubleshooting.md +41 -0
- package/.claude/skills/physics-3d-collision/resources/CollisionDebugger.cs +33 -0
- package/.claude/skills/plan-feature/SKILL.md +14 -0
- package/.claude/skills/playtest/SKILL.md +14 -0
- package/.claude/skills/project-stage/SKILL.md +14 -0
- package/.claude/skills/prototype-feature/SKILL.md +14 -0
- package/.claude/skills/qa-plan/SKILL.md +14 -0
- package/.claude/skills/release/SKILL.md +18 -0
- package/.claude/skills/release-readiness/SKILL.md +14 -0
- package/.claude/skills/retrospective/SKILL.md +14 -0
- package/.claude/skills/review/SKILL.md +16 -0
- package/.claude/skills/security-audit/SKILL.md +14 -0
- package/.claude/skills/setup-multiplayer-services/SKILL.md +39 -0
- package/.claude/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
- package/.claude/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
- package/.claude/skills/setup-multiplayer-services/references/examples.md +33 -0
- package/.claude/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
- package/.claude/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
- package/.claude/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
- package/.claude/skills/setup-vivox-voice-chat/SKILL.md +118 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/.env.example +6 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/README.md +101 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/promptfooconfig.yaml +32 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/init-and-login.yaml +76 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/text-chat.yaml +65 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/voice-channels.yaml +74 -0
- package/.claude/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
- package/.claude/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
- package/.claude/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
- package/.claude/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
- package/.claude/skills/setup-vivox-voice-chat/references/voice-channels.md +90 -0
- package/.claude/skills/shader-graph-create-custom-node/SKILL.md +25 -0
- package/.claude/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
- package/.claude/skills/sprint-plan/SKILL.md +14 -0
- package/.claude/skills/sprite-editor/SKILL.md +66 -0
- package/.claude/skills/sprite-editor/references/api_reference.md +151 -0
- package/.claude/skills/sprite-editor/references/background.md +112 -0
- package/.claude/skills/sprite-editor/references/templates.md +72 -0
- package/.claude/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
- package/.claude/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
- package/.claude/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
- package/.claude/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
- package/.claude/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
- package/.claude/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
- package/.claude/skills/sprite-editor/scripts/README.md +134 -0
- package/.claude/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
- package/.claude/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
- package/.claude/skills/status/SKILL.md +16 -0
- package/.claude/skills/story-readiness/SKILL.md +14 -0
- package/.claude/skills/test/SKILL.md +16 -0
- package/.claude/skills/ui/SKILL.md +142 -0
- package/.claude/skills/ui-imgui/SKILL.md +186 -0
- package/.claude/skills/ui-imgui/references/gui-elements.md +156 -0
- package/.claude/skills/ui-imgui/references/templates.md +141 -0
- package/.claude/skills/ui-review/SKILL.md +14 -0
- package/.claude/skills/ui-ugui/SKILL.md +282 -0
- package/.claude/skills/ui-ugui/references/scrollview-setup.md +29 -0
- package/.claude/skills/ui-uitk/SKILL.md +235 -0
- package/.claude/skills/ui-uitk/references/common-issues.md +74 -0
- package/.claude/skills/ui-uitk/references/custom-elements.md +241 -0
- package/.claude/skills/ui-uitk/references/painter2d.md +282 -0
- package/.claude/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
- package/.claude/skills/ui-uitk/references/svg-icons.md +136 -0
- package/.claude/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
- package/.claude/skills/ui-uitk/references/uss-guide.md +138 -0
- package/.claude/skills/unity-cli/CHANGELOG.md +233 -0
- package/.claude/skills/unity-cli/SECURITY.md +22 -0
- package/.claude/skills/unity-cli/SKILL.md +414 -0
- package/.claude/skills/unity-cli/references/auth-license-cloud.md +146 -0
- package/.claude/skills/unity-cli/references/build-run-test.md +349 -0
- package/.claude/skills/unity-cli/references/collaboration.md +472 -0
- package/.claude/skills/unity-cli/references/config-hub.md +103 -0
- package/.claude/skills/unity-cli/references/diagnostics-maintenance.md +326 -0
- package/.claude/skills/unity-cli/references/editors-install.md +327 -0
- package/.claude/skills/unity-cli/references/integration-advanced.md +472 -0
- package/.claude/skills/unity-cli/references/projects-templates.md +574 -0
- package/.claude/skills/unity-package-management/SKILL.md +304 -0
- package/.claude/skills/unity-package-management/references/select-packages.md +108 -0
- package/.claude/skills/urp-postprocessing/SKILL.md +188 -0
- package/.claude/skills/urp-postprocessing/references/code-templates.md +119 -0
- package/.claude/skills/urp-postprocessing/references/effect-reference.md +86 -0
- package/.claude/skills/validate-urp-render-graph-renderer-feature/SKILL.md +269 -0
- package/.claude/skills/work/SKILL.md +36 -0
- package/.claude/skills/work/references/classification.md +41 -0
- package/.claude/skills/work/references/closure.md +50 -0
- package/.claude/skills/work/references/feature-contracts.md +32 -0
- package/.claude/skills/work/references/verification.md +26 -0
- package/CLAUDE.md +6 -0
- package/LICENSE +21 -0
- package/README.md +162 -0
- package/THIRD_PARTY_NOTICES.md +23 -0
- package/UPGRADING.md +32 -0
- package/VERSION +1 -0
- package/docs/ARCHITECTURE.md +73 -0
- package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +324 -0
- package/docs/MIGRATION-MATRIX.md +23 -0
- package/docs/PROJECT-POLICY.md +67 -0
- package/docs/WORKFLOWS.md +61 -0
- package/package-assets/setup-vivox-voice-chat-evals.gitignore +7 -0
- package/package.json +41 -0
- package/scaffold/.nccgs/bugs/.gitkeep +1 -0
- package/scaffold/.nccgs/closures/.gitkeep +1 -0
- package/scaffold/.nccgs/context/.gitkeep +1 -0
- package/scaffold/.nccgs/decisions/.gitkeep +1 -0
- package/scaffold/.nccgs/evidence/.gitkeep +1 -0
- package/scaffold/.nccgs/features/.gitkeep +1 -0
- package/scaffold/.nccgs/migrations/.gitkeep +1 -0
- package/scaffold/.nccgs/playtests/.gitkeep +1 -0
- package/scaffold/.nccgs/project.yaml +103 -0
- package/scaffold/.nccgs/requirements.yaml +10 -0
- package/scaffold/.nccgs/reviews/.gitkeep +1 -0
- package/scaffold/.nccgs/state.md +40 -0
- package/scaffold/.nccgs/templates/agent-handoff.md +25 -0
- package/scaffold/.nccgs/templates/architecture-decision.md +27 -0
- package/scaffold/.nccgs/templates/closure-record.md +51 -0
- package/scaffold/.nccgs/templates/context-packet.yaml +17 -0
- package/scaffold/.nccgs/templates/evidence-record.md +23 -0
- package/scaffold/.nccgs/templates/feature-contract.md +35 -0
- package/scaffold/.nccgs/templates/migration-plan.md +40 -0
- package/scaffold/.nccgs/templates/waiver.md +11 -0
- package/scripts/cli.mjs +56 -0
- package/scripts/install.mjs +267 -0
- package/scripts/sync-unity-skills.mjs +126 -0
- package/scripts/validate.mjs +205 -0
- package/tests/framework.test.mjs +121 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Remote Config Reference
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
- [Overview](#overview)
|
|
6
|
+
- [How It Works](#how-it-works)
|
|
7
|
+
- [FetchConfigsAsync API](#fetchconfigsasync-api)
|
|
8
|
+
- [.rc File Format](#rc-file-format)
|
|
9
|
+
- [Game Overrides](#game-overrides)
|
|
10
|
+
- [Common Patterns](#common-patterns)
|
|
11
|
+
- [Code Template -- Load JSON Config](#code-template--load-json-config)
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
Server-side game configuration. Store game definitions (achievement lists, battle pass tiers, shop catalogs) as JSON entries updatable without a client build. Accessed via `RemoteConfigService.Instance`.
|
|
16
|
+
|
|
17
|
+
- **Namespace:** `Unity.Services.RemoteConfig`
|
|
18
|
+
- **Package:** `com.unity.remote-config`
|
|
19
|
+
|
|
20
|
+
## How It Works
|
|
21
|
+
|
|
22
|
+
- Configuration is stored as key-value entries in the Unity Dashboard or deployed via `.rc` files through the Deployment Window.
|
|
23
|
+
- The client fetches all config at once using `FetchConfigsAsync`.
|
|
24
|
+
- Values are strongly typed: `string`, `bool`, `int`, `float`, `long`, and `JSON`.
|
|
25
|
+
|
|
26
|
+
## FetchConfigsAsync API
|
|
27
|
+
|
|
28
|
+
```csharp
|
|
29
|
+
struct UserAttributes {}
|
|
30
|
+
struct AppAttributes {}
|
|
31
|
+
var result = await RemoteConfigService.Instance.FetchConfigsAsync(
|
|
32
|
+
new UserAttributes(), new AppAttributes());
|
|
33
|
+
// Access values:
|
|
34
|
+
string val = result.config.GetString("key");
|
|
35
|
+
int num = result.config.GetInt("key");
|
|
36
|
+
bool flag = result.config.GetBool("key");
|
|
37
|
+
// For JSON values:
|
|
38
|
+
var token = result.config["key"]; // JToken
|
|
39
|
+
var obj = token.ToObject<MyType>();
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- `UserAttributes` and `AppAttributes` are empty structs unless you use Game Overrides (audience targeting).
|
|
43
|
+
- Results are cached locally; subsequent calls return cached data unless you call with different attributes.
|
|
44
|
+
|
|
45
|
+
## .rc File Format
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"$schema": "https://ugs-config-schemas.unity3d.com/v1/remote-config.schema.json",
|
|
50
|
+
"entries": {
|
|
51
|
+
"my_string_key": "hello",
|
|
52
|
+
"my_int_key": 42,
|
|
53
|
+
"my_json_key": { "nested": true }
|
|
54
|
+
},
|
|
55
|
+
"types": {
|
|
56
|
+
"my_json_key": "JSON"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- **Create via:** Right-click in Project window > Assets > Create > Services > Remote Config
|
|
62
|
+
- **Deploy via:** the Deployment Window (Services > Deployment)
|
|
63
|
+
- The `types` block is needed only for JSON entries; `string`, `int`, `bool`, `float`, and `long` are auto-detected.
|
|
64
|
+
|
|
65
|
+
## Game Overrides
|
|
66
|
+
|
|
67
|
+
Game Overrides (via `com.unity.services.tooling`) override Remote Config values for specific player segments. Remote Config itself does not provide A/B testing -- Game Overrides layer on top of it.
|
|
68
|
+
|
|
69
|
+
- Game Overrides are defined as `.ugo` files.
|
|
70
|
+
- Used for A/B testing and audience targeting.
|
|
71
|
+
- Configured in the Unity Dashboard or deployed via `.ugo` files through the Deployment Window.
|
|
72
|
+
- When active, `FetchConfigsAsync` returns the overridden values automatically.
|
|
73
|
+
|
|
74
|
+
## Common Patterns
|
|
75
|
+
|
|
76
|
+
- **Game definitions** (achievements, battle pass tiers) stored as JSON arrays under a single key.
|
|
77
|
+
- **Feature flags** stored as booleans for toggling game features server-side.
|
|
78
|
+
- **Version-specific config** with server-side updates -- change game balance without shipping a new client build.
|
|
79
|
+
|
|
80
|
+
## Code Template -- Load JSON Config
|
|
81
|
+
|
|
82
|
+
```csharp
|
|
83
|
+
using Unity.Services.RemoteConfig;
|
|
84
|
+
using Newtonsoft.Json.Linq;
|
|
85
|
+
|
|
86
|
+
struct UserAttributes {}
|
|
87
|
+
struct AppAttributes {}
|
|
88
|
+
|
|
89
|
+
async Task<List<T>> LoadJsonConfigAsync<T>(string key)
|
|
90
|
+
{
|
|
91
|
+
var result = await RemoteConfigService.Instance.FetchConfigsAsync(
|
|
92
|
+
new UserAttributes(), new AppAttributes());
|
|
93
|
+
var token = result.config[key];
|
|
94
|
+
return token.ToObject<List<T>>();
|
|
95
|
+
}
|
|
96
|
+
```
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
# Tooling Reference
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
- [Overview](#overview)
|
|
6
|
+
- [Access Control](#access-control)
|
|
7
|
+
- [`.ac` File Format](#ac-file-format)
|
|
8
|
+
- [URN Pattern Format](#urn-pattern-format)
|
|
9
|
+
- [URN Reference by Service](#urn-reference-by-service)
|
|
10
|
+
- [Recommended Pattern: Deny-All-Then-Allow](#recommended-pattern-deny-all-then-allow)
|
|
11
|
+
- [Game Overrides](#game-overrides)
|
|
12
|
+
- [`.ugo` File Format](#ugo-file-format)
|
|
13
|
+
- [Editor API Models](#editor-api-models)
|
|
14
|
+
|
|
15
|
+
Editor-only package. Registers **Access Control** (`.ac`) and **Game Overrides** (`.ugo`) file types with the Deployment Window (`com.unity.services.deployment`).
|
|
16
|
+
|
|
17
|
+
- **Package:** `com.unity.services.tooling`
|
|
18
|
+
- **Namespace:** `Unity.Services.Tooling.Editor.AccessControl.Authoring.Core.Model` / `Unity.Services.Tooling.Editor.GameOverrides.Authoring.Core.Model`
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Overview
|
|
23
|
+
|
|
24
|
+
Tooling provides two cloud resource file types deployed through the Deployment Window:
|
|
25
|
+
|
|
26
|
+
| File Type | Extension | Purpose |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| Access Control | `.ac` | Permit or deny player/service-account access to UGS services on a URN basis |
|
|
29
|
+
| Game Overrides | `.ugo` | A/B testing and audience targeting by overriding Remote Config values for player segments |
|
|
30
|
+
|
|
31
|
+
Both file types are created via right-click in the Project window → **Create > Unity Gaming Services** and deployed via **Services > Deployment**.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Access Control
|
|
36
|
+
|
|
37
|
+
Access Control policies permit or deny access to UGS services on a **URN basis**. Each statement targets a resource URN pattern and applies a `Read`, `Write`, or `*` action for a principal (`Player` or `ServiceAccount`). **Deny takes precedence over Allow.**
|
|
38
|
+
|
|
39
|
+
| Concept | Description |
|
|
40
|
+
|---|---|
|
|
41
|
+
| **Effect** | `"Allow"` or `"Deny"` — Deny takes precedence over Allow |
|
|
42
|
+
| **Action** | `"Read"`, `"Write"`, or `"*"` (both) |
|
|
43
|
+
| **Principal** | `"Player"` (end user) or `"ServiceAccount"` (server/admin) |
|
|
44
|
+
| **Resource** | URN pattern — `urn:ugs:<service>:/<path>` with `*` and `**` wildcards |
|
|
45
|
+
|
|
46
|
+
Common use cases:
|
|
47
|
+
- Deny direct player writes to Cloud Save (force writes through Cloud Code)
|
|
48
|
+
- Deny player currency/inventory writes in Economy (only allow purchases)
|
|
49
|
+
- Restrict Cloud Code module/script invocation to specific endpoints
|
|
50
|
+
- Deny player account deletion or identity unlinking
|
|
51
|
+
|
|
52
|
+
### `.ac` File Format
|
|
53
|
+
|
|
54
|
+
**Create via:** Right-click in Project window → **Create > Unity Gaming Services > Access Control**
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"$schema": "https://ugs-config-schemas.unity3d.com/v1/project-access-policy.schema.json",
|
|
59
|
+
"statements": [
|
|
60
|
+
{
|
|
61
|
+
"Sid": "DenyPlayerCloudSaveWrites",
|
|
62
|
+
"Effect": "Deny",
|
|
63
|
+
"Action": ["Write"],
|
|
64
|
+
"Principal": "Player",
|
|
65
|
+
"Resource": "urn:ugs:cloud-save:/**"
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
| Field | Type | Description |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| `Sid` | `string` | Unique statement ID within the file |
|
|
74
|
+
| `Effect` | `string` | `"Allow"` or `"Deny"` — Deny wins over Allow |
|
|
75
|
+
| `Action` | `string` or `string[]` | `"Read"`, `"Write"`, or `"*"` (both) |
|
|
76
|
+
| `Principal` | `string` or `string[]` | `"Player"` (end user) or `"ServiceAccount"` (server/admin) |
|
|
77
|
+
| `Resource` | `string` or `string[]` | URN pattern — `urn:ugs:<service>:/<path>` |
|
|
78
|
+
|
|
79
|
+
### URN Pattern Format
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
urn:ugs:<service>:/<path>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- `*` matches a single path segment
|
|
86
|
+
- `**` matches zero or more path segments (including nested)
|
|
87
|
+
- `/**/` is commonly used to skip environment/version segments in the URL
|
|
88
|
+
|
|
89
|
+
### URN Reference by Service
|
|
90
|
+
|
|
91
|
+
#### Authentication (`player-auth`)
|
|
92
|
+
|
|
93
|
+
| URN Pattern | Description |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `urn:ugs:player-auth:/*/authentication/anonymous**` | Anonymous sign-up |
|
|
96
|
+
| `urn:ugs:player-auth:/*/authentication/external-token**` | External token sign-in (social, platform) |
|
|
97
|
+
| `urn:ugs:player-auth:/*/authentication/session-token**` | Session token sign-in |
|
|
98
|
+
| `urn:ugs:player-auth:/*/authentication/link/**` | Link external identity |
|
|
99
|
+
| `urn:ugs:player-auth:/*/authentication/unlink/**` | Unlink external identity |
|
|
100
|
+
| `urn:ugs:player-auth:/*/users**` | Player info (Read) / Delete player (Write) |
|
|
101
|
+
| `urn:ugs:player-auth:/.well-known/**` | JWKS public keys |
|
|
102
|
+
|
|
103
|
+
#### Cloud Save (`cloud-save`)
|
|
104
|
+
|
|
105
|
+
| URN Pattern | Description |
|
|
106
|
+
|---|---|
|
|
107
|
+
| `urn:ugs:cloud-save:/**` | All Cloud Save (blanket) |
|
|
108
|
+
| `urn:ugs:cloud-save:/**/players/*/keys**` | List player data keys |
|
|
109
|
+
| `urn:ugs:cloud-save:/**/players/*/items**` | Read/write player data items (own data only) |
|
|
110
|
+
| `urn:ugs:cloud-save:/**/players/*/item-batch**` | Batch write player data items |
|
|
111
|
+
| `urn:ugs:cloud-save:/**/players/query**` | Query Default player data |
|
|
112
|
+
| `urn:ugs:cloud-save:/**/players/*/public/keys**` | Read another player's public keys |
|
|
113
|
+
| `urn:ugs:cloud-save:/**/players/*/public/items**` | Read another player's public items |
|
|
114
|
+
| `urn:ugs:cloud-save:/**/players/public/query**` | Query Public player data |
|
|
115
|
+
| `urn:ugs:cloud-save:/**/custom/*/items**` | Read game-wide (Custom) data items |
|
|
116
|
+
|
|
117
|
+
#### Economy (`economy`)
|
|
118
|
+
|
|
119
|
+
| URN Pattern | Description |
|
|
120
|
+
|---|---|
|
|
121
|
+
| `urn:ugs:economy:/**/players/*/config**` | Read player economy configuration |
|
|
122
|
+
| `urn:ugs:economy:/**/currencies**` | Player currencies (Read/Write) |
|
|
123
|
+
| `urn:ugs:economy:/**/inventory**` | Player inventory (Read/Write) |
|
|
124
|
+
| `urn:ugs:economy:/**/purchases/virtual**` | Virtual purchases |
|
|
125
|
+
| `urn:ugs:economy:/**/purchases/googleplaystore**` | Google Play Store purchases |
|
|
126
|
+
| `urn:ugs:economy:/**/purchases/appleappstore**` | Apple App Store purchases |
|
|
127
|
+
|
|
128
|
+
#### Leaderboards (`leaderboards`)
|
|
129
|
+
|
|
130
|
+
| URN Pattern | Description |
|
|
131
|
+
|---|---|
|
|
132
|
+
| `urn:ugs:leaderboards:/**/leaderboards/**` | All leaderboard operations |
|
|
133
|
+
|
|
134
|
+
#### Cloud Code (`cloud-code`)
|
|
135
|
+
|
|
136
|
+
| URN Pattern | Description |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `urn:ugs:cloud-code:/**/modules/**` | Cloud Code module endpoints |
|
|
139
|
+
| `urn:ugs:cloud-code:/**/scripts/**` | Cloud Code scripts (legacy JS) |
|
|
140
|
+
| `urn:ugs:cloud-code:/**/subscriptions/tokens/**` | Subscription tokens |
|
|
141
|
+
|
|
142
|
+
### Recommended Pattern: Deny-All-Then-Allow
|
|
143
|
+
|
|
144
|
+
Start with a blanket deny, then explicitly allow only what the player needs. This ensures new services are locked down by default.
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
{
|
|
148
|
+
"$schema": "https://ugs-config-schemas.unity3d.com/v1/project-access-policy.schema.json",
|
|
149
|
+
"statements": [
|
|
150
|
+
{
|
|
151
|
+
"Sid": "Deny-all-ugs-access",
|
|
152
|
+
"Effect": "Deny",
|
|
153
|
+
"Action": ["*"],
|
|
154
|
+
"Principal": "Player",
|
|
155
|
+
"Resource": "urn:ugs:*:/**"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"Sid": "Allow-Anonymous-SignUp",
|
|
159
|
+
"Effect": "Allow",
|
|
160
|
+
"Action": ["Write"],
|
|
161
|
+
"Principal": "Player",
|
|
162
|
+
"Resource": "urn:ugs:player-auth:/*/authentication/anonymous**"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"Sid": "Allow-External-Token-SignIn",
|
|
166
|
+
"Effect": "Allow",
|
|
167
|
+
"Action": ["Write"],
|
|
168
|
+
"Principal": "Player",
|
|
169
|
+
"Resource": "urn:ugs:player-auth:/*/authentication/external-token**"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"Sid": "Allow-Session-Token-SignIn",
|
|
173
|
+
"Effect": "Allow",
|
|
174
|
+
"Action": ["Write"],
|
|
175
|
+
"Principal": "Player",
|
|
176
|
+
"Resource": "urn:ugs:player-auth:/*/authentication/session-token**"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"Sid": "Allow-Link-External-Id",
|
|
180
|
+
"Effect": "Allow",
|
|
181
|
+
"Action": ["Write"],
|
|
182
|
+
"Principal": "Player",
|
|
183
|
+
"Resource": "urn:ugs:player-auth:/*/authentication/link/**"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"Sid": "Allow-Get-PlayerInfo",
|
|
187
|
+
"Effect": "Allow",
|
|
188
|
+
"Action": ["Read"],
|
|
189
|
+
"Principal": "Player",
|
|
190
|
+
"Resource": "urn:ugs:player-auth:/*/users**"
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"Sid": "Allow-Get-JWKS",
|
|
194
|
+
"Effect": "Allow",
|
|
195
|
+
"Action": ["Read"],
|
|
196
|
+
"Principal": "Player",
|
|
197
|
+
"Resource": "urn:ugs:player-auth:/.well-known/**"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"Sid": "Allow-Read-Economy-Config",
|
|
201
|
+
"Effect": "Allow",
|
|
202
|
+
"Action": ["Read"],
|
|
203
|
+
"Principal": "Player",
|
|
204
|
+
"Resource": "urn:ugs:economy:/**/players/*/config**"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"Sid": "Allow-Read-Currencies",
|
|
208
|
+
"Effect": "Allow",
|
|
209
|
+
"Action": ["Read"],
|
|
210
|
+
"Principal": "Player",
|
|
211
|
+
"Resource": "urn:ugs:economy:/**/currencies**"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"Sid": "Allow-Read-Inventory",
|
|
215
|
+
"Effect": "Allow",
|
|
216
|
+
"Action": ["Read"],
|
|
217
|
+
"Principal": "Player",
|
|
218
|
+
"Resource": "urn:ugs:economy:/**/inventory**"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"Sid": "Allow-Virtual-Purchases",
|
|
222
|
+
"Effect": "Allow",
|
|
223
|
+
"Action": ["Write"],
|
|
224
|
+
"Principal": "Player",
|
|
225
|
+
"Resource": "urn:ugs:economy:/**/purchases/virtual**"
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"Sid": "Allow-GooglePlay-Purchases",
|
|
229
|
+
"Effect": "Allow",
|
|
230
|
+
"Action": ["Write"],
|
|
231
|
+
"Principal": "Player",
|
|
232
|
+
"Resource": "urn:ugs:economy:/**/purchases/googleplaystore**"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"Sid": "Allow-AppStore-Purchases",
|
|
236
|
+
"Effect": "Allow",
|
|
237
|
+
"Action": ["Write"],
|
|
238
|
+
"Principal": "Player",
|
|
239
|
+
"Resource": "urn:ugs:economy:/**/purchases/appleappstore**"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"Sid": "Allow-Read-Leaderboards",
|
|
243
|
+
"Effect": "Allow",
|
|
244
|
+
"Action": ["Read"],
|
|
245
|
+
"Principal": "Player",
|
|
246
|
+
"Resource": "urn:ugs:leaderboards:/**/leaderboards/**"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"Sid": "Allow-Read-CloudSave-PlayerKeys",
|
|
250
|
+
"Effect": "Allow",
|
|
251
|
+
"Action": ["Read"],
|
|
252
|
+
"Principal": "Player",
|
|
253
|
+
"Resource": "urn:ugs:cloud-save:/**/players/*/keys**"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"Sid": "Allow-CloudSave-PlayerItems",
|
|
257
|
+
"Effect": "Allow",
|
|
258
|
+
"Action": ["*"],
|
|
259
|
+
"Principal": "Player",
|
|
260
|
+
"Resource": "urn:ugs:cloud-save:/**/players/*/items**"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"Sid": "Allow-CloudSave-PlayerItemBatch",
|
|
264
|
+
"Effect": "Allow",
|
|
265
|
+
"Action": ["Write"],
|
|
266
|
+
"Principal": "Player",
|
|
267
|
+
"Resource": "urn:ugs:cloud-save:/**/players/*/item-batch**"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"Sid": "Allow-Query-Default-PlayerData",
|
|
271
|
+
"Effect": "Allow",
|
|
272
|
+
"Action": ["Write"],
|
|
273
|
+
"Principal": "Player",
|
|
274
|
+
"Resource": "urn:ugs:cloud-save:/**/players/query**"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"Sid": "Allow-Read-Public-PlayerKeys",
|
|
278
|
+
"Effect": "Allow",
|
|
279
|
+
"Action": ["Read"],
|
|
280
|
+
"Principal": "Player",
|
|
281
|
+
"Resource": "urn:ugs:cloud-save:/**/players/*/public/keys**"
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"Sid": "Allow-Read-Public-PlayerItems",
|
|
285
|
+
"Effect": "Allow",
|
|
286
|
+
"Action": ["Read"],
|
|
287
|
+
"Principal": "Player",
|
|
288
|
+
"Resource": "urn:ugs:cloud-save:/**/players/*/public/items**"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"Sid": "Allow-Query-Public-PlayerData",
|
|
292
|
+
"Effect": "Allow",
|
|
293
|
+
"Action": ["Write"],
|
|
294
|
+
"Principal": "Player",
|
|
295
|
+
"Resource": "urn:ugs:cloud-save:/**/players/public/query**"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"Sid": "Allow-Read-GameData",
|
|
299
|
+
"Effect": "Allow",
|
|
300
|
+
"Action": ["Read"],
|
|
301
|
+
"Principal": "Player",
|
|
302
|
+
"Resource": "urn:ugs:cloud-save:/**/custom/*/items**"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"Sid": "Allow-CloudCode-Modules",
|
|
306
|
+
"Effect": "Allow",
|
|
307
|
+
"Action": ["*"],
|
|
308
|
+
"Principal": "Player",
|
|
309
|
+
"Resource": "urn:ugs:cloud-code:/**/modules/**"
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"Sid": "Allow-CloudCode-Scripts",
|
|
313
|
+
"Effect": "Allow",
|
|
314
|
+
"Action": ["*"],
|
|
315
|
+
"Principal": "Player",
|
|
316
|
+
"Resource": "urn:ugs:cloud-code:/**/scripts/**"
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"Sid": "Allow-Subscription-Tokens",
|
|
320
|
+
"Effect": "Allow",
|
|
321
|
+
"Action": ["*"],
|
|
322
|
+
"Principal": "Player",
|
|
323
|
+
"Resource": "urn:ugs:cloud-code:/**/subscriptions/tokens/**"
|
|
324
|
+
}
|
|
325
|
+
]
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
This policy:
|
|
330
|
+
- **Denies** all UGS access by default
|
|
331
|
+
- **Allows** authentication (anonymous, external, session token sign-in; link external ID; read player info)
|
|
332
|
+
- **Denies** identity unlinking and player deletion (inherited from blanket deny)
|
|
333
|
+
- **Allows** economy reads (config, currencies, inventory) and purchases (virtual, Google Play, Apple App Store)
|
|
334
|
+
- **Denies** direct currency/inventory writes (inherited from blanket deny — use Cloud Code for server grants)
|
|
335
|
+
- **Allows** leaderboard reads
|
|
336
|
+
- **Allows** Cloud Save player data reads/writes for own data (Default items), public data reads, game-wide data reads
|
|
337
|
+
- **Denies** Cloud Save blanket writes (Protected data only writable via Cloud Code)
|
|
338
|
+
- **Allows** Cloud Code module, script, and subscription token access
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## Game Overrides
|
|
343
|
+
|
|
344
|
+
Game Overrides are the A/B testing and audience targeting mechanism for UGS. They override **Remote Config** values for specific player segments (audiences). Remote Config itself does not provide A/B testing — Game Overrides layer on top of it.
|
|
345
|
+
|
|
346
|
+
Use cases:
|
|
347
|
+
- A/B test different XP multipliers for player segments
|
|
348
|
+
- Roll out features gradually to targeted audiences
|
|
349
|
+
- Run time-limited promotions with different reward values
|
|
350
|
+
|
|
351
|
+
### `.ugo` File Format
|
|
352
|
+
|
|
353
|
+
**Create via:** Right-click in Project window → **Create > Unity Gaming Services > Game Override**
|
|
354
|
+
|
|
355
|
+
```json
|
|
356
|
+
{
|
|
357
|
+
"GameOverrides": [
|
|
358
|
+
{
|
|
359
|
+
"id": "double-xp-weekend",
|
|
360
|
+
"name": "Double XP Weekend",
|
|
361
|
+
"enabled": true,
|
|
362
|
+
"audiences": ["high_engagement_players"],
|
|
363
|
+
"overrides": [
|
|
364
|
+
{
|
|
365
|
+
"key": "xp_multiplier",
|
|
366
|
+
"value": 2.0
|
|
367
|
+
}
|
|
368
|
+
]
|
|
369
|
+
}
|
|
370
|
+
]
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
| Field | Type | Description |
|
|
375
|
+
|---|---|---|
|
|
376
|
+
| `id` | `string` | Unique override ID |
|
|
377
|
+
| `name` | `string` | Human-readable name |
|
|
378
|
+
| `enabled` | `bool` | Whether this override is active |
|
|
379
|
+
| `audiences` | `string[]` | Segment IDs from Unity Segmentation |
|
|
380
|
+
| `overrides[].key` | `string` | Remote Config key to override |
|
|
381
|
+
| `overrides[].value` | `any` | Replacement value |
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Editor API Models
|
|
386
|
+
|
|
387
|
+
### Access Control
|
|
388
|
+
|
|
389
|
+
```csharp
|
|
390
|
+
namespace Unity.Services.Tooling.Editor.AccessControl.Authoring.Core.Model
|
|
391
|
+
{
|
|
392
|
+
interface IProjectAccessFile
|
|
393
|
+
{
|
|
394
|
+
string Path { get; }
|
|
395
|
+
string Name { get; }
|
|
396
|
+
List<IAccessControlStatement> Statements { get; }
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
interface IAccessControlStatement
|
|
400
|
+
{
|
|
401
|
+
string Sid { get; } // Statement ID — unique within the file
|
|
402
|
+
string Effect { get; } // "Allow" or "Deny" — Deny takes precedence
|
|
403
|
+
List<string> Action { get; } // "Read", "Write", or "*" (both)
|
|
404
|
+
List<string> Principal { get; } // "Player" or "ServiceAccount"
|
|
405
|
+
List<string> Resource { get; } // URN pattern(s) the rule applies to
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Game Overrides
|
|
411
|
+
|
|
412
|
+
```csharp
|
|
413
|
+
namespace Unity.Services.Tooling.Editor.GameOverrides.Authoring.Core.Model
|
|
414
|
+
{
|
|
415
|
+
interface IGameOverride
|
|
416
|
+
{
|
|
417
|
+
string Id { get; }
|
|
418
|
+
string Name { get; }
|
|
419
|
+
bool Enabled { get; }
|
|
420
|
+
List<string> Audiences { get; }
|
|
421
|
+
List<OverrideConfig> Overrides { get; }
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
class GameOverridesConfigFile
|
|
425
|
+
{
|
|
426
|
+
public List<IGameOverride> GameOverrides { get; }
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
Both file types are discovered automatically by the Deployment Window when `com.unity.services.deployment` is installed.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: closure
|
|
3
|
+
description: Evaluates and records final IMPLEMENTED, VERIFIED, VALIDATED, DONE, or BLOCKED state using project closure mode, linked artifacts, evidence, manual gates, and explicit waivers.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Closure
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Read project closure policy, feature contract, context packet, final diff, evidence review, required linked artifacts, PO gates, and waivers. Apply lean, linked, or strict rules from [closure policy](../work/references/closure.md). Update one canonical closure record; link rather than duplicate reports and registers. A waiver applies only to its named item. Synchronize state and technical status, but never modify canon to legitimize divergence. Report the exact final state and blockers.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: Performs a read-only code review against requirements, architecture, Unity constraints, ownership, tests, performance, security, and regression risk.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Bash, Task
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Code Review
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Read the context packet, final diff, governing decisions, affected callers, and tests. Route distinct Unity, networking, security, performance, or UI lenses when needed. Report only actionable findings with severity, exact evidence, impact, and remediation direction. Verify that tests assert requirements and that serialized/lifecycle behavior is addressed. Do not edit or praise generally; state when no material issue is found.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: compatibility-review
|
|
3
|
+
description: Reviews save, serialization, API, network, content, platform, or migration compatibility and defines versioning, detection, fallback, tests, and rollback.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Bash, Task
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Compatibility Review
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Remain read-only unless a migration plan is requested. Inventory producers, consumers, stored/on-wire formats, versions, invariants, and failure modes. Identify breaking and ambiguous changes, old-data coverage, forward/backward expectations, migration idempotency, recovery, and telemetry. Return compatibility verdict, required tests, rollout/rollback, and Product Owner decisions.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: context-pack
|
|
3
|
+
description: Creates or refreshes a focused NCCGS context packet for STANDARD or CONTROLLED work, mapping requirements, canonical sections, decisions, ownership, dependencies, verification, and source revisions without copying whole documents.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Context Pack
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Read the [context packet protocol](../../nccgs/protocols/context-packets.md) and project policy. Resolve the feature ID, objective, classification, domains, and accountable owner. Map exact canonical sections and decision summaries with source revisions; list writable, read-only, protected, and generated paths; record dependencies, constraints, out-of-scope behavior, verification, and PO gates. Create or update `.nccgs/context/<feature-id>.yaml` from the template. Do not paste whole documents. Mark contradictions and the exact reason for any required full-source read. Report packet path and unresolved inputs.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dependency-review
|
|
3
|
+
description: Evaluates a proposed Unity package, SDK, service, or external dependency for necessity, fit, licensing, security, maintenance, compatibility, lock-in, migration, and rollback before adoption.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Bash, Task, WebSearch, WebFetch
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Dependency Review
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Remain read-only. Define the capability need and compare build, buy, existing-project, and no-change options. Verify current authoritative documentation, supported Unity/platform versions, license, data/privacy, operational cost, update policy, failure behavior, transitive risk, and exit plan. Recommend with evidence. Adoption or replacement requires explicit Product Owner authority and an architecture decision.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design
|
|
3
|
+
description: Designs or revises player-facing mechanics, systems, UX, levels, economy, narrative, content, or accessibility before implementation. Routes to focused design roles and preserves Product Owner control of subjective and canonical decisions.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, Task, AskUserQuestion, WebSearch, WebFetch
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Design
|
|
8
|
+
|
|
9
|
+
Produce implementation-ready design truth with the smallest complete set of specialized perspectives.
|
|
10
|
+
|
|
11
|
+
Read policy, state, relevant pillars/canon, interacting requirements, and the code constraints needed for feasibility. Distinguish exploration, focused design, and CONTROLLED cross-system change.
|
|
12
|
+
|
|
13
|
+
Select the accountable design role and only the specialists required by the domain: systems, level, economy, UX, accessibility, narrative, art, audio, live ops, or prototyping. Use Opus leadership only for cross-creative conflict or product-wide synthesis.
|
|
14
|
+
|
|
15
|
+
Separate established facts from proposals and Product Owner decisions. Batch meaningful choices with real alternatives, tradeoffs, and a recommendation. Do not ask implementation trivia.
|
|
16
|
+
|
|
17
|
+
Define applicable rules, states, formulas, feedback, dependencies, edge cases, tuning surfaces, objective acceptance criteria, subjective gates, out-of-scope behavior, and traceable requirement IDs. Consult technical roles for feasibility without letting implementation redefine intended design.
|
|
18
|
+
|
|
19
|
+
Persist accepted changes in mapped canonical sources; do not create a parallel GDD tree. Run `/design-review` for STANDARD or CONTROLLED changes. If implementation is included and decisions are closed, hand the accepted contract to `/work`.
|
|
20
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-review
|
|
3
|
+
description: Reviews a proposed or changed game design for clarity, player intent, systemic interactions, balance, UX, accessibility, canon, feasibility, and testability without approving subjective choices.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Task
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Design Review
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Remain read-only. Review the target against pillars, canonical decisions, interacting systems, platform constraints, and implementation evidence only where relevant. Use focused specialists for economy, UX, accessibility, level, narrative, art, or audio lenses. Separate contradictions, exploitable/degenerate behavior, untestable requirements, and optional improvements. Return prioritized findings, PO decisions, and implementation-readiness verdict.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: evidence-review
|
|
3
|
+
description: Independently evaluates whether accumulated tests, runtime observations, builds, reports, and manual gates actually prove each requirement and support the claimed closure state.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Bash, Task
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Evidence Review
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Read the [evidence protocol](../../nccgs/protocols/evidence.md), requirements, evidence records, test outputs, runtime/build observations, baseline, and waivers. Map every criterion to PASS, FAIL, NOT PROVEN, PO GATE, or N/A. Detect stale source revisions, unexplained count/skip changes, evidence produced before the final diff, and claims based only on inspection. Return closure impact and exact evidence still required.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hotfix
|
|
3
|
+
description: Runs a tightly scoped CONTROLLED workflow for urgent production or release-critical defects with containment, minimal change, accelerated evidence, rollback, and follow-up debt.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Task, AskUserQuestion
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Hotfix
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Confirm affected version, severity, user/data impact, reproduction, containment, release branch, and rollback. Build the smallest safe fix with one accountable writer; preserve compatibility and avoid unrelated refactors. Run targeted regression plus the release-critical checks justified by blast radius. Record evidence, known gaps, approval, release steps, rollback trigger, and required follow-up. Publication still requires explicit authority.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|