Utilice esta técnica para mejorar el movimiento y el comportamiento del enemigo emulando la visión básica.

La detección de línea de visión agrega una capa de complejidad a tu juego con un mecanismo que permite a los personajes u objetos percibir su entorno. Puedes usar esta función para el comportamiento de la IA del enemigo, la mecánica de visibilidad del jugador, el juego sigiloso y más.

En Godot, el nodo RayCast2D ofrece una forma sencilla y eficiente de lograr la detección de línea de visión.

Configurando el juego de Godot

Antes de sumergirse en los nodos RayCast2D, configure un entorno de juego 2D básico en Godot 4. crear un jugador personaje que puede moverse usando las entradas del teclado e interactuar con plataformas.

Primero, crea una escena para el personaje del jugador. Agrega un PersonajeCuerpo2D nodo como raíz de la escena. Dentro de PersonajeCuerpo2D, Agrega un ColisiónForma2D con forma de rectángulo y Sprite2D para la representación visual del personaje.

El código utilizado en este artículo está disponible en este

instagram viewer
repositorio de GitHub y su uso es gratuito bajo la licencia MIT.

Aquí está el código GDScript para el movimiento del reproductor:

extends CharacterBody2D

var speed = 300

func _physics_process(delta):
var input_dir = Vector2.ZERO

if Input.is_action_pressed("ui_left"):
input_dir.x -= 1

if Input.is_action_pressed("ui_right"):
input_dir.x += 1

if Input.is_action_pressed("ui_up"):
input_dir.y -= 1

if Input.is_action_pressed("ui_down"):
input_dir.y += 1

velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)

Ahora, crea algunas plataformas para que el jugador interactúe. Puedes usar Cuerpo estático2D nodos con formas de colisión apropiadas para representar las plataformas. Colóquelos en la escena para crear un entorno de plataformas.

Configurando RayCast2D

Para crear una detección de línea de visión, utilice el RayCast2D nodo. Así es como puedes agregar un RayCast2D nodo usando GDScript:

var raycast: RayCast2D

func _ready():
raycast = RayCast2D.new()
add_child(raycast)

Asegúrese de adjuntar este script al PersonajeCuerpo2D nodo. Este fragmento de código crea un nuevo RayCast2D nodo y lo adjunta como hijo al personaje del jugador.

Proporcionar retroalimentación visual sobre la interacción en la línea de visión

Ahora puedes imprimir un mensaje cada vez que la línea de visión del jugador se cruza con una plataforma. Lanza un rayo desde la posición del jugador en la dirección del movimiento. Si el rayo choca con un objeto, significa que el jugador tiene línea de visión hacia una plataforma.

Agregue el siguiente código al mismo script:

func _physics_process(delta):
#... (previous movement code)

raycast.target_position = Vector2(100, 0)

if raycast.is_colliding():
print("Collided with platform!")

Aquí está el resultado:

Ampliando la funcionalidad de RayCast2D

Hay muchas funciones avanzadas que puedes utilizar para mejorar significativamente la interactividad y complejidad de tu juego.

get_collider()

Utilizando el get_collider() método, puede acceder al primer objeto intersectado por el rayo. El método devuelve nulo si no hay ningún objeto en la ruta del rayo. Esto es particularmente útil para identificar el objeto específico al que su jugador tiene línea de visión.

if raycast.is_colliding():
var collided_object = raycast.get_collider()

if collided_object:
print("You can see:", collided_object.name)

get_collider_rid()

El get_collider_rid() El método puede indicarle el ID de recurso (RID) del primer objeto intersectado:

if raycast.is_colliding():
var collider_rid = raycast.get_collider_rid()

if !collider_rid.is_valid():
print("No valid object RID")
else:
print("Object RID:", collider_rid)

get_collider_shape()

El get_collider_shape() La función devuelve el ID de forma del primer objeto intersectado, o 0 si no se produce ninguna colisión.

if raycast.is_colliding():
var collider_shape = raycast.get_collider_shape()

if collider_shape == 0:
print("No valid shape ID")
else:
print("Shape ID:", collider_shape)

