extends CharacterBody3D
const SPEED = 1.0
const ACCELERATION = 1.5 # Ajusta este valor para la velocidad de respuesta deseada
#@onready var navAgent = $NavigationAgent3D#ORIGINAL
@onready var navAgent = $NavigationAgent3D
#@onready var target = $"../Player" # Descomenta esta línea si tu jugador se llama "Player"
@onready var target = $"../CharacterBody3D" # Asegúrate de que esta ruta sea correcta para tu jugador
func _physics_process(delta: float) -> void:
# Elimina o comenta la rotación manual si quieres que siempre mire al objetivo
# rotate_y(0.11)
# Añadir gravedad.
if not is_on_floor():
velocity += get_gravity() * delta
if target: # Verifica si el objetivo existe
_update_target_position() # Actualiza la posición del objetivo primero
var currentLocation = global_transform.origin
var nextLocation = navAgent.get_next_path_position()
var nextVelocity = (nextLocation - currentLocation).normalized() * SPEED
velocity = velocity.move_toward(nextVelocity, ACCELERATION * delta) # Usa delta para suavizar la aceleración
move_and_slide()
# Orientar al enemigo hacia la dirección del movimiento (siguiente punto de la ruta)
if nextVelocity.length_squared() > 0.01: # Evita rotaciones cuando no hay movimiento significativo
look_at(global_transform.origin + nextVelocity, Vector3.UP)
else:
print("El objetivo (jugador) no existe.")
func _update_target_position():
if target:
navAgent.target_position = target.global_transform.origin
else:
print("El objetivo (jugador) no existe. No se puede actualizar la posición del NavigationAgent.")
------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
Explicacion: estos dos GDScript sirven para que un enemigo persiga a un player, el de arriba lo persigue asta tocarse con el player ...............el inferior gdscript , tiene el añadido de que se para a una distancia del player, la cual se puede variar desde esta linea const STOPPING_DISTANCE = 1.0 # Distancia mínima al jugador para detenerse.
Cambiando el valor 1.0 se acortara o se distanciara mas el enemigo al detenerse conforme se tope con el player.
En mi actual juego que estoy desarrollando me encontre con un error de que el enemigo al tocar al player se inclinaba asta caer hacia atras y gracias a esta variante de la distancia pude corregir o disimular ese error......
---------------------------------------------------------------------------------------------------------------
extends CharacterBody3D
const SPEED = 1.0
const ACCELERATION = 1.5 # Ajusta este valor para la velocidad de respuesta deseada
const STOPPING_DISTANCE = 1.0 # Distancia mínima al jugador para detenerse
# NO declaramos 'var velocity' aquí. CharacterBody3D ya tiene una propiedad 'velocity' integrada.
@onready var navAgent = $NavigationAgent3D
@onready var target = $"../CharacterBody3D" # Asegúrate de que esta ruta sea correcta para tu jugador
func _physics_process(delta: float) -> void:
# Añadir gravedad.
# Accedemos directamente a la propiedad 'velocity' del CharacterBody3D.
if not is_on_floor():
# get_gravity() es una función del CharacterBody3D en Godot 4.x
velocity += get_gravity() * delta
if target: # Verifica si el objetivo existe
_update_target_position() # Actualiza la posición del objetivo primero
var currentLocation = global_transform.origin
var targetLocation = target.global_transform.origin # Obtenemos la posición actual del jugador
# Calcula la distancia al jugador
var distance_to_player = currentLocation.distance_to(targetLocation)
# LÓGICA DE DETENCIÓN: Si está cerca, no se mueve
if distance_to_player <= STOPPING_DISTANCE:
velocity = Vector3.ZERO # Detiene el movimiento del enemigo
# Opcional: Aquí podrías añadir lógica para un ataque, una animación de espera, etc.
else:
# Si no está lo suficientemente cerca, calcula el siguiente punto en la ruta y se mueve
var nextLocation = navAgent.get_next_path_position()
var nextVelocity = (nextLocation - currentLocation).normalized() * SPEED
# Accedemos directamente a la propiedad 'velocity' del CharacterBody3D.
velocity = velocity.move_toward(nextVelocity, ACCELERATION * delta)
# Mueve y desliza al personaje.
# En Godot 4.x, move_and_slide() no necesita argumentos si la 'velocity'
# ya es una propiedad del CharacterBody3D y el 'Up Direction' está configurado en el Inspector.
move_and_slide() # <--- Línea 39 (aproximadamente): Sin argumentos aquí.
# Orientar al enemigo hacia el jugador (o la dirección del movimiento si lo prefieres)
# Siempre se orientará al jugador, incluso si no se mueve activamente.
look_at(targetLocation, Vector3.UP)
else:
print("El objetivo (jugador) no existe.")
func _update_target_position():
if target:
navAgent.target_position = target.global_transform.origin
else:
print("El objetivo (jugador) no existe. No se puede actualizar la posición del NavigationAgent.")