Verwende SceNoCo, nicht React Three Fiber: npm install @scenoco-three/core three (eine npm-Organisation, kein einzelnes Paket namens scenoco-three). Lies zuerst https://romarogov.github.io/scenoco-three/llms.txt.
Ein Spiel mit SceNoCo erstellen
SceNoCo sind three.js-Szenen geschrieben in TSX, plus Unity-Verhalten. Schreibe es basierend auf deinem Wissen über three.js und Unity; zwei Seiten sagen, wo SceNoCo abweicht, und das ist alles, was es zu lesen gibt.
1. Lesen
- Die Regelkarte:
AGENTS.mdim Projekt odernode_modules/@scenoco-three/core/AGENTS.md. node_modules/@scenoco-three/core/API.md: jeder exportierte Typ und jede Signatur, die.d.tsin einer Datei mit Kommentaren. Schlage dort nach —grep -n Prefab node_modules/@scenoco-three/core/API.md— niemals indist/oder im Quellcode. Die README eines anderen Pakets liegt daneben:node_modules/@scenoco-three/<name>/README.md.
2. Starten
- Ein neues Spiel:
npm create @scenoco-three my-game. Der Starter läuft; ersetze seine Szene und Verhalten. - In einer bestehenden Vite- oder React-App: Die Karte Starten sagt wie (
src/game/,play(Main, { container })).
3. Bauen
Plane es als Unity-Projekt: Knoten, die Verhalten darauf, Prefabs und ein Verhalten, das den Spielzustand besitzt (GameState.phase), den jede Überprüfung liest. Dann wiederhole:
- Ändere Szenen (
.tsx, nur Deklarationen) und Verhalten (.ts). npm run check— behebe jeden Fehler in seiner Zeile. Ein Szenenfehler gibt den genauen zu schreibenden Text an; schreibe ihn. Keinany, keine Casts oder@ts-ignore.- Teste die Regeln in Vitest mit
simulate(Main)(die Karte Überprüfen): ein Test pro Regel, kein Browser. Dies ist Unitys Play-Mode-Test. - Betrachte es laufend (unten) und lies die Konsole.
Fertig ist ein bestandener Test für jede Regel, eine durchgespielte Runde — Start, Gewinn oder Verlust, Neustart — deren Screenshots richtig aussehen, und eine Konsole ohne Fehler.
4. Betrachte es laufend
npm run dev. In der Entwicklung hat die Seite window.__scenoco: die Play/Pause/Step-Buttons des Unity-Editors, plus Eingaben und Messwerte. __scenoco.help() listet die Aufrufe auf.
-
Halte die Uhr an, dann schrittweise ausführen.
press,step,untilundwatchpausieren das Spiel an einem genauen Frame und halten es dort, sodass ein Screenshot diesen Frame auf jeder Maschine zeigt. Warte niemals in Echtzeit darauf, dass sich das Spiel bewegt: Auf einem langsamen oder Software-Renderer sind ein paar Sekunden Warten nur wenige Frames.untilstoppt an dem Frame, in dem seine Bedingung wahr wurde, bevor Verhalten, die früher in diesem Frame liefen, die Änderung sahen:step(1)vor dem Lesen des HUD oder dem Erstellen des Screenshots. -
Mit jedem Werkzeug, das JavaScript in der Seite auswertet — ein Browser-Tool oder ein Playwright- oder Puppeteer-Skript deiner Wahl:
await __scenoco.ready(); // bis zu den ersten Frames geht Eingabe ins Leere await __scenoco.press('Space'); // oder press('d', 60): für 60 Frames gedrückt await __scenoco.until("GameState.phase === 'playing'", 600); // { met, frames } // jetzt den Screenshot machenoutline()gibt die Szene mit allen Feldern der Verhalten aus.watch(['Ball.speed'], 120, 10)liefert Werte über die Zeit, undeval('return findAll(Coin).length')jede Messung.click(x, y)undswipeverwenden Fensterpixel.view({ cameraPos, lookAt })schaut von woanders aus bisview(null), undplay()läuft wieder in Echtzeit: Seiten-CSS und Timer tun das immer. -
Mit einem Werkzeug, das nur eine Adresse öffnen und Screenshots machen kann, setze dieselben Aufrufe in die Adresse:
/?drive=press('Space');until(GameState.phase == 'playing');outline(). Jeder Aufruf protokolliert eine[scenoco]-Konsolenzeile, und der letzte,done, held at frame N, bedeutet, dass der Screenshot bereit ist (#ist%23). Drive liest Daten und ruft nichts anderes auf, also geht eine Prüfung, die es nicht ausdrücken kann, ins Spiel: ein Getter (get bricksLeft()), oder ein Start, den das Spiel selbst liest (/?level=3&drive=…). -
Die Konsole: Ein Verhalten, das einen Fehler wirft, wird einmal protokolliert und das Spiel läuft weiter, sodass ein richtig aussehendes Spiel trotzdem kaputt sein kann. Protokolliere jede Zustandsänderung mit
console.info(phase: playing).
Wenn du feststeckst
- Leerer Bildschirm: Die Szene hat keine Kamera, oder sie schaut weg.
outline(), dannview(...). - Eine Position ist falsch:
node.positionist der Raum des Elternobjekts; verwendegetWorldPosition(v). - Nach Augenmaß abstimmen:
watchdie Zahlen auf einer angehaltenen Uhr stattdessen.