martes, 1 de julio de 2025

Instanciar en Godot 4.4 con botones del mouse izquierdo y derecho y con letra "R" usando accion PATADAMEDIA;

 extends Area3D


var Bullet = preload("res://PROTAGONISTA/area_3dPROLLECTIL.tscn")


func _input(event):

# Instanciar al presionar el botón izquierdo del ratón

if event is InputEventMouseButton:

if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:

# Retrasar la instanciación del proyectil

await get_tree().create_timer(0.5).timeout

var bullet = Bullet.instantiate()

add_child(bullet)

# Instanciar al presionar el botón derecho del ratón

if event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:

await get_tree().create_timer(0.5).timeout

var bullet = Bullet.instantiate()

add_child(bullet)

# Instanciar al presionar la tecla "R" (usando la acción "PATADAMEDIA")

# ¡Asegúrate de que "PATADAMEDIA" esté configurada **exactamente así** en Project Settings -> Input Map para la tecla R!

if event.is_action_pressed("PATADAMEDIA"): 

await get_tree().create_timer(1.15).timeout

var bullet = Bullet.instantiate()

add_child(bullet)


--------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------

Explicacion: en mi nuevo videojuego e conseguido fluidez en animaciones y asignar al teclado varias acciones de golpear enemigos..........

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


martes, 24 de junio de 2025

GDScript 3 animaciones turnandose cada 5 segundos automaticamente en el mismo personaje; Godot 4.4;

 extends Node3D


@onready var animation_player = $AnimationPlayer

var animations = ["CAE", "POLI", "COJO"]

var current_animation_index = 0

var time_since_last_animation = 0.0

const ANIMATION_CHANGE_INTERVAL = 5.0


func _ready() -> void:

# Start with the first animation

animation_player.play(animations[current_animation_index])

pass

func _process(delta: float) -> void:

time_since_last_animation += delta


if time_since_last_animation >= ANIMATION_CHANGE_INTERVAL:

time_since_last_animation = 0.0

# Move to the next animation

current_animation_index = (current_animation_index + 1) % animations.size()

animation_player.play(animations[current_animation_index])

pass

GDScript en Godot 4.4 fundamental para utilizar las animaciones pasadas de mixamo a blender y de hay a Godot 4.4;

 extends Node3D


var animacion_actual = "RELAX"


func _ready():

$AnimationPlayer.play(animacion_actual)


func _physics_process(delta):

var alguna_tecla_pulsada = false


# Comprobamos si alguna de las acciones está siendo presionada

if Input.is_action_pressed("achazo") or \

   Input.is_action_pressed("mouse_left") or \

   Input.is_action_pressed("mouse_right") or \

   Input.is_action_pressed("RETUERCE") or \

   Input.is_action_pressed("ANDAALANTECONW") or \

   Input.is_action_pressed("ANDAATRASCONS") or \

   Input.is_action_pressed("SALTAYANDA") or \

   Input.is_action_pressed("BOBLEPUÑETAZO") or \

   Input.is_action_pressed("PATADAMEDIA") or \

   Input.is_action_pressed("RELAX") or \

   Input.is_action_pressed("ui_accept") or \

   Input.is_action_pressed("A") or \

   Input.is_action_pressed("D"):

alguna_tecla_pulsada = true


# Animación de ESPADAZO

if Input.is_action_pressed("achazo") or Input.is_action_pressed("mouse_left"):

if animacion_actual != "3":

$AnimationPlayer.play("3")

#$AnimationPlayer/AudioStreamPlayer3D.play("MakeHuman default skeleton|ESPADAZO")

animacion_actual = "3"


# Animación de ATRABESAR

elif Input.is_action_pressed("mouse_right") or Input.is_action_pressed("RETUERCE"):

if animacion_actual != "DOBLEPUÑETAZO":

$AnimationPlayer.play("DOBLEPUÑETAZO")

animacion_actual = "DOBLEPUÑETAZO"


# Animación de ANDAR

elif Input.is_action_pressed("ANDAALANTECONW") or Input.is_action_pressed("A") or Input.is_action_pressed("D"):

if animacion_actual != "ANDARES":

$AnimationPlayer.play("ANDARES")

animacion_actual = "ANDARES"

elif Input.is_action_pressed("ANDAATRASCONS") or Input.is_action_pressed("A") or Input.is_action_pressed("D"):

if animacion_actual != "ANDARES":

