DEV Community

Gaurav Kumar ladhar
Gaurav Kumar ladhar

Posted on

How to create Trail Effect in Godot Engine

A trail effect is a visual effect that creates a trail of particles, lines, or other graphical elements behind a moving object. It is commonly used in games to enhance the visual feedback of movement, create special effects like magic spells or sword slashes, or add a sense of speed and motion to objects.

The trail effect can be used in various scenarios, such as

  • Character Movement: Adding a trail effect to a character's movement can make it feel more dynamic and visually appealing.

  • Projectiles: Trails can be used to create a visual representation of the path of a projectile, such as a bullet or an arrow.

  • Special Effects: Trail effects can be used to create magical or fantastical effects, like a trail of fire or sparks.

  • UI Elements: Trails can be used to enhance the visual feedback of UI elements, such as highlighting a button when it is clicked or dragged.

Now, let's dive into how you can create a trail effect.

  1. Create a queue of position of player movement and draw line between them.
  2. If Line Exceeds maximum length of trail, delete the last position of queue while adding new position.
  3. During this keep updating the line using position to give trail effect.

Creating a Trail Effect in Godot using Line2D and GDScript

To create a trail effect in Godot, we can utilize the Line2D node and GDScript. The Line2D node allows us to draw lines and curves, making it suitable for creating a trail effect that follows the position of an object.

Here's how you can implement it:

Create a new script that extends the Node2D class. Let's call it "TrailEffect.gd".
In the script, define a variable to hold a reference to the Line2D node.

@export var line2d: Line2D
Enter fullscreen mode Exit fullscreen mode

Add two additional variables to control the trail effect.

@export var max_points: int = 10
@export var point_spacing: float = 1
Enter fullscreen mode Exit fullscreen mode

Add a variable to accumulate the distance between points

var distance_accum: float = 0.0
Enter fullscreen mode Exit fullscreen mode

In the _ready function, check if the Line2D node is assigned

func _ready():
    if line2d == null:
        print("Error: line2d is not assigned. Please assign it in the editor.")
        return
    line2d.clear_points()
Enter fullscreen mode Exit fullscreen mode

In the _process function, get the current mouse position

func _process(delta):
    if line2d == null:
        return
    var mouse_position = get_viewport().get_mouse_position()
Enter fullscreen mode Exit fullscreen mode

Calculate the distance from the last point to the current mouse position

    if line2d.get_point_count() > 0:
        var last_point = line2d.get_point_position(line2d.get_point_count() - 1)
        var distance = mouse_position.distance_to(last_point)
        distance_accum += distance
    else:
        distance_accum = point_spacing
Enter fullscreen mode Exit fullscreen mode

Add a new point if the accumulated distance exceeds the spacing

    if distance_accum >= point_spacing:
        line2d.add_point(mouse_position)
        distance_accum = 0.0
        if line2d.get_point_count() > max_points:
            line2d.remove_point(0)
Enter fullscreen mode Exit fullscreen mode

Optionally, you can add a function to reset the trail

func reset_trail():
    if line2d != null:
        line2d.clear_points()
        distance_accum = 0.0
Enter fullscreen mode Exit fullscreen mode

Here is Complete Code

extends Node2D

# Reference to the Line2D node
@export var line2d: Line2D
# Maximum number of points in the trail
@export var max_points: int = 10
# Distance between points
@export var point_spacing: float = 1
# Used to control the spacing between trail points
var distance_accum: float = 0.0

func _ready():
    if line2d == null:
        print("Error: line2d is not assigned. Please assign it in the editor.")
        return
    # Ensure the Line2D node is empty at the start
    line2d.clear_points()
func _process(delta):
    if line2d == null:
        return
    var mouse_position = get_viewport().get_mouse_position()
    # Calculate the distance from the last point to the current mouse position
    if line2d.get_point_count() > 0:
        var last_point = line2d.get_point_position(line2d.get_point_count() - 1)
        var distance = mouse_position.distance_to(last_point)
        distance_accum += distance
    else:
        distance_accum = point_spacing # Ensure the first point is added
    # Add a new point if the accumulated distance exceeds the spacing
    if distance_accum >= point_spacing:
        line2d.add_point(mouse_position)
        distance_accum = 0.0
        # Remove the oldest point if we exceed the max number of points
        if line2d.get_point_count() > max_points:
            line2d.remove_point(0)
# Optionally, you can reset the trail
func reset_trail():
    if line2d != null:
        line2d.clear_points()
        distance_accum = 0.0
Enter fullscreen mode Exit fullscreen mode

Result of above Code
Preview

Above Trail is also added with width curve for line.

By adding Color and Particle Effect trail we can get following Trial effects.

Trail Effect

Top comments (0)