viernes, 6 de diciembre de 2024

GDScript para un CharacterBody3D; personaje que manejamos en 1ª persona; a 360 grados y a 90 grados dos ejemplos;

extends CharacterBody3D


var rotation_angle = 90.0  # Ángulo de rotación actual

var rotate_speed = 2.0  # Velocidad de rotación reducida para un giro más suave


const SPEED = 0.2  # Velocidad de movimiento

const JUMP_VELOCITY = 4.5  # Velocidad de salto


var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


func _physics_process(delta):

    # Movimiento vertical (salto)

    if not is_on_floor():

        velocity.y -= gravity * delta


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

        velocity.y = JUMP_VELOCITY


    # Movimiento horizontal (basado en la entrada)

    var input_dir = Input.get_vector("ui_left", "ui_right", "andaradelante", "detenerse")

    var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()


    if direction:

        velocity.x = direction.x * SPEED

        velocity.z = direction.z * SPEED

    else:

        velocity.x = move_toward(velocity.x, 0, SPEED)

        velocity.z = move_toward(velocity.z, 0, SPEED)


    # Aplicar movimiento y rotación

    move_and_slide()


    # Rotación (limitada a 90 grados y más lenta)

    var rotation_delta = 0.0

    if Input.is_action_pressed("move_left"):

        rotation_delta = rotate_speed * delta  # Invertimos la dirección

    elif Input.is_action_pressed("move_right"):

        rotation_delta = -rotate_speed * delta  # Invertimos la dirección


    # Limitamos el giro a 90 grados en ambas direcciones

    rotation_angle = clamp(rotation_angle + rotation_delta, -PI / 2, PI / 2)

    rotate_y(rotation_delta)


    # Movimiento basado en "andaradelante" (opcional)

    if Input.is_action_pressed("andaradelante"):

        translate(Vector3(0, 0, -0.009))


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

mismo script pero limitado a 90 grados de giro., el de arriba gira 360 grados

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

extends CharacterBody3D


var rotation_angle = 0.0  # Ángulo de rotación actual

var rotate_speed = 3.1     # Velocidad de rotación


const SPEED = 0.1          # Velocidad de movimiento

const JUMP_VELOCITY = 4.0   # Velocidad de salto


var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


func _ready():

pass


func _physics_process(delta):

# Movimiento vertical (saltar)

if not is_on_floor():

velocity.y -= gravity * delta


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

velocity.y = JUMP_VELOCITY


# Movimiento horizontal (basado en input)

var input_dir = Input.get_vector("ui_left", "ui_right", "andaradelante", "detenerse")

var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()


if direction:

velocity.x = direction.x * SPEED

velocity.z = direction.z * SPEED

else:

velocity.x = move_toward(velocity.x, 0, SPEED)

velocity.z = move_toward(velocity.z, 0, SPEED)


move_and_slide()


# Rotación (limitada a 60 grados)

if Input.is_action_pressed("move_left"):

if rotation_angle > -PI / 3:  # -60 grados en radianes

rotation_angle -= rotate_speed * delta

rotate_y(rotate_speed * delta)


if Input.is_action_pressed("move_right"):

if rotation_angle < PI / 3:  # 60 grados en radianes

rotation_angle += rotate_speed * delta

rotate_y(-rotate_speed * delta)

 

# Detener movimiento (opcional)

if Input.is_action_pressed("andaradelante"):

#if Input.is_action_pressed("detenerse"):

velocity.x = 0

velocity.z = 0

rotate_y(0)  # Opcional, para detener la rotación también

translate(Vector3(0, 0, -0.009))




#if Input.is_action_pressed("andaradelante"):

if Input.is_action_pressed("detenerse"):

velocity.x = 0

velocity.z = 0

rotate_y(0)  # Opcional, para detener la rotación también

translate(Vector3(0, 0, 0.009))

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

OTRO EJEMPLO SOLO GIRA 90 GRADOS NO ABANZA NI RETROCEDE

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


extends CharacterBody3D


var rotation_angle = 0.0  # Ángulo de rotación actual

var rotate_speed = 3.1     # Velocidad de rotación


const SPEED = 0.1          # Velocidad de movimiento

const JUMP_VELOCITY = 4.0   # Velocidad de salto


var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


func _ready():

pass


func _physics_process(delta):

# Movimiento vertical (saltar)

if not is_on_floor():

velocity.y -= gravity * delta


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

velocity.y = JUMP_VELOCITY


# Movimiento horizontal (basado en input)