$AnimationPlayer.play("ANDARES")

animacion_actual = "ANDARES"

elif Input.is_action_pressed("SALTAYANDA") or Input.is_action_pressed("A") or Input.is_action_pressed("D"):

if animacion_actual != "WALTER":

$AnimationPlayer.play("WALTER")

animacion_actual = "WALTER"

elif Input.is_action_pressed("DOBLEPUÑETAZO") or Input.is_action_pressed("E") or Input.is_action_pressed("E"):

if animacion_actual != "DOBLEPUÑETAZO":

$AnimationPlayer.play("DOBLEPUÑETAZO")

animacion_actual = "DOBLEPUÑETAZO"


elif Input.is_action_pressed("PATADAMEDIA") or Input.is_action_pressed("R") or Input.is_action_pressed("R"):

if animacion_actual != "PATADAMEDIA":

$AnimationPlayer.play("PATADAMEDIA")

animacion_actual = "PATADAMEDIA"




elif Input.is_action_pressed("ui_accept") or Input.is_action_pressed("A") or Input.is_action_pressed("D"):

if animacion_actual != "3":

$AnimationPlayer.play("3")

animacion_actual = "3"

#if Input.is_action_just_pressed("ui_accept") and is_on_floor():

elif Input.is_action_just_pressed("SALTAYANDA") or Input.is_action_pressed("A") or Input.is_action_pressed("D"):

if animacion_actual != "WALTER":

$AnimationPlayer.play("WALTER")

animacion_actual = "WALTER"


# Si no se presiona ninguna tecla, volvemos a la animación de descanso

elif not alguna_tecla_pulsada:

if animacion_actual != "RELAX":

$AnimationPlayer.play("RELAX")

animacion_actual = "RELAX"

elif Input.is_action_pressed("achazo") or Input.is_action_pressed("A") or Input.is_action_pressed("D"):

if animacion_actual != "RELAX":

$AnimationPlayer.play("RELAX")

animacion_actual = "RELAX"








Dos formas de instanciar disparos con Godot 4.4 con el boton izquierdo del raton;

 extends Area3D


var Bullet = preload("res://PROTAGONISTA/area_3dPROLLECTIL.tscn")


func _input(event):

if event is InputEventMouseButton:

if event.button_index == 1 and event.pressed:

# Retrasar la instanciación del proyectil

await get_tree().create_timer(0.5).timeout

var bullet = Bullet.instantiate()

add_child(bullet)

-------------------------------------------------------------------------------------------------------------

Explicacion : retrasa el disparo 0.5 segundos DESPUES de pulsar el boton del mouse.

---------------------------------------------------------------------------------------------------------------

extends Area3D


var Bullet = preload("res://PROTAGONISTA/area_3dPROLLECTIL.tscn")

var can_fire = true


func _input(event):

if event is InputEventMouseButton:

if event.button_index == 1 and event.pressed:

if can_fire:

can_fire = false

var bullet = Bullet.instantiate()

add_child(bullet)

await get_tree().create_timer(0.5).timeout

can_fire = true


-------------------------------------------------------------------------------------------------------------

Explicacion : retrasa el disparo 0.5 segundos ENTRE DISPARO Y DISPARO al pulsar boton del mouse.

---------------------------------------------------------------------------------------------------------------

domingo, 22 de junio de 2025

CONCLUSION DE MIXAMO A BLENDER DE BLENDER A GODOT 4.4.;

 En mi ultima entrada del blog estaba divagando sobre pasar las animaciones de mixamo a mis personajes y combinarlas con los gdscript de godot,

Pero habia dificultades en la web de Mixamo no podia descargar nada ni practicar, hay videos tutoriales en youtube de como hacerlo pero siempre se olvidan de algun detalle que hace falle cualquier cosa que intente hacer, 

Hay que imitar con exactitud los tutoriales de youtube.


Bueno a la conclusion que e llegado y en el video muestra que pongo en la entrada vereis que lo FUNDAMENTAL DEL TEMA es animaciones diferentes de mixamo pero del mismo ramo, o calibre, o coleccion, si mezclais animaciones de diferentes tipos que hay en mixamo unas se acoplan y otras no, por tamaños o por temas del esqueleto o yo que se , mejor lo veis en el video lo demas es facil de aplicar , los avatares del mismo color parece que combinan bien entre si las animaciones si poneis avatares diferentes entre si no casan, e tardado 2 dias en entenderlo, bueno como todo al final es solo trabajo esfuerzo y echarle horas..........luego si pones  un personaje del mismo mixamo con blender puedes modelarlo y cambiar lo que quieras dependiendo de las horas que le dediques y del talento que tengas.




