Collision Result GC Leading to Engine Crash in GodotJS
- Dominant language
- C++
- Stars
- 1.1k
- Forks
- 80
- PR merge metrics
- No merged PRs in 30d
Description
### Version
4.1-v0.0.20-20240906
### System information
Windows11
### Issue description
```ts
export default class TestScript extends godot.PhysicsBody2D {
collink: any;
_ready() {
this.set_physics_process(true); // Enable physics processing
}
_physics_process(delta: number): void {
let velocity = new godot.Vector2();
if (godot.Input.is_action_pressed("up")) velocity.y -= 1;
if (godot.Input.is_action_pressed("down")) velocity.y += 1;
if (godot.Input.is_action_pressed("left")) velocity.x -= 1;
if (godot.Input.is_action_pressed("right")) velocity.x += 1;
// Normalize velocity vector and scale by speed and delta time
if (velocity.length() > 0) {
velocity.x *= 5;
velocity.y *= 5;
// Update position and handle collisions
// Without storing the collision result, the object is garbage collected (GC)
// which leads to game crashes on subsequent collision checks
const res = this.move_and_collide(velocity, false, 0.08, true);
if (res) this.collink = res; // Store collision result to prevent GC
console.log('res', res);
}
}
}
```
### Steps to reproduce
Just testing the above code
### Minimal reproduction project (MRP)
[game.zip](https://github.com/user-attachments/files/17529435/game.zip)
Contributor guide
Research direction
Start with the attached game.zip reproduction and run the TypeScript script around PhysicsBody2D.move_and_collide. Trace the GodotJS binding and collision-result lifetime, then repeatedly exercise the collision path without manually retaining res. Done means the reproduction no longer crashes during subsequent collision checks.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, typescript
- Domain
- game-dev
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100