var input_dir = Input.get_vector("ui_left", "ui_right", "andaradelante", "detenerse")

var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()


if direction:

velocity.x = direction.x * SPEED

velocity.z = direction.z * SPEED

else:

velocity.x = move_toward(velocity.x, 0, SPEED)

velocity.z = move_toward(velocity.z, 0, SPEED)


move_and_slide()


# Rotación (limitada a 60 grados)

if Input.is_action_pressed("move_left"):

if rotation_angle > -PI / 3:  # -60 grados en radianes

rotation_angle -= rotate_speed * delta

rotate_y(rotate_speed * delta)


if Input.is_action_pressed("move_right"):

if rotation_angle < PI / 3:  # 60 grados en radianes

rotation_angle += rotate_speed * delta

rotate_y(-rotate_speed * delta)


# Detener movimiento (opcional)

if Input.is_action_pressed("detenerse"):

velocity.x = 0

velocity.z = 0

rotate_y(0)  # Opcional, para detener la rotación también


# Movimiento continuo (opcional)

# Puedes reemplazar estas líneas con el movimiento deseado

# translate(Vector3(0, 0, -0.01))  # Movimiento continuo hacia adelante


jueves, 5 de diciembre de 2024

Un CharacterBody3D, limito su giro a 60 grados, para que no dispare a su espalda que me rompe la idea de juego;

 extends CharacterBody3D


var rotation_angle = 0.0  # Ángulo de rotación actual

var rotate_speed = 3.1     # Velocidad de rotación


const SPEED = 0.1          # Velocidad de movimiento

const JUMP_VELOCITY = 4.0   # Velocidad de salto


var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


func _ready():

pass


func _physics_process(delta):

# Movimiento vertical (saltar)

if not is_on_floor():

velocity.y -= gravity * delta


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

velocity.y = JUMP_VELOCITY


# Movimiento horizontal (basado en input)

var input_dir = Input.get_vector("ui_left", "ui_right", "andaradelante", "detenerse")

var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()


if direction:

velocity.x = direction.x * SPEED

velocity.z = direction.z * SPEED

else:

velocity.x = move_toward(velocity.x, 0, SPEED)

velocity.z = move_toward(velocity.z, 0, SPEED)


move_and_slide()


# Rotación (limitada a 60 grados)

if Input.is_action_pressed("move_left"):

if rotation_angle > -PI / 3:  # -60 grados en radianes

rotation_angle -= rotate_speed * delta

rotate_y(rotate_speed * delta)


if Input.is_action_pressed("move_right"):

if rotation_angle < PI / 3:  # 60 grados en radianes

rotation_angle += rotate_speed * delta

rotate_y(-rotate_speed * delta)


# Detener movimiento (opcional)

if Input.is_action_pressed("detenerse"):

velocity.x = 0

velocity.z = 0

rotate_y(0)  # Opcional, para detener la rotación también


# Movimiento continuo (opcional)

# Puedes reemplazar estas líneas con el movimiento deseado

# translate(Vector3(0, 0, -0.01))  # Movimiento continuo hacia adelante




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

NUEVA COMBINACION A 60 GRADOS CADA VEZ QUE SE PRESIONA TECLA

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


extends CharacterBody3D


var rotation_angle = 0.0  # Current rotation angle

var rotate_speed = 10.0  # Rotation speed (adjust as needed)


const SPEED = 0.2        # Movement speed

const JUMP_VELOCITY = 4.5 # Jump velocity


var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


func _physics_process(delta):

# Vertical movement (jumping)

if not is_on_floor():

velocity.y -= gravity * delta


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

velocity.y = JUMP_VELOCITY


# Horizontal movement (based on input)

var input_dir = Input.get_vector("ui_left", "ui_right", "andaradelante", "detenerse")

var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()


if direction:

velocity.x = direction.x * SPEED

velocity.z = direction.z * SPEED

else:

velocity.x = move_toward(velocity.x, 0, SPEED)

velocity.z = move_toward(velocity.z, 0, SPEED)


# Apply movement and rotation

move_and_slide()


# Rotation (limited to 60 degrees)

if Input.is_action_pressed("move_left"):

if rotation_angle > -PI / 3:

rotation_angle -= rotate_speed * delta

rotate_y(rotate_speed * delta)

elif Input.is_action_pressed("move_right"):

if rotation_angle < PI / 3:

rotation_angle += rotate_speed * delta

rotate_y(-rotate_speed * delta)