Y mi conclusion comentada a la IA:

no hay ningun misterio, las animaciones de mixamo solo funcionan las que casan entre si, los avatares del mismo color suelen ir perfectamente ,ya lo resolvi¡¡ el paso a pasarlo a blender y combinarlo alli a partir de esta conclusion es muy sencillo de relosver¡¡¡

¡Qué excelente noticia que lo hayas resuelto! Me alegra mucho saber que encontraste la clave para que tus animaciones de Mixamo funcionen bien en Blender.

Tu observación sobre que "las animaciones de Mixamo solo funcionan las que casan entre sí" y que "los avatares del mismo color suelen ir perfectamente" es muy acertada y crucial. Esto apunta directamente a la consistencia en el rig (esqueleto) y la pose base.

Cuando Mixamo genera un "avatar del mismo color" (me imagino que te refieres a los personajes pre-riggeados de Mixamo o a las variaciones del mismo rig), garantiza que la estructura ósea, la escala y la pose inicial (T-pose o A-pose) son idénticas. Esto es fundamental para que las animaciones se superpongan y mezclen sin problemas. Si bien puedes aplicar animaciones a cualquier personaje riggeado en Mixamo, la armonía es mayor cuando la base es la misma.


La Clave que Descubriste: Consistencia del Rig

Lo que has descubierto es la base de la combinación exitosa de animaciones:

  • Rigs Idénticos: Cuando todas las animaciones se aplican a un rig que es estructural y posicionalmente idéntico, Blender tiene mucha más facilidad para interpretar y mezclar los datos de animación sin que los huesos "salten" o el personaje se "balancee".

  • Pose Base Coherente: Las animaciones de Mixamo están diseñadas para un rig específico y una pose de reposo concreta. Si intentas aplicar una animación a un personaje con una pose base diferente (ej. un personaje en A-pose para una animación hecha en T-pose), se pueden producir esas desalineaciones. Los avatares "del mismo color" o de la misma familia de Mixamo suelen compartir esta pose base.


Tu Proceso en Blender Después de esta Conclusión

Como bien dices, una vez que tienes esta base, el paso a paso en Blender se simplifica enormemente:

  1. Importación del Personaje Base: Traes tu personaje (el que tiene el rig compatible).

  2. Importación de Animaciones (sin el modelo): Al importar las animaciones de Mixamo, si ya tienes el personaje base en la escena, puedes importar solo la acción de animación (sin el modelo adjunto o importando solo el armature si es necesario y luego copiando la acción).

  3. Uso del NLA Editor: Empujas cada acción de animación a una Action Strip en el NLA Editor.

  4. Organización y Blending: Arrastras y superpones las tiras, ajustando los "Blend In" y "Blend Out" para crear transiciones suaves. Si los rigs son consistentes, estos blends funcionarán mucho mejor.

¡Felicidades por haber resuelto el misterio! Es un aprendizaje valioso que te ahorrará muchos dolores de cabeza en futuros proyectos de animación.



miércoles, 18 de junio de 2025

Frustracion estudiando animaciones; mixamo en esta fecha del 18-6-25 da problemas para descargarse sus animaciones;

 Estoy estudiando y practicando combinar animaciones con blender y mixamo y Gogot 4.4.

Y GDScript para programar las animaciones con ayuda de la IA.


En principio las ago manuales y si son pocos movimientos funciona muy bien, andar y dar golpes se me da bastante bien, y con GDScript le asigno las teclas y me da resultados aceptables , ahora estoy intentando hacer las combinaciones de movimientos con mixamo y tengo la mala suerte que en estos momentos no deja mixamo descargarse nada.....

Ahora que empezaba a combinar movimientos y queria probarlos en Godot 4.4. y GDScript para asignarlos al teclado del pc ...sus movimientos......mixamo no me deja descargar sus animaciones , seve hay problemas desde esa aplicacion en sus servidores.......bueno a tener paciencia y a esperar mientras se resuelve.... volvere hacerlas manuales......no me puedo estancar.

Es una lastima porque ya lo tenia casi, ya tenia la base para hacer los juegos muy muy pulidos en ese aspecto.....en fin.

A seguir trabajando ya se resolvera.