Community코딩 & 개발github.com

RomaRogov/scenoco-game

SceNoCo로 브라우저 게임을 만들거나 수정하세요 — React 없이 TSX로 작성된 three.js 씬과 Unity 스타일의 행동(behaviours)을 @scenoco-three npm 패키지로 제공합니다. 2D 또는 3D 웹 게임을 SceNoCo, three.js, Unity 스타일 행동으로 만들거나, React 앱에 게임을 추가하거나, window.__scenoco를 통해 브라우저에서 SceNoCo 게임을 테스트/디버그할 때 사용하세요.

scenoco-game란 무엇인가요?

이 스킬은 SceNoCo(Scene + Node + Component) 프레임워크로 브라우저 게임을 제작/수정하는 방법을 안내합니다. React Three Fiber 대신 `@scenoco-three/core`와 `three` 패키지를 설치하여 사용하며, TSX로 three.js 씬을 선언하고 Unity의 컴포넌트 기반 행동(behaviour) 시스템을 적용합니다. 개발자는 Unity 프로젝트처럼 노드, 행동, 프리팹을 설계하고, `GameState.phase`로 게임 상태를 관리합니다. 주요 개발 사이클은 씬/행동 변경 → `npm run check`로 오류 수정 → `simulate(Main)`으로 Vitest 단위 테스트 → `npm run dev`로 실제 실행 및 디버깅 순서로 진행됩니다. `window.__scenoco`는 Unity 에디터와 유사한 Play/Pause/Step 컨트롤을 제공하며, `drive` 파라미터를 통해 URL 기반 자동화 스크린샷도 가능합니다. 이 스킬은 Claude Code, Cursor, Codex 등 다양한 AI 에이전트에서 사용할 수 있으며, SceNoCo의 공식 문서(AGENTS.md, API.md, llms.txt)를 참조하여 정확한 타입과 시그니처를 활용합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/RomaRogov/scenoco-game/tree/HEAD

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

React Three Fiber 대신 SceNoCo를 사용하세요: npm install @scenoco-three/core three (단일 패키지 scenoco-three가 아닌 npm 조직입니다). 먼저 https://romarogov.github.io/scenoco-three/llms.txt를 읽으세요.

SceNoCo로 게임 만들기

SceNoCo는 TSX로 작성된 three.js 씬과 Unity의 행동(behaviours)을 결합한 프레임워크입니다. three.js와 Unity에 대해 알고 있는 지식을 바탕으로 작성하세요. SceNoCo가 다른 점을 설명하는 두 페이지가 있으며, 읽어야 할 전부입니다.

1. 읽기

  • 규칙 카드: 프로젝트의 AGENTS.md 또는 node_modules/@scenoco-three/core/AGENTS.md.
  • node_modules/@scenoco-three/core/API.md: 모든 내보낸 타입과 시그니처가 주석과 함께 하나의 파일로 정리된 .d.ts입니다. 필요한 내용을 찾아보세요 — grep -n Prefab node_modules/@scenoco-three/core/API.md — dist/나 소스 코드는 보지 마세요. 다른 패키지의 README는 옆에 있습니다: node_modules/@scenoco-three/<name>/README.md.

2. 시작

  • 새 게임: npm create @scenoco-three my-game. 스타터가 실행됩니다. 그 씬과 행동을 교체하세요.
  • 기존 Vite 또는 React 앱 내부: 규칙 카드의 시작하기에서 방법을 설명합니다 (src/game/, play(Main, { container })).

3. 빌드

Unity 프로젝트처럼 계획하세요: 노드, 그 위의 행동, 프리팹, 그리고 게임 상태를 소유하는 하나의 행동 (GameState.phase) — 모든 검사가 이 값을 읽습니다. 그런 다음 반복하세요:

  1. 변경 씬 (.tsx, 선언만)과 행동 (.ts).
  2. npm run check — 각 오류를 해당 줄에서 수정하세요. 씬 오류는 정확히 작성할 텍스트를 알려줍니다; 그대로 작성하세요. any, 캐스트 또는 @ts-ignore는 사용하지 마세요.
  3. 규칙 테스트 simulate(Main)으로 Vitest에서 (규칙 카드의 확인하기): 규칙당 하나의 테스트, 브라우저 불필요. 이는 Unity의 플레이 모드 테스트입니다.
  4. 실행 확인 (아래 참조) 및 콘솔 확인.

