GDScript Code Generator: Magnet Node

Here's a GDScript implementation for a magnet node in Godot, with a complexity level of 5:

extends Area2D

class_name MagnetNode

export var attraction_force: float = 500.0
export var attraction_radius: float = 200.0
export var attract_groups: Array = ["Attractable"]

var attracted_bodies: Array = []

func _ready():
    collision_shape = CollisionShape2D.new()
    var circle_shape = CircleShape2D.new()
    circle_shape.radius = attraction_radius
    collision_shape.shape = circle_shape
    add_child(collision_shape)
    
    connect("body_entered", self, "_on_body_entered")
    connect("body_exited", self, "_on_body_exited")

func _physics_process(delta):
    for body in attracted_bodies:
        if is_instance_valid(body) and body is RigidBody2D:
            var direction = global_position - body.global_position
            var distance = direction.length()
            var force = direction.normalized() * (attraction_force / (distance * distance))
            body.apply_central_impulse(force * delta)

func _on_body_entered(body):
    for group in attract_groups:
        if body.is_in_group(group):
            attracted_bodies.append(body)
            break

func _on_body_exited(body):
    attracted_bodies.erase(body)

func set_attraction_radius(new_radius: float):
    attraction_radius = new_radius
    if collision_shape and collision_shape.shape:
        collision_shape.shape.radius = new_radius

func toggle_magnet(enabled: bool):
    set_physics_process(enabled)
    collision_shape.disabled = not enabled

Code Explanation:

This GDScript creates a MagnetNode class that extends Area2D. Here's a breakdown of its functionality:

To use this node in your Godot project:

  1. Create a new script named "MagnetNode.gd" and paste this code.
  2. Add an Area2D node to your scene and attach this script to it.
  3. Configure the export variables in the Inspector.
  4. Ensure objects you want to attract are RigidBody2D nodes and belong to one of the attract_groups.
← Back to Godot Assist