get_colision_normal()

Para comprender mejor la interacción, get_colision_normal() le proporciona la normal de la forma en el punto de colisión. En los casos en que el rayo comienza dentro de la forma y hit_desde_dentro es cierto, el resultado normal será Vector2(0, 0).

if raycast.is_colliding():
var collision_normal = raycast.get_collision_normal()
print("Collision Normal:", collision_normal)

get_collision_point()

Cuando el rayo cruza un objeto, get_collision_point() devuelve el punto exacto de colisión en coordenadas globales.

if raycast.is_colliding():
var collision_point = raycast.get_collision_point()
print("Collision Point:", collision_point)

Usando estas capacidades avanzadas del RayCast2D nodo, puede obtener información crítica sobre las interacciones entre el rayo y los objetos en colisión.

Estos métodos te permiten recopilar información esencial que puede afectar significativamente la mecánica del juego, las interacciones de los objetos y los comentarios de los jugadores.

Incluyendo características adicionales

Además de la funcionalidad principal de detección de línea de visión, puedes mejorar aún más la dinámica de tu juego implementando algunas funciones avanzadas.

Activadores de eventos

En lugar de simplemente imprimir un mensaje, puedes activar eventos específicos en el juego. Por ejemplo, revelar caminos ocultos, activar mecanismos o alertar a los enemigos sobre la presencia del jugador puede agregar profundidad a tu juego.

Manejo dinámico de obstáculos

Considere escenarios en los que los obstáculos puedan obstruir la línea de visión. La implementación de la detección dinámica de obstrucciones garantiza que la línea de visión se actualice en tiempo real a medida que los objetos entran y salen de la vista del jugador.

Indicadores visuales personalizados

En lugar de depender únicamente del texto, puede crear indicadores visuales personalizados para resaltar la presencia de interacciones en la línea de visión. Esto podría implicar cambiar el color del jugador o del objeto sprite, mostrar un icono o animando elementos relevantes.

Mecánica de niebla de guerra

Para juegos centrados en estrategia o exploración, puedes introducir mecánicas de niebla de guerra. Esto restringe la visión del jugador hasta que establece una línea de visión, revelando el mundo del juego gradualmente y fomentando la toma de decisiones estratégicas.

Mejores prácticas para la detección de línea de visión

Optimizar la detección de la línea de visión es crucial para mantener una experiencia de juego fluida. A continuación se presentan algunas de las mejores prácticas a tener en cuenta.

Frecuencia de transmisión de rayos

Evite realizar raycasts en cada cuadro si no es necesario. Considere verificar la línea de visión solo cuando la posición del jugador o el entorno cambien significativamente. Esto ayuda a reducir cálculos innecesarios.

Longitud del rayo

Equilibre la duración de su raycast. Los rayos extremadamente largos pueden afectar el rendimiento, así que elija una longitud que cubra el área necesaria y al mismo tiempo mantenga bajo control la carga computacional.

Capas de colisión

Utilice capas y máscaras de colisión para ajustar qué objetos considera la detección de línea de visión. Esto evita transmisiones de rayos innecesarias a objetos irrelevantes.

Resultados del almacenamiento en caché

Si realiza la misma detección de línea de visión para varios objetos o fotogramas, considere almacenar en caché los resultados para evitar cálculos redundantes.

Integración a nivel de plataforma

Alinee su mecánica de detección de línea de visión con el diseño de niveles de tu juego de plataformas. Considere la verticalidad del entorno, las diferentes alturas de las plataformas y los posibles obstáculos que podrían obstruir la línea de visión.

Asegúrese de que su sistema de detección tenga en cuenta estos matices para crear una experiencia de jugador intuitiva y fluida.

Hacer que los juegos de Godot sean más atractivos con la detección de línea de visión

La detección de línea de visión agrega profundidad y realismo a tu mundo de juego. Los jugadores pueden diseñar estrategias, esconderse o abordar los desafíos de manera diferente según su línea de visión. Esta mecánica puede convertir un juego de plataformas simple en una experiencia más inmersiva, haciendo que el juego sea más atractivo y memorable.