Enemy To Follow Player

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By sadsax

Am trying to ma the enemy follow the player,
but problem: I can refer to the player (or the player scene) in the script.
The Player and Enemy are both in the root folder
THIS IS MY CODE BELOW:

extends KinematicBody

var path =
var path_node = 0

var speed = 10

onready var nav = get_parent()
onready var player = $“Player”

func _ready():
pass

func _physics_process(delta):
if path_node < path.size():
var direction = (path[path_node] - global_transform.origin)
if direction.length() < 1:
path_node += 1
else:
move_and_slide(direction.nomalized() * speed, Vector3.UP)

func move_to(target_pos):
path = nav.get_simple_path(global_transform.origin, target_pos)
path_node = 0

func _on_Timer_timeout():
move_to(player.global_transform.origin)

:bust_in_silhouette: Reply From: Kyle Szklenski

I think what you’re suggesting should be possible. However, you don’t want to use:

onready var player = $"Player"

Instead, I’d recommend the below approach:

  1. Create a function on your enemy named “setTarget” and have it take in a parameter called “target”
  2. When you create your enemy, get your player from there and call enemy.setTarget(player)
  3. In your enemy, only try to get a path to your player if the player is not null, and try until you have a target (Edit: updated format so it would not italicize stuff unintentionally.)

This is only one way to approach this. Another way I’ve done it is to use groups, where you put your player in a group, and then every enemy can get access to the player directly if they need it. I prefer the above though as it’s more declarative.