Pet Following
Problem
You need to have a game entity such as a pet or minion, follow a character.
Solution
We start by adding a Marker2D
to the character. This will represent the place where the pet wants to “hang out” near the character.
In this example, we’ve made it a child of the Sprite2D
, because the character’s code uses $Sprite2D.scale.x = -1
to flip the horizontal direction when the character moves left. Since the marker is a child of the sprite, it will flip too.
Pet script
Here’s the script for the pet.
extends CharacterBody2D
@export var parent : CharacterBody2D
var speed = 25
@onready var follow_point = parent.get_node("Sprite2D/FollowPoint")
The parent
variable holds a reference to the character the pet should follow. We then get the FollowPoint
node from that so we can get its position in _physics_process()
:
func _physics_process(delta):
var target = follow_point.global_position
velocity = Vector2.ZERO
if position.distance_to(target) > 5:
velocity = position.direction_to(target) * speed
if velocity.x != 0:
$Sprite2D.scale.x = sign(velocity.x)
if velocity.length() > 0:
$AnimationPlayer.play("run")
else:
$AnimationPlayer.play("idle")
move_and_slide()
If it’s close to the target point, we stop the pet’s movement.
Navigating obstacles
Depending on your world, you may find the pet gets stuck on obstacles. For more robust following, you can use navigation. See TileMap Navigation for an example.
Download This Project
Download the project’s example code here: https://github.com/godotrecipes/ai_behavior_demos