else:

rotation_angle = move_toward(rotation_angle, 0, rotate_speed * delta)

rotate_y(-rotation_angle * delta)  # Smoothly rotate back to center


# Movement based on "andaradelante" action (optional)

if Input.is_action_pressed("andaradelante"):

translate(Vector3(0, 0, -0.009))


# Mouse-based movement (optional)

if Input.is_action_pressed("mouse_left"):

translate(Vector3(0.0, 0.00, -0.04))


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

OTRO RESULTADO DE EQUILIBRIO DE GIRO

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


extends CharacterBody3D


var rotation_angle = 0.0  # Ángulo de rotación actual

var rotate_speed = 10.0  # Velocidad de rotación


const SPEED = 0.2        # Velocidad de movimiento

const JUMP_VELOCITY = 4.5 # Velocidad de salto


var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


var is_rotating_left = false

var is_rotating_right = false


func _physics_process(delta):

# Vertical movement (jumping)

if not is_on_floor():

velocity.y -= gravity * delta


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

velocity.y = JUMP_VELOCITY


# Horizontal movement (based on input)

var input_dir = Input.get_vector("ui_left", "ui_right", "andaradelante", "detenerse")

var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()


if direction:

velocity.x = direction.x * SPEED

velocity.z = direction.z * SPEED

else:

velocity.x = move_toward(velocity.x, 0, SPEED)

velocity.z = move_toward(velocity.z, 0, SPEED)


# Apply movement and rotation

move_and_slide()


# Rotation (limited to 60 degrees, one time per press)

if Input.is_action_just_pressed("move_left") and not is_rotating_left:

if rotation_angle > -PI / 3:

rotation_angle -= rotate_speed * delta

rotate_y(rotate_speed * delta)

is_rotating_left = true

elif Input.is_action_just_released("move_left"):

is_rotating_left = false


if Input.is_action_just_pressed("move_right") and not is_rotating_right:

if rotation_angle < PI / 3:

rotation_angle += rotate_speed * delta

rotate_y(-rotate_speed * delta)

is_rotating_right = true

elif Input.is_action_just_released("move_right"):

is_rotating_right = false


# Movement based on "andaradelante" (optional)

if Input.is_action_pressed("andaradelante"):

translate(Vector3(0, 0, -0.009))


viernes, 29 de noviembre de 2024

GDScript, una animacion la detiene al presionar tecla "u" con mapa de entrada llamado"paraanimacion" al soltar prosige;

 extends Node3D


var animation_player = null

var animation_playing = false

var target_animation = "MakeHuman default skeleton|pistolaenmanodisparando"


func _ready():

# Obtener una referencia al nodo AnimationPlayer

animation_player = $AnimationPlayer




# Reproducir la animación si existe

animation_player.play(target_animation)

animation_playing = true


func _process(delta):

# Controlar la reproducción de la animación con la tecla "u"

if Input.is_action_pressed("paraanimacion"):

if animation_playing:

# Detener la animación

animation_player.stop()

animation_playing = false

elif Input.is_action_just_released("paraanimacion"):

if not animation_playing:

# Reanudar la animación

animation_player.play(target_animation)

animation_playing = true

lunes, 25 de noviembre de 2024

extends CPUParticles3D, GDScript rota el plano de particulas constantemente; para conseguir efectos;

 extends CPUParticles3D



# Called when the node enters the scene tree for the first time.

func _ready() -> void:


pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta: float) -> void:

rotate_z(1.2)

pass


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

otro ejemplo en otro eje

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

extends CPUParticles3D



# Called when the node enters the scene tree for the first time.

func _ready() -> void:


pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta: float) -> void:

rotate_x(2)

pass

-----------------------------------------
otro ejemplo mas en los 3 ejes x,z,y
----------------------------------------------


extends CPUParticles3D


# Called when the node enters the scene tree for the first time.
func _ready() -> void:

pass # Replace with function body.


# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
rotate_z(1.4)
rotate_x(1.7)
rotate_y(1.1)
pass

jueves, 21 de noviembre de 2024

GDScript para Godot 4.3 por tiempo cambia la escena, por presional tecla del pc numero -9- cambia la escena, y al presionar -esc- sales del juego;

 extends Node


var tiempo_transcurrido = 0.0  # Variable para almacenar el tiempo transcurrido


func _process(delta):


if Input.is_action_pressed("ui_cancel"):

get_tree().quit()


tiempo_transcurrido += delta


if tiempo_transcurrido >= 12.0:

