Mostrando entradas con la etiqueta GDScript en Godot 4.4 IA enemigos persiguiendo al Player;. Mostrar todas las entradas
Mostrando entradas con la etiqueta GDScript en Godot 4.4 IA enemigos persiguiendo al Player;. Mostrar todas las entradas

domingo, 29 de junio de 2025

GDScript en Godot 4.4 IA enemigos persiguiendo al Player;

 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.")