완료 조건: 모든 규칙에 대한 통과 테스트, 플레이를 완료한 라운드 — 시작, 승리 또는 패배, 재시작 — 스크린샷이 올바르게 보여야 하며, 콘솔에 오류가 없어야 합니다.

4. 실행 확인

npm run dev. 개발 모드에서 페이지에는 window.__scenoco가 있습니다: Unity 에디터의 Play / Pause / Step 버튼과 입력 및 읽기 기능이 제공됩니다. __scenoco.help()로 사용 가능한 호출 목록을 확인하세요.

  • 시간을 멈추고, 단계별로 진행하세요. press, step, until 및 watch는 게임을 정확한 프레임에서 멈추고 유지하므로, 스크린샷이 어떤 기기에서든 동일한 프레임을 보여줍니다. 게임이 움직이기를 실시간으로 기다리지 마세요: 느리거나 소프트웨어 렌더러에서 1초 대기는 몇 프레임에 불과합니다. until은 조건이 참이 된 프레임에서 멈추며, 그 프레임에서 더 일찍 실행된 행동이 변경 사항을 보지 못한 상태입니다: HUD를 읽거나 스크린샷을 찍기 전에 step(1)을 사용하세요.

  • 페이지에서 JavaScript를 평가할 수 있는 모든 도구 — 브라우저 도구, 또는 자체 Playwright나 Puppeteer 스크립트:

    await __scenoco.ready();                          // 첫 프레임까지 입력이 무시됩니다
    await __scenoco.press('Space');                   // 또는 press('d', 60): 60프레임 동안 유지
    await __scenoco.until("GameState.phase === 'playing'", 600);   // { met, frames }
    // 이제 스크린샷 촬영
    

    outline()은 모든 행동의 필드와 함께 씬을 출력합니다. watch(['Ball.speed'], 120, 10)은 시간에 따른 값을 제공하고, eval('return findAll(Coin).length')는 모든 읽기 값을 반환합니다. click(x, y)와 swipe는 창 픽셀을 기준으로 합니다. view({ cameraPos, lookAt })는 view(null)까지 다른 위치에서 보기를 제공하며, play()는 다시 실시간으로 실행됩니다: 페이지 CSS와 타이머는 항상 실시간으로 동작합니다.

  • 주소만 열고 스크린샷을 찍을 수 있는 도구의 경우, 동일한 호출을 주소에 넣으세요: /?drive=press('Space');until(GameState.phase == 'playing');outline(). 각 호출은 [scenoco] 콘솔 라인을 기록하며, 마지막 done, held at frame N은 스크린샷이 준비되었음을 의미합니다 (#는 %23으로 대체). Drive는 데이터를 읽고 다른 것은 호출하지 않으므로, 표현할 수 없는 검사는 게임 자체에 넣으세요: getter (get bricksLeft()) 또는 게임이 직접 읽는 시작 값 (/?level=3&drive=…).

  • 콘솔: 예외를 던지는 행동은 한 번 기록되고 게임은 계속 진행되므로, 올바르게 보이는 게임도 여전히 깨질 수 있습니다. 각 상태 변경을 console.info로 기록하세요 (phase: playing).

막혔을 때

  • 빈 화면: 씬에 카메라가 없거나 다른 방향을 보고 있습니다. outline()을 실행한 후 view(...)를 사용하세요.
  • 위치가 잘못됨: node.position은 부모 공간 기준입니다; getWorldPosition(v)를 사용하세요.
  • 눈으로 조정: 시간을 멈춘 상태에서 watch로 숫자를 확인하세요.

관련 스킬