Aus #153 (offener Punkt 3; angefordert im Kommentar in #153). Hängt an #152.
Befund
Raycast (#153) trifft heute jeden blockierenden Collider und die Tilemap, Trigger nur per Schalter. Filtern kann man nur hinterher im Graph über object.
#152 plant benannte Ebenen (max. 16) mit Layer und Collides with am Collider und eine gemeinsame Funktion layersMeet(a, b).
Raycast und Raycast all (#157) bekommen einen Eingang Layers (Mehrfachauswahl der Projekt-Ebenen): Getroffen wird nur, was auf einer der gewählten Ebenen liegt.
Die Prüfung läuft in Solids.raycast vor dem Schnitttest, damit Editor-Run und Play gleich antworten.
Tests: Strahl geht durch eine ausgeschlossene Ebene zum nächsten Collider; Tilemap auf eigener Ebene; beide Systeme.
Offen (mit Vorschlag)
Vorgabe: Vorschlag „alle Ebenen“, damit bestehende Graphen gleich antworten.
Ebenen des Besitzers berücksichtigen (Strahl trifft nur, womit der Besitzer kollidieren würde)? Vorschlag: nein, der Strahl hat seine eigene Auswahl; wer das will, verdrahtet es.
Aus #153 (offener Punkt 3; angefordert im Kommentar in #153). Hängt an #152.
## Befund
- **Raycast** (#153) trifft heute jeden blockierenden Collider und die Tilemap, Trigger nur per Schalter. Filtern kann man nur hinterher im Graph über `object`.
- #152 plant benannte Ebenen (max. 16) mit **Layer** und **Collides with** am Collider und eine gemeinsame Funktion `layersMeet(a, b)`.
## Zu bauen (sobald #152 steht)
- Raycast und Raycast all (#157) bekommen einen Eingang **Layers** (Mehrfachauswahl der Projekt-Ebenen): Getroffen wird nur, was auf einer der gewählten Ebenen liegt.
- Die Prüfung läuft in `Solids.raycast` vor dem Schnitttest, damit Editor-Run und Play gleich antworten.
- Tests: Strahl geht durch eine ausgeschlossene Ebene zum nächsten Collider; Tilemap auf eigener Ebene; beide Systeme.
## Offen (mit Vorschlag)
1. **Vorgabe:** Vorschlag „alle Ebenen“, damit bestehende Graphen gleich antworten.
2. **Ebenen des Besitzers berücksichtigen** (Strahl trifft nur, womit der Besitzer kollidieren würde)? Vorschlag: nein, der Strahl hat seine eigene Auswahl; wer das will, verdrahtet es.
meleki
added the new label 2026-09-19 11:37:24 +02:00
Der Raycast-Node hat eine Einstellung „Layers" — ein Häkchen pro Kollisionsebene des Projekts, dieselbe Feldart, die der Collider für „Collides with" nutzt. Getroffen wird nur, was auf einer angehakten Ebene sitzt; Tilemaps zählen dabei wie Collider. Vorgabe ist jede Ebene, und ein Graph ohne den Param antwortet genau wie vorher.
Die Prüfung ist einseitig — anders als die symmetrische Regel aus #152. Der Strahl liest das collidesWith des Getroffenen nicht. Ein Strahl ist kein Collider; wen er ansehen darf, ist seine Sache. Ein Collider, der mit nichts kollidiert, wird von einem Strahl trotzdem getroffen. Das liegt als eigener Unit-Test vor und steht im Wiki.
Der Filter sitzt in Solids.raycast vor dem Schnitttest — dem einen Weg, den Editor-Run und Play beide gehen. Deshalb läuft jeder Unit-Test über describe.each gegen beide Systeme.
Nebenbei nötig: NodeView kannte die Feldarten layer/layers nicht, am Node hätte „Layers: 65533" gestanden. Jetzt steht dort der Name der Ebene bzw. „All layers".
5 neue e2e-Checks im neuen Block 43d: ein Schild auf eigener Ebene zwischen Caster und Boden hält den Strahl; die Zeile „Layers" am Node mit „All layers"; das Häkchen-Menü mit den Ebenen des Projekts; nach dem Abwählen geht der Strahl durch das Schild bis zum Boden (145 → 280 Einheiten, aus dem Log gemessen); und die Maske als Name statt als Bits.
6 neue Unit-Tests, je 3 gegen beide Systeme: der Strahl geht durch eine ausgeschlossene Ebene zum nächsten Collider — auch dann, wenn dieser selbst mit nichts kollidiert; eine Tilemap auf eigener Ebene wird genauso getroffen oder passiert; und der Node-Param in vier Stufen.
Zwei Gegenproben, beide greifen: Filterzeile in Solids.raycast entschärft → 6 Unit-Tests fallen und Modul 43 fällt mit dem Abwähl-Check (reached: 145 statt 280). Formatierung am Node abgeschaltet → der Node-Check fällt mit "Layers: 65533". Originale per cmp zurückgeprüft.
Check-Summe 1153 (1148 + 5, gerechnet; die 1148 ist von CI an ae3aa7d bestätigt).
Zwei Funde beim Messen
__gm.rays() misst nur, solange der Scene-Tab vorn ist. Der Hook liefert, was der Viewport zuletzt gezeichnet hat — eine Node-Auswahl schaltet aber auf den Graph-Tab. Mein erster Testaufbau war dadurch blind und wäre auch gegen kaputten Code grün geblieben. Der Block misst jetzt über einen Log-Node an distance.
Eine laufende Behavior-Instanz behält den Graph, mit dem sie gestartet ist. Die Einstellung steht sofort im Projekt, der laufende Editor-Run castet aber weiter mit der alten Maske, bis die Instanz neu entsteht. Bestehendes Verhalten, kein Teil dieser Änderung — steht jetzt im Wiki, der Test schaltet „Run in editor" dafür aus und wieder an.
Doku
Wiki: Colliders (die Einstellung, die Einseitigkeit, der Hinweis zur laufenden Instanz; „ein Filter nach Ebenen kommt später" gestrichen), Physics (offene Punkte nachgezogen: bleibt #157), Behaviors (der Node), Development (Check-Summe). Nebenbei die En-Dashes aus Colliders und Physics geräumt, die Gitea als mehrdeutige Zeichen anflaggt.
Deine beiden offenen Punkte („vorschläge passen") sind so gebaut: Vorgabe „alle Ebenen", und der Strahl hat seine eigene Auswahl statt der des Besitzers.
Gebaut und gepusht: `0fdde6c`, Wiki `bc2a138`.
## Was gebaut wurde
Der **Raycast-Node hat eine Einstellung „Layers"** — ein Häkchen pro Kollisionsebene des Projekts, dieselbe Feldart, die der Collider für „Collides with" nutzt. Getroffen wird nur, was auf einer angehakten Ebene sitzt; Tilemaps zählen dabei wie Collider. Vorgabe ist jede Ebene, und ein Graph ohne den Param antwortet genau wie vorher.
**Die Prüfung ist einseitig — anders als die symmetrische Regel aus #152.** Der Strahl liest das `collidesWith` des Getroffenen nicht. Ein Strahl ist kein Collider; wen er ansehen darf, ist seine Sache. Ein Collider, der mit nichts kollidiert, wird von einem Strahl trotzdem getroffen. Das liegt als eigener Unit-Test vor und steht im Wiki.
Der Filter sitzt in **`Solids.raycast` vor dem Schnitttest** — dem einen Weg, den Editor-Run und Play beide gehen. Deshalb läuft jeder Unit-Test über `describe.each` gegen beide Systeme.
Nebenbei nötig: `NodeView` kannte die Feldarten `layer`/`layers` nicht, am Node hätte „Layers: 65533" gestanden. Jetzt steht dort der Name der Ebene bzw. „All layers".
## Tests
```
./check.sh → 121 Files, 1770 Tests, CHECK EXIT 0 (vorher 1764)
npm run build → BUILD EXIT 0
GM_STEPS=43 (frisch geseedet) → ALL PASSED – 13 checks (vorher 8)
```
- **5 neue e2e-Checks** im neuen Block 43d: ein Schild auf eigener Ebene zwischen Caster und Boden hält den Strahl; die Zeile „Layers" am Node mit „All layers"; das Häkchen-Menü mit den Ebenen des Projekts; nach dem Abwählen geht der Strahl durch das Schild bis zum Boden (145 → 280 Einheiten, aus dem Log gemessen); und die Maske als Name statt als Bits.
- **6 neue Unit-Tests**, je 3 gegen beide Systeme: der Strahl geht durch eine ausgeschlossene Ebene zum nächsten Collider — auch dann, wenn dieser selbst mit nichts kollidiert; eine Tilemap auf eigener Ebene wird genauso getroffen oder passiert; und der Node-Param in vier Stufen.
- **Zwei Gegenproben, beide greifen:** Filterzeile in `Solids.raycast` entschärft → 6 Unit-Tests fallen und Modul 43 fällt mit dem Abwähl-Check (`reached: 145` statt 280). Formatierung am Node abgeschaltet → der Node-Check fällt mit `"Layers: 65533"`. Originale per `cmp` zurückgeprüft.
- Check-Summe **1153** (1148 + 5, gerechnet; die 1148 ist von CI an `ae3aa7d` bestätigt).
## Zwei Funde beim Messen
- **`__gm.rays()` misst nur, solange der Scene-Tab vorn ist.** Der Hook liefert, was der Viewport zuletzt gezeichnet hat — eine Node-Auswahl schaltet aber auf den Graph-Tab. Mein erster Testaufbau war dadurch blind und wäre auch gegen kaputten Code grün geblieben. Der Block misst jetzt über einen `Log`-Node an `distance`.
- **Eine laufende Behavior-Instanz behält den Graph, mit dem sie gestartet ist.** Die Einstellung steht sofort im Projekt, der laufende Editor-Run castet aber weiter mit der alten Maske, bis die Instanz neu entsteht. Bestehendes Verhalten, kein Teil dieser Änderung — steht jetzt im Wiki, der Test schaltet „Run in editor" dafür aus und wieder an.
## Doku
Wiki: Colliders (die Einstellung, die Einseitigkeit, der Hinweis zur laufenden Instanz; „ein Filter nach Ebenen kommt später" gestrichen), Physics (offene Punkte nachgezogen: bleibt #157), Behaviors (der Node), Development (Check-Summe). Nebenbei die En-Dashes aus Colliders und Physics geräumt, die Gitea als mehrdeutige Zeichen anflaggt.
Deine beiden offenen Punkte („vorschläge passen") sind so gebaut: Vorgabe „alle Ebenen", und der Strahl hat seine eigene Auswahl statt der des Besitzers.
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 #153 (offener Punkt 3; angefordert im Kommentar in #153). Hängt an #152.
Befund
object.layersMeet(a, b).Zu bauen (sobald #152 steht)
Solids.raycastvor dem Schnitttest, damit Editor-Run und Play gleich antworten.Offen (mit Vorschlag)
vorschläge passen
Gebaut und gepusht:
0fdde6c, Wikibc2a138.Was gebaut wurde
Der Raycast-Node hat eine Einstellung „Layers" — ein Häkchen pro Kollisionsebene des Projekts, dieselbe Feldart, die der Collider für „Collides with" nutzt. Getroffen wird nur, was auf einer angehakten Ebene sitzt; Tilemaps zählen dabei wie Collider. Vorgabe ist jede Ebene, und ein Graph ohne den Param antwortet genau wie vorher.
Die Prüfung ist einseitig — anders als die symmetrische Regel aus #152. Der Strahl liest das
collidesWithdes Getroffenen nicht. Ein Strahl ist kein Collider; wen er ansehen darf, ist seine Sache. Ein Collider, der mit nichts kollidiert, wird von einem Strahl trotzdem getroffen. Das liegt als eigener Unit-Test vor und steht im Wiki.Der Filter sitzt in
Solids.raycastvor dem Schnitttest — dem einen Weg, den Editor-Run und Play beide gehen. Deshalb läuft jeder Unit-Test überdescribe.eachgegen beide Systeme.Nebenbei nötig:
NodeViewkannte die Feldartenlayer/layersnicht, am Node hätte „Layers: 65533" gestanden. Jetzt steht dort der Name der Ebene bzw. „All layers".Tests
Solids.raycastentschärft → 6 Unit-Tests fallen und Modul 43 fällt mit dem Abwähl-Check (reached: 145statt 280). Formatierung am Node abgeschaltet → der Node-Check fällt mit"Layers: 65533". Originale percmpzurückgeprüft.ae3aa7dbestätigt).Zwei Funde beim Messen
__gm.rays()misst nur, solange der Scene-Tab vorn ist. Der Hook liefert, was der Viewport zuletzt gezeichnet hat — eine Node-Auswahl schaltet aber auf den Graph-Tab. Mein erster Testaufbau war dadurch blind und wäre auch gegen kaputten Code grün geblieben. Der Block misst jetzt über einenLog-Node andistance.Doku
Wiki: Colliders (die Einstellung, die Einseitigkeit, der Hinweis zur laufenden Instanz; „ein Filter nach Ebenen kommt später" gestrichen), Physics (offene Punkte nachgezogen: bleibt #157), Behaviors (der Node), Development (Check-Summe). Nebenbei die En-Dashes aus Colliders und Physics geräumt, die Gitea als mehrdeutige Zeichen anflaggt.
Deine beiden offenen Punkte („vorschläge passen") sind so gebaut: Vorgabe „alle Ebenen", und der Strahl hat seine eigene Auswahl statt der des Besitzers.