#queue_free()

var siguiente_escena = preload("res://ESCENAS/world_environmentESCENA PRINCIPAL-9-.tscn")  # Precargar la escena

get_tree().change_scene_to_packed(siguiente_escena)  # Cambiar a la escena precargada (Godot 4.2)

#queue_free()  # Liberar este nodo después del cambio de escena


# Nueva condición para cambiar de escena al presionar "9"

if Input.is_action_just_pressed("PISONUEVEPEROBOYAL10"):

var nueva_escena = preload("res://ESCENAS/world_environmentESCENA PRINCIPAL-9-.tscn")

get_tree().change_scene_to_packed(nueva_escena)


pass # Replace with function body.

miércoles, 20 de noviembre de 2024

Trabajo que publicare en itchi.io, perico415 - itch.io calculo en enero del 2025,;

 

https://perico415.itch.io/

Despues de 11 meses mas o menos casi un año de desarrollar con Godot, muestro este video de mi proximo trabajo que publicare en itchi.io, perico415 - itch.io calculo en enero del 2025, en estos 11 meses publique en itchi.io varios juegos, todos de tematica adulta,


Todos con bastante audiencia, y algunas capturas de video muy exitosas, teniendo en cuenta que no soy Youtuber de éxito y popular,


Realmente no me arrepiento de cambiarme a Godot antes usaba Unity, pero veia mucho royo, y para ser un aficionado en estos temas de desarrollar videojuegos, yo solo quiero hacerme rico haciendo juegos, no necesito a Unity ni trabajar para una empresa, yo me vasto y me sobro para ganar mucha pasta¡¡¡¡


Soy sarcastico….pero realmente me siento capaz de cualquier cosa!!!!


No ahora en serio, me gusta muchisimo crear videojuegos, y con Godot me siento muy comodo.



Y me encanta ver como suben un monton las visitas a mi pagina de Itch.io. perico415 - itch.io .



En este video, muestro mi proximo trabajo, tematica de intriga y misterio y surrealismo, me inspira el ambiente nocturno del cine de terror, me inspira Stephen king,


El juego va de un ascensor y de situaciones al vajar y subir plantas de un edificio, en cada planta procuro cambiar la escena, las animaciones , me da por hacerlas manualmente incluso las de caminar que son muy muy dificiles de hacer, pero lo estoy haciendo, y el juego tendra todo un mismo estilo de movimiento y de graficos 3d, podria poner animaciones ya echas realistas, pero me esta gustando hacerlas yo, y si desarrollo juegos es por diversion no por obligacion,




La IA del navegador Microsoft Edge me esta ayudando muchisimo en el tema de programacion GDScript que es el que usa Godot 4.3, es la version que estoy utilizando.



No te resuelve la papeleta, tienes que ir preguntando y probando y cambiando lineas de codigo, y al final estoy teniendo muy buenos resultados, lo mejor cuando un codigo, un script funciona, puedes hacer cambios y añadirle lineas o cambiarlas, y voy aprendiendo.


Ayuda a aprender es como tener un profesor particular.



Pondre varios scripts que utilizo en el juego, algunos vienen con el propio Godot otros los e retocado yo sacando informacion de aquí y de aya,


En este juego estoy empezando a manipular barra de vida, algo estoy haciendo y saldra en el juego, con script que me proporciono la IA , puedo manipular ideas y temas que salen en el juego,


Mis herramientas de trabajo son, Godot 4.3, Blender, Gimp, Paint, Makehuman, lmms , practicamente casi todos de tipo software libre.org , tambien uso algo de la web OpenGameArt.org .


Y efectos de sonido de https://www.videvo.net/

E conseguido hacer efectos de tembleque del ascensor, efectos de aparecer y desaparecer de fantasmas, cambiar escenas con facilidad por paso de tiempo o presionando alguna tecla del pc,


Me encanta y me gusta muchisimo poder jugar con las camaras y sus enfoques, haciendo un juego de estilo como de cine y de comic.


Y bueno hay estoy con mi maravillosa aficion, con la que pienso hacerme multimillonario……..perdon con la que pienso entretenerme asta el fin de mis dias, si la salud me lo permite, que pienso seran muchos años ya que para esto no hace falta correr maratones ni levantar cargas pesadas de 50 kilos, ….


Eso si paciencia….toneladas….contancia...eterna. Espero guste el video ...ala asta luego!!!!!



A continuacion algunos scripts GDScript que uso en el juego, ayudado por la IA, sino imposible no tengo estudios de programacion.........

extends MeshInstance3D


func _input(event):

# Comprobamos si es un evento de teclado

if event is InputEventKey:

if event.pressed:

if event.keycode == KEY_Z:

rotate_x(0.04)

elif event.keycode == KEY_X:

rotate_x(-0.04)

# Comprobamos si es un evento de acción de entrada

elif event is InputEventAction:

pass

#func _input(event):

if event is InputEventMouseButton:



if event.pressed and event.is_action("mouse_rueda_arriba"):

#if event.action == "mouse_rueda_arriba":

rotate_x(-0.04)

elif event.pressed and event.is_action("mouse_rueda_avajo"):

#elif event.action == "mouse_rueda_avajo":

rotate_x(0.04)




ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

extends Node3D



# Called when the node enters the scene tree for the first time.

func _ready() -> void:

$AnimationPlayer.play("Esqueleto|EsqueletoAction")

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta: float) -> void:

pass


ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

extends Area3D



# Called when the node enters the scene tree for the first time.

func _ready() -> void:

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta: float) -> void:

pass



func _on_area_entered(area: Area3D) -> void:

#$"CSGBox3D2ASCENSOR4 puertaabre".play("puertaascensor")

$MeshInstance3D.play("corredera")

pass # Replace with function body.

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo


extends Area3D



# Called when the node enters the scene tree for the first time.

func _ready() -> void:

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta: float) -> void:

pass



func _on_area_entered(area: Area3D) -> void:

var siguiente_escena = preload("res://ESCENAS/world_environmentESCENA PRINCIPAL-2-.tscn")  # Precargar la escena


get_tree().change_scene_to_packed(siguiente_escena)  # Cambiar a la escena precargada (Godot 4.2)


queue_free()  # Liberar este nodo después del cambio de escena

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

extends Area3D



# Called when the node enters the scene tree for the first time.

func _ready() -> void:

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta: float) -> void:

pass



func _on_area_entered(area: Area3D) -> void:

queue_free()

pass # Replace with function body.

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

extends Area3D



# Called when the node enters the scene tree for the first time.

func _ready() -> void:

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta: float) -> void:

pass



func _on_area_entered(area: Area3D) -> void:

$MeshInstance3D/AnimationPlayer.play("CORREDERAS")

pass # Replace with function body.


ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

extends Area3D



# Called when the node enters the scene tree for the first time.

func _ready() -> void:

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta: float) -> void:

pass



func _on_area_entered(area: Area3D) -> void:

$"../CSGBox3D2ASCENSOR4 puertaabre".play($"../CSGBox3D2ASCENSOR4 puertaabre/AnimationPlayer")

pass # Replace with function body.

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo








extends Area3D



var Bullet = preload("res://EL PROTAGONISTA/BALA PROYECTIL/PROYECTIL.tscn")

#var Bullet2 = preload("res://EL PROTAGONISTA/FOGONAZO PISTOLA/cpu_particles_3dfogonazo.tscn")



func _ready() -> void:




pass # Replace with function body.






func _input(event):






if event is InputEventMouseButton:




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



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


var bullet = Bullet.instantiate()

#var bullet2 = Bullet2.instantiate()


add_child(bullet)

#add_child(bullet2)


func _unhandled_input(event):

if event is InputEventKey and event.pressed:

if event.keycode == KEY_W:

translate(Vector3(0, 0, 0) * get_process_delta_time())  # Temporary movement (consider physics)


#if event.keycode == KEY_


#apply_impulse(Vector3(0,40,4))#ORIGINAL



if event.keycode == KEY_Z:

rotate_x(0.02)

pass

if event.keycode == KEY_X:

rotate_x(-0.02)

pass

if event is InputEventMouseButton:



if event.pressed and event.is_action("mouse_rueda_arriba"):

#if event.action == "mouse_rueda_arriba":

rotate_x(-0.02)

elif event.pressed and event.is_action("mouse_rueda_avajo"):

#elif event.action == "mouse_rueda_avajo":

rotate_x(0.02)

pass

oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo



martes, 19 de noviembre de 2024

GDScript aparece y desaparece un nodo; este es de un tipo Node3D; ago efecto de un fantasma;

 extends Node3D


var timer = 0.0

var blink_speed = 0.4  # Ajusta la velocidad de parpadeo


func _process(delta: float) -> void:

timer += delta

if timer >= blink_speed:

timer = 0.0

visible = not visible