@playcraft/cli 0.0.56 → 0.0.58
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/README.md +41 -26
- package/REMIX.md +17 -5
- package/dist/cli-root-help.js +1 -0
- package/dist/commands/build-all.js +10 -9
- package/dist/commands/build.js +13 -12
- package/dist/commands/create.js +26 -33
- package/dist/commands/platform-skills.generated.js +19 -0
- package/dist/commands/remix.js +48 -2
- package/dist/commands/skills.js +2 -0
- package/dist/commands/tools-generation.js +1 -1
- package/dist/commands/workspace-runtime.js +54 -0
- package/dist/index.js +3 -1
- package/dist/project-skills/commands.js +72 -0
- package/dist/project-skills/lifecycle.js +28 -0
- package/dist/project-skills/local-run.js +112 -0
- package/dist/project-skills/local-store.js +149 -0
- package/dist/project-skills/messages.js +72 -0
- package/dist/project-skills/reconcile.js +62 -0
- package/dist/project-skills/remote-cache.js +51 -0
- package/dist/project-skills/validation.js +19 -0
- package/dist/remix/clone.js +4 -1
- package/dist/remix/init-template.js +2 -0
- package/dist/remix/local-git.js +56 -0
- package/dist/remix/pull.js +66 -0
- package/dist/remix/push.js +90 -0
- package/dist/utils/agent-api-client.js +54 -17
- package/dist/utils/tool-operation-journal.js +54 -0
- package/dist/workspace-runtime/codex/app-server.js +395 -0
- package/dist/workspace-runtime/codex/config-toml.js +25 -0
- package/dist/workspace-runtime/codex/jsonrpc-stdio.js +106 -0
- package/dist/workspace-runtime/codex/loopback.js +59 -0
- package/dist/workspace-runtime/codex/native-adapter.js +3 -0
- package/dist/workspace-runtime/main.js +10 -0
- package/dist/workspace-runtime/persistence/journal.js +350 -0
- package/dist/workspace-runtime/processes/managed-writes.js +69 -0
- package/dist/workspace-runtime/serve.js +111 -0
- package/dist/workspace-runtime/server/auth.js +21 -0
- package/dist/workspace-runtime/server/dispatch.js +861 -0
- package/dist/workspace-runtime/server/execution-group.js +88 -0
- package/dist/workspace-runtime/server/http.js +561 -0
- package/dist/workspace-runtime/server/lock.js +53 -0
- package/dist/workspace-runtime/server/types.js +1 -0
- package/dist/workspace-runtime/workspaces/context-error.js +2 -0
- package/dist/workspace-runtime/workspaces/file-snapshot.js +213 -0
- package/dist/workspace-runtime/workspaces/files.js +143 -0
- package/dist/workspace-runtime/workspaces/git.js +242 -0
- package/dist/workspace-runtime/workspaces/json5-edit.js +170 -0
- package/dist/workspace-runtime/workspaces/parameters.js +272 -0
- package/dist/workspace-runtime/workspaces/prepare.js +364 -0
- package/dist/workspace-runtime/workspaces/registry.js +107 -0
- package/dist/workspace-runtime/workspaces/revisions.js +31 -0
- package/package.json +6 -3
- package/project-template-v2/.claude/agents/artist.md +82 -0
- package/project-template-v2/.claude/agents/developer.md +153 -0
- package/project-template-v2/.claude/agents/game-designer.md +264 -0
- package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +533 -0
- package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +153 -0
- package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +27 -0
- package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +208 -0
- package/project-template-v2/.claude/agents/refs/atom-skill-library.md +81 -0
- package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +432 -0
- package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +252 -0
- package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +266 -0
- package/project-template-v2/.claude/agents/refs/framework-mda.md +147 -0
- package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +123 -0
- package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +88 -0
- package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +67 -0
- package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +120 -0
- package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +300 -0
- package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +495 -0
- package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +1141 -0
- package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +111 -0
- package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +365 -0
- package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +412 -0
- package/project-template-v2/.claude/agents/reviewer.md +75 -0
- package/project-template-v2/.claude/agents/technical-artist.md +86 -0
- package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +243 -0
- package/project-template-v2/.claude/hooks/user-prompt.mjs +133 -0
- package/project-template-v2/.claude/settings.json +33 -0
- package/project-template-v2/.claude/skills/brainstorming/SKILL.md +161 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +270 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +177 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +354 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +148 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +56 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +62 -0
- package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +309 -0
- package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +182 -0
- package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +123 -0
- package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +205 -0
- package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +280 -0
- package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +184 -0
- package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +306 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +298 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +123 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +254 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +324 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +97 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +118 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +137 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +397 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +296 -0
- package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +122 -0
- package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +219 -0
- package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +373 -0
- package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +161 -0
- package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +215 -0
- package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +382 -0
- package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +423 -0
- package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +158 -0
- package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +100 -0
- package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +167 -0
- package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +270 -0
- package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +236 -0
- package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +130 -0
- package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +390 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +240 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +226 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +308 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +275 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +134 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +142 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +153 -0
- package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +386 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +182 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +72 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +121 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +102 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +127 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +106 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +128 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +67 -0
- package/project-template-v2/.claude/snapshot.mjs +263 -0
- package/project-template-v2/.playcraft/skills.lock.json +152 -0
- package/project-template-v2/CLAUDE.md +146 -0
- package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
- package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
- package/project-template-v2/assets/bundles/.gitkeep +0 -0
- package/project-template-v2/assets/images/bg/.gitkeep +0 -0
- package/project-template-v2/assets/images/reference/.gitkeep +0 -0
- package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
- package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
- package/project-template-v2/assets/images/ui/.gitkeep +0 -0
- package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
- package/project-template-v2/assets/models/.gitkeep +0 -0
- package/project-template-v2/docs/harness/iteration-1/context-flow.md +254 -0
- package/project-template-v2/docs/harness/iteration-1/generate-flow.md +91 -0
- package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +214 -0
- package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +75 -0
- package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +63 -0
- package/project-template-v2/docs/harness/iteration-2/context-flow.md +223 -0
- package/project-template-v2/docs/harness/iteration-2/generate-flow.md +129 -0
- package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +267 -0
- package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +164 -0
- package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +115 -0
- package/project-template-v2/docs/harness/orchestrator-flow.md +364 -0
- package/project-template-v2/docs/project-state.json +60 -0
- package/project-template-v2/docs/project-state.md +72 -0
- package/project-template-v2/docs/standards/README.md +225 -0
- package/project-template-v2/docs/standards/agent-behavior-standards.md +174 -0
- package/project-template-v2/docs/standards/artifacts/design-brief.md +19 -0
- package/project-template-v2/docs/standards/artifacts/design.md +22 -0
- package/project-template-v2/docs/standards/artifacts/game-code.md +41 -0
- package/project-template-v2/docs/standards/artifacts/todo-list.md +41 -0
- package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +343 -0
- package/project-template-v2/game/index.ts +18 -0
- package/project-template-v2/globals.d.ts +51 -0
- package/project-template-v2/index.css +34 -0
- package/project-template-v2/index.html +18 -0
- package/project-template-v2/main.ts +9 -0
- package/project-template-v2/package.json +46 -0
- package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +31 -0
- package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +86 -0
- package/project-template-v2/skills/_shared/scripts/dod-check.mjs +153 -0
- package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +70 -0
- package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +91 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +131 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +80 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +90 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +93 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +23 -0
- package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +230 -0
- package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +58 -0
- package/project-template-v2/skills/_shared/scripts/state-get.mjs +339 -0
- package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +39 -0
- package/project-template-v2/skills/_shared/scripts/state-set.mjs +94 -0
- package/project-template-v2/skills/_shared/scripts/state-store.mjs +783 -0
- package/project-template-v2/skills/_shared/scripts/todo-add.mjs +88 -0
- package/project-template-v2/skills/_shared/scripts/todo-get.mjs +130 -0
- package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +33 -0
- package/project-template-v2/skills/_shared/scripts/todo-set.mjs +47 -0
- package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +268 -0
- package/project-template-v2/skills/_shared/scripts/verify-env.mjs +285 -0
- package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +161 -0
- package/project-template-v2/skills/playable-autoplay/SKILL.md +176 -0
- package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +4 -0
- package/project-template-v2/skills/playable-debug/SKILL.md +116 -0
- package/project-template-v2/skills/playable-debug/agents/openai.yaml +4 -0
- package/project-template-v2/skills/playable-debug/references/debug-config.md +40 -0
- package/project-template-v2/skills/playable-record/SKILL.md +140 -0
- package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +104 -0
- package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +141 -0
- package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +425 -0
- package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +261 -0
- package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +398 -0
- package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +322 -0
- package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +105 -0
- package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +230 -0
- package/project-template-v2/skills/playable-validate/SKILL.md +61 -0
- package/project-template-v2/skills/playable-validate/validation-rules.md +14 -0
- package/project-template-v2/skills/playable-verify-ui/SKILL.md +63 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +1 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +218 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +51 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +59 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +106 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +116 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +59 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +64 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +58 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +333 -0
- package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
- package/project-template-v2/tsconfig.json +20 -0
- package/project-template-v2/vite.config.ts +27 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# 5-Component Filter 框架 — 机制好玩度快速检验
|
|
2
|
+
|
|
3
|
+
## 原始来源
|
|
4
|
+
|
|
5
|
+
- **出处**:https://mcpmarket.com/zh/tools/skills/game-design-framework
|
|
6
|
+
- **性质**:这是一个 Claude Code Skill 中提出的实战框架,并非学术论文。它综合了多个游戏设计理论(MDA、Game Feel 等),形成了一套**快速可操作**的机制评估工具。
|
|
7
|
+
- **关联理论**:
|
|
8
|
+
- Steve Swink 的 Game Feel 6 组件(Response 对应"实时控制",Satisfaction 对应"多汁性")
|
|
9
|
+
- MDA 框架的 Aesthetics 层(Motivation 对应"目标情感",Fit 对应"整体一致性")
|
|
10
|
+
- Nielsen 的可用性启发式(Clarity 对应"系统可见性"和"匹配现实世界")
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 一、核心思想
|
|
15
|
+
|
|
16
|
+
5-Component Filter 是一个**快速评估清单**,用于在设计和迭代阶段检验每一个游戏机制是否"好玩"。
|
|
17
|
+
|
|
18
|
+
它的核心问题是:
|
|
19
|
+
|
|
20
|
+
> **"这个机制通过了以下 5 项检查吗?如果任一项不通过,它就不会好玩。"**
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 二、5 个组件详解
|
|
25
|
+
|
|
26
|
+
### 组件 1:Clarity(清晰度)
|
|
27
|
+
|
|
28
|
+
> **核心问题:玩家在 3 秒内能看懂怎么玩吗?**
|
|
29
|
+
|
|
30
|
+
| 维度 | 检查点 |
|
|
31
|
+
| ---------------- | ----------------------------------------------------- |
|
|
32
|
+
| **视觉可见性** | 可操作对象是否视觉突出?能否一眼分辨什么能点/不能点? |
|
|
33
|
+
| **动作可猜测性** | 不看教程,玩家能猜到该做什么吗? |
|
|
34
|
+
| **反馈明确性** | 操作后发生了什么——成功还是失败——是否立刻清晰? |
|
|
35
|
+
| **状态可读性** | 当前游戏状态(分数、剩余步数、进度)是否随时可读? |
|
|
36
|
+
|
|
37
|
+
**评分标准**:
|
|
38
|
+
| 等级 | 描述 |
|
|
39
|
+
|------|------|
|
|
40
|
+
| ⭐⭐⭐ | 零教程可上手,3 秒内理解玩法 |
|
|
41
|
+
| ⭐⭐ | 需要 1 次提示或试错后理解 |
|
|
42
|
+
| ⭐ | 需要文字教程或多次试错 |
|
|
43
|
+
| ❌ | 5 秒后仍不知道该做什么 |
|
|
44
|
+
|
|
45
|
+
**Playable Ad 中的硬约束**:
|
|
46
|
+
|
|
47
|
+
> 在 Playable Ad 中,Clarity 是**生死线**。玩家不会花超过 3 秒去"学"一个广告。如果不能即刻理解,就会关闭。
|
|
48
|
+
|
|
49
|
+
**常见修复手段**:
|
|
50
|
+
|
|
51
|
+
- 手指引导动画(指示首次操作)
|
|
52
|
+
- 高亮可操作区域
|
|
53
|
+
- 第一步设计为"不可能失败"
|
|
54
|
+
- 减少首屏信息量
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### 组件 2:Motivation(动机)
|
|
59
|
+
|
|
60
|
+
> **核心问题:玩家为什么想做这个动作?**
|
|
61
|
+
|
|
62
|
+
| 维度 | 检查点 |
|
|
63
|
+
| -------------- | ------------------------------------ |
|
|
64
|
+
| **目标可见性** | 玩家是否知道自己在朝什么目标努力? |
|
|
65
|
+
| **进度感** | 每次操作后是否感到"离目标更近了"? |
|
|
66
|
+
| **奖励预期** | 玩家是否期待下一个动作会带来好结果? |
|
|
67
|
+
| **紧迫感** | 是否有时间/步数/空间等约束驱动行动? |
|
|
68
|
+
|
|
69
|
+
**评分标准**:
|
|
70
|
+
| 等级 | 描述 |
|
|
71
|
+
|------|------|
|
|
72
|
+
| ⭐⭐⭐ | 玩家主动想做、停不下来 |
|
|
73
|
+
| ⭐⭐ | 知道该做什么但没有强烈冲动 |
|
|
74
|
+
| ⭐ | 被动执行,缺乏内在驱动力 |
|
|
75
|
+
| ❌ | "为什么我要做这个?" |
|
|
76
|
+
|
|
77
|
+
**设计策略**:
|
|
78
|
+
|
|
79
|
+
| 策略 | 机制示例 | 适用场景 |
|
|
80
|
+
| ------------ | -------------------------------------- | ---------- |
|
|
81
|
+
| **可见目标** | 进度条、目标分数、"消除 30 个红色方块" | 所有类型 |
|
|
82
|
+
| **短期奖励** | 每次匹配后的分数弹出、金币收集动画 | 休闲消除 |
|
|
83
|
+
| **紧迫感** | 倒计时、步数限制、上升的障碍 | 增加挑战感 |
|
|
84
|
+
| **好奇心** | 翻转显示隐藏图案、解锁新内容预览 | 探索发现类 |
|
|
85
|
+
| **差一点感** | 失败时显示"还差 2 个就赢了!" | 转化驱动 |
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### 组件 3:Response(响应性)
|
|
90
|
+
|
|
91
|
+
> **核心问题:操作后 100ms 内有反馈吗?**
|
|
92
|
+
|
|
93
|
+
| 维度 | 检查点 |
|
|
94
|
+
| ---------- | ------------------------------------ |
|
|
95
|
+
| **即时性** | 触摸/点击后有即时视觉+听觉反馈吗? |
|
|
96
|
+
| **多通道** | 反馈是否同时涵盖视觉+听觉(+触觉)? |
|
|
97
|
+
| **比例性** | 反馈强度是否与动作重要性成正比? |
|
|
98
|
+
| **一致性** | 相同操作的反馈是否每次都一致? |
|
|
99
|
+
|
|
100
|
+
**评分标准**:
|
|
101
|
+
| 等级 | 描述 |
|
|
102
|
+
|------|------|
|
|
103
|
+
| ⭐⭐⭐ | 每次操作都有多通道即时反馈,爽快利落 |
|
|
104
|
+
| ⭐⭐ | 有反馈但单通道或有延迟感 |
|
|
105
|
+
| ⭐ | 部分操作无反馈或反馈不一致 |
|
|
106
|
+
| ❌ | 操作后没有任何可感知的变化 |
|
|
107
|
+
|
|
108
|
+
**这与 Steve Swink 的 Game Feel 直接对应**:
|
|
109
|
+
|
|
110
|
+
- 100ms 阈值 → 来自 Swink 的"实时控制"组件
|
|
111
|
+
- 多通道反馈 → 来自 Swink 的"润色"组件
|
|
112
|
+
- 比例性 → 来自 Swink 的"多汁性"组件
|
|
113
|
+
|
|
114
|
+
**快速检查表**:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
□ 点击有按下缩放效果?
|
|
118
|
+
□ 松手有弹起动画?
|
|
119
|
+
□ 匹配成功有消除动画?
|
|
120
|
+
□ 消除有音效?
|
|
121
|
+
□ 连击有升级反馈?
|
|
122
|
+
□ 失败有挫败感反馈(但不惩罚)?
|
|
123
|
+
□ 每一帧都有东西在动?
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
### 组件 4:Satisfaction(满足感)
|
|
129
|
+
|
|
130
|
+
> **核心问题:每次成功操作有"爽"的感觉吗?**
|
|
131
|
+
|
|
132
|
+
| 维度 | 检查点 |
|
|
133
|
+
| -------------- | ---------------------------------------------- |
|
|
134
|
+
| **"啊哈"时刻** | 操作结果是否超出玩家预期?(如意外的连锁消除) |
|
|
135
|
+
| **感官奖励** | 成功是否伴随视觉+听觉的"爆发"? |
|
|
136
|
+
| **成长曲线** | 随着游戏进行,满足感是否在升级? |
|
|
137
|
+
| **对比度** | 成功与未成功之间的反馈差距是否足够大? |
|
|
138
|
+
|
|
139
|
+
**评分标准**:
|
|
140
|
+
| 等级 | 描述 |
|
|
141
|
+
|------|------|
|
|
142
|
+
| ⭐⭐⭐ | 每次成功都想"再来一次",有近乎上瘾的满足感 |
|
|
143
|
+
| ⭐⭐ | 成功有正反馈但缺乏"wow"时刻 |
|
|
144
|
+
| ⭐ | 成功与失败的感觉差距不大 |
|
|
145
|
+
| ❌ | 成功了也没什么特别感觉 |
|
|
146
|
+
|
|
147
|
+
**满足感的层级设计**(对应 Juice 的"连击升级"):
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
Level 1(单次匹配) → 小粒子 + 轻音效
|
|
151
|
+
Level 2(连击 ×2) → 更多粒子 + 音高上升 + 飘字
|
|
152
|
+
Level 3(连击 ×3) → 屏幕震动 + 大粒子 + 连击文字
|
|
153
|
+
Level 4(超级连击) → 全屏特效 + 慢动作 + 欢呼声
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
> **关键洞察**:满足感 = Response(响应性)× Surprise(惊喜度)。同样的响应如果每次都完全一样,会逐渐麻木。适度的随机性和升级机制维持满足感。
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
### 组件 5:Fit(契合度)
|
|
161
|
+
|
|
162
|
+
> **核心问题:这个机制与整体风格搭吗?**
|
|
163
|
+
|
|
164
|
+
| 维度 | 检查点 |
|
|
165
|
+
| ------------------ | -------------------------------------- |
|
|
166
|
+
| **与主题一致** | 机制是否与游戏的视觉主题和世界观匹配? |
|
|
167
|
+
| **与其他机制协同** | 这个机制是否与其他机制产生有趣的交互? |
|
|
168
|
+
| **与目标受众匹配** | 机制的复杂度是否适合目标玩家? |
|
|
169
|
+
| **与平台特性适配** | 机制是否利用了平台的特有输入方式? |
|
|
170
|
+
|
|
171
|
+
**评分标准**:
|
|
172
|
+
| 等级 | 描述 |
|
|
173
|
+
|------|------|
|
|
174
|
+
| ⭐⭐⭐ | 机制与整体风格浑然一体、不可分割 |
|
|
175
|
+
| ⭐⭐ | 机制与整体搭配,但有可改进空间 |
|
|
176
|
+
| ⭐ | 机制感觉像是"外挂"上去的 |
|
|
177
|
+
| ❌ | 明显与游戏整体格格不入 |
|
|
178
|
+
|
|
179
|
+
**Fit 的检查维度扩展**:
|
|
180
|
+
|
|
181
|
+
| 契合维度 | 好的例子 | 坏的例子 |
|
|
182
|
+
| ---------- | -------------------------- | ------------------------ |
|
|
183
|
+
| 主题契合 | 果冻消除游戏用"弹弹弹"动画 | 中世纪骑士游戏用霓虹粒子 |
|
|
184
|
+
| 节奏契合 | 休闲消除的慢节奏配柔和配乐 | 放松游戏用高速闪烁特效 |
|
|
185
|
+
| 复杂度契合 | 休闲广告用单指操作 | 休闲广告用 5 步组合操作 |
|
|
186
|
+
| 平台契合 | 移动端用滑动/点击 | 移动端用双指旋转缩放 |
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 三、5-Component Filter 的使用方法
|
|
191
|
+
|
|
192
|
+
### 方法 1:单机制评估卡
|
|
193
|
+
|
|
194
|
+
评估一个具体的游戏机制(如"滑动交换两个相邻方块"):
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
机制名称: [交换消除]
|
|
198
|
+
┌──────────────┬────────┬─────────────────────────┐
|
|
199
|
+
│ Component │ Score │ Notes │
|
|
200
|
+
├──────────────┼────────┼─────────────────────────┤
|
|
201
|
+
│ Clarity │ ⭐⭐⭐ │ 滑动方向=交换方向,直觉 │
|
|
202
|
+
│ Motivation │ ⭐⭐⭐ │ 可见的目标分数+步数限制 │
|
|
203
|
+
│ Response │ ⭐⭐ │ 缺少消除音效,需补充 │
|
|
204
|
+
│ Satisfaction │ ⭐⭐ │ 连锁反馈不够强烈 │
|
|
205
|
+
│ Fit │ ⭐⭐⭐ │ 与糖果主题完美搭配 │
|
|
206
|
+
└──────────────┴────────┴─────────────────────────┘
|
|
207
|
+
最低分: Response (⭐⭐) & Satisfaction (⭐⭐)
|
|
208
|
+
优先改进: 添加消除音效 + 增强连锁视觉反馈
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 方法 2:多机制对比
|
|
212
|
+
|
|
213
|
+
在 Brainstorm 阶段比较多个候选机制:
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
Clarity Motivation Response Satisfaction Fit Total
|
|
217
|
+
方案A-滑动交换 ⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐ ⭐⭐⭐ 13
|
|
218
|
+
方案B-点击选取 ⭐⭐ ⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐ 11
|
|
219
|
+
方案C-拖拽放置 ⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐ ⭐⭐ 12
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### 方法 3:迭代检查点
|
|
223
|
+
|
|
224
|
+
在开发过程中定期使用,特别是:
|
|
225
|
+
|
|
226
|
+
1. **Brainstorm 后**:评估概念是否有基本的好玩潜力
|
|
227
|
+
2. **原型完成后**:第一次可玩版本的快速健检
|
|
228
|
+
3. **Juice 添加后**:确认 Juice 是否真的提升了各项分数
|
|
229
|
+
4. **最终交付前**:确保没有组件被遗漏
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 四、快速诊断表
|
|
234
|
+
|
|
235
|
+
当 QA 或玩家说"不好玩"但说不清原因时,用此表逐项排查:
|
|
236
|
+
|
|
237
|
+
| 玩家的模糊反馈 | 最可能的缺失组件 | 优先修复方向 |
|
|
238
|
+
| ----------------------- | ---------------- | ---------------------------------- |
|
|
239
|
+
| "不知道该干什么" | Clarity | 加引导动画、高亮可操作区 |
|
|
240
|
+
| "没意思" / "为什么要玩" | Motivation | 加可见目标、紧迫感、奖励预览 |
|
|
241
|
+
| "操作没感觉" / "卡卡的" | Response | 加即时反馈、音效、缓动动画 |
|
|
242
|
+
| "赢了也没什么感觉" | Satisfaction | 加连击反馈、胜利演出、对比度 |
|
|
243
|
+
| "感觉怪怪的" / "不搭" | Fit | 检查主题一致性、节奏匹配、平台适配 |
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 五、参考资源
|
|
248
|
+
|
|
249
|
+
- 🔗 **框架来源**:[Game Design & Mechanics Framework (MCP Market)](https://mcpmarket.com/zh/tools/skills/game-design-framework)
|
|
250
|
+
- 📕 **Clarity 理论基础**:Jakob Nielsen 的 [10 Usability Heuristics](https://www.nngroup.com/articles/ten-usability-heuristics/)
|
|
251
|
+
- 📕 **Response 理论基础**:Steve Swink 的 [Game Feel (2008)](https://www.taylorfrancis.com/books/mono/10.1201/9781482267334/game-feel-steve-swink)
|
|
252
|
+
- 📕 **Motivation 理论基础**:MDA 框架的 [Aesthetics Taxonomy](https://www.researchgate.net/publication/228884866_MDA_A_Formal_Approach_to_Game_Design_and_Game_Research)
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# Game Feel & Game Juice 框架
|
|
2
|
+
|
|
3
|
+
## 原始来源
|
|
4
|
+
|
|
5
|
+
### 理论基石
|
|
6
|
+
|
|
7
|
+
- **书籍**:Steve Swink (2008). _Game Feel: A Game Designer's Guide to Virtual Sensation_. Morgan Kaufmann.
|
|
8
|
+
- 详细解读:https://www.gamejuice.co.uk/articles/swink-6-components-game-feel
|
|
9
|
+
|
|
10
|
+
### 经典演讲
|
|
11
|
+
|
|
12
|
+
- **Juice it or Lose it** (2012) — Martin Jonasson & Petri Purho,Nordic Game Indie Night
|
|
13
|
+
- 解读:https://www.gamejuice.co.uk/articles/juice-it-or-lose-it-lessons
|
|
14
|
+
- **The Art of Screenshake** (2013) — Jan Willem Nijman (Vlambeer), INDIGO Classes
|
|
15
|
+
- 中文解读:https://blog.chosenconcept.dev/tw/posts/2022/11/0012-the-art-of-screenshake/
|
|
16
|
+
|
|
17
|
+
### 综合参考
|
|
18
|
+
|
|
19
|
+
- Making Games 'Juicy':https://abagames.github.io/joys-of-small-game-development-en/make_game_juicy.html
|
|
20
|
+
- Game Feel 资源汇总:https://marcosecchi.github.io/resources/pages/gamedesign_game-feel.html
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 一、什么是 Game Feel?
|
|
25
|
+
|
|
26
|
+
Game Feel(游戏手感)是指**玩家在操控游戏时感受到的无形触感**——为什么同样是"跳跃",《超级马里奥》的跳跃就是比其他游戏"更舒服"?Game Feel 就是对这种差异的系统性解释。
|
|
27
|
+
|
|
28
|
+
Steve Swink 在 2008 年的同名著作中首次将 Game Feel 系统化为 **6 个组件**,为"什么让游戏玩起来感觉好"提供了可分析、可诊断的结构框架。
|
|
29
|
+
|
|
30
|
+
> **Game Feel 不是一个配方,而是一把测量工具和一套诊断语言。**
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 二、Steve Swink 的 6 个 Game Feel 组件
|
|
35
|
+
|
|
36
|
+
### 组件 1:Real-Time Control(实时控制)
|
|
37
|
+
|
|
38
|
+
**定义**:玩家必须能**直接**操控虚拟对象,且输入获得**即时**响应。
|
|
39
|
+
|
|
40
|
+
**关键阈值**:
|
|
41
|
+
|
|
42
|
+
- **100ms**:超过此延迟,大脑不再认为这是"直接控制",而像是在"下达命令等执行"
|
|
43
|
+
- **一致性 > 速度**:不稳定的 80ms 延迟比稳定的 100ms 感觉更糟
|
|
44
|
+
|
|
45
|
+
**常见问题及修复**:
|
|
46
|
+
| 问题 | 原因 | 修复方式 |
|
|
47
|
+
|------|------|---------|
|
|
48
|
+
| 操控迟钝 | 输入延迟过高 | 减少帧延迟,优化输入管线 |
|
|
49
|
+
| 动作"卡住" | 必须等动画播完才能响应 | 输入缓存、动画取消、设置可打断帧 |
|
|
50
|
+
| 感觉不灵敏 | 帧率不稳定 | 固定物理步长,与渲染帧率解耦 |
|
|
51
|
+
|
|
52
|
+
### 组件 2:Simulated Space(空间模拟)
|
|
53
|
+
|
|
54
|
+
**定义**:游戏世界必须遵循**内部一致**的物理规则(重量、动量、碰撞、重力)。
|
|
55
|
+
|
|
56
|
+
物理可以夸张,**但必须可预测**。
|
|
57
|
+
|
|
58
|
+
**核心原则**:
|
|
59
|
+
|
|
60
|
+
- 不可预测的物理让人愤怒——不是因为"不真实",而是因为"无法建立心理模型"
|
|
61
|
+
- 模拟必须延伸到玩家能互动的所有事物
|
|
62
|
+
|
|
63
|
+
**经典案例**:
|
|
64
|
+
|
|
65
|
+
- **《蔚蓝》(Celeste)**:物理完全不真实(空中冲刺违反物理定律),但内部绝对一致,玩家能精准预测落点
|
|
66
|
+
- **反例**:角色有时被击退 3 格有时 5 格,没有可见原因 → 玩家困惑
|
|
67
|
+
|
|
68
|
+
### 组件 3:Polish(润色)
|
|
69
|
+
|
|
70
|
+
**定义**:游戏性非严格必需、但能让体验更丰富的修饰层——粒子、屏幕震动、音效、动画细节、拖尾等。
|
|
71
|
+
|
|
72
|
+
这就是大众常说的 **"Juice"**。
|
|
73
|
+
|
|
74
|
+
**⚠️ 关键顺序**:
|
|
75
|
+
|
|
76
|
+
> **润色排在第三位,不是第一位。** 它是**放大器**——放大已经感觉良好的空间模拟。如果底层模拟很弱,润色只会让弱点更刺眼。
|
|
77
|
+
|
|
78
|
+
**一致性要求**:
|
|
79
|
+
|
|
80
|
+
- 特效必须形成一种"语言"——屏幕震动在不同语境下不能意思矛盾
|
|
81
|
+
- 润色层应是有统一语法的系统,而非随意堆砌
|
|
82
|
+
|
|
83
|
+
### 组件 4:Metaphor(隐喻)
|
|
84
|
+
|
|
85
|
+
**定义**:虚拟对象与玩家**现实物理理解**之间的连接。
|
|
86
|
+
|
|
87
|
+
玩家带着一生的物理体验来玩游戏。当虚拟互动与真实物理感觉共鸣时,会产生近乎潜意识的"正确感"。
|
|
88
|
+
|
|
89
|
+
**示例**:
|
|
90
|
+
| 隐喻匹配 | 效果 |
|
|
91
|
+
|---------|------|
|
|
92
|
+
| 重物落地→低沉轰鸣+屏幕微震 | ✅ 符合物理直觉,感觉"对" |
|
|
93
|
+
| 爆头→清脆尖锐声+短衰减 | ✅ 高冲击碰撞的真实声学特征 |
|
|
94
|
+
| 仙女魔杖→榴弹发射器声效 | ❌ 隐喻破裂,反馈与世界矛盾 |
|
|
95
|
+
|
|
96
|
+
### 组件 5:Juiciness(多汁性)
|
|
97
|
+
|
|
98
|
+
**定义**:**最小输入产生最大输出**的特质。游戏对每个动作给予不成比例的丰厚反馈。
|
|
99
|
+
|
|
100
|
+
**核心理念**:让玩家每一个微小操作都感到"有力量、有效果"。
|
|
101
|
+
|
|
102
|
+
**⚠️ 需要层级**:
|
|
103
|
+
|
|
104
|
+
- 每次操作都全屏爆炸 → 反而削弱了真正重大事件的冲击力
|
|
105
|
+
- 正确做法:**小动作小奖励,大动作大奖励**,建立清晰的反馈层级
|
|
106
|
+
|
|
107
|
+
**玩具测试**(源自马里奥 64 团队):
|
|
108
|
+
|
|
109
|
+
> 在没有关卡、没有敌人的空房间里,光是跑、跳、操作,是否就已经令人满足?如果是,你就拥有了 Juiciness。
|
|
110
|
+
|
|
111
|
+
### 组件 6:Mastery(学习与精通)
|
|
112
|
+
|
|
113
|
+
**定义**:随着玩家内化操控、开始流畅行动,手感随时间**不断加深**的掌控感。
|
|
114
|
+
|
|
115
|
+
**深度 vs 天花板**:
|
|
116
|
+
|
|
117
|
+
- 操控系统必须足够深,让精通能持续产生新能力
|
|
118
|
+
- 操控太浅 → 很快触及天花板 → 玩家失去兴趣
|
|
119
|
+
- 精通创造**心流**——这是长期留存的核心
|
|
120
|
+
|
|
121
|
+
> **对 Playable Ad 的特殊考量**:15 秒内无法实现深度精通,但可以设计"可感知的操控深度"——让玩家觉得"如果我再玩一会儿,我能做得更好",这正是转化的驱动力。
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 三、Game Feel 诊断工具
|
|
126
|
+
|
|
127
|
+
当游戏"感觉不对"时,按组件逐一排查:
|
|
128
|
+
|
|
129
|
+
| 症状 | 对应组件 | 诊断方向 |
|
|
130
|
+
| --------------------- | ---------- | -------------------------------------- |
|
|
131
|
+
| 操控迟钝、无响应 | ① 实时控制 | 查输入延迟、动画打断帧、响应时机 |
|
|
132
|
+
| 移动不可预测、轻飘 | ② 空间模拟 | 查物理一致性、重力曲线、动量传递 |
|
|
133
|
+
| 有特效但仍觉无力 | ③ 润色 | 查反馈通道是否同步、反馈语言是否一致 |
|
|
134
|
+
| 技术正确但情感平淡 | ④ 隐喻 | 查反馈是否匹配世界逻辑和玩家物理直觉 |
|
|
135
|
+
| 动作缺乏震撼力 | ⑤ 多汁性 | 查反馈的规模和种类与动作重要性是否匹配 |
|
|
136
|
+
| 老手停止进步/失去兴趣 | ⑥ 精通 | 控制系统有天花板,阻碍了技巧表达 |
|
|
137
|
+
|
|
138
|
+
**组件间的依赖关系**:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
① 实时控制 ← 基础。没有它,⑥精通不可能
|
|
142
|
+
② 空间模拟 ← ③润色的基座。模拟弱则润色制造混乱
|
|
143
|
+
④ 隐喻 ← 绑定整个系统。没有它,所有反馈情感空洞
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 四、Game Juice 实操清单
|
|
149
|
+
|
|
150
|
+
Juice 是 Game Feel 中"润色"和"多汁性"组件的具体实现手段。以下综合了 **Juice it or Lose it** 演讲和 **The Art of Screenshake** 演讲中的所有技术:
|
|
151
|
+
|
|
152
|
+
### 4.1 视觉反馈
|
|
153
|
+
|
|
154
|
+
| # | 技术 | 描述 | 示例 |
|
|
155
|
+
| --- | -------------------------------- | ------------------------- | --------------------- |
|
|
156
|
+
| 1 | **Squash & Stretch(挤压拉伸)** | 物体弹跳/碰撞时的形变动画 | 球落地时压扁再弹起 |
|
|
157
|
+
| 2 | **Screen Shake(屏幕震动)** | 碰撞/消除时的短暂画面抖动 | 消除方块时轻震 0.1 秒 |
|
|
158
|
+
| 3 | **Particles(粒子特效)** | 碰撞/消除时喷射的粒子 | 方块消除时碎片飞溅 |
|
|
159
|
+
| 4 | **Flash/Blink(闪白/闪烁)** | 受击/激活时的短暂颜色变化 | 敌人被打中闪白 1 帧 |
|
|
160
|
+
| 5 | **Color Change(颜色变化)** | 根据状态变化调整颜色 | HP 低时角色变红 |
|
|
161
|
+
| 6 | **Trail(拖尾)** | 移动物体留下的轨迹 | 子弹拖出光轨 |
|
|
162
|
+
| 7 | **Muzzle Flash(枪口焰)** | 发射/释放时的源头特效 | 射击时枪口闪火 |
|
|
163
|
+
| 8 | **Impact VFX(命中特效)** | 击中目标时的视觉标记 | 命中时溅射火花 |
|
|
164
|
+
| 9 | **Permanence(永久痕迹)** | 保留战斗/操作的视觉痕迹 | 地上留有碎片 |
|
|
165
|
+
|
|
166
|
+
### 4.2 动画与运动
|
|
167
|
+
|
|
168
|
+
| # | 技术 | 描述 | 示例 |
|
|
169
|
+
| --- | -------------------------------------- | --------------------- | ------------------------ |
|
|
170
|
+
| 10 | **Tweening/Easing(缓动)** | 所有运动使用缓动曲线 | 方块落下用 easeOutBounce |
|
|
171
|
+
| 11 | **Anticipation(预备动作)** | 大动作前的蓄力姿势 | 跳跃前先蹲下 |
|
|
172
|
+
| 12 | **Follow-through(随动)** | 动作完成后的惯性延续 | 挥剑后手臂的回摆 |
|
|
173
|
+
| 13 | **Knockback(击退)** | 碰撞后的位移反应 | 敌人被击中后弹飞 |
|
|
174
|
+
| 14 | **Recoil(后坐力)** | 施力者自身的反作用 | 射击时枪向上弹跳 |
|
|
175
|
+
| 15 | **Bigger Projectiles(更大的投射物)** | 弹药/投射物比实际更大 | 子弹放大到清晰可见 |
|
|
176
|
+
|
|
177
|
+
### 4.3 时间操控
|
|
178
|
+
|
|
179
|
+
| # | 技术 | 描述 | 示例 |
|
|
180
|
+
| --- | ------------------------------------- | ---------------------- | ---------------------- |
|
|
181
|
+
| 16 | **Hit Stop/Freeze Frame(打击暂停)** | 命中瞬间的极短暂冻结 | 打击时停顿 2-3 帧 |
|
|
182
|
+
| 17 | **Slow Motion(慢动作)** | 关键时刻降低时间流速 | 最后一击进入 0.3x 慢放 |
|
|
183
|
+
| 18 | **Speed Up(加速)** | 常规行为加速以保持节奏 | 子弹速度翻倍 |
|
|
184
|
+
|
|
185
|
+
### 4.4 镜头
|
|
186
|
+
|
|
187
|
+
| # | 技术 | 描述 | 示例 |
|
|
188
|
+
| --- | ------------------------------- | ---------------------- | ---------------------------- |
|
|
189
|
+
| 19 | **Camera Lerp(镜头平滑跟随)** | 镜头像弹簧一样柔和追踪 | 角色移动时镜头延迟 0.1s 跟随 |
|
|
190
|
+
| 20 | **Camera Kick(镜头推动)** | 有方向性的镜头偏移 | 射击时镜头向射击反方向微推 |
|
|
191
|
+
| 21 | **Zoom(缩放)** | 关键时刻拉近/推远 | 大规模消除时镜头微微拉远 |
|
|
192
|
+
|
|
193
|
+
### 4.5 音效
|
|
194
|
+
|
|
195
|
+
| # | 技术 | 描述 | 示例 |
|
|
196
|
+
| --- | ------------------------------- | ---------------------- | --------------------------- |
|
|
197
|
+
| 22 | **Impact SFX(打击音效)** | 碰撞/消除时的声音 | 清脆的"啪"声 |
|
|
198
|
+
| 23 | **Pitch Variation(音高变化)** | 连续操作的音高递增 | 连续消除从低音到高音 |
|
|
199
|
+
| 24 | **Layered SFX(分层音效)** | 多个声音叠加成丰满效果 | 爆炸 = 低频轰+中频碎+高频嘶 |
|
|
200
|
+
| 25 | **BGM Reactive(音乐响应)** | 背景音乐响应游戏事件 | 连击时 BGM 加鼓点 |
|
|
201
|
+
|
|
202
|
+
### 4.6 情感反馈
|
|
203
|
+
|
|
204
|
+
| # | 技术 | 描述 | 示例 |
|
|
205
|
+
| --- | -------------------------------- | ----------------------- | ------------------------------ |
|
|
206
|
+
| 26 | **Floating Text(飘字)** | 动作结果的数字/文字弹出 | "+100" 向上飘出 |
|
|
207
|
+
| 27 | **Celebration(庆祝演出)** | 达成成就时的夸张表演 | 全消时烟花+欢呼声 |
|
|
208
|
+
| 28 | **Expressions(表情)** | 角色/物体显示情感反应 | 被选中的方块"瞪大眼睛" |
|
|
209
|
+
| 29 | **Combo Escalation(连击升级)** | 连续成功的反馈逐级增强 | Normal → Great → Amazing → MAX |
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 五、Juice 实施优先级
|
|
214
|
+
|
|
215
|
+
根据 "Juice it or Lose it" 的核心建议:
|
|
216
|
+
|
|
217
|
+
### 第一步:音效(成本最低、见效最快)
|
|
218
|
+
|
|
219
|
+
一个好的打击/消除音效就能让操作感提升 50%。
|
|
220
|
+
|
|
221
|
+
### 第二步:缓动动画
|
|
222
|
+
|
|
223
|
+
将所有 `linear` 运动替换为 `easeOut` / `easeInOut`,瞬间提升品质感。
|
|
224
|
+
|
|
225
|
+
### 第三步:层层叠加
|
|
226
|
+
|
|
227
|
+
依次加入粒子 → 屏幕震动 → 慢动作 → 颜色变化……
|
|
228
|
+
|
|
229
|
+
### 核心法则
|
|
230
|
+
|
|
231
|
+
> **"More is more. Add more juice, then add more."**(多就是多。加更多 Juice,然后再加更多。)
|
|
232
|
+
|
|
233
|
+
但要记住 Steve Swink 的警告:
|
|
234
|
+
|
|
235
|
+
> **Juice 是放大器,不是遮瑕膏。** 底层 Game Feel(实时控制+空间模拟)必须先到位。
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 六、累积效应
|
|
240
|
+
|
|
241
|
+
Juice 技术单独使用效果有限,但**累积叠加**产生质变:
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
裸机制 → 🫤 能玩但乏味
|
|
245
|
+
+ 音效 → 😐 稍好
|
|
246
|
+
+ 音效 + 粒子 → 🙂 开始有感觉
|
|
247
|
+
+ 音效 + 粒子 + 屏幕震动 → 😀 体验明显提升
|
|
248
|
+
+ 音效 + 粒子 + 屏幕震动 + 慢动作 → 😆 开始上瘾
|
|
249
|
+
+ 以上全部 + 连击升级 + 飘字 → 🤩 停不下来
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**整体远大于部分之和。**
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 七、参考资源汇总
|
|
257
|
+
|
|
258
|
+
| 类型 | 名称 | 链接 |
|
|
259
|
+
| ------- | ----------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
260
|
+
| 📕 书籍 | Game Feel (Steve Swink, 2008) | [Taylor & Francis](https://www.taylorfrancis.com/books/mono/10.1201/9781482267334/game-feel-steve-swink) |
|
|
261
|
+
| 🎤 演讲 | Juice it or Lose it (2012) | [GameJuice 解读](https://www.gamejuice.co.uk/articles/juice-it-or-lose-it-lessons) |
|
|
262
|
+
| 🎤 演讲 | The Art of Screenshake (2013) | [中文解读](https://blog.chosenconcept.dev/tw/posts/2022/11/0012-the-art-of-screenshake/) |
|
|
263
|
+
| 📝 文章 | 6 Components of Game Feel | [GameJuice](https://www.gamejuice.co.uk/articles/swink-6-components-game-feel) |
|
|
264
|
+
| 📝 文章 | Making Games 'Juicy' | [abagames](https://abagames.github.io/joys-of-small-game-development-en/make_game_juicy.html) |
|
|
265
|
+
| 🔗 汇总 | Game Feel Resources | [marcosecchi](https://marcosecchi.github.io/resources/pages/gamedesign_game-feel.html) |
|
|
266
|
+
| 🎮 案例 | Celeste & Forgiveness | Celeste 如何用宽容度提升 Game Feel |
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# MDA 框架 — Mechanics, Dynamics, Aesthetics
|
|
2
|
+
|
|
3
|
+
## 原始来源
|
|
4
|
+
|
|
5
|
+
- **论文**:Hunicke, R., LeBlanc, M., & Zubek, R. (2004). _MDA: A Formal Approach to Game Design and Game Research_. AAAI Workshop – Technical Report.
|
|
6
|
+
- **原文 PDF**:https://www.researchgate.net/publication/228884866_MDA_A_Formal_Approach_to_Game_Design_and_Game_Research
|
|
7
|
+
- **Semantic Scholar**:https://www.semanticscholar.org/paper/MDA-%3A-A-Formal-Approach-to-Game-Design-and-Game-Hunicke-Leblanc/2b134e5c46eec50f69c702c0b4aa29687d5d8fba
|
|
8
|
+
- **解读**:https://educationalgamedesign.com/mechanics-dynamics-and-aesthetics-mda-framework-by-hunicke-leblanc-and-zubek.html
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 一、核心思想
|
|
13
|
+
|
|
14
|
+
MDA 框架将游戏拆解为三个相互关联的层次,提供了一种**形式化的语言**来分析和设计游戏。其最核心的洞察是:
|
|
15
|
+
|
|
16
|
+
> **设计者自下而上(规则 → 行为 → 情感),玩家自上而下(情感 → 行为 → 规则)。**
|
|
17
|
+
|
|
18
|
+
设计者编写规则(Mechanics),规则在运行时产生动态行为(Dynamics),动态行为引发玩家的情感体验(Aesthetics)。但玩家的感知方向正好相反——他们首先感受到"好不好玩"(Aesthetics),然后才注意到行为模式和底层规则。
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
设计者视角: Mechanics → Dynamics → Aesthetics
|
|
22
|
+
↑ 你直接控制 ↑ 你间接影响 ↑ 你的最终目标
|
|
23
|
+
|
|
24
|
+
玩家视角: Aesthetics → Dynamics → Mechanics
|
|
25
|
+
↑ 首先感受到 ↑ 然后注意到 ↑ 最后才理解
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 二、三层详解
|
|
31
|
+
|
|
32
|
+
### 层次 1:Mechanics(机制)
|
|
33
|
+
|
|
34
|
+
**定义**:游戏的组件、规则、算法和数据结构。
|
|
35
|
+
|
|
36
|
+
这是设计者能**直接控制**的部分。包括:
|
|
37
|
+
|
|
38
|
+
- 玩家可以执行的**动作/动词**(点击、滑动、放置、交换……)
|
|
39
|
+
- 游戏运行的**规则和算法**(匹配判定、分数计算、消除逻辑……)
|
|
40
|
+
- 底层的**数据结构**(棋盘矩阵、牌组列表、状态机……)
|
|
41
|
+
|
|
42
|
+
**示例**(三消游戏):
|
|
43
|
+
| 机制要素 | 具体内容 |
|
|
44
|
+
|---------|---------|
|
|
45
|
+
| 动作 | 交换两个相邻方块 |
|
|
46
|
+
| 匹配规则 | ≥3 个同色方块连成一线即消除 |
|
|
47
|
+
| 重力 | 消除后上方方块下落填补空位 |
|
|
48
|
+
| 分数算法 | 基础分 × 连击倍率 |
|
|
49
|
+
|
|
50
|
+
### 层次 2:Dynamics(动态)
|
|
51
|
+
|
|
52
|
+
**定义**:当机制被执行、玩家开始游戏后**涌现**的运行时行为。
|
|
53
|
+
|
|
54
|
+
这是设计者只能**间接影响**的部分。Dynamics 是 Mechanics 的"运行时行为"——你设计了规则,但规则在实际游戏中会产生你未必预料到的交互模式和策略。
|
|
55
|
+
|
|
56
|
+
**示例**(三消游戏):
|
|
57
|
+
| 动态行为 | 来源机制 |
|
|
58
|
+
|---------|---------|
|
|
59
|
+
| 连锁消除(一次消除引发新的匹配) | 重力 + 匹配规则的组合 |
|
|
60
|
+
| 玩家优先寻找大规模消除而非小匹配 | 分数算法的倍率激励 |
|
|
61
|
+
| 在有限步数下出现的紧迫感 | 步数限制 + 分数目标 |
|
|
62
|
+
| 特殊方块的策略性保留 | 特殊方块生成规则 + 其清除范围 |
|
|
63
|
+
|
|
64
|
+
### 层次 3:Aesthetics(美学/情感)
|
|
65
|
+
|
|
66
|
+
**定义**:游戏旨在引发的**情感体验**。
|
|
67
|
+
|
|
68
|
+
这是设计者的**最终目标**——让玩家"感觉好"。MDA 框架给出了一个经典的 **8 种乐趣分类法**,不是说游戏必须包含所有类型,而是帮助设计者明确自己的游戏主要瞄准哪几种情感。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 三、8 种乐趣分类(Aesthetics Taxonomy)
|
|
73
|
+
|
|
74
|
+
| # | 类型 | 英文 | 关键词 | 描述 |
|
|
75
|
+
| --- | -------- | ---------- | -------------------- | ------------------------------------------------------------------------ |
|
|
76
|
+
| 1 | **感官** | Sensation | 视听冲击、特效满足 | 通过视觉、听觉等感官刺激获得的愉悦。华丽的特效、悦耳的音效、流畅的动画。 |
|
|
77
|
+
| 2 | **幻想** | Fantasy | 代入、扮演、想象 | 让玩家代入一个虚构角色或世界,体验日常不可能的事情。 |
|
|
78
|
+
| 3 | **叙事** | Narrative | 故事推进、情节展开 | 通过故事的展开和发展,给玩家"追剧"般的参与感。 |
|
|
79
|
+
| 4 | **挑战** | Challenge | 克服困难、成就感 | 面对障碍、克服困难后获得的成就感。难度曲线和技巧门槛是关键。 |
|
|
80
|
+
| 5 | **社交** | Fellowship | 合作、竞争、社区 | 与他人互动、合作或竞争带来的社交愉悦。 |
|
|
81
|
+
| 6 | **探索** | Discovery | 发现、惊喜、揭秘 | 发现新区域、新道具、隐藏内容时的惊喜和好奇心满足。 |
|
|
82
|
+
| 7 | **表达** | Expression | 自我展现、创造 | 玩家通过游戏系统表达自我的自由度(如捏脸、建筑、选择路线)。 |
|
|
83
|
+
| 8 | **消遣** | Submission | 放空、无脑、消磨时间 | "关掉脑子"的轻松愉悦,让玩家放松地消磨时间。 |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 四、在 Playable Ad 中的适用度评估
|
|
88
|
+
|
|
89
|
+
Playable Ad 的典型场景是 **15-30 秒**、**单人**、**即点即玩**、**以转化为目标**。基于这些约束:
|
|
90
|
+
|
|
91
|
+
| 乐趣类型 | 适用度 | 原因 |
|
|
92
|
+
| ---------------------- | ---------- | ------------------------------------------------ |
|
|
93
|
+
| **Sensation(感官)** | ⭐⭐⭐⭐⭐ | 核心。视听反馈是 15 秒内让玩家"爽"的最快途径。 |
|
|
94
|
+
| **Challenge(挑战)** | ⭐⭐⭐⭐⭐ | 核心。"差一点就赢了"的挫折感是转化的最大驱动力。 |
|
|
95
|
+
| **Submission(消遣)** | ⭐⭐⭐⭐ | 非常适合休闲消除类。"无脑但上瘾"的循环。 |
|
|
96
|
+
| **Discovery(探索)** | ⭐⭐⭐ | 适合翻转、解谜类。发现匹配/路径的"啊哈"时刻。 |
|
|
97
|
+
| **Fantasy(幻想)** | ⭐⭐ | 时间太短难以建立深度代入,但简单的主题包装可以。 |
|
|
98
|
+
| **Expression(表达)** | ⭐⭐ | 时间太短难以展开,但简单的选择(如选角色)可以。 |
|
|
99
|
+
| **Narrative(叙事)** | ⭐ | 几乎不适用。15 秒无法讲好一个故事。 |
|
|
100
|
+
| **Fellowship(社交)** | ⭐ | 几乎不适用。Playable Ad 是单人体验。 |
|
|
101
|
+
|
|
102
|
+
### 设计启发问题
|
|
103
|
+
|
|
104
|
+
在 Brainstorm 阶段,可以用以下问题引导设计方向:
|
|
105
|
+
|
|
106
|
+
1. **"这个游戏主要打哪 2-3 种乐趣?"** — 确定主攻方向
|
|
107
|
+
2. **"玩家在第 5 秒会感受到什么情感?"** — 确保开头有足够的 hook
|
|
108
|
+
3. **"15 秒内能体验到至少一次完整的情感循环吗?"** — 确保时长内有完整体验
|
|
109
|
+
4. **"失败时玩家会觉得'差一点就行了'还是'完全没懂'?"** — 诊断挑战性设计是否到位
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 五、MDA 的设计方法论
|
|
114
|
+
|
|
115
|
+
### 从 Aesthetics 出发倒推设计
|
|
116
|
+
|
|
117
|
+
MDA 框架最有价值的用法不是从 M 推到 A,而是**从 A 反推到 M**:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
1. 确定目标情感(Aesthetics)
|
|
121
|
+
→ "我希望玩家感到满足感 + 轻度挑战"
|
|
122
|
+
|
|
123
|
+
2. 设想需要的动态行为(Dynamics)
|
|
124
|
+
→ "连锁消除带来满足感,有限步数带来挑战"
|
|
125
|
+
|
|
126
|
+
3. 设计支撑这些行为的规则(Mechanics)
|
|
127
|
+
→ "重力填充 + 匹配规则产生连锁;步数限制产生紧迫"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 用 MDA 诊断问题
|
|
131
|
+
|
|
132
|
+
当游戏"感觉不对"时,MDA 提供了诊断路径:
|
|
133
|
+
|
|
134
|
+
| 症状 | 可能的问题层 | 诊断方向 |
|
|
135
|
+
| ---------------------- | --------------- | --------------------------------------------------- |
|
|
136
|
+
| "好看但无聊" | Aesthetics 缺失 | 你瞄准了什么情感?Sensation 有了但 Challenge 没有? |
|
|
137
|
+
| "有策略深度但没人想玩" | Dynamics 问题 | 涌现行为是否有趣?玩家能发现策略吗? |
|
|
138
|
+
| "概念好但执行差" | Mechanics 问题 | 规则是否能产生你想要的 Dynamics? |
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 六、参考资源
|
|
143
|
+
|
|
144
|
+
- 📄 **原始论文** (2004):[ResearchGate](https://www.researchgate.net/publication/228884866_MDA_A_Formal_Approach_to_Game_Design_and_Game_Research)
|
|
145
|
+
- 📖 **知乎中文翻译**:[MDA 框架详解](https://zhuanlan.zhihu.com/p/402577913)
|
|
146
|
+
- 🎓 **教育版解读**:[Educational Game Design](https://educationalgamedesign.com/mechanics-dynamics-and-aesthetics-mda-framework-by-hunicke-leblanc-and-zubek.html)
|
|
147
|
+
- 🛠️ **设计工具箱**:[Game Design Toolkit - MDA Framework](https://tkdev.dss.cloud/gamedesign/toolkit/mda-framework/)
|