Aus #155 (offener Punkt 2, dort „als Feld später, falls nötig“; angefordert im Kommentar in #155).
Befund
Eine One-Way-Plattform blockiert nur einen Kontakt, dessen Normale höchstens 45° von ihrer blockierenden Seite abweicht. Der Wert ist fest verdrahtet: ONE_WAY_CONE in src/core/properties/collider.ts:118, geprüft in landsOn.
landsOn wird an drei Stellen benutzt: Solids (Move und Raycast, src/runtime/systems/solids.ts) und die Entscheidung vor jedem Rapier-Step (src/runtime/physics/PhysicsSystem.ts). Eine Änderung wirkt dadurch automatisch überall gleich.
One-Way-Tiles blockieren immer „from above“ und haben heute keine eigenen Felder dafür.
Zu bauen
Am Collider neues Feld One-way angle (Grad, 0–90, Vorgabe 45), sichtbar nur bei eingeschaltetem One-way.
An der Tile dasselbe Feld, sichtbar nur bei „One-way (from above)“.
landsOn bekommt den Winkel statt der Konstante; solidShapesOf gibt ihn mit der blockierenden Seite weiter.
Tests gegen beide Systeme: schräge Plattform (Polygon oder gedreht) mit 30° Neigung hält bei 45°, lässt bei 20° durch; Raycast folgt derselben Regel; Vorgabe ändert bestehende Projekte nicht.
Offen (mit Vorschlag)
Grenzen: Vorschlag 0–90°. Bei 90° zählt jeder Kontakt, der nicht von der Gegenseite kommt.
Anzeige im Scene-View (Kegel an der dicken Seite)? Vorschlag: nein, erst wenn es fehlt.
Aus #155 (offener Punkt 2, dort „als Feld später, falls nötig“; angefordert im Kommentar in #155).
## Befund
- Eine One-Way-Plattform blockiert nur einen Kontakt, dessen Normale höchstens **45°** von ihrer blockierenden Seite abweicht. Der Wert ist fest verdrahtet: `ONE_WAY_CONE` in `src/core/properties/collider.ts:118`, geprüft in `landsOn`.
- `landsOn` wird an drei Stellen benutzt: `Solids` (Move und Raycast, `src/runtime/systems/solids.ts`) und die Entscheidung vor jedem Rapier-Step (`src/runtime/physics/PhysicsSystem.ts`). Eine Änderung wirkt dadurch automatisch überall gleich.
- One-Way-Tiles blockieren immer „from above“ und haben heute keine eigenen Felder dafür.
## Zu bauen
- Am Collider neues Feld **One-way angle** (Grad, 0–90, Vorgabe **45**), sichtbar nur bei eingeschaltetem One-way.
- An der Tile dasselbe Feld, sichtbar nur bei „One-way (from above)“.
- `landsOn` bekommt den Winkel statt der Konstante; `solidShapesOf` gibt ihn mit der blockierenden Seite weiter.
- Tests gegen beide Systeme: schräge Plattform (Polygon oder gedreht) mit 30° Neigung hält bei 45°, lässt bei 20° durch; Raycast folgt derselben Regel; Vorgabe ändert bestehende Projekte nicht.
## Offen (mit Vorschlag)
1. **Grenzen:** Vorschlag 0–90°. Bei 90° zählt jeder Kontakt, der nicht von der Gegenseite kommt.
2. **Anzeige im Scene-View** (Kegel an der dicken Seite)? Vorschlag: nein, erst wenn es fehlt.
meleki
added the new label 2026-09-19 11:37:24 +02:00
Neues Feld One-way angle am Collider und an der Tile: 0–90°, Vorgabe 45°. Ein Kontakt blockiert, wenn seine Normale höchstens um diesen Winkel von der blockierenden Seite abweicht. Ohne gesetzten Wert ist der Grenzwert bitgenau derselbe wie vorher, bestehende Projekte verhalten sich gleich (per Test belegt).
Die Regel gilt gleich für Move, Raycast und Dynamic Bodies in Rapier.
Tiles mit verschiedenen Winkeln verschmelzen nie zu einem Rechteck, jede Gruppe behält ihren Winkel.
Scene-View (Punkt 2): Kegel in der Mitte der dicken Seite, ±Winkel, für Collider und One-Way-Tiles.
Inspector:Blocks from und One-way angle erscheinen nur bei eingeschaltetem One-way, über die neue Schema-Option shownWith. Graph-Nodes und Speicherformat sehen die Felder weiter immer.
Korrektur am Testplan: Eine gedrehte 30°-Plattform zeigt keinen Unterschied, weil ihre blockierende Seite mitdreht. Der Winkel wirkt nur bei Flächen, die schräg zur Seite stehen. Getestet wird deshalb mit einem Polygon-Keil mit 25° Neigung und Above (25° statt 30°, weil bei Friction 0,5 ab ca. 26,6° gerutscht wird).
Bekannte Grenze: Bei ungleichmäßig skalierten Objekten wird der Kegel im Scene-View mitverzerrt. Die Kollision rechnet trotzdem richtig.
Tests
13 neue Unit-Tests (tests/core/one-way-angle.test.ts), Bewegung und Raycast jeweils in beiden Systemen: Keil hält bei 45° und 25°, lässt bei 20° durch; bei 90° blocken auch die Seiten; zwei Tile-Winkel bleiben getrennt; die Kegelkante zählt noch als Treffer; Dynamic Box ruht bei 45° und fällt bei 20°.
Gegenprobe: 7 eingebaute Fehler, alle gefangen.
e2e 43a: 1 neuer Check (Felder vor dem Einschalten weg, danach da).
CI zu 5385d9e (Logs gelesen): Gate Task 148 – 110 Testdateien grün, CHECK EXIT 0; Suite Task 149 – ALL PASSED – 1075 checks, Smokes 24 / 19 / 21. Die Summe 1075 ist damit gemessen.
Umgesetzt in `5385d9e` (Wiki `a61c7a8`).
**Was sich ändert**
- Neues Feld **One-way angle** am Collider und an der Tile: 0–90°, Vorgabe 45°. Ein Kontakt blockiert, wenn seine Normale höchstens um diesen Winkel von der blockierenden Seite abweicht. Ohne gesetzten Wert ist der Grenzwert bitgenau derselbe wie vorher, bestehende Projekte verhalten sich gleich (per Test belegt).
- Die Regel gilt gleich für `Move`, Raycast und Dynamic Bodies in Rapier.
- Tiles mit verschiedenen Winkeln verschmelzen nie zu einem Rechteck, jede Gruppe behält ihren Winkel.
- **Scene-View** (Punkt 2): Kegel in der Mitte der dicken Seite, ±Winkel, für Collider und One-Way-Tiles.
- **Inspector:** *Blocks from* und *One-way angle* erscheinen nur bei eingeschaltetem One-way, über die neue Schema-Option `shownWith`. Graph-Nodes und Speicherformat sehen die Felder weiter immer.
**Korrektur am Testplan:** Eine gedrehte 30°-Plattform zeigt keinen Unterschied, weil ihre blockierende Seite mitdreht. Der Winkel wirkt nur bei Flächen, die schräg zur Seite stehen. Getestet wird deshalb mit einem Polygon-Keil mit 25° Neigung und *Above* (25° statt 30°, weil bei Friction 0,5 ab ca. 26,6° gerutscht wird).
**Bekannte Grenze:** Bei ungleichmäßig skalierten Objekten wird der Kegel im Scene-View mitverzerrt. Die Kollision rechnet trotzdem richtig.
**Tests**
- 13 neue Unit-Tests (`tests/core/one-way-angle.test.ts`), Bewegung und Raycast jeweils in beiden Systemen: Keil hält bei 45° und 25°, lässt bei 20° durch; bei 90° blocken auch die Seiten; zwei Tile-Winkel bleiben getrennt; die Kegelkante zählt noch als Treffer; Dynamic Box ruht bei 45° und fällt bei 20°.
- Gegenprobe: 7 eingebaute Fehler, alle gefangen.
- e2e 43a: 1 neuer Check (Felder vor dem Einschalten weg, danach da).
**CI zu `5385d9e`** (Logs gelesen): Gate Task 148 – 110 Testdateien grün, `CHECK EXIT 0`; Suite Task 149 – `ALL PASSED – 1075 checks`, Smokes 24 / 19 / 21. Die Summe 1075 ist damit gemessen.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Aus #155 (offener Punkt 2, dort „als Feld später, falls nötig“; angefordert im Kommentar in #155).
Befund
ONE_WAY_CONEinsrc/core/properties/collider.ts:118, geprüft inlandsOn.landsOnwird an drei Stellen benutzt:Solids(Move und Raycast,src/runtime/systems/solids.ts) und die Entscheidung vor jedem Rapier-Step (src/runtime/physics/PhysicsSystem.ts). Eine Änderung wirkt dadurch automatisch überall gleich.Zu bauen
landsOnbekommt den Winkel statt der Konstante;solidShapesOfgibt ihn mit der blockierenden Seite weiter.Offen (mit Vorschlag)
Umgesetzt in
5385d9e(Wikia61c7a8).Was sich ändert
Move, Raycast und Dynamic Bodies in Rapier.shownWith. Graph-Nodes und Speicherformat sehen die Felder weiter immer.Korrektur am Testplan: Eine gedrehte 30°-Plattform zeigt keinen Unterschied, weil ihre blockierende Seite mitdreht. Der Winkel wirkt nur bei Flächen, die schräg zur Seite stehen. Getestet wird deshalb mit einem Polygon-Keil mit 25° Neigung und Above (25° statt 30°, weil bei Friction 0,5 ab ca. 26,6° gerutscht wird).
Bekannte Grenze: Bei ungleichmäßig skalierten Objekten wird der Kegel im Scene-View mitverzerrt. Die Kollision rechnet trotzdem richtig.
Tests
tests/core/one-way-angle.test.ts), Bewegung und Raycast jeweils in beiden Systemen: Keil hält bei 45° und 25°, lässt bei 20° durch; bei 90° blocken auch die Seiten; zwei Tile-Winkel bleiben getrennt; die Kegelkante zählt noch als Treffer; Dynamic Box ruht bei 45° und fällt bei 20°.CI zu
5385d9e(Logs gelesen): Gate Task 148 – 110 Testdateien grün,CHECK EXIT 0; Suite Task 149 –ALL PASSED – 1075 checks, Smokes 24 / 19 / 21. Die Summe 1075 ist damit gemessen.