타격감·게임필 — 히트스톱·화면 흔들림·파티클 예산과 소리/이펙트 동기를 수치로 판정한다. 트리거 "타격감", "임팩트", "히트스톱", "화면 흔들림", "파티클", "연출", "game feel".
Scanned 9/19/2026
Install to Claude Code
npx -y skills add snwlee/Nereus --skill impact --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Impact?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/snwlee-impact)More formats (shields.io, HTML) on the badges page.
---
name: impact
description: 타격감·게임필 — 히트스톱·화면 흔들림·파티클 예산과 소리/이펙트 동기를 수치로 판정한다. 트리거 "타격감", "임팩트", "히트스톱", "화면 흔들림", "파티클", "연출", "game feel".
---
# impact
nereus:common 규칙을 따른다. 담당 에이전트: game-ux.
**엔진과 무관하다** — 히트스톱·셰이크·파티클 예산은 어느 엔진에서도 같은 축이다.
## 0. gameux 와의 경계
| | 담당 |
|---|---|
| UI·HUD·포커스 경로·안전영역·입력 장치 | `nereus-game:gameux` |
| 입력 지연·입력 버퍼 같은 **입력 타이밍** | `gameux` (여기서도 버퍼 하한을 게이트로 본다) |
| 히트스톱·셰이크·파티클·타격 연출·소리 동기 | 여기 |
합치지 않는 이유: `gameux` 의 축은 **읽히는가**이고 impact 의 축은 **느껴지는가**다.
한 체크리스트에 섞으면 둘 다 흐려진다.
## 1. 왜 수치인가
"타격감이 좋다/나쁘다"는 판정이 아니다. 판정이 아니면 회귀 테스트도 게이트도 성립하지 않는다.
그래서 전부 수치로 받는다. 그리고 두 가지는 개별 값이 아니라 **합**으로 본다.
- **히트스톱은 누적으로 본다.** 한 번 80ms 는 문제가 아니다. 초당 여러 번 걸려
누적 정지 시간이 길어지면 게임이 "끊긴다"고 느껴진다. 개별 값만 보면 이 상태를 놓친다.
- **셰이크는 동시 진폭의 합으로 본다.** 각각 0.4 인 셰이크 셋이 겹치면 1.2 다.
트리거가 겹칠 수 있다면 겹친 상태가 실제 상태다.
## 2. 계획을 JSON 으로 적는다
```json
{
"maxParticles": 300,
"inputBufferMs": 120,
"cues": [
{
"name": "hit",
"visual": true,
"sound": "swing",
"haptic": true,
"hitstopMs": 60,
"hitsPerSecond": 1.5,
"shake": { "amplitude": 0.4, "concurrent": true },
"reducedMotion": "셰이크 대신 1프레임 화이트 플래시"
}
]
}
```
- `sound` 는 **사운드 계획의 큐 이름**이다. 아래 교차 검증이 이것을 본다.
- `shake.concurrent` 가 `true` 면 다른 셰이크와 동시에 활성될 수 있다는 뜻이고, 진폭 합에 들어간다.
- `reducedMotion` 은 셰이크를 쓰면 **필수**다. 문장으로 "끌 수 있게 한다"고 적는 것은 게이트가 아니다.
## 3. 소리 교차 검증이 이 스킬의 핵심이다
```bash
echo '{"genre":"battle-pvp","plan":{...},"soundCues":["swing","land"]}' \
| node "${CLAUDE_PLUGIN_ROOT}/lib/impact-budget.mjs"
```
`soundCues` 는 `nereus-game:sound` 계획의 `cues[].name` 목록이다.
**도메인별 초록의 합은 게임의 초록이 아니다.** 사운드 검사는 "선언된 큐가 예산 안"이라 하고
임팩트 검사는 "이펙트가 예산 안"이라 하는데, 둘이 서로를 안 보면 **소리 없이 터지는 이펙트**를
아무도 못 잡는다. 이펙트만 있고 소리가 없는 타격은 절반만 만든 연출이다.
`soundCues` 를 주지 않으면 그 항목만 `unmeasured` 에 `sound-cross-check` 로 남고
예산 항목은 그대로 판정한다 — 사운드 계획이 아직 없다고 임팩트 검사가 통째로 꺼지지 않는다.
## 4. 위반 코드
| 코드 | 뜻 |
|---|---|
| `no-baseline` | 장르 프로파일에 `impact` 기준이 없다 (다른 검사를 하지 않는다) |
| `hitstop-budget` | 초당 누적 정지 시간이 예산을 넘는다 |
| `shake-amplitude` | 동시 활성 셰이크 진폭의 합이 상한을 넘는다 |
| `particle-budget` | 파티클 동시 수가 상한을 넘는다 |
| `input-buffer` | 입력 버퍼가 장르 하한 미만이다 |
| `single-channel` | 그 큐가 시각·청각·촉각 중 한 층만 갖는다 |
| `no-reduced-motion` | 셰이크를 쓰는데 모션 감소 대체 선언이 없다 |
| `sound-missing` | 참조한 사운드 큐가 없거나 `sound` 선언 자체가 없다 |
기준은 장르 프로파일의 `impact` 키에서 온다 — 스킬 안에 수치를 박지 않는다.
오비는 점프 입력이 애니메이션 중에 들어오므로 버퍼가 가장 길고, PvP 는 타격이 잦아 정지 예산이 크다.
## 5. 피드백은 두 층 이상이다
한 층만 쓰면 그 감각을 못 쓰는 환경에서 피드백이 통째로 사라진다.
소리를 끈 플레이어, 진동이 없는 기기, 화면을 못 보는 순간이 전부 그렇다.
`gameux` 의 "색만으로 상태를 구분하지 않는다"와 같은 원리다.
## 하지 말 것
- 히트스톱을 개별 길이만 보고 정하지 않는다. 누적이 실제로 느껴지는 값이다.
- 셰이크를 강하게 잡고 "설정에서 끄면 된다"로 넘기지 않는다. 기본값이 대부분의 경험이다.
- 이펙트를 먼저 만들고 소리를 나중에 붙이지 않는다. 교차 검증이 막는다.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!