Clase magistral de desarrollo de juegos en Godot 3D: crea un juego de batalla de tanques | Skillademia Academy | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Clase magistral de desarrollo de juegos en Godot 3D: crea un juego de batalla de tanques

teacher avatar Skillademia Academy, Creative Skills for the Future

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      ¡Bienvenido a la clase magistral de Godot 3D!

      1:02

    • 2.

      Instalación de Godot

      1:40

    • 3.

      Descripción general del proyecto: Zonal Battle

      3:44

    • 4.

      Navegar por Godot: la ventana principal, el árbol de escenas y el inspector

      4:46

    • 5.

      Navegación por Godot: la ventana de juego y navegación espacial básica en 3D

      5:37

    • 6.

      Primitivos y espacio 3D: rotación, escala, traducción

      14:36

    • 7.

      Materiales

      7:51

    • 8.

      Construcción de objetos complejos a partir de primitivas: el tanque

      26:30

    • 9.

      Crear el campo de juego

      16:03

    • 10.

      El nodo Camera3D

      8:44

    • 11.

      Vectores

      12:11

    • 12.

      El nodo CharacterBody3D

      10:44

    • 13.

      Reacción a la entrada del jugador: movimiento

      26:53

    • 14.

      Reacción a la entrada del jugador: control de la torreta

      10:54

    • 15.

      Colisión

      13:25

    • 16.

      El nodo de Body rígido: disparar una concha

      53:09

    • 17.

      Entorno: iluminación del mundo y el Sol global

      6:35

    • 18.

      Juego: Añadir tanques enemigos mediante escenas heredadas

      5:13

    • 19.

      Destruyendo los tanques

      6:46

    • 20.

      IA: máquinas de estado

      16:33

    • 21.

      Añadir una máquina de estado al tanque enemigo a través de ECS …

      50:35

    • 22.

      Cómo agregar una máquina de estado al tanque enemigo a través de la parte de ECS 2

      22:19

    • 23.

      SFX: audio en 3D

      12:49

    • 24.

      Capas básicas de IU

      14:34

    • 25.

      Eventos y señales de UI: marcación

      18:27

    • 26.

      Creación de un minimapa

      6:52

    • 27.

      UI 3D con nodos Label3D

      3:42

    • 28.

      Inicio del menú

      12:54

    • 29.

      Menú de pausa

      6:37

    • 30.

      Gestor del juego: estados inicial/final

      31:37

    • 31.

      Sistema de engorde enemigos

      53:16

    • 32.

      Múltiples ángulos de cámara

      8:33

    • 33.

      Mejores explosiones con efectos de partículas

      28:49

    • 34.

      Redistructurización de tus tanques: materiales repasados

      5:30

    • 35.

      Calcomanías

      4:01

    • 36.

      Importación de modelos externos

      9:45

    • 37.

      Mejorar el nivel del terreno

      21:15

    • 38.

      Exportar tu juego

      1:28

    • 39.

      Proyecto de clase: crea tu propio juego 3D

      0:47

    • 40.

      ¡Felicidades!¿Qué sigue?

      0:32

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

9

Estudiantes

1

Proyecto

Acerca de esta clase

Godot se ha convertido en uno de los motores de juegos de código abierto más emocionantes que existen en la actualidad: es potente, flexible y completamente gratuito. Con el lanzamiento de Godot 4, el desarrollo 3D en tiempo real es más capaz que nunca, lo que abre la puerta a la creación de juegos completos sin depender de herramientas propietarias.

En esta clase, aprenderás el desarrollo de juegos en 3D desde las ceras, mediante la creación de un proyecto jugable completo llamado Zone Battle. En lugar de demostraciones aisladas, este curso se centra en los sistemas reales utilizados en juegos reales: desde el movimiento y el combate hasta la interfaz de usuario, la IA, el audio y la exportación.

Comenzaremos por instalar Godot y familiarizarnos con el editor, las escenas, los nodos y la navegación 3D. A partir de ahí, construirás activos del juego utilizando primitivas, crearás materiales, configurarás cámaras, iluminación y entornos y le darás vida a todo con la física y los controles del jugador.

A medida que el proyecto crezca, implementarás sistemas de juego, como el desove de enemigos, la IA de tanques con máquinas de estado, la mecánica de colisión y disparo, la puntuación, los menús, los minimapas, los efectos de sonido y explosiones de partículas. También aprenderás a estructurar un juego adecuadamente con administradores, escenas heredadas y componentes reutilizables.

Para esta clase se usa la versión 4.3 estable de Godot, pero las técnicas que aprenderás (organización de escenas, física, lógica de IA, sistemas de interfaz de usuario y arquitectura de juego) son habilidades fundamentales que se aplican a diferentes versiones de Godot.

Al final del curso, no solo entenderás cómo funciona Godot, sino que habrás construido y exportado tu propio juego 3D completo, además de obtener una base sólida para seguir desarrollando tus propios proyectos.


Qué aprenderás

  • Cómo navegar y usar el editor Godot para proyectos 3D
  • Conceptos básicos de 3D: transformaciones, materiales, cámaras, iluminación y física
  • Construir objetos y entornos complejos a partir de simples primitivas
  • Movimiento del jugador, control de torrete, disparo y sistemas de colisión
  • Creación de IA enemiga usando máquinas de estado y lógica estilo ECS
  • Cómo agregar efectos de sonido, interfaz de usuario, sistemas de puntuación, minimapas y menús
  • Cómo trabajar con partículas, calcomanías, modelos externos y mejoras del terreno
  • Estructuración de un juego completo con gerentes, spawners y estados
  • Exportar tu juego 3D terminado

Requisitos

  • Una computadora capaz de ejecutar Godot 4.x
  • Godot instalado (descarga gratuita)
  • No se requiere experiencia previa en Godot
  • Es útil tener curiosidad por la programación básica o el desarrollo de juegos, pero no es obligatorio

A QUIÉN ESTÁ DIRIGIDA LA CLASE

  • Principiantes que quieran aprender el desarrollo de juegos 3D desde cero
  • Usuarios de Godot que pasan del 2D al 3D
  • Desarrolladores independientes explorando Godot 4
  • Estudiantes de diseño de juegos y aficionados
  • Desarrolladores que buscan una experiencia de aprendizaje completa y basada en proyectos

Conoce a tu profesor(a)

Teacher Profile Image

Skillademia Academy

Creative Skills for the Future

Profesor(a)

NEW CLASS: Figma Beginner Masterclass: Learn UI Design Step by Step

Figma can feel intimidating when you first open it.

There are so many tools, panels, and features that many beginners don't know where to start, or what actually matters when designing an interface.

That's exactly what this class is designed to solve.

In this beginner-friendly class, we'll build a complete UI project together while learning the fundamentals of Figma step by step. You'll learn how to structure layouts, work with typography and colors, organize your designs, and create simple interactive prototypes.

The focus isn't just on learning the software, but on understanding the workflow behind modern UI design in a practical and approachable way.

If you'... Ver perfil completo

Level: Beginner

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. ¡Bienvenido a la clase magistral de Godot 3D!: Construir un juego de tres D puede sonar complejo, pero con la estructura adecuada, se convierte en un proceso que puedes abordar paso a paso. Bienvenido al curso de Desarrollo de Juegos de Godot D. Soy Steve Carstensen, y en esta clase, vamos a construir un juego completo de tres D juntos al usar Aprenderás a trabajar dentro del motor, entenderás cómo funcionan las tres escenas D y gradualmente darás vida a un juego jugable a través de un proyecto real Comenzaré aprendiendo a navegar por interfaz de Godot y trabajando con tres objetos básicos D. A partir de ahí, pasarás a física, los controles del jugador, la cámara, iluminación, el sonido, la interfaz de usuario y la IA, todos los sistemas centrales que hacen que un juego de tres D funcione. Cada capítulo se basa en el anterior. Crearás tanques, entornos, enemigos y sistemas de juego paso a paso, aprendiendo no solo qué hacer, sino por qué las cosas funcionan como lo hacen en Gdo Este curso está diseñado para estudiantes principiantes a intermedios. No necesitas experiencia previa con Godot o desarrollo de juegos de tres D. Empezaremos desde los fundamentos y construiremos todo juntos. Al final del curso, tendrás un juego de tres D completamente jugable y, lo que es más importante, una base sólida que podrás usar para comenzar a construir tus propios proyectos Empecemos. 2. Instalación de Godot: En esta lección muy corta, vamos a descargar e instalar el motor GdoGame, que es lo que vamos a usar para el resto de este Así que abre tu navegador y ve a G DO engine.org También se puede obtener de steam, y a partir de la grabación de este curso, la última versión es 43. Así que simplemente hacemos clic en eso y nos dirigimos al GDOEngine y lo conseguirás para tu sistema operativo relevante Ahora, no vamos a usar la versión habilitada para Net, así que simplemente consigue el Gudo Engine estándar Los binarios habilitados para la red te permitirán usar C SAP, pero como vamos a estar usando script GD a lo largo de este curso, eso podría hacer que las cosas sean un poco confusas porque son dos lenguajes totalmente diferentes Sin embargo, el código y función de C Sharp llama API y todas esas cosas en realidad son muy similares así que si querías un poco de desafío y querías intentar convertir mentalmente GD Script a C Sharp en tu cabeza, puedes hacerlo, pero no me haré responsable de ninguna locura que ocurra como resultado de Entonces, vamos a conseguir GdOfurt tres. Y Gadot no requiere ningún tipo de instalación. Simplemente puedes descargarlo y copiar el ejecutable donde quieras. Para que lo puedas poner en tu escritorio o lo que sea. Voy a pegarlo con todas mis otras instalaciones de Gadot, y volveré contigo en un momento 3. Descripción general del proyecto: Zonal Battle: A lo largo de las lecciones de este curso, aprenderás a recrear este juego de combate de tanques estilo retro, similar al clásico juego de zona de batalla publicado por Atari Comenzaremos con los conceptos básicos de crear un tanque, una arena de tres D, mover el tanque a través de la entrada del usuario y luego crear un sistema de generación configurable de enemigos impulsados por IA para combatir Bien, entonces con eso fuera del camino, comencemos. Cuando cargues Gado por primera vez, verás al gerente del proyecto. Y esto te dará una lista de todos los proyectos que tienes a tu disposición en los que ya has estado trabajando. O si recién estás comenzando con una nueva instalación, no tendrás nada. Entonces voy a crear un nuevo proyecto. Entonces puedes crear uno. Puedes importar uno de un lugar específico, tal vez de una versión anterior de Gadot o de otro lugar diferente que Gado no esté monitoreando, o puedes escanear un lugar en particular para cualquier proyecto que ya exista actualmente Entonces vamos a hacer crear y cuando creas un nuevo proyecto, tienes la oportunidad de darle un nombre de proyecto. Entonces vamos a llamar al nuestro Zone Battle. Y vamos a crear una carpeta para ello. Y lo que eso hará es que irá a la carpeta en la que le indiquemos que ponga nuestro proyecto y luego cree una subcarpeta con el nombre específico del proyecto para que no tengamos que preocuparnos por intentar accidentalmente crear un proyecto y una carpeta que ya tenga cosas en él Entonces voy a cambiar esto y lo voy a poner en otra parte. Va a entrar en Larngdo tres D, y le vamos a dar una nueva carpeta En realidad, no necesitamos darle una nueva carpeta porque vamos a crear una. Entonces seleccionamos una nueva carpeta, y va a ser Larndo tres D y luego Zone Battle, que es el nombre de nuestro proyecto Entonces, para el renderizador, esto va a depender la plataforma a la que estés apuntando Entonces la compatibilidad significa que debería funcionar prácticamente en cualquier cosa. Y luego el móvil, por supuesto, es para dispositivos móviles. El renderizado y varios efectos y las diferentes características compatibles de tres D tienden a reducirse en dispositivos móviles porque no son tan potentes como el hardware de PC Entonces, básicamente, si estás apuntando a los teléfonos, especialmente a los teléfonos de gama baja, usa el móvil, y te dice aquí mismo. Por lo que es compatible con escritorio y móvil. Los tres gráficos D son menos avanzados, es menos escalable, así sucesivamente y así sucesivamente. Vamos a ir con Forward porque vamos a estar desarrollando en un escritorio. Y como un aparte, no recomendaría intentar seguir junto con este curso si estás intentando ejecutar Gadot en un dispositivo Android, sobre todo si se trata de un teléfono Aprovecharás al máximo este curso trabajando en un escritorio. Entonces con eso fuera del camino, dejamos nuestros metadatos de Control de versiones con Git. En realidad no vamos a estar haciendo nada con Virgin Control en este curso. Pero si quisieras subir tus cosas al control de origen más tarde después para respaldarlas, los datos ya estarán ahí. Así que ahora solo vamos a hacer crear Ed Okay. Ahora que tenemos nuestro proyecto creado y cargado, vamos a pasar por conceptos básicos de la interfaz de usuario de Gadot Y para eso, puedes unirte a mí en la siguiente lección, y aprenderemos sobre cómo funcionan los distintos Windows, y luego podremos comenzar con nuestro juego. ¿Te ves ahí? 4. Navegar por Godot: la ventana principal, el árbol de escenas y el inspector: Bienvenido de nuevo. Ahora que has creado tu archivo de proyecto, necesitamos familiarizarte con el entorno de desarrollo de Godot La ventana principal aquí es donde va a tener lugar la mayor parte de tu desarrollo , y es lo suficientemente importante como para que le demos su propia lección. Entonces la lección después de esto discutiremos cómo navegar por esta ventana. El siguiente es el sistema de archivos. La carpeta de recursos en el sistema de archivos representa la carpeta raíz del proyecto. Y podemos verificar esto haciendo clic derecho sobre él y seleccionando Abrir Administrador de archivos. Y verás que nos lleva directo a la carpeta Battle de zona que creamos cuando iniciamos nuestro proyecto. Aquí está nuestro proyecto punto GadoFle que es el archivo de proyecto físico, y aquí está el icono punto SVG, que aparece por Cualquier archivo, recurso, guiones, escenas, lo que sea que arrastre o guarde directamente en esta carpeta, siempre y cuando Gadot sepa lo que son y sepa importarlos , aparecerá aquí en su sistema de archivos Incluso puedes crear nuevas carpetas aquí y organizar tu proyecto como quieras. El siguiente es el árbol de escenas. El árbol de escenas es donde hacemos un seguimiento de la jerarquía de nodos que conforman la escena en la que estamos trabajando actualmente. Todo en gAdo está representado por escenas, y las escenas son meramente colecciones de nodos. nodos en sí son simplemente componentes pequeños o a veces no tan pequeños que hacen varias cosas, y todo lo que posiblemente quieras usar en un GADOGame está representado por un nodo de algún tipo Entonces, por ejemplo, si solo quisiéramos un objeto tres D que estuviera representado por una posición en tres espacios D, aquí podríamos crear un nodo raíz, y nos daría un nodo tres D, y un nodo tres D es literalmente solo una posición en el espacio tres D, que, por supuesto, todavía no hemos discutido realmente, así que eso no va a tener ningún sentido. Pero además de eso, podemos agregar otros nodos debajo de él como hijos de ese nodo, porque en la base de cada escena hay un nodo raíz, y luego hay un montón de nodos que están unidos debajo de él, y todos esos conformarán tu escena. Entonces podemos crear un montón de estos y todos se consideran parte de este archivo. Definitivamente vamos a estar viendo una forma más profunda de usar el árbol de escenas en futuras lecciones y tratar con la jerarquía de nodos y así sucesivamente y así sucesivamente. Pero por ahora solo debes saber que todo lo que hay en tu GodObject va a ser representado y almacenado y exhibido en este árbol en particular Por último, tenemos que hablar del inspector. El inspector le permitirá modificar todos los datos visibles en cualquiera de sus nodos. Entonces, por ejemplo, dado que un nodo tres D es una posición en tres espacios D, podemos alterar su posición, su rotación y su escala. Para que podamos moverlo así y así sucesivamente, y verás que el valor se actualiza aquí. Pero también, si quisiéramos cambiar esto directamente, podríamos. Y eso va para prácticamente cualquier tipo de nodo que puedas tener. Entonces, por ejemplo, si quisiéramos agregar algo diferente como una cámara, se puede ver ahora que la cámara tiene su propio conjunto de datos. Pero como una cámara también es un nodo tres D, tendrá todos los datos disponibles para nodo tres D además de todos sus datos específicos de cámara. Así que de nuevo, todo lo que pueda desear modificar para un nodo existente está disponible en esta ventana. Y vamos a estar usando esta ventana extensamente con el fin de establecer la información de nuestros nodos así como investigarla mientras estamos depurando cosas Hablando de depurar cosas, en la parte inferior aquí, vemos un montón de pestañas que actualmente no están expandidas, pero una de ellas es el depurador, y es sumamente útil, y definitivamente la vamos a estar usando cuando llegue el momento Aquí abajo, también tienes animación de audio y editores Shader, así como la consola de salida Cualquier consola de salida es útil si quieres hacer eco de cosas a la consola mientras el juego se está ejecutando, o si quieres buscar algún mensaje de error o algo por el estilo. Entonces ahí lo tienes. Ese es el Editor de Gado en pocas palabras, y todas las diversas características del editor que vamos a utilizar para crear nuestro juego, definitivamente estaremos investigando mayor profundidad en lecciones posteriores Y en la siguiente lección, como prometí, vamos a mirar la ventana del editor. Entonces te veré ahí. 5. Navegación por Godot: la ventana de juego y navegación espacial básica en 3D: Mm. Bienvenida de nuevo. En esta lección, vamos a ver los conceptos básicos de navegar por el espacio tres D de Godo, además de ver algunas de las formas en que puedes configurar las ventanas de la ventana gráfica y orientar las cosas manera que puedas ver lo que estás haciendo y cómo trabajar Lo primero que voy a mencionar es que la mayor parte de estos controles, así como cualquier atajo de teclado que podamos tropezar a lo largo de esta aventura, son básicamente los mismos que son para blender Una de las formas en que puedes personalizar esto es si vas bajo Configuración del editor y vas a Editores, tres D, y navegación, no solo verás todos los diversos ajustes, sino que también hay una opción llamada Esquema de sino que también hay una opción navegación donde puedes cambiarlo de Gdolablender, a Maya o Modo, a Maya o Modo, si esos son más cómodos También hay ataduras clave que también puedes cambiar, pero no vamos a ahondar demasiado en Lo que vamos a aprender aquí es suficiente para que empiezas, y luego puedes profundizar en los esquemas de control a tu gusto porque pueden llegar a ser bastante profundos. Entonces lo primero que vamos a notar es cómo maniobrar alrededor de esta ventana Y lo primero que puedes hacer es mantener pulsado el botón derecho del ratón, y eso orientará tu cámara de visión en función de su posición en tres espacios D. Entonces, si mantienes pulsado el botón central del ratón, eso orbitará la cámara. Y por último, si necesitas mover la cámara, puedes mantener pulsado Shift y usar el botón central del mouse, y eso maniobrará tu cámara alrededor Entonces una combinación de estas tres cosas te permitirá orientar tu cámara de tal manera que puedas ver lo que sea que estés viendo. También tienes este pequeño artilugio en la esquina superior derecha de tu pantalla que te permitirá chasquear rápidamente a una orientación particular Entonces como pueden ver, si hago clic en la X, la Z, o la Y, inmediatamente la romperá de tal manera que ese eje esté apuntando directamente a mí, y luego los otros dos se orienten de igual manera. De esa manera, también puedes decir de un vistazo cuál es tu orientación si no necesariamente recuerdas los colores de los ejes. Entonces el eje Z es azul, el eje rojo es X, y el eje amarillo verdoso es Y. Así que al mirar esto rápidamente, puedo decir que Y es recto arriba y abajo para que esté mirando hacia abajo Y esto se ve reforzado por este pequeño indicador de aquí, que es ortogonal superior. Lo que eso significa es que estoy encima de lo que sea que esté mirando hacia abajo porque estoy mirando hacia abajo por el eje Y. Y entonces si volvemos a hacer clic en esto, no va a pasar nada. Um, y ahora estamos en el fondo. Entonces, si tuviera que hacer clic en esto para X, eso traerá eso alrededor. Y luego si hago clic en esto, que es lo contrario de Z, eso va a llevar eso a la vanguardia, lo que significa que estamos viendo esto desde atrás. Por lo que también puedes cambiar estas orientaciones en lugar de jugar con este pequeño control haciendo clic izquierdo haciendo clic en el botón de tres o los tres puntos en esa esquina Y ahora puedes elegir una de esas vistas, y también puedes ver las distintas combinaciones de teclas para esas vistas, si quieres cambiar a ellas rápidamente. Entonces, si quería ir a la izquierda, puedo seleccionar eso de la izquierda. Y si quería ir a la parte trasera, puedo seleccionar eso de la parte trasera y así sucesivamente. Y al hacerlo, lo cambia a lo que se llama vista ortogonal, y eso básicamente significa que estás mirando hacia adelante y no está tomando en cuenta ningún cálculo de profundidad. Entonces normalmente, si vas a perspectiva, podrías ver la vista en perspectiva. Y eso es básicamente matemáticas. Si no sabes nada de eso, realmente no tienes que preocuparte por ello. En términos generales, vas a estar trabajando en perspectiva nueve de cada diez veces porque te da la noción más realista de lo que estás viendo. Básicamente, una vez que te mejores trabajando con tres D, sabrás cuándo necesitas usar la vista ortogonal, y podrás cambiar a ella. Si intento decirte bajo qué circunstancias se utilizan las vistas ortogonales, probablemente no lo vas a conseguir. Así que no te preocupes por eso por ahora. Trabaja en perspectiva y todo va a ser genial. Y también tenemos la opción de proporcionar múltiples ventanas gráficas Entonces, si hago clic en el pequeño botón de vista aquí, tengo la opción de dividir mi ventana en dos o tres o incluso cuatro ventanas gráficas Y una vez que ponga una cámara al mundo y veamos cómo funciona eso en la lección sobre cámaras, podré cambiar una de estas vistas para que me muestre lo que ve mi cámara. Y entonces de esa manera, voy a poder trabajar y entender lo que va a ver el jugador, cómo mis cambios se reflejan en el jugador también. Entonces, si hacemos click de nuevo a esto, volveremos a Viewport uno Y sí, eso debería servirnos. Entonces ahora que podemos maniobrar en nuestro mundo de las tres D, te mostraré cómo maniobrar realmente a nuestro amigo del cubo en el espacio tres D, pero eso va a ser una lección en sí mismo. Te veré ahí. 6. Primitivos y espacio 3D: rotación, escala, traducción: Bienvenido de nuevo. Ahora estamos en el punto en el que podemos comenzar a indagarnos en la manipulación de objetos en un espacio de tres D. Y afortunadamente para nosotros, en realidad no tenemos que crear esos objetos nosotros mismos. Como mínimo, si no estamos usando tres modelos D que hemos creado o que se crearon en otro lugar, podemos desbastar cosas usando lo que se llaman primitivas para proporcionar marcadores Y eso es exactamente lo que vamos a hacer por el momento es que vamos a crear nuestros objetos hechos de marcadores de posición Así que el primer marcador que vamos a aprender a usar es la instancia de malla Y técnicamente, la instancia de malla no es un marcador de posición, sino que proporciona primitivas de marcador de posición para que las usemos. Así que podríamos crear una nueva escena de tres D con un nodo tres D en su raíz o podríamos ir a otro nodo y seleccionar la instancia de malla tres D, y eso es lo que vamos a hacer. Entonces, ¿qué hicimos exactamente aquí? Bueno, hemos creado una nueva escena, y en la raíz de esa escena hay una instancia de malla de tres nodos D. Ahora, la instancia de malla tres nodo D, además de ser difícil de decir, es un nodo tres D, lo que significa que tiene una posición y orientación en tres espacios D, pero también tiene valores adicionales. Y uno de esos valores es la propiedad mesh. Entonces, si ampliamos este desplegable, vemos todas estas diferentes mallas que podemos crear Y la que queremos es nueva malla de caja. Boom. Ahora tenemos una caja. Si no quisiéramos una caja, podríamos hacerla una cápsula o un quad, lo cual es una forma elegante de decir un rectángulo plano. También tenemos un prisma, que es un triángulo. Entonces sí, esto nos permitirá crear un montón de diferentes tipos de pozo, incluso hay un Tauro. Esa es una ordenada. Tengo una rosquilla Hagamos unos tanques para donas. Eso va a ser hilarante. A lo mejor voy a hacer algunos enemigos aerodeslizadores hacia el final del curso En fin, volvamos a nuestra caja. Esto nos da un cubo y es algo maravilloso. Ahora bien, si hacemos clic en el propio cubo, va a abrir la malla y nos permitirá cambiar las cosas al respecto. Y antes de hacer eso, hay que señalar que estos objetos de malla, ya sean malla cilíndrica, malla lisa, lo que sea, son lo que se llama un recurso. Entonces Gadot en realidad trabaja con dos tipos diferentes de objetos Uno es un nodo, y eso es algo que se pondrá en tu árbol de escenas, y el otro es un recurso. Y un recurso es básicamente una colección elegante de datos. Y a veces necesitamos recursos dentro de nuestros nodos. Entonces, por ejemplo, una instancia de malla tres D requiere una malla. ¿Qué es una malla? Bueno, una malla es una colección de puntos y caras que al ser renderizadas por el motor de juego Gadot nos hace ver un cubo, y esos datos se guardan en un archivo, que son nuestros recursos de malla un poco más o un poco menos confuso sería icono punto SVG. Un archivo SVG es un archivo de imagen. Y lo que es un archivo de imagen, pero solo un montón de bits que determinan Bueno, en el caso del archivo SVG, realidad es arte vectorial. Pero si se tratara de un mapa de bits, sería una colección de datos que indicara los colores y las posiciones y algunos otros valores dentro del Bitmap Entonces necesitaríamos ese archivo de mapa de bits para texturas o sprites o cualquier otra cosa Entonces, por ejemplo, el sprite sería el nodo, y requeriría un recurso de mapa de bits Esa es una forma elegante de decir que la malla requiere una malla, y una malla es un recurso, y así es como lo hacemos. Estaremos creando recursos más adelante en el curso cuando trabajemos en nuestras interfaces de usuario y otras cosas similares. Pero tenemos cosas ahora que podemos cambiar como parte del recurso. Entonces, si queremos cambiar su tamaño en las direcciones X y Z, por ejemplo, para hacerlo más grande, podemos. Y nuevamente, tenemos aquí nuestra pequeña flecha circular para volver a la normalidad si así lo queremos. Y también tenemos cosas que pueden indicar texturación y un montón de otras cosas que vamos a estar viendo más adelante, pero probablemente no vamos a cambiarlo dentro de la propia malla Vamos a cambiarlo en otra parte. Pero ahora que tenemos un cubo, podemos orientarlo y moverlo alrededor. Y lo primero que vamos a hacer es que vamos a expandir la propiedad de transformación del nodo tres porción D de los datos de instancias de malla dentro del expector y vamos a mirar la posición, rotación y escala Estos tres grupos de números son los que determinan la posición, rotación y escala de los cubos dentro del mundoespacio La posición de un objeto en el espacio mundial se indica en tres ejes, los cuales están representados por líneas Entonces como puedes ver aquí, la línea roja, la X va de izquierda a derecha, la línea Z, que es azul va hacia el horizonte, y luego la línea verdosa amarillenta, el eje Y es arriba o abajo Cambiar el valor en uno de estos ejes o en uno de estos ejes cambiará la posición del objeto en el espacio. Entonces ahora mismo está en lo que se conoce como el origen, que es el punto muerto, cero, cero, cero, como se puede ver. Ahora bien, si quisiéramos mover el objeto hacia arriba, podríamos cambiar su Y a, por ejemplo, una, y ahora se ha movido. También podemos cambiar su posición usando estos controles de flecha. Entonces ahora mismo, lo que vemos en realidad son todos los controles disponibles para este objeto, así podemos hacer lo que diablos queramos con él Pero también podemos limitar los controles con estos botones arriba aquí. Entonces, si solo queremos mover nuestro objeto, haríamos clic en este botón para ponerlo en modo movimiento, y eso ocultaría los otros controles de rotación, es decir, que no podríamos rotarlo, solo podríamos moverlo a lo largo del eje aquí. Entonces las flechas son bastante autoexplicativas, pero lo que es un poco confuso son estos pequeños rectángulos Y estos rectángulos son una forma corta de mover algo a lo largo de un plano en particular. Entonces, por ejemplo, este de aquí, este azul moverá el objeto en relación a las coordenadas X e Y o básicamente a lo largo del plano horizontal que conforman estos dos ejes. Entonces, volvamos a poner esto a cero. Y si tuviera que empezar a moverlas, pueden ver que mis valores X e Y están cambiando aquí en el inspector. Si tuviera que hacer lo mismo con este verde, estaría en el eje X y en el eje Z y ídem para el rojo en el eje Y y el eje Z. Por lo que esto proporciona una forma rápida de mover la cosa en una orientación particular. Entonces, por ejemplo, si solo quisieras deslizar algo por el piso sin arrastrarlo accidentalmente al aire, podrías moverlo así o bien podrías moverlo así, dependiendo de qué manera estuvieras mirando Y se vuelve un poco más fácil orientar una de estas cosas si estás mirando una dirección en particular, y ahora puedo ir Ds. Por lo tanto, cambiar la posición de un objeto en el espacio físico tres D se conoce como traducción y se representa aquí por la propiedad position. Además, y vamos a verlas un poco más en el futuro, pero una colección de múltiples valores como X, Y y Z se conoce como vector. Y hay todo tipo de matemáticas que vamos a hacer con vectores para mover cosas y hacer cálculos de física y todo tipo de cosas divertidas. Pero vamos a estar viendo eso en una lección posterior. El paso es la rotación, y la rotación se puede configurar con el modo de rotación o simplemente ponerlo de nuevo en modo de selección para que puedas hacer lo que sea que puedas reorientarlos a todos. Pero volvamos al modo de rotación. Y el modo de rotación te permitirá rotar el objeto a lo largo de los tres ejes. Entonces, si quisiera girar alrededor del eje X, usaría este rojo. Y entonces si quisiera maniobrar orientarlo alrededor del eje amarillo, usaría el amarillo , y luego el azul, claro, es el eje Z. Y una cosa notarás, también, cuando pases el cursor sobre estos botones, verás que hay teclas de acceso rápido que está mostrando que te permitirán sacar funcionalidad extra de ella Entonces, por ejemplo, si tuviéramos que mantener presionado el control y luego intentáramos rotar esta cosa, se rompería a la grilla. Entonces, como puedes ver, no está rotando suavemente. Es saltar de punto a punto. Y eso es un poco más obvio si volviéramos al modo de movimiento porque cada una de estas intersecciones de cuadrícula es una coordenada en la cuadrícula Entonces si mantengo pulsado el control y ahora muevo esto aquí, verás que se ajusta al centro de ese punto ahí, que es 000 negativo uno, supongo, en la dirección Z. Sí, bueno, cero, cero, uno, en realidad, porque Z positiva va hacia ti y Z negativa va de nuevo al horizonte. Nosotros. Pero como puede ver, se está ajustando a las ubicaciones individuales de la cuadrícula aquí, números enteros Y puedes, por supuesto, cambiar ese chasquido. Bueno, ahí no, pero puedes cambiar ese ajuste bajo la configuración de tu editor Eso no es. Bien, volvamos. Y finalmente, tenemos escala, y la escala es un poco extraña porque la escala cambia el tamaño de un objeto de una manera particular. Entonces ahora mismo, los tres están bloqueados. Entonces, si cambio uno de ellos, va a cambiar también a los otros, lo que significa que va a escalar uniformemente en todas las direcciones. Si los desvinculo haciendo clic en este botón aquí, entonces puedo cambiar cada uno de ellos individualmente, lo que significa que puedo estirar o apretar a lo largo de cualquier eje en particular Ahora bien, el problema aquí es que estos valores modifican los valores aquí definidos. Entonces, si digo que mi cubo era uno por uno, y luego lo escalo en las direcciones X, Y y Z de tal manera que sea dos y dos, Oh, eso no funcionó. Y eso es porque debería haberlo hecho antes de volver a vincularme con ellos. Lo que está pasando es que está tomando eso uno por uno y volándolo por este factor para que en realidad sea de dos en dos por dos. Ahora bien, si tuviera que cambiar esto para que fuera X es dos, ahora funcionalmente va a ser cuatro S uno, dos, tres, o uno, dos, tres, cuatro, porque está multiplicando el tamaño base original del objeto por el valor de escala Y esto se vuelve confuso porque escalar objetos puede romper la física porque los cálculos físicos piensan que el objeto es de un tamaño cuando parece que es otro. Pero generalmente, para lo que usarías escalar es para arreglar un objeto que no estaba configurado a la escala correcta cuando se estaba creando en blender o lo que sea. En términos generales, cuando haces un objeto, quieres que esté en su escala correcta dentro del espacio mundial Entonces estas coordenadas del espacio mundial que vemos aquí en la posición y así sucesivamente y así sucesivamente, estas son todas en metros, pero es completamente arbitraria Fácilmente podríamos mirarlos como pies o yardas o lo que sea. A la computadora no le importa de una forma u otra. Simplemente sabe que este valor es uno, y eso es todo lo que es. Pero cuando creamos los objetos en nuestro software de modelado, por ejemplo, se necesita un marco de referencia. Entonces, por ejemplo, un humano es lo que 1.5 metros de altura, da o toma. Lo siento. Yo soy de EU, así que hay estas métricas locas que los valores son, ya sabes, no estamos familiarizados con ellos. Pero digamos que un humano medía 1.6 metros altura y que un jet tenía como 10 metros de largo. Bueno, si estuvieras modelando un humano y un jet en licuadora, querrías asegurarte de que el humano 1.6 metros de largo, y el jet en realidad tenía 10 metros de largo para que pudieras meter al humano en el jet y todo sería del tamaño correcto. Digamos que por cualquier razón, el modelador creó el jet a una escala diferente, tal vez se suponía que era una miniatura o algo así, y luego necesitabas usarlo como un jet de tamaño completo, y luego los importaste dos juntos, y la persona es infinitamente más grande que el jet, querrías escalar al humano o escalar el jet up, y ojalá la física no se rompa si, es por eso generalmente por lo que usarías escalado. La mayoría de las veces, sin embargo, vas a dejar el escalado en uno y luego cambiar cambiar el tamaño de tus primitivas Al menos eso es lo que vamos a hacer. Es lo menos confuso del grupo. Entonces, respectivamente, aquí están nuestros botones de rotación, y luego también tenemos nuestros botones de escala, nuestro botón de escala aquí arriba. Entonces seríamos capaces de escalar esta manera, como lo estábamos haciendo ahí. Y entonces, claro, los rectángulos funcionan de la misma manera. Es solo que en vez de moverlo, va a estar escalándolo. Entonces, sí, así es como manipular la orientación básica y todo lo demás de un objeto de tres D en tres espacios D. Y en nuestra siguiente lección, vamos a ver los materiales, y luego vamos a construir un tanque y comenzar a mover el tanque usando las cosas que aprendimos aquí. Entonces te veré ahí. 7. Materiales: Bienvenida de nuevo. En esta lección, vamos a echar un breve vistazo a la funcionalidad básica de un material de mallas El material es un recurso que básicamente define muchos aspectos diferentes de cómo se ve el objeto desde su texturizado, hasta su iluminación, hasta su transparencia hasta un montón de cosas Masa permitirá un montón de diferentes efectos que normalmente tendrías que usar un shader para crear Pero por los poderes de sus materiales, no tienes que preocuparte por ello. Así que agreguemos un material a nuestro objeto, y simplemente podemos hacer clic en la malla para abrir las propiedades de la malla. Y aproximadamente a mitad de camino, verá el material desplegable, y vamos a crear un nuevo material estándar tres D. Como puede ver, hay tres tipos diferentes de materiales El material de sombreado requerirá que escribas un shader para manejar específicamente cómo quieres que se renderice el objeto , y eso está mucho más allá del alcance de lo que vamos a hacer aquí Así que vamos con un material estándar tres D, y ahora puedes ver que nuestro bloque ha cambiado ligeramente, y eso es por los ajustes predeterminados del material. Entonces, si hacemos clic una vez en el material, el desplegable de materiales se expandirá. Y guau, aquí hay un montón de cosas. Entonces, el primero y más importante que debemos mirar es el albedo o albedo No sé exactamente cómo se pronuncia eso. Pero el Albedo controla tanto la textura como el color del objeto Entonces nuestro objeto está completamente sin textura, como se puede ver. Y si queremos cambiar el color, podemos hacer clic una vez en el color. Y luego a medida que lo cambiamos, se puede ver el color del objeto cambiando en nuestra ventana. Vamos a resetear eso. También podemos agregar una textura al objeto. Así que vamos a agarrar nuestro icono punto SVG y tirarlo por ahí. Y ahora puedes ver que tu objeto está texturizado, aunque el escalado no es particularmente bueno porque esta textura no se hizo para este objeto en mente. Podríamos arreglarlo abriendo la UV y cambiando la escala. Entonces vamos a hacer eso solo para ver cómo funciona. Y creo que sí. Parece que es Whoops Parece que van a ser dos y dos. A lo mejor no. Prueba tres. Ahí vamos. Por lo que UV se refiere a las coordenadas de la textura a medida que se mira arriba y se proyecta sobre el objeto. coordenadas UV comienzan desde cero, y luego van a una todo el camino en la esquina más alejada de la textura. Y dependiendo en qué parte de la cara de la textura estemos intentando renderizar, Godot buscará el píxel en ese punto y luego lo proyectará aquí Pero nuevamente, ya que esta textura no estaba correctamente mapeada en blender o donde sea a esta imagen, tuvimos que ajustarla aquí abajo para que encajara. podamos quitar eso simplemente golpeando a nuestro amigo la flecha circular, y luego subiremos hasta aquí y lo despejaremos. En realidad, vamos a ponerlo de nuevo por un segundo. Porque puedes teñirlo cambiando el color del albedo también Entonces, entre esas dos cosas, puedes obtener una buena cantidad de control sobre cómo se ve realmente tu objeto. Entonces, lo que realmente hace Gadot es que toma la textura, y luego la tiñe en función del Entonces, si solo quieres el color real, lo dejarás como blanco. Entonces aclaremos esto otra vez. Y el siguiente que nos interesa es la transparencia. Entonces si quieres un objeto que sea semitransparente, puedes cambiarlo puedes cambiarlo de deshabilitado a uno de estos diferentes valores. Alpha es el más sencillo. Ahora, claro, no va a verse diferente porque nuestro albedo es totalmente opaco Entonces si volvemos y expandimos nuestro albedo y luego cambiamos el Alfa, que es la transparencia, ahora se puede ver que el objeto se está volviendo más transparente y de hecho podemos ver a través Voy a cambiar eso de nuevo. Otro interesante es el metálico y su correspondiente rugosidad. Por lo que estos dos te permitirán hacer que el objeto se vea más metálico, de ahí el nombre. Y entonces la rugosidad determinará qué tan bien, áspero es el objeto Y al hacerlo, determinar cuánta luz está saliendo realmente de la cosa. No estamos obteniendo una imagen completamente precisa de los ajustes con nuestro cubo, y eso se debe en parte a la iluminación del entorno, que definitivamente vamos a cambiar en una lección futura. Pero si quieres ver cómo se supone que debe verse, siendo todo lo demás igual, puedes mirar la vista previa en la parte superior del material, y te mostrará los resultados de los ajustes. Entonces, si tuviéramos que cambiar este albedo, digamos a un poco oscuro o gris, y si movemos bien el metálico hacia abajo, el metálico es bueno Vamos a mover el especular hacia abajo un poco y la rugosidad hacia abajo un poco más. Eso no se ve bien. Entonces, sí, como puedes ver, cambiar estos valores cambiará el aspecto de tu objeto, y se verá especialmente interesante una vez que realmente empecemos a involucrar la iluminación. Otra que vamos a usar eventualmente es la emisión, y la emisión permitirá que el objeto emita color y brillo. Entonces, si lo habilitamos, y luego cambiamos el color de emisión para decir verde, ahora el objeto está brillando en verde, y si cambiamos el multiplicador de energía, ahora está realmente resplandeciente Y también tenemos un montón de otros escenarios interesantes que vamos a profundizar más adelante cuando decidamos mejorar nuestro juego. Entonces, lo que vamos a hacer en la siguiente lección es que vamos a estar construyendo el tanque controlado por el jugador a partir de primitivas, y vamos a estar usando el albedo y los metálicos y la rugosidad para que se vea Y luego en lecciones posteriores, vamos a volver a visitar algunos de estos ajustes de materiales y agregar texturas y mapas de bache y toda esa bondad para que nuestro juego se vea realmente bien Siéntete libre de jugar con estos valores. Básicamente no hay forma de que los rompas. Y entonces, ya sabes, lo peor viene a lo peor. Solo tienes que volver a subir al material y decir, claro, y luego volverás a ningún material, y luego podrás empezar de nuevo. Así que pasemos a la siguiente lección en la que voy a guiarte a través de la construcción nuestro tanque y de prepararlo un poco, y luego crearemos el mundo, y nos moveremos en el mundo. Nos vemos ahí. 8. Construcción de objetos complejos a partir de primitivas: el tanque: Bienvenido de nuevo. Lo que vamos a hacer ahora es que vamos a flexionar nuestras nuevas habilidades de manipulación primitiva, y vamos a construir todos los componentes a partir de primitivas que vamos a usar en nuestro juego Esto generalmente no es lo que harías por un producto profesional. Por lo general, tendrías un equipo de arte que estaría creando tus mallas y otras cosas para que las importaras, y lo veremos más adelante en el curso, importando algunos modelos más guapos para usar en nuestro juego Pero cuando se trata de prototipado y simplemente poner las cosas en marcha para que puedas verlo funcionando o simplemente para tener algo en su lugar para que puedas empezar a codificar tu script de movimiento, por ejemplo, este tipo de cosas son invaluables Además, si en realidad vas por un look de poli bajo extremadamente retro, es posible que quieras construir tus cosas así en primer lugar. Entonces, en última instancia, en esta lección, lo que vamos a hacer es construir nuestro tanque, y luego en nuestra siguiente lección, vamos a construir el campo de juego y también mirar guardar escenas individuales para duplicar objetos Así que comencemos aquí con una nueva escena de tres D. Así que simplemente haga clic en tres D escena, y eso le dará un nodo tres D. Y este nodo tres D es básicamente un nodo vacío que es puramente una posición en tres D espacio, como ya hemos visto, representado por nuestro objeto de transformación por aquí en el inspector. Vamos a renombrarlo, así que haz click sobre él una vez para seleccionarlo, y luego volver a darle click, o puedes hacer click derecho sobre él y seleccionar renombrar, y vamos a llamarlo Tanque. Y finalmente estamos en lecciones futuras, vamos a duplicar este tanque para hacer a nuestros enemigos. Entonces y también, es solo una buena idea salvar tu trabajo. Entonces, ¿por qué no seleccionamos Guardar escena?, y lo pondremos en la raíz de nuestra carpeta de recursos, lo que significa que va a ir en la raíz de nuestro proyecto, y solo seleccionaremos Guardar, y eso nos dará nuestra escena de tanque. Ahora bien, si ve aquí este mensaje de error, no entre en pánico. trata de un bug y Gadot que ha estado ahí desde algún tiempo en la era de los cuatro puntos dos, y no parece que se haya arreglado Nuevamente, a partir del momento de esta grabación, estamos en 43 estables. Entonces, de nuevo, si ves este error, simplemente ignóralo. En realidad no afecta nada, y se arreglará eventualmente. Toca oh, vamos a usar un agrupamiento de malla instancia tres Ds para construir nuestro tanque. Entonces lo primero que vamos a hacer es que vamos a hacer click derecho sobre Tanque, y vamos a hacer nodo Adhild Y vamos a estar trabajando extensamente con la instancia de malla tres nodo D aquí. También tenga en cuenta que una vez que haya abierto esta ventana de crear nuevo nodo, en realidad puede buscar si conoce el nombre del nodo. De lo contrario, simplemente puede expandir los árboles de nodos hasta obtener lo que desea. El grueso de lo que vamos a estar trabajando está en la rama D del nodo tres, por así decirlo. Al menos hasta que trabajemos o al menos hasta que empecemos a construir nuestra interfaz de usuario y empecemos a trabajar con sonido y cosas así. Pero de todos modos, ahora mismo, simplemente haremos clic en malla tres D, y crearemos una nueva. Y ahora que tenemos una malla tres D, podemos agregar una nueva primitiva. Así que vamos a bajar esa carpeta, y necesitamos una nueva malla de caja, y ahí está, nuestro buen amigo el cubo. Ahora lo que vamos a hacer es que este cubo va a ser el centro de nuestro tanque. Entonces le voy a dar un nuevo material, un nuevo material estándar tres D, y voy a cambiarlo a gris. Así que expande el albedo, da clic en color, arrastra la cosa un poco hacia abajo hasta que obtengamos algo bonito y de aspecto gris, y ahí vamos Generalmente, lo que quieres hacer cuando vas a cambiar el tamaño de estas primitivas es que casi siempre vas a estar trabajando directamente en el inspector porque Gadot al menos hasta donde yo sé, no tiene ninguna herramienta para estirar y triturar directamente los objetos dentro de la ventana Entonces vamos aquí y vamos a decir que ahora es un 0.5 todavía vamos a hacerlo 0.25. Ahora bien, lo que estoy haciendo aquí es puramente artístico. En definitiva, lo que voy a hacer es juntar un montón de estos primitivos para que se parezcan a un tanque Siéntete libre de cambiar cualquiera de estas cosas, cambiar los colores, cambiar las proporciones, hacer que tu tanque se vea como quieras. Solo hay un par de cosas que vas a necesitar hacer exactamente de la misma manera que yo las hice, y eso es sobre todo cuando se trata de paternidad de la torreta, y nos ocuparemos de eso cuando lleguemos a ese punto. Entonces esto va a ser 0.25 metros de altura, y digamos que va a ser Whoa, eso es demasiado grande También está en la dirección equivocada. Digamos, 3 metros dar o tomar, ¿ o queremos cinco? Sí, buena pregunta. Bien, vamos con tres y veamos a dónde nos lleva el viento Y 1 metro de ancho está bien. Ahora bien, para hacer la mitad inferior del tanque, podrías tener la tentación de simplemente hacer Control D y duplicar tu malla, arrastrarla hasta aquí y luego empezar a manipularla Pero tendrías un problema. Porque dado que duplicó el nodo existente, estos nodos comparten el mismo recurso de malla. No duplicará el recurso de malla en sí. Entonces, si tuvieras que cambiar esto ahora, hagamos estos cinco, va a cambiar a ambos porque están operando fuera de la misma malla. Entonces lo que quieres hacer aquí es que quieres cambiar. Entonces irás al menú desplegable de la malla y seleccionarás Hacer único. Y eso te permitirá cambiar esta malla sin afectar la malla existente. Y vamos a hacer eso. Así que en realidad vamos a resetear todos estos para que vuelva a ser un cubo, y vamos a cambiar el color del material porque ahora queremos que sea verde. Y tenemos exactamente el mismo problema porque, de nuevo, es compartir el material, así que queremos cambiar esto y hacer que esto sea único, también. Y ahora si cambiamos el color albedo, deberíamos tener Ahí vamos Ahora podemos conseguir un bonito green sin que afecte a nada más. Haga clic en eso una vez para cerrar. Bien, entonces el ancho es el mismo, y vamos a hacer la Y a medio metro Y lo que puedes hacer aquí es que puedes usar las flechas para cambiar la orientación, y puedes hacer click en esta cosa para darte las vistas ortogonales para que puedas alinear las cosas tan perfectamente como las vas a conseguir. Pero también puedes hacerlo a través de la transformación. Al puñetear los números directamente. Y en su mayor parte, eso es lo que tiendo a hacer porque sé lo grandes que son las cosas que estoy haciendo. Entonces en este caso, tenemos la Y es medio metro de altura, así que eso significa de cero a abajo va a ser 0.25. Entonces, si cambio esto a 0.25, eso debería alinearlo incorrectamente. Y eso es porque, bien. Bueno, hazlo 0.5, y eso también va a estar mal. Es punto cero Bien, bueno, me sirve bien por tratar de hacer matemáticas en mi cabeza. Bien, vamos a arrastrar esto aquí. Y si acercas lo suficiente, puedes ver que está casi lo más cerca que va a importar. También voy a mencionar en una de las razones por las que no querrías hacer esto para un juego real, aunque en nuestro caso, ya que nuestro juego es lo suficientemente bajo de poli, realmente no va a afectar nada es que vas a tener problemas con la optimización. Entonces, por ejemplo, una vez que terminemos nuestro tanque, nunca vamos a ver esta cara de este cubo porque va a estar oculta por la mitad inferior del tanque. Y de igual manera, nunca vamos a ver la parte superior de este cubo verde porque va a estar oculto por este bloque gris, también. Y aunque nunca los vamos a ver. Gadot todavía va a intentar renderizarlos. Entonces, lo que vamos a estar pasando es Godot va a estar renderizando un montón de cosas que en realidad nunca vemos, lo que no va a causar una caída de rendimiento en nuestro caso porque nuestro juego es tan bajo poli que no importa Pero al final querrías construir estas mallas en un programa externo como blender de tal manera que estas caras invisibles simplemente no formen parte del modelo en absoluto Pero nuevamente, todo lo que estamos haciendo es crear prototipos, así que esto está perfectamente bien Así que simplemente cambiaremos esto un poco para que se vea un poco genial. Y luego duplicaremos esta malla y la moveremos un poco más atrás. Y lo que vamos a hacer aquí es que en realidad vamos a cambiar la malla a un prisma, y vamos a darle su propio material, nuevamente, nuevo material estándar. , queremos que tenga el mismo color Sin embargo, queremos que tenga el mismo color que los otros materiales. Entonces vamos a ampliar esto. Vamos a ir a Albedo. Y luego cuando hacemos clic en el color, ahora tenemos un pequeño cuentagotas Entonces, si hacemos clic en el cuentagotas y vamos aquí, podemos obtener exactamente el mismo color, lo que significa que ahora estas dos cosas están Entonces, una de las configuraciones útiles para el prisma es esta de izquierda a derecha, lo que le permite sesgar la parte superior del triángulo Entonces, si lo ponemos a cero, ese va a ser un triángulo perfectamente rectángulo. Y ahora queremos darle vueltas a este tipo para que se vea así Y asegurémonos de que la transformación sea correcta. Entonces esto está un poco apagado. Entonces queremos que sea 180 par, y ahí vamos. Y ahora vamos a necesitar que esta tenga la misma altura que esta de aquí. Por lo que la altura es la mitad en la dirección Y. Entonces cambiaremos esto a la mitad en la dirección Y. Y queremos que no sea tan ancho en la dirección X también. Entonces vamos a hacer que 0.5. Y podemos traer esto, y sigue siendo no es que sea demasiado grande. Es que el otro está demasiado lejos. Entonces, si lo movemos ahí, y luego hacemos clic en esto y movemos esto por aquí, se ve bastante bien, aunque tenemos que ponerlos un poco en términos de la transformación. Aún no he averiguado muy bien cuál esa posición Y se supone que es. Cero, 3.75 quizá. Eso se ve bastante bien. Y entonces esta malla necesita ser un poco más. Debe ser 0.5, negativo 0.5. Ahí vamos. Eso se ve bastante bien. A pesar de que me gustaría saber, bien, este material es en realidad parece que es demasiado oscuro. Entonces queremos que sean lo mismo. Entonces abriremos esto y el albedo. Bien, ahí está ese hexágono, y luego miramos este Nosotros vamos aquí, el albedo. Sí, son números diferentes. Entonces copiaremos esta. ¿Espera? No. ¿Son el mismo número? Copia esa. Ve aquí. No, no son del mismo color. No sé lo que era, no sé qué pasó ahí. Probablemente sea por la iluminación, en realidad. Bien, ahí vamos. Eso es perfecto. Ahora, vamos a tomar este aquí y vamos a duplicarlo, y vamos a girarlo y usarlo para la otra parte aquí. Entonces, una vez más, expandiremos la malla. Ampliaremos la transformación. Transformamos vamos a cambiar la Y necesita ser 180 ahora. Entonces ahora hemos rotado eso. Queremos eso ahí, ¿y éste va a ser 2.5 ish? No, bueno, cometí el mismo error que cometí antes. Necesito que sea único. Ahí vamos. Y lo que fue ese T dos es demasiado. 1.5. Se ve bastante bien. Muévete eso. 0.75. Fresco. Bien, así que este es el fondo de nuestro tanque, y se ve bastante bien Ahora vamos a duplicar estos tres. Entonces seleccionamos uno haciendo click izquierdo sobre él, y luego desplazamos el click izquierdo para obtener los tres. Y luego podemos duplicarlos. Y luego podemos girarlos a lo largo del eje X. Entonces vamos 180 grados, y ahora los movemos hacia arriba. ¿Cuál fue el valor negativo de esa? Para que podamos copiar esto. Y una vez que hayamos seleccionado los tres, en realidad podemos modificar todas sus posiciones al mismo tiempo. Y hay que revertir el letrero ahí. Boom. Perfecto. Bien, así que vamos a golpear Controles, asegúrate de guardar nuestro trabajo en caso de que nuestra computadora explote porque no queremos tener que volver a hacerlo todo Y ahora vamos a hacer la torreta. Pero antes de hacerlo, sería una buena idea agruparlos como el cuerpo. Entonces vamos a agregar otro nodo hijo al tanque, y éste sólo va a ser un nodo tres D. Vamos a llamarlo cuerpo. Y nos vamos a mover. Vamos a seleccionar todas estas, y vamos a moverlas. vamos a arrastrar hasta aquí para repararlos bajo el cuerpo Y eso significa que ahora si necesitamos manipular todo el cuerpo de alguna manera, forma, o forma más adelante, podemos hacerlo. Pero nos preocupa más hacer algo similar para la torreta. Entonces vamos a crear otro nodo tres D, llamémoslo torreta. Y esta vez, vamos a agregar otra instancia de malla tres D, y esta va a ser una pista de tubo, que es una malla extrañamente llamada Pero lo que es es que es una especie de cilindro, pero se puede cambiar el número de lados en el cilindro. Entonces si lo hacemos, digamos, seis, ahora tenemos un hexágono. Si lo hacemos 12, tenemos un como sea esa cosa es un dodecaedro, creo que se llaman Entonces volveremos a bajar eso a seis, y luego volveremos a agarrar bien el color, ya sabes, en realidad no tenemos que hacerlo. Entonces te mostraré cómo copiar todo el material en un momento. Entonces vamos a tomar esto. Cambiaremos el radio a 0.125, que es demasiado pequeño. Digamos 0.25. Eso es mejor. Y entonces vamos a cambiar la altura, que es técnicamente la Así que si cambiamos el número de secciones, sí. Entonces hay y en realidad podemos verificar esto, y te lo mostraré en un momento. Entonces, vamos a subir esto. Y si vamos a ver, Bien, no está a la vista. Está bajo el No, no está debajo de los tres puntos. ¿Dónde estaba esa cosa? Bien, fue por aquí y por debajo. Estos tres puntos. Si vamos aquí y cambiamos de display normal a display wireframe, boom Ahora ya podemos ver el y voy a volver a centrar esto. Se pueden ver los polígonos, los triángulos que conforman su primitiva. Entonces en este caso, lo que tenemos aquí es que tenemos dos secciones, que es la mitad superior e inferior, y cada sección tiene múltiples anillos. Entonces, si los cambio a eso, ahora solo tenemos dos secciones, dos anillos, más bien. Entonces esta es una forma de reducir el número de secciones en lo tuyo. Y por alguna razón, no me deja hacer una sección. Requiere de dos independientemente. Y en realidad podemos cambiar la forma de esta cosa usando las curvas, pero no vamos a hacer eso. Entonces la longitud de la sección es buena. Y en realidad, no, vamos a bajar eso. A 1.25 eso debería aplanarlo. Sí, ahí vamos. Bien, entonces tomamos esto. Entonces aquí está la torreta. Y bien, voy a poner esto de nuevo en modo normal. Boom. Entonces lo que tenemos aquí es que tenemos las torretas el nodo raíz original está aquí, pero luego nos mudamos a la instancia de malla aquí arriba Así que en realidad queremos cambiar la transformación de instancias de malla para que sean cero, cero, para que estén centradas, modo que esté centrada exactamente donde se supone que debe estar la torreta. Y ahora vamos a mover esto hacia atrás y lo moveremos hacia abajo para que quede justo arriba contra El cuerpo lo más cerca que podamos hacerlo porque no queremos que ninguna luz se asome por el Vamos a uno de estos segmentos del cuerpo, no a ese. Vamos a uno de estos segmentos corporales. Ahora podemos copiar el material e ir aquí y luego pegar el material. Y ahora no tenemos que preocuparnos por atornillar con el cuentagotas y asegurarnos de obtener los colores correctos Así que pega, boom, ahí está. Y ahora vamos a hacer otro de estos para el barril. Entonces esta vez, vamos a usar un cilindro, y vamos a girarlo. Y podemos girarlo así, también. Entonces, si hacemos esto, iremos así. Ahora, idealmente, así esta rotación va a cambiar cuando juguemos el juego. Vamos a hacerlo para que podamos subir y bajar el cañón. Pero por ahora, queremos que sea agradable hasta 90 grados. Abre la malla. Vuelva a pegar el material. Vamos a cambiar el Whoa. Bien, entonces las alturas. Hagámoslo 1.5. Y cambiaremos el radio superior e inferior. Entonces, como pueden ver, si cambio el radio superior, en realidad lo convierte en un cono. Bien, así que vamos a hacerlo 0.120 0.1. Sí, 0.1. Se ve bastante bien. Ahora simplemente arrastramos a este tipo por aquí hasta que sea, una vez más, tan carne como podamos hacerla con la torreta Y si entra un poquito, está bien. No tiene que ser perfecto. Es solo que queremos conseguirlo lo mejor que podamos. Bien. Se ve bastante groovy No lo sé. Sigo sintiendo que eso es demasiado grande. Hagámoslo 0.05. Ahí vamos. Eso me gusta. Y ahora agreguemos un hocico. Y el hocico básicamente va a ser lo mismo que esta cosa, así podemos duplicarlo. Y vamos a hacer que la malla única otra vez para que podamos modificarla. Vamos a cambiar la transformación. Uh, vamos a darle una rotación de 90. ¿Qué acaba de pasar? Hmm. Interesante. No sé a dónde fue eso. Bien, la posición es cero, cero. Bien, ¿sabes qué? Voy a borrar eso y hacerlo de nuevo. Bien, vamos a hacer esto a la antigua usanza. Simplemente agregaremos otra instancia de malla tres D. Le daremos un rastro de tubo. Una vez más, vamos a pegar en el material correcto. Cambiaremos el radio a, digamos, 2.5 por ahora. Lo cambiaremos momentáneamente. Secciones. Los volveremos a reducir. Los escalones radiales bajan a seis. Y luego transformar 90. Oh, ya veo lo que hice la última vez. Bien, veo mi problema. En lugar de cambiar la rotación, cambié la posición, por lo que la puso a los 90, que estaba fuera de la cámara. Bien. Claramente, necesito otra taza de café antes de intentar enseñar hoy. Entonces, movamos esto aquí. Ahora, como pueden ver, obviamente, eso es demasiado grande, aunque podría ser genial para algunas personas. Pero voy a mover eso ahí y luego cambiar de nuevo el radio. Entonces hagamos que el radio sea cero, uno. Eso se ve mucho mejor. Bien, ahora tenemos un tanque, y es un tanque guapo. Y la razón por la que hicimos la torreta de esta manera es porque queremos un punto central para que la torreta pueda maniobrar alrededor Entonces como la torreta está centrada aquí, normalmente, así que veamos el cañón aquí. Normalmente, si tuviera que rotar este barril, bueno, vamos a girarlo se puede ver que está girando alrededor del punto central de la malla, y no hay forma de cambiar el punto de anclaje de la malla misma de tal que Gadot consideraría este es el centro de la malla Siempre va a estar aquí. Entonces es por eso que usamos un nodo tres D como básicamente el punto de anclaje todo el objeto porque ahora si giro el nodo, el tankar gira exactamente como debería Y ahora que lo pienso, vamos a tener que hacer algo similar para poder girar la torreta misma. Entonces hagámoslo ahora. Vamos a añadir otro hijo, que es un nodo tres D, y éste será torretas de rotación o mejor dicho punto de anclaje de cañón Y luego tomamos las dos piezas de barril, y las arrastramos aquí abajo para que sean criadas hasta el punto de anclaje del cañón Y ahora si giro esto, el cañón puede girar hacia arriba y hacia abajo. Aunque, como hicimos eso y el barril está en el centro aquí, lo que en realidad queremos hacer es mover esto un poco hacia abajo. Bien, vamos a cambiar eso. Y por supuesto, los barriles están compensados incorrectamente ahora, así que nos ocuparemos de esto. Lo ajustaremos un poco así. Ahora estos dos de aquí abajo. Y nuevamente, puedes seleccionar ambas cosas a la vez para que las puedas mover juntas. Ahora tenemos eso ahí mismo. Y ahora estamos ahora si giramos el cañón, el cañón gira bien, aunque en realidad deberíamos moverlo dentro solo un poquito para que no veamos esa costura. Entonces ahí está. Y finalmente vamos a querer bloquear la rotación del cañón para que no pase por el fondo del tanque, pero ahí está. Bien. Control S otra vez. Tenemos un tanque. Solo hay un problema más, y es que queremos que la base queremos que el origen, la posición del punto de anclaje raíz del tanque esté en el suelo. Entonces ya que por eso creamos nuestras partes del cuerpo parentales a un nodo de tanque, porque ahora todo lo que tenemos que hacer es moverlas hacia arriba. Oh, hagámoslo en la posición aquí. Los movemos hacia arriba Así que ahora el desplazamiento del tanque está en la base aquí, y ahí es exactamente donde queremos que esté. Bien, eso fue mucho. Si quieres seguir practicando maniobrando alrededor del espacio Gado tres D y manipulando primitivas de malla, siéntete libre de cambiar tu tanque o agregarle más piezas De lo contrario, los veré en la siguiente lección donde vamos a construir el campo de juego. Nos vemos ahí. 9. Crear el campo de juego: Bienvenido de nuevo. En esta lección, vamos a construir el campo de juego para que tengamos algo para que los tanques y sus enemigos corran y vamos a crear una nueva escena, que podamos pasar por debajo de escena y una nueva escena Y nuevamente, va a ser una escena de tres D, entonces un nodo tres D. Y vamos a renombrarle este, y vamos a llamarlo arena o campo de juego o campo de batalla o lo que quieras Después agregaremos una instancia de malla tres D. Y una vez más, le daremos una malla de caja. Aunque, en este caso, también podrías usar una malla plana. Aunque en mi experiencia, a veces descubrí que los aviones en realidad no registran correctamente la colisión. A veces la física de Gado se vuelve un poco chiflada. Entonces vamos con una malla de caja, y la vamos a cambiar en las direcciones X e Y a 100. Bueno, no la dirección Y, la dirección Z, más bien. Y podemos adelgazarlo un poco, hacerlo 0.5. No es que eso realmente importe. Y luego una vez más, un nuevo material, y éste va a ser pardusco Ahí vamos. Tenemos un campo de juego. Ahora vamos a darle un poco de color a nuestro campo de juego agregando algunos árboles y algunas colinas y algunas rocas, también Entonces agregaremos una nueva instancia de malla. En realidad, no. Añadiremos un nuevo nodo tres D, y lo llamaremos árbol. Bien, vamos. Clic derecho. Ahí vamos. Y este árbol es, de nuevo, va a ser un par de instancias de malla. Entonces, la primera instancia de malla instantánea de desorden, no es una palabra fácil de decir. La instancia de malla va a ser un cilindro. Y ese cilindro va a ser color marrón oscuro para ser el tronco del árbol. Y lo lograremos. Bueno, el radio es fino y lo haremos 3 metros. Voy a deslizar esto aquí arriba de tal manera que quede al ras del suelo. Y también agregaremos una esfera encima. Entonces otra instancia de malla, esta será una malla de esfera, y el material será verde Ahora, por supuesto, esta esfera es demasiado pequeña, así que colapsaremos el material, y luego iremos al radio, y la haremos, digamos, dos, y la altura también será dos. Y en este punto, puedes hacerlos como quieras. Entonces, si tuviera que hacer estos cinco, se vería así, lo cual es bastante genial. Originalmente las hice perfectamente esféricas, lo que también funciona, aunque ahora que lo pienso, me gusta un poco más esto. Entonces vamos a hacer eso. Y una vez más nos aseguraremos Bien, ahora tenemos un árbol Ahora, queremos los árboles. Queremos poder usar el árbol como básicamente un prefabricado tal manera que podamos copiar y pegar y colocar tantos árboles como queramos Pero para hacer eso, necesitamos una forma de referirnos comúnmente a cada árbol porque digamos que copiamos acabamos de hacer Control D, y copiamos y pegamos un montón de estos árboles. Y entonces, por alguna razón después, decidimos que queríamos que el tronco del árbol fuera azul, por ejemplo. Bueno, tendríamos que regresar y tendríamos que cambiar todos esos árboles manualmente. Y si ponemos 100 árboles en nuestro campo de juego, eso sería mucho trabajo Así que sólo vamos a hacer click derecho y seleccionar Guardar sucursal como SN. Y entonces ya es así que automáticamente pone por defecto el nombre del archivo al nombre del nodo Entonces vamos a estar bien aquí. Simplemente golpearemos árbol y una vez más, ignoraremos ese error de análisis Simplemente nunca desaparece. Y ahora tenemos un árbol. Entonces, si quisiéramos, ahora podemos arrastrar más árboles a nuestra escena, y tenemos dos árboles. Entonces voy a hacer eso un par de veces. Y puedes hacer un verdadero bosque si quieres, pero yo sólo voy a poner tres aquí Y vamos a hacer lo mismo y hacer una colina. Y no va a ser la colina de mayor aspecto del mundo por las limitaciones de nuestras mallas, pero vamos a hacer un prisma, y vamos a hacerlo grande Y vamos a hacerlo marrón. Que sea un poco más marrón que el campo de juego. Y deberíamos cambiarle el nombre a Hill. Ahora que tenemos esto, podemos cerrar el material, y podemos cambiar la transformación porque queremos rotarla. Y entonces vamos a igualar eso a negativo 120. Y vamos a igualar eso a negativo 120. Lo cual en realidad no es del todo correcto, pero en realidad no lo hace. Negativo 115, parece. No. Interesante. Bien, independientemente, ahora tenemos una colina, que todavía no es lo suficientemente grande. Hagamos siete por todas partes. Y esto es sólo un gusto puramente personal aquí. No hay un sí o un no increíble. Es por eso que esto tiene que ser de este tipo de cosas de tamaño. Sólo lo estoy haciendo porque eso es lo que quiero que sea. Puedes cambiarlos fácilmente tú mismo. Y además, dado el hecho de que las colinas son literalmente como triángulos, no necesitan ser súper detalladas para los propósitos de nuestro prototipo aquí, pero puedes agregar fácilmente más instancias de malla a las colinas y hacerlas lucir más rocosas Pero vamos a poner esto por aquí. Y una vez más, haremos clic derecho en Guardar como se ve. Y ahora tenemos un cerro, así que agregaremos otro cerro. Y podemos hacer fácilmente una roca haciendo lo mismo. Entonces le doy click derecho y duplico y vamos a llamar a esto una roca. Y vamos a guardar esa rama como escena. Bien, ahí había un mensaje de error . Guardar rama de escena. ¿Cuál fue el mensaje de error? El mensaje de error fue puede guardar la rama de una escena ya instanciada. Para crear una variación de una escena, puedes hacer una escena heredada basada en la escena instanciada Entonces no queremos hacer eso. Entonces supongo que solo haremos la roca manualmente. Estaremos viendo escenas instanciadas en una lección futura. Entonces por ahora, sólo volveremos a Arena. Nodo hijo instancia tres D. Rock. Y hagamos las rocas ligeramente diferentes. Haremos las rocas como una esfera, pero serán pequeñas y estarán medio enterradas en la mitad enterradas en el suelo. El albedo es gris. Y hagamos el radio 0.75. Y también guardaremos la roca como su propia escena rock. Y golpearemos el Control D para duplicar las rocas unas cuantas veces y nos moveremos algunas. Entonces ahora tenemos nuestra arena, y las colinas están un poco apagadas, así que en realidad es algo bueno que hayamos hecho una escena con ellos para poder mostrarte cómo ajustar esto. Entonces echemos un vistazo al doble clic no funciona. Bien, vamos a pasar por aquí. Y entonces lo que podemos hacer es si hacemos doble clic en este pequeño icono que dice Open Editor, podemos abrir la escena Hill en el editor. Pero y al hacerlo, podemos editar la escena, y luego todas las demás escenas se actualizarán para tener esto en cuenta. Entonces echemos un vistazo aquí. Tenemos nuestra transformación, lo cual es extraño. Sigue perdiendo la pista de ello. Bien, así que vamos a llevar el rojo adelante. Ahí vamos. Bien, bueno, en lugar de atornillar con esto, la forma más fácil de arreglarlo es simplemente mover esto un poco hacia abajo para que el fondo quede recortado por el terreno Entonces ahora si salvamos esto y volvemos a Oh, nunca salvamos nuestra arena. Será mejor que hagamos esa escena, salvaremos a Arena. A Hmm. Bien. No. Todavía tenemos eso, ¿es correcto? Bien, sí, es solo la sombra, no. Justo ahí. Bien, ahora los cerros están correctamente al ras de la arena. Y de nuevo, notarás que cambiamos la posición Y del cerro directamente dentro de la propia escena de la colina, y luego ambos cerros se actualizaron automáticamente cuando lo guardamos y volvimos a nuestro nivel principal. Bien. Oh, este es nuestro nivel tan increíble como parece. Y si quieres seguir practicando creando escenas y poniendo prefabricados en el nivel, ¿por qué no lo arreglas un Algo bueno que hacer probablemente sería cerrar esta frontera con cerros para que cuando finalmente implementemos colisión en física, el tanque no se caiga del borde del mundo. En nuestra siguiente lección, vamos a agregar una cámara, y luego después de eso, vamos a llegar a las cosas buenas. Entonces te veré ahí. 10. El nodo Camera3D: En esta lección, vamos a tomar todas las escenas que hemos creado inicialmente, y no sólo las vamos a ensamblar en una escena maestra, sino que vamos a mirar el nodo de cámara y cómo es fundamental darle vida a tus tres juegos D. Entonces tenemos nuestros tanques. Tenemos nuestras rocas. todo lo que construimos en la lección anterior. Ahora bien, si intentáramos ejecutar nuestro juego, no obtendríamos nada particularmente impresionante. Entonces hagámoslo. El primer problema que tenemos es que no hemos definido lo que Godot llama la escena principal Entonces como mencioné antes, todo en Gadot es una escena, y Godot necesita saber cuál es la escena raíz predeterminada que va a cargar y ejecutar cuando iniciemos el Entonces, por ahora, simplemente vamos a convertirlo en la arena. Entonces, si intentas ejecutar el juego sin haber establecido una escena por defecto, Godot te va a dar este diálogo que dice: se ha definido ninguna escena principal Seleccione uno. Y si decimos seleccionar corriente ya que la arena es nuestra escena actual, esa es la escena que Gadot va a cargar cuando comience el juego. Y no conseguimos nada. Y la razón por la que no obtenemos nada es que estamos jugando en un entorno de tres D, y Godot no puede renderizar un entorno de tres D sin una cámara Entonces, como habrás adivinado, una cámara en Godot es un nodo Y queremos adjuntar la cámara a nuestro reproductor. Así que volvamos a nuestra escena de tanques, y vamos a hacer un clic derecho Agregar nodo hijo. Y lo que queremos es cámara tres D. Ahora fíjate que en muchos casos, también hay dos versiones D de los mismos nodos en los que estamos trabajando. Y esto es para entornos planos basados en sprites de dos D. Entonces, si estuvieras haciendo un juego de desplazamiento lateral basado en mapas de bits o un juego de rol japonés de la vieja escuela, estarías usando Camera two D o dos nodos D. Pero como estamos trabajando completamente en tres D en este curso, solo queremos los nodos para tres D, al menos hasta llegar a la parte de la interfaz de usuario. Entonces seleccionaremos Cámara tres D, y la agregaremos. Y ahora tenemos una cámara adherida a nuestro tanque. Y puedes ver ahora que tenemos una cámara, hecho, déjame borrarla para que veas la diferencia. Fue un poco sutil. Entonces ahora que la cámara se ha ido, aquí no vemos nada. Y ahora si volvemos a agregar una cámara, ahora tenemos la opción de previsualizar nuestra cámara en la ventana frontal. Entonces si hacemos clic en esta o en la ventana principal, más bien. Entonces, si hacemos clic en esto, ahora podemos ver lo que tenemos. Y, claro, parece basura porque no hemos alineado correctamente nuestra cámara. Entonces hagámoslo. Desmarcaremos esto Pero en realidad, en lugar de desmarcar esto, volvamos a subir a ver, y ahora iremos a dos puertos de vista Y como puedes ver, nuestro puerto de vista superior es lo que puedes ver en la cámara, y nuestra ventana gráfica inferior es la misma vista de tres D que teníamos antes Así podemos usar esta vista inferior para orientar nuestra cámara y podemos verla actualizada en tiempo real lo que nuestra cámara está viendo realmente. Así que vamos a arrastrar nuestra cámara hacia arriba porque una cámara es solo un nodo tres D, igual que las otras con las que hemos estado trabajando. Para que podamos manipularlo de la misma manera. Así que vamos a girarlo hacia el frente, y voy a afinar eso un poco para que sea igual a 90 negativo. Y voy a arrastrarlo ligeramente hacia atrás. Y lo moveremos un poco hacia arriba, y luego lo inclinaremos ligeramente hacia abajo para que podamos ver nuestro tanque en todo su esplendor. Y claro, la cámara tiene un grupo diverso de escenarios con los que estaremos jugando en futuras lecciones. El más importante de los cuales es el entorno. Pero también puedes cambiar el campo de visión de la cámara, y son planos de recorte cercanos y lejanos, lo que la mayoría de las veces realmente no quieres hacer Notarás que si lo pones demasiado cerca, que el tanque finalmente desaparece porque la cámara lo que determina el plano de recorte cercano y lejano es dónde comienza a renderizar la cámara y dónde termina renderizando la cámara Y eso es un volumen de tres D en sí mismo. Entonces cualquier cosa en ese volumen se renderizará. Así que vamos a reiniciarlos otra vez. Y este también es un escenario extremadamente importante, y determinaremos qué cámara se está renderizando realmente. Entonces es posible, posible que hayas visto esto en otros tres juegos D para tener múltiples cámaras, múltiples vistas de cámara. Y una de las formas de hacerlo es simplemente forzar manualmente la cámara en una orientación diferente. Pero una forma más común es simplemente tener múltiples cámaras y permitirte solo ver la imagen vista por una de ellas a la vez. Entonces, si tuviéramos dos cámaras, y podríamos dejarme agregaré una segunda cámara, y veremos esto en tiempo real. Así duplicar. Y la segunda cámara, vamos a moverla. Bueno, vamos así, y vamos a hacer un adelanto, y por supuesto, no vemos nada interesante. Entonces si volvemos aquí, es la cámara actual. Y entonces si vamos aquí, podemos cambiar esto a la cámara actual. Ahora eso no va a cambiar nada aquí porque estamos previsualizando automáticamente nuestra cámara principal Entonces esto en realidad no se actualiza correctamente. Eso puede ser un bicho, puede que esté haciendo algo mal. No tengo manera de saberlo. Pero si ahora vamos a correr nuestra escena, vamos a volver a conseguir nada porque no lo cambié. Entonces esta es en realidad una buena oportunidad para decirte cómo cambiar de escena tu escena predeterminada en Gado Así que si vamos a la configuración del proyecto, y si vamos a correr, puedes ver la propiedad de escena principal. Entonces podemos cambiar esto, y actualmente lo tenemos puesto a Ana, que no tiene cámara en ella. Y si lo cambiamos a tanque, que tiene la cámara, ahora si ejecutamos el juego, veremos nuestro tanque en toda su gloria apagada, y estamos viendo la vista desde nuestra cámara inicial porque es la primera cámara, así que es la predeterminada porque ninguna de nuestras cámaras está puesta a corriente Si ponemos la segunda cámara a corriente, y luego volvemos a ejecutar la escena, deberíamos ver la vista fuera de la segunda cámara. Y ahí está. Entonces, claro, esto no nos sirve de nada porque todo lo que vemos es el tanque. Y esto se debe a que el tanque no se encuentra actualmente en la arena. Entonces volvamos a la arena. Ahora bien, podríamos arrastrar el tanque directamente a la arena, y realmente no hay nada malo en eso, pero me gusta mantener mis estructuras separadas y jerárquicas, que es una palabra que no es fácil de pronunciar Entonces vamos a crear una nueva escena, y una vez más, va a ser un nodo tres D, y a esta la vamos a llamar juego. Y el juego, como te imaginas, va a incluir la arena, y todo lo que teníamos que hacer era arrastrarlo porque ya lo creamos, y luego simplemente arrastraremos en un tanque. Y ahora si guardamos nuestro juego como escena, y el primer swing que vamos a hacer es vamos a limpiar esto un poco y quitarle esta cámara mal orientada. Y ahora que ya lo hemos hecho, Gadot volverá por defecto a esta cámara, pero la pondremos a la corriente de todos modos solo para mantener las cosas consistentes Y ahora si volvemos a nuestro proyecto y cambiamos la escena actual de tanque o la escena predeterminada de juego actual a tanque, no, si volvemos y cambiamos la escena por defecto de tanque a juego, y luego cerramos eso ahora si ejecutamos nuestro juego, deberíamos ver todo lo que esperaríamos ver. Y nosotros lo hacemos. Ahora, por supuesto, no hemos puesto ninguna iluminación ni nada por el estilo en el ambiente. Entonces, claro, está completamente oscuro. No tenemos skybox, ninguna de esas cosas. Pero ten la seguridad de que vamos a estar adornando nuestro juego muy, muy pronto Pero antes de hacer eso, necesitamos aprender un poco sobre los vectores y cómo organizar algunas de estas cosas para que podamos movernos en este mundo del juego. Y en ese punto, tendremos que ver lo que estamos haciendo. Entonces veremos los ambientes y la iluminación. Te veré ahí. 11. Vectores: Bienvenida de nuevo. En esta lección, vamos a echar un vistazo al concepto matemático conocido como vector. Y la razón por la que vamos a hacer esto es porque los vectores se utilizan constantemente, pesadamente y en todas partes en los videojuegos, sobre todo cuando se trata de entornos de tres D. Y como estamos trabajando únicamente en tres D, y vamos a estar haciendo mucho trabajo de física y moviendo objetos en el espacio de tres D, es un buen concepto para conocer. Entonces he configurado un nodo dos D aquí, y la razón por la que lo he hecho es que es un poco más fácil ilustrar conceptos vectoriales en dos D que en tres D, pero las matemáticas y los conceptos son todos exactamente iguales. Entonces, si entiendes a uno, entiendes al otro. Ya hemos estado trabajando un poco con vectores, como se puede imaginar, bajo la propiedad transform de nuestros nodos, y volvamos a nuestro tanque, y podemos verlo un poco más correctamente. Tenemos la posición, la rotación y los valores de escala, y todos estos son vectores. Un vector es un concepto matemático que se define por una dirección y una magnitud. Y la magnitud es simplemente una forma elegante de decir cuánto tiempo dura ese vector. Entonces si volvemos a dos D y volvemos a este nodo en blanco que creé, voy a poder mostrarte eso. Ahora bien, lo que he hecho con la grilla aquí es que he encendido la grilla misma presionando bien, en realidad, no presioné nada para hacer eso. Pero si presionas este botón aquí para hacer el ajuste de cuadrícula, y luego si vas por debajo de los tres puntos y seleccionas configurar Snap y asegúrate de que el píxel Snap esté configurado, entonces se ajustará lo que sea que estés haciendo a la cuadrícula, como mostré antes cuando estábamos haciendo tres D. Y lo que he hecho es configurar el snap a un píxel para el paso de la cuadrícula para que podamos ver mucho las coordenadas más fácil. Entonces voy a agregar un nodo hijo aquí llamado cast two D. Y fíjate que también hay un cast tres D, pero como dije, sacar una dimensión de la ecuación hace que sea un poco más fácil conceptualizar Pero nuevamente, las matemáticas son exactamente las mismas. La única diferencia entre cast dos D y cast tres D es que el cast dos D no tiene un componente Z porque en dos dimensiones, solo estamos trabajando en X e Y, pero en tres dimensiones, estamos trabajando en X, Y y Z. Entonces afortunadamente para nosotros, un rayo o un rayo cast es un vector Entonces como puedes ver aquí, es una flecha. Ahora, vas a hacerlo si tuvieras que lanzar uno de estos a tu juego, no vas a ver esta flecha en tu juego. Esto es solo para fines de visualización del editor y depuración para que realmente puedas ver a dónde apunta tu vector Y está un poco fuera porque hay un valor llamado posición objetivo, y ese tipo de faldas alrededor estamos intentando lo que intentamos mostrar. Pero en términos generales, tratamos todos los vectores como si comenzaran en cero, cero, aunque obviamente para un reparto de rayos, puedes decirle que comience donde quieras. Pero matemáticamente hablando, no importa si un rayo o si un vector comienza en cero o comienza en 34 16 o donde más decidamos ponerlo Todas las matemáticas son iguales y asumen que los vectores comienzan en el origen de cualquier espacio local en el que se originen. Y eso es otra cosa de la que deberíamos hablar un poco, y eso es el espacio local versus el espacio global. Entonces, como puedes imaginar, tres espacios D y dos espacios D también se rompen o al menos las posiciones se definen en coordenadas. Y hemos estado usando coordenadas todo el tiempo, por ejemplo, diciéndole a nuestro tanque que está ubicado en la posición 000. Se trata de un conjunto de coordenadas en el espacio local. Y ahora, el espacio local es relevante para el objeto en el que estás trabajando o más bien es su propio espacio autónomo. Y entonces ese espacio se puede definir en relación con un espacio más grande, que nueve de cada diez veces es el espacio global. Entonces, por ejemplo, en este caso, si asumimos que nuestro nodo de juego que creamos en la lección anterior es el espacio global, y si su origen de 000 es el punto muerto de todo lo que usa nuestro juego, y entonces decimos que nuestro tanque, la totalidad de nuestro tanque se ubica en 7.34 relativo al origen del espacio global Bueno, ya que el tanque tiene su propio espacio local, el cuerpo del tanque se encuentra a las 00 o en realidad, no creo que lo sea. Comprobemos la transformación. No, el cuerpo del Tanque se encuentra en 0.626 en el espacio local, lo que luego agregarías a la posición global del Tanque para obtener la posición global real de ese objeto Entonces todo es jerárquico. Puede desglosar y tener múltiples espacios locales. Entonces, por ejemplo, la torreta Tanques tiene su propio espacio local porque tiene múltiples objetos debajo de ella. Entonces el origen de los tanques o el origen de las torretas de cero, cero, el cañón es en realidad su posición es en referencia a la posición de los tanques y así sucesivamente y así sucesivamente Todo eso es realmente complicado, en realidad. Pero todo eso es básicamente una forma extremadamente elegante de decir que este 00 puede ser en realidad un conjunto diferente de coordenadas en el espacio mundial, pero cuando se trata de cálculos vectoriales, nada de eso importa. Entonces, los vectores tendrán una magnitud, y lo que la magnitud es la longitud de esta línea. Entonces cambiemos esto de tal manera que el punto final esté aquí. Entonces, para un reparto de rayos, que es un vector, el punto final del vector se indica mediante el parámetro de posición objetivo. Y en este caso, tenemos 56 por 24. Entonces esa es esta coordenada aquí. Son 56 X y 24 Y. Ahora bien, la magnitud del vector es la longitud de esta línea, que se calcula matemáticamente hablando, por el teorema de Pitágoras, que no es fácil de pronunciar, porque aquí forma Afortunadamente, en realidad no tenemos que preocuparnos por eso porque Gadot nos proporciona clases vectoriales para script GD que calcularán todo lo que posiblemente quieras calcular para un Se puede calcular su magnitud. Puedes calcular cosas como productos punteados. Puedes sumarlos y restarlos, lo que veremos en un momento Pero es una buena idea conocer estos conceptos al menos en un nivel básico para que puedas estar como, Oh, para hacer esto con un vector, necesito hacer estas dos cosas en particular, y veremos algunas de esas cosas en un momento. Pero ahora mismo sólo estamos hablando un poco de vocabulario. Entonces las coordenadas son el punto del vector relativo al origen del vector, y luego la magnitud del vector es la longitud de esta línea. Ahora, obviamente, la magnitud que podemos usar para hacer todo tipo de cosas limpias, por ejemplo, si quisiéramos encontrar la distancia entre dos objetos en nuestro mundo de juego, si asumimos que uno de los objetos era el origen del vector, y entonces la ubicación del segundo objeto en el espacio mundial era el punto final del vector. Si calculamos la magnitud del vector, entonces sabríamos la distancia en metros de los objetos entre sí. Y vamos a verlo un poco cuando hablemos de apuntar y disparar balas en una lección posterior. Entonces, agreguemos un segundo reparto de rayos. Y vamos a mover el primero aquí abajo. Y en realidad, los haremos un poco más pequeños. Pero de todas formas, bajaremos a ésta y a esa. Ahora, vectores, antes de seguir adelante, un vector con una magnitud de uno se llama vector normalizado. Y usamos mucho vectores normalizados en la lectura de entrada y también en cualquier lugar donde no queramos que el vector esté, a falta de un término mejor, contaminado por la longitud del vector Y vamos a ver eso cuando hablemos más de input. Pero como los vectores son estructuras matemáticas, podemos sumarlas y restarlas unas de otras Entonces voy a tomar este vector aquí y voy a agregarlo a este vector aquí. Ahora bien, visualmente hablando, lo que eso significa es eso, debería haber dejado eso donde está. Pero de todos modos, visualmente hablando, cuando agregas dos vectores, esto es lo que obtendrás. Tomarás el primer vector, y al agregarle el segundo vector, básicamente lo estarás poniendo al final del vector. Y este nuevo punto final es el equivalente a un tercer vector. Uy. Vamos a intentarlo de nuevo. Entonces volveremos a poner esto en cero. Y en realidad, permítanme cambiar éste para que quede un poco más claro. Entonces, si agregamos este vector a este vector, funcionalmente obtendremos este vector porque lo que haces es agregar las coordenadas de los dos puntos finales Entonces este es 24 32, y luego si le sumamos 016, obtenemos este tercer valor que es 24 32 Y esto es importante porque cuando nosotros y vamos a ver esto en aproximadamente dos lecciones cuando empezamos a mover nuestro tanque, la forma en que vamos a mover nuestro tanque es que la velocidad del tanque o su velocidad esté representada por un vector, y vamos a cambiar esa velocidad agregando más velocidad a ese vector. Como segundo vector. Y eso va a ser un poco más claro cuando realmente lo veamos matemáticamente Pero así sería como es en el espacio visual. Ahora, la otra cosa que vamos a echar un vistazo rápido es cómo restar vectores Entonces, si tuviéramos que tomar este tercer vector aquí y restarlo del primer vector, vamos a obtener el equivalente del segundo vector Y voy a dar vueltas a esto. Lo que significaría que es una forma rápida y sucia de averiguar cómo dos objetos pueden enfrentarse entre sí Entonces, si quisiéramos averiguar el vector quisiéramos averiguar la dirección en la que algo en esta posición tendría que mirar para poder ver algo en esta posición, restarías los dos vectores que representaban sus posiciones Así que las matemáticas vectoriales son un tema muy largo y complicado. Pero por ahora, todo lo que realmente necesitamos saber es que los vectores están representados por un punto en tres espacios D o en dos espacios D. Y ya sea sumando o restándolos o calculando la longitud del vector, puedes obtener varias propiedades o afectar varias cosas en el mundo del juego Y como dije, en una lección o dos, cuando empecemos a mover las cosas, verás cómo funciona eso en código. 12. El nodo CharacterBody3D: Bienvenida de nuevo. En esta lección, finalmente vamos a empezar a sumergirnos en las cosas que hacen nuestro juego real, y vamos a empezar a codificar. Pero antes que lo hagamos, vamos a salir un poco de orden, porque si recuerdas, cuando ejecutas tu juego, está oscuro. Ahora, vamos a hablar de iluminación y ambiente en una lección posterior. Pero por ahora, vamos a ver una manera muy rápida y sucia de meter en nuestro juego la iluminación que tenemos por defecto en esta escena. Y eso se hace bajo el ambiente. Por lo que los tres puntos junto a estos botones aquí traerán a colación el sol de vista previa y el entorno de previsualización. Y ya nos gusta la forma en que se ve, así que simplemente hacemos clic en Agregar Sol a SN. Y que Gadot copiará todos los ajustes que el sol actual está mostrando en esta ventana de previsualización en un nodo de luz direccional y añadiéndolo a la arena Y ahora, si empezamos nuestro juego, está iluminado, aunque no tan iluminado como podría estar porque obviamente no tenemos luz de fondo del entorno. Pero de nuevo, vamos a ver eso más adelante. Ahora mismo, solo necesitamos ver qué estamos haciendo. Entonces, volvamos a nuestro tanque. Gadot te permitirá adjuntar scripts, que son mini programas a cualquier nodo de tu juego Y por la interacción de esos guiones es cómo se obtiene un juego. Entonces vamos a agregar vamos a dar click en el nivel raíz de nuestro tanque, y vamos a ir a este botón aquí, que es adjuntar un script nuevo o existente. Vamos a mantener el lenguaje como script GD, y hereda el nodo tres D. De hecho vamos a cambiar eso en un momento Sí, hagámoslo ahora. Bien. Entonces nuestro tanque es actualmente un nodo tres D, y hasta ahora, esto ha estado bien, pero en realidad queremos cambiar esto. Entonces vamos a hacer click derecho y vamos a hacer cambio de tipo. Y vamos a cambiarlo no vamos a hacer eso. Vamos a cambiarlo a un cuerpo de personaje tres D. Ahora bien, ¿qué es un cuerpo de personaje tres D? Un cuerpo de personaje tres D es cuerpo un cuerpo físico tres D, que es la base de todos los nodos basados en la física en Gadot Y queremos física porque queremos hacer cosas como poder mover a nuestros personajes y hacer que choquen entre sí y hagan física Ahora, ya que nuestro tanque va a ser controlado por nuestros guiones y por nuestros controles que usa el jugador. No queremos que el tanque se vea afectado puramente por la física. Así que vamos a usar el cuerpo del personaje tres nodo D, que es un nodo que sólo interactuará con los sistemas de física de la manera en que el script que le adjuntamos le dice. Y eso no tiene mucho sentido en este momento, pero quédate conmigo y quedará todo claro en unos momentos Entonces cambiamos el tipo del tanque a un cuerpo de personaje dos D o cuerpo de personaje tres D, e inmediatamente tenemos un problema. Gadot nos va a advertir que este objeto no tiene forma, por lo que no puede chocar con otros objetos, y no puede interactuar con otros Y ahora mismo no nos importa eso. Así que vamos a dejar que Gadot siga avisándonos y quejándose, y simplemente lo ignoraremos por el momento, y nos ocuparemos de eso más adelante Así que volvamos a intentar adjuntar un script a Gado y ahora podemos ver que hereda del cuerpo del personaje tres D. Esto se debe a que el script GD es un lenguaje de scripting orientado a objetos, lo que significa que puedes decir los objetos de tu juego como tu tanque, que hereda el comportamiento de un nodo diferente Entonces lo que estamos haciendo aquí es que le estamos diciendo a Gadot que nuestro tanque es un cuerpo de personaje tres D, pero va a tener algunas cosas extra que vamos a agregar Así que queremos todos los comportamientos y todo el código y todo lo que viene con el cuerpo del personaje tres D por defecto, y luego vamos a agregar alguna funcionalidad adicional encima de él. Y nos va a preguntar, ¿ dónde queremos poner nuestro guión? Y me gusta mantener las cosas organizadas, así que en realidad voy a decirle que use una carpeta diferente. Me gusta poner todos mis guiones en su propia carpeta. Entonces abrimos, y luego creamos una nueva carpeta llamada scripts, y ahora vamos a poner nuestro script de tanque en esa carpeta de scripts. También puedes hacer lo mismo con las escenas. lo general, lo que voy a hacer es tener una carpeta para guiones y otra carpeta para escenas. Pero, sí, por ahora, está perfectamente bien. En realidad no vamos a tener demasiadas escenas más en este juego, por lo que ese nivel de organización no va a ser necesario. Pero tal vez voy a mover las cosas una vez que realmente empecemos a agregar efectos de sonido y texturas y demás Gadot es realmente lo suficientemente inteligente como para que si te mueves en la mayoría de los casos, es lo suficientemente inteligente como para que si mueves objetos a diferentes carpetas, pueda actualizar tu árbol de escenas y todos los enlaces relevantes sin que tengas que actualizarlos manualmente Para que puedas mover tus cosas todo lo que quieras, y no se romperá. Bien. Entonces ahora que hemos creado este script, tenemos un script en blanco. Y en la parte superior, tenemos la palabra clave extiende el cuerpo del personaje tres D, y así es como Gudo sabe que nuestro script de tanque, que ahora está unido a nuestro personaje de tanque, va a heredar del cuerpo del personaje tres D. Podemos, si queremos, darle su propio nombre de clase para que dentro del juego, sepamos que es de tipo clase tanque y luego podemos referirle como tal Entonces sí, hagámoslo. Ahora, tengo la plantilla de script predeterminada desactivada. Normalmente, vas a obtener comentarios extra y algunas funciones predeterminadas definidas para ti, pero vamos a redefinirlas en breve de todos modos Y luego en el futuro, puedes encender la plantilla o dejarla apagada de cualquier manera. Pero sí, así es como empezamos, y luego simplemente golpearemos Controles para asegurarnos de que no perdemos nada. Y antes de pasar a la siguiente lección y comenzar a hablar de controlar nuestro tanque a través de la entrada del usuario, veamos los conceptos básicos de cómo vamos a interactuar con un cuerpo de personaje tres D. Así que el cuerpo del personaje tres D tiene una función conocida como proceso de física. Y como existe, la entrada de Gado o Autocompletar va a intentar crearla para nosotros, para que podamos dejarla, y entonces de esa manera, no tenemos que preocuparnos recordar su firma de función Y como variable, toma la cantidad de tiempo que ha pasado entre las llamadas al proceso de física. Eso se expresa como un flotador, así que probablemente va a ser como 0.012 o algo así, W, por supuesto, siendo uno un segundo completo Proceso de física se llama a una velocidad de 60 veces por segundo, que es en lo que funciona el motor de física que usa Gadot Afortunadamente, no tenemos que escalar ninguno de nuestros tratos de velocidad dentro del proceso de física en el cuerpo del personaje tres D por Delta porque todos los cálculos bajo el capó ya lo tienen en cuenta Pero para otros tipos de objetos de física, lo haremos, y trataremos con eso cuando surja. Pero de todos modos, no tenemos que definir una variable llamada velocidad porque uno ya está integrado en el cuerpo del personaje tres D. Así que si simplemente lo deletreamos correctamente, podemos asignar un nuevo vector tres a ese valor. Y lo hacemos usando la palabra clave vector three constructor. Y como se puede ver, de nuevo, Gadot está intentando decirnos así es como se define esta variable, y estos son los valores que hay que poner en ella Entonces en realidad queremos este tercero porque vamos a proporcionar la X, la Y y la Z nosotros mismos. Y así, si tuviéramos que hacer esto, estaríamos proporcionando una velocidad de cero, lo que, por supuesto, significa que nuestro tanque no se va a mover, pero no vamos a hacer eso. Queremos que nuestro tanque se mueva en dirección X. Y así en este caso, se va a mover exactamente a lo largo del eje X porque esa es la forma en la que se enfrenta actualmente. Entonces vamos a cambiar este valor a, digamos, diez, solo por el gusto de hacerlo Y ahora el cuerpo del personaje tres D tiene un método llamado mover y deslizar, y mover y deslizar tomará la velocidad, y hará un montón de cálculos diferentes sobre él, y luego finalmente moverá el tanque. Y como estamos forzando la velocidad a este valor constante cada proceso de física, entonces nunca va a disminuir la velocidad ni nada por el estilo. Y si pulsamos el botón de reproducción aquí, se puede ver ahora que nuestro tanque avanza, y seguirá avanzando hasta la profundidad de calor del universo. Y nuevamente, fíjense que no está cayendo, y eso es porque no le hemos asignado un vector descendente para simular la gravedad. Entonces nuevamente, la Y, la velocidad de arriba y abajo, y la velocidad Z, que está dentro y fuera, van a permanecer constantemente en cero, y el tanque avanzará a una velocidad de diez. Ahora bien, ¿qué significa en realidad diez? Um, no estoy 100% seguro. Los valores proporcionados a los cálculos de velocidad, que yo sepa, no están en, como, metros por segundo o pies por segundo ni nada de eso, o unidades por segundo, son arbitrarios. Entonces, una de las cosas que debes hacer para afinar tu proceso de física es comenzar con un valor y luego seguir jugando con esos valores hasta que realmente se parezcan a algo que quieres, desafortunadamente. Voy a hacer algunas investigaciones sobre eso, y si resulta estar equivocado, entonces voy a actualizar en una lección futura. Pero por ahora, pasemos a la siguiente lección, y veremos cómo capturar los controles del teclado para los controles del teclado cambiar esto y realmente hacer que el tanque se mueva de la manera que queramos. Te veré ahí. 13. Reacción a la entrada del jugador: movimiento: Bienvenida de nuevo. En esta lección, vamos a aprender a consultar los controles del teclado del usuario para maniobrar nuestro tanque en tres espacios D. Entonces todo movimiento o toda lectura de entrada en Gdo se hace por medio de lo que se llaman acciones Y podemos ver las acciones establecidas para un proyecto bajo la configuración del proyecto y el mapa de entrada. Ahora, el tuyo se va a quedar así por defecto porque GADO tiene un montón de acciones integradas, pero por alguna razón, se niega a mostrárselas hasta que hagas clic en este botón. Y aquí se puede ver un montón de ellos. Entonces, los que más nos interesan son los de la interfaz de usuario, que son específicamente UI left, UI right, UI up y UI down. Y puedes ver aquí que están mapeados a un montón de diferentes configuraciones de control. Por lo que la interfaz de usuario izquierda se asigna a la flecha izquierda en el teclado, así como un botón Joypad en particular o un acceso JoyPad Entonces no importa el dispositivo de control que uses. Si enchufas un joystick y presionas el botón correspondiente, vas a conseguir que me quede. O si presionas la flecha izquierda en el teclado, vas a conseguir que me quede. O si lo mapeas a un botón del mouse, cual puedes hacer manualmente, también lo hará. Pero no vamos a hacer ninguna de esas cosas. Sin embargo, en realidad puedes crear el tuyo propio. Entonces, por ejemplo, si quisieras subir la visualización del mapa a la clave, podrías crear una nueva acción llamada map y luego mapearla al MK, y estarías bien. Entonces, lo primero que vamos a hacer es en realidad proporcionar una referencia al tanque del jugador dentro del objeto del juego. Y parece que ya lo he renombrado aquí, pero así es como se veía originalmente Entonces fue tanque, y luego vamos a cambiarle el nombre a jugador Tanque. Y la razón por la que le renombramos es porque eventualmente vamos a tener un montón de tanques para representar a los enemigos y demás, y no queremos tener que saber cuál es cuál. Entonces este va a ser el jugador. Y una de las otras razones por las que le damos un nombre es para que podamos manipularlo directamente con los controles, que veremos en un minuto. Si vamos al script del juego y usamos la palabra clave export, podemos obtener cualquier variable que definamos bajo la palabra clave export para que aparezca en el inspector de aquí. Entonces, por ejemplo, si simplemente defino una variable llamada X, no la verás. Pero si tuviera que exportar esa variable, y si fuera a deletrear exportar correctamente y usar la anotación correcta ahí, oh, sí, proporciona requiere un tipo, así que ahí vamos Ahora bien, si tuviera que hacer esto, la variable X aparece en el inspector y puedo cambiar sus valores aquí, igual que lo haríamos para la transformada o cualquiera de las otras cosas que hemos estado usando hasta ahora. Entonces en este caso, vamos a crear un jugador llamado, y vamos a bloquear su valor a tanque. Y al hacerlo, hemos obligado a Gadot a reconocer o limitar cualquier cosa que arrastremos aquí Entonces, por ejemplo, si quisiera arrastrar a Ana por aquí, Godot no me dejaría Pero si yo fuera a arrastrar jugador Tanque, que es, por supuesto, un tanque, Ooh Ganancia, arrastre. Ahí vamos. Ahora tenemos esto asignado. Entonces, cuando dejamos de fumar, cuando manipulamos la variable player en nuestro script, va a llamar a los métodos de este script en particular, que es, por supuesto, un tanque. Y la razón por la que el nombre de la clase está disponible para nosotros es porque aquí lo definimos. Así que vamos a guardar nuestro juego. Guión. Y además, parece que empecé a grabar después de adjuntar el guión al objeto del juego. Entonces, si estás siguiendo en casa, primero que debes hacer es adjuntar un guión a tu clase de juego, mismo que hicimos con un tanque con nuestro guión de tanque al objeto tanque en la lección anterior. Entonces ahora que tenemos esto disponible, vamos a hacer que el juego sea responsable recoger la entrada y no el tanque. Y la razón por la que vamos a hacer eso es porque vamos a tener otros tanques más adelante para representar a los enemigos, y no queremos tener que separar el código que lee los controles para el tanque jugador, de los tanques enemigos y todas esas otras cosas. Entonces es mejor solo tener un tanque genérico y luego dejar el juego manipule directamente el tanque del jugador y luego dejar que la interfaz de usuario manipule directamente a los tanques enemigos para que tengan una interfaz común. Ahora, todos los nodos en Gado tienen un método predefinido llamado entrada de clave no controlada, y eso es lo que vamos a usar Este método se llama cada vez que el usuario presiona una tecla. Siempre que el usuario suelta una clave, cada vez que el usuario mantiene presionada una tecla, cualquier evento clave relacionado en Gadot, se llama a este método Y la razón por la que estamos usando este método en lugar de monitorear directamente la entrada clave del usuario en, digamos, el método de proceso o lo que sea, es que estos métodos solo se llaman cuando cambia el estado de la clave, por lo que no estamos constantemente tirando y repoleando y consultando Entonces una de las reglas fundamentales de la programación informática es que no hagas más trabajo del que necesitas. B lo más perezoso posible. Entonces no queremos estar constantemente haciendo que Gadot diga: ¿Está la llave abajo ¿La llave está abajo? ¿La clave es Doown? Sólo queremos que la llave sea como, Oye, estoy abajo y luego hacer que Go Gadot reaccione ante ello Entonces eso es lo que vamos a hacer aquí. Entonces en este método, vamos a definir dos variables. Vamos a definir uno llamado valor de giro, y va a ser un flotador, y vamos a definir uno llamado valor de movimiento. Y también va a ser una carroza. Y estos valores o bien van a ser cero, uno negativo o uno, dependiendo del estado de nuestra entrada. Y como se podría imaginar, vamos a manipular el tanque en base a estos valores. Entonces lo que queremos hacer, por ejemplo, es si el ratón izquierdo o si se mantiene presionada la flecha izquierda, vamos a querer que el tanque gire hacia la izquierda, que sería en la dirección negativa. Y si vamos a mantener pulsada la tecla de flecha derecha, entonces el tanque girará en la dirección positiva. Y si no se sujetan las llaves, el tanque no girará en absoluto. Y lo hacemos usando la entrada Singleton, que se encarga tratar con todas las cosas de entrada en GIDO Y vamos a usar una función llamada eje G. Y Gaxis toma dos parámetros. Se necesita una acción negativa y una acción positiva. Y puedes ver la definición de función aquí en la insinuación debajo de mi entrada Así que vamos a darle UI a la izquierda y a la derecha. Ahora bien, ¿qué es toda esta tontería sobre las acciones positivas y negativas? Bueno, es posible que un valor de entrada tenga un rango de valores porque es posible, por ejemplo, si estás usando un controlador para empujar un poco hacia la izquierda o todo el camino hacia la izquierda. Y Gadot representa que con un valor de aproximadamente cero a uno para mostrar cuanto a la izquierda se está presionando el palo Y queremos combinar eso con el valor en la otra dirección, lo cual no es realmente posible. O tal vez como que lo es. Quiero decir, las cosas se ponen graciosas cuando se trata de analógicos. Pero lo que estamos haciendo es, ya que estamos usando el teclado, la intensidad de entrada del comando izquierdo o va a ser cero, lo que significa que no se está presionando la tecla o una, lo que significa que se está presionando la tecla. No obstante, queremos diferenciar cuál es negativo y cuál es positivo. Y como ya dije que queremos que la izquierda se represente por negativo, en este caso particular, la función input get access va a consultar si está ocurriendo o no la acción left. Si lo es y es la acción negativa, entonces va a devolver uno negativo. Y como nosotros es la acción positiva, si es mantener presionada a la derecha, entonces vamos a conseguir una. Entonces este bit de código va a devolver uno negativo, cero o uno, dependiendo de cómo se estén manteniendo presionados estos botones. Y si los mantienes a ambos al mismo tiempo, se cancelan entre sí y sale como cero, que es también lo que queremos. Entonces vamos a hacer lo mismo por el valor de movimiento, aunque en este caso, va a ser UI abajo y yo arriba, lo que parece un poco hacia atrás, que parece un poco hacia atrás, pero Gadot representa adelante y atrás con la coordenada Z y la coordenada Z, y de hecho te voy a mostrar esto aquí Por lo que la coordenada Z está orientada en esta dirección. Que es hacia ti, y esta es la dirección positiva. Entonces Z bajar es positivo. Z subir es negativo. Entonces normalmente pensaríamos en arriba como positivo, pero en realidad es al revés. Entonces por eso lo volteamos en el guión aquí. Y Gadot se queja porque claramente, no sé la diferencia entre un plus y un igual Entonces ahora que tenemos estos valores, podemos verificar que estamos obteniendo lo que queremos imprimiéndolos . Entonces hagámoslo. Entonces ahora si empiezo mi juego. Bueno, el tanque se mueve porque no eliminamos nada del código de nuestras lecciones anteriores. Entonces, vamos a ignorar eso por ahora. No va a ir a ninguna parte. Pero ya verán si presiono y suelte el up que la fuerza de entrada está arriba. Y abajo. Y ahora si lo hago a derecha e izquierda, obtenemos nuestros ceros y nuestros negativos exactamente como los queremos. Así que eliminemos este código del proceso de física, y pondremos aquí la palabra clave pass para indicar que esta es una función vacía, y vamos a tener que definir algunos valores y variables para que nuestro tanque funcione. Entonces, lo primero que vamos a necesitar hacer es que vamos a necesitar definir un par de valores para determinar qué tan rápido se va a mover y rotar nuestro tanque. Entonces vamos a exportar una variable llamada velocidad de giro. Y una cosa a tener en cuenta es que, técnicamente, Gadot utiliza el caso de serpiente para sus convenciones de capitalización Pero he sido programador de Sea Sharp y Java durante los últimos 15 años, así que tengo tendencia a usar estuche de camello. Probablemente voy a cambiar inconsistentemente de un lado a otro entre los dos a lo largo la totalidad de este curso, así que no sigas mi ejemplo. Escoge uno y quédate con él. Pero de todos modos, Turnspeed va a ser un flotador Y la velocidad de movimiento también va a ser un flotador Y también te voy a mostrar un pequeño truco de anotación aseado que si estás familiarizado con versiones anteriores en Gadot se agregó en algún momento alrededor de la era 4.2. No estoy del todo seguro de dónde. Pero si quieres agregar una punta de herramienta, así que vamos a ir a nuestro tanque aquí. Puedes ver que tenemos velocidad de giro y velocidad de movimiento, y si pasas el cursor sobre ella, obtienes una punta de herramienta, y dice: No hay descripción disponible. Y eso te entristece. Entonces, si quieres agregar una punta de herramienta, solo usa una etiqueta hash doble. Un solo hash tag es un comentario, lo que significa que Godo lo ignorará Pero si es una etiqueta hash doble, es una punta de herramienta. Entonces volteemos la velocidad en grados. Más bien la velocidad de giro del tanque en grados. Y es un color ligeramente diferente, así que puedes ver que es una anotación. Ahora si vamos por aquí, tenemos consejos de herramientas, y es maravilloso. Desde que me enteré de eso, he estado enamorada de ella. Anoto todo ahora. Entonces, como prometí, en realidad hice un poco de investigación, y descubrí que a pesar de que Godot se refiere a las tres unidades de cuadrícula D como metros y tipo de actos como si fuera la misma unidad de medida que sería en licuadora, que también usa unidades, a Godot no le importa Es sólo una unidad. Puedes considerarlos pulgadas, metros, unidades de libertad, como quieras llamarlos, y todos los cálculos funcionarán igual. Así que sí. Sólo vamos a considerarlo arbitrariamente metros. Realmente no creo que importe. Y aquí vamos a proporcionar algunos valores predeterminados. Entonces nuestra velocidad de giro en grados es de 20, y digamos simplemente grados. Y la razón por la que definimos de esa manera es porque la rotación se puede manejar en gO tanto en grados como en radianes Internamente, en el motor, todo se hace en radianes, pero sí acepta grados como valores de entrada en muchos casos, y puedes convertir entre los dos con bastante facilidad Yo personalmente y muchas veces cuando estás haciendo modelos de veces cuando estás haciendo tres D y cosas así, es más fácil pensar en grados porque cuando dices ángulo, ¿qué piensa la mayoría de la gente? Piensan ángulo de 45 grados, ángulo 90 grados, ángulo recto, lo que sea. Y todo eso es en grados, pero todo lo demás está en radianes Por lo que suele ser una buena idea indicar qué valor esperas cuando estás creando una variable como esta. Entonces sí, grados de velocidad de giro. Y la velocidad de movimiento está en unidades por segundo, así que en realidad no tenemos que definir nada ahí. Equivale a diez. Entonces nuevamente, diez unidades por segundo. Ahora, vamos a necesitar un par de métodos que vayan a actualizar esos valores, y también vamos a necesitar los propios valores porque estos son solo constantes Esto solo significa que, oye, cuando el tanque gire, va a girar a 20 grados por segundo, pero necesitamos algo para monitorear realmente cuál es la velocidad de rotación actual del tanque. Y vamos a ver por qué es eso en un momento. Así que vamos a definir una variable llamada velocidad de rotación. Y eso es un que es un flotador, y entonces vamos a tener otro llamado velocidad de movimiento. Y estos valores son los que van a ser modificados por la entrada, como veremos en un momento. Pero lo primero que tenemos que hacer es que vamos a necesitar definir un par de funciones más, y una de ellas se va a llamar establecer velocidad de giro. Y va a tomar un valor de entrada, que es un flotador. Y por ahora, solo lo pondremos para que pase para que no haga nada. Se llama tachar una función. Podemos definirlos sin proporcionar realmente ninguna información para que podamos configurar el marco. Y vamos a haber establecido la velocidad de movimiento. Entonces ahora tenemos estos valores, podemos volver al juego, y en lugar de simplemente imprimir estos valores, podemos tomar el tanque del jugador y podemos establecer su velocidad de giro en función de su valor de turno. Y podemos establecer la velocidad de movimiento del jugador en función su valor de movimiento. Entonces, ¿qué significa todo eso? Lo que significa es que cuando cambia el estado de la clave, así que cuando el usuario presiona o suelta una tecla, esta información se va a calcular, como mencionamos anteriormente, y entonces esos valores van a modificar las velocidades de giro y movimiento existentes. Entonces, si el tanque no se mueve en absoluto, su velocidad de rotación va a ser cero. Lo cual se va a reflejar por el hecho de que el valor de giro que se pasa es cero. Y si el tanque está girando hacia la izquierda, bueno, la velocidad de rotación va a ser la velocidad de giro existente modificada por la dirección. Por lo que sería negativo 20 para izquierda y positivo 20 para derecha. Entonces, lo que realmente queremos hacer es establecer la variable de velocidad de rotación igual a la velocidad de giro del tanque en grados multiplicada por el valor de entrada. Entonces nuevamente, ya que si hubiéramos pulsado la tecla izquierda, el valor de entrada sería igual a uno negativo. Eso significa que la velocidad de rotación sería 20 veces negativa una, que es negativa 20, lo que significa que el tanque estaría rotando negativo 20 grados, que lo giraría hacia la izquierda y lo mismo para la derecha. Y vamos a hacer lo mismo por la velocidad de movimiento. Entonces la velocidad de movimiento va a ser igual Bueno, uh, velocidad de movimiento va a ser igual a la velocidad de movimiento, y aquí es en realidad donde creé dos variables que se nombran ambiguamente, así que no debes hacer eso Llamemos a esto velocidad de avance. Ahora, llamemos a esto una velocidad de movimiento, y esta es velocidad de avance. Así que la velocidad de avance es igual a los tiempos de velocidad de movimiento valor de entrada. Y ahora que tenemos estos valores, podemos modificar los valores existentes de los tanques con esos nuevos valores en proceso de física. Entonces, lo que hace el proceso de física, como mencioné antes, es que se le llama 60 veces por segundo, y aquí es donde se hacen todas las manipulaciones de, digamos, velocidad o rotación o cualquier cosa que afecte los valores de física de los tanques Entonces, en nuestro caso, esa sería la velocidad del tanque y, por supuesto, la rotación del tanque. Entonces, lo primero que vamos a hacer es que vamos a establecer la rotación del tanque igual a su rotación actual más la velocidad de rotación. Entonces, ¿cómo hacemos eso? Bueno, hay dos maneras. Hay una variable dentro del nodo tres D llamada rotación, pero también hay una llamada grados de rotación. Y como dije, ya que me gusta trabajar en grados, y grados de rotación es una variable de conveniencia específicamente para eso, voy a establecer grados de rotación iguales a un nuevo vector tres y vamos a iniciarlo con tres ceros Entonces, lo que esto significa es que no hay absolutamente ninguna rotación en absoluto. Pero lo que queremos hacer es que queremos rotar el tanque a lo largo del eje y porque el eje Y es el que es recto arriba y abajo. Y si tuviéramos que rotar el tanque a lo largo de ese eje, el tanque realmente giraría en su lugar. Entonces como pueden ver aquí, ya que es la línea verde claro, y esta es la rotación verde claro, si tuviera que mover esto, entonces el tanque se movería así. Y eso es lo que queremos hacer en código. Entonces volvemos aquí y grados de rotación, y queremos cambiar el componente Y. Entonces el componente Y ahora es igual a la velocidad de rotación por Delta. Y eso es porque queremos escalarlo por la cantidad de tiempo que ha pasado entre fotogramas, que es lo que es Delta. De lo contrario, la velocidad de rotación, que es 20 o negativa 20 se llamaría 60 veces por segundo, lo que significa que cada 60 de segundo, la rotación se actualizaría lo que significa que cada 60 de segundo, la rotación se actualizaría 20 grados en cualquier dirección, y no queremos un tanque que gire como un top Entonces esto realmente debería funcionar. Ejecutemos nuestro juego y veamos. Ahora bien, si presiono hacia la izquierda, no pasa absolutamente nada. Y si presiono a la derecha, absolutamente no pasa nada. Bueno, eso está roto. Bien, veamos cuál es el problema El problema es muy probable que no estemos haciendo movimiento y deslizamiento. No creo que ese sea el caso, pero vamos a comprobarlo. No, ese no es el caso. Bien, ya veo cuál es el problema. El problema es que estoy ajustando incondicionalmente la rotación a un valor, mientras que queremos que sea igual al valor actual más el nuevo valor Porque lo que esto es esto nos va a dar ya sea un 20 o un 20 negativo. Y si cambiamos la rotación solo a 20, no vamos a obtener una rotación consistente. Somos el tanque se va a encerrar a 20 o a los 20 negativos, y ese va a ser el final de la misma. Lo que queremos que haga es que vaya cambiando gradualmente con el tiempo. Entonces si la rotación fue cero, entonces agregamos esto para que sea negativo 20 ish sobre un segundo. Y luego en el siguiente turno, es negativo 40 en un segundo y así sucesivamente y así sucesivamente. Entonces esto realmente debería solucionar el problema. Y lo tenemos al revés, y eso es porque aquí necesitamos revertir los valores. Perfecto. Ahora tenemos un tanque giratorio, y hacemos exactamente lo mismo para el movimiento, casi. Entonces, lo que tenemos que hacer es establecer el cuerpo del personaje tres Ds construidos en variable de velocidad, que aparentemente no puedo deletrear velocidad. Y la velocidad va a ser igual a algo. Ahora, hay un par de formas diferentes de determinar cómo mover un nodo en función de su orientación. Lo más sencillo es tomar un vector orientado hacia adelante, multiplicarlo por el valor del movimiento, y luego establecerlo a la velocidad. Y si bien eso es perfectamente aceptable, la mayoría de las veces, Gadot en realidad recomienda que no hagas eso por toda una serie de razones matemáticas También se complica un poco porque hay que tener en cuenta la orientación del tanque y el hecho de que Gadot considere que Forward está en la dirección Z y todo tipo de tonterías que probablemente estén en la dirección Z y todo tipo de haciendo que me mires, vaya, ¿De qué carajo está hablando este tipo ahora mismo La forma más fácil es usar una herramienta interna o un objeto interno llamado base de transformación. Así que cada nodo en Gadot tiene una variable interna llamada transform, y transform es exactamente como suena Básicamente es este objeto aquí, que determina la posición y rotación y escala del objeto y probablemente algunas otras cosas que me estoy olvidando en el espacio tres D. Y Gadot maneja todos esos cálculos a través de esos cálculos a través su motor de física bajo el capó. Y una de las variables internas de la transformación que nos da es esta cosa llamada la base. La base es el resultado de todos esos cálculos previos a cualquier modificación adicional que pueda realizar. Entonces te voy a mostrar cómo funciona esto. ¡Vaya! Control K. Los vamos a comentar y vamos a volver al juego, y sólo vamos a cambiar esto un poco. Reproductor de impresión dot transform dot BASIS. Ahora, solo tocaré una tecla y dejará de correr juego. Y esta es la base. La base es un vector de vectores. Y lo que te da es la orientación de tu objeto en un montón de contextos diferentes. El más útil para nosotros es el contexto X porque este vector determina la orientación X y Z de nuestro tanque después de aplicar la rotación. Y para mover el tanque hacia adelante, queremos moverlo en el plano XZ. Entonces esa sería una combinación de esta dirección y la dirección azul hacia adelante y hacia atrás en la dirección hacia la que mira el tanque. Entonces, si volvemos a nuestro guión y podemos deshacernos de esto, la velocidad del tanque será igual a la base de tanques, el componente X de la base de tanques, multiplicado por la velocidad de movimiento. Y lo que eso hará es que escalará, el vector X por la velocidad de movimiento, que es exactamente lo que necesitamos para la velocidad. Ahora bien, si llamo mover y deslizar, eso debería permitir que el tanque se mueva hacia adelante en cualquier dirección en la que se encuentre. Entonces cruzemos los dedos. Y, uh, no. Es porque la velocidad de movimiento es una constante. En realidad queremos velocidad de avance. Y es por eso que necesitas nombrar tus variables una manera juiciosamente responsable Bien, ahí vamos. Ahora si presiono hacia adelante, el tanque avanza. Si empujo hacia atrás, se mueve hacia atrás. Si giro el tanque y ahora lo muevo hacia adelante, ahí vamos. Apuntemos al árbol, y atravesaremos el árbol. Y eso es porque no hemos habilitado ningún tipo de colisión. Y la única razón por la que parece que tenemos colisión es que como no estamos aplicando ninguna velocidad en la dirección Y, el tanque no está siendo afectado por la gravedad de ninguna manera, así que no va a caer. Pero ahora tenemos un tanque en movimiento, y podemos pasar a la siguiente lección. Entonces te voy a ver ahí. 14. Reacción a la entrada del jugador: control de la torreta: Bienvenida de nuevo. En esta lección, que va a ser infinitamente más fácil que la última lección, vamos a aprovechar lo que aprendimos en la última lección para manipular la torreta del tanque Entonces, lo primero que tenemos que hacer es proporcionar un par de variables adicionales a nuestro tanque. Específicamente, necesitamos una velocidad de rotación de la torreta. Y también necesitamos una velocidad de ángulo de torreta. Porque la torreta va a poder tanto rotar como también subir y bajar. Y como resultado de eso, también vamos a necesitar una velocidad de movimiento de torreta. Y por último, Y torreta. Ahí vamos. Vamos a necesitar un ángulo máximo para la torreta que no podamos tener no podemos tenerla girando por todas partes. Torreta Ángulo máximo grados de flotación. Y llamemos a eso 15. Y vamos a necesitar algunas funciones similares para manipular la torreta de la misma manera que hicimos para girar y mover. Entonces vamos a hacer giros. Torretas No. Va a requerir un valor de entrada. Y torreta angular. No puedo escribir salvarme la vida, ¿verdad? Y ahora que tenemos estos, podemos alterar la velocidad de rotación y ángulo exactamente de la misma manera que hicimos para el giro y rotación. Y solo para mantener las cosas simples, el ángulo de la torreta, la velocidad de subida y menor va a ser exactamente la misma velocidad que la velocidad movimiento de la torreta, la velocidad de rotación. Si tú como ejercicio, si quieres cambiarlo para que utilice un valor diferente, ese sería un buen ejercicio para lo hagas en tu tiempo libre. Bien. Entonces, antes de poder manipular estos valores a través de los controles y también agregarlos a nuestro proceso de física, que vamos a hacer, necesitamos referencias a la parte de torreta del tanque. Entonces, si volvemos a nuestro valor de tres D aquí, nuestra vista de tres D aquí, en nuestra lección anterior, realidad creamos un nodo para representar el tanque, que contiene las instancias de malla del tanque, y luego también creamos un punto de anclaje de barril, que artilla el cañón a la torreta. Ahora, necesitamos apoderarnos de referencias a estos valores desde dentro del tanque. Y hay un par de formas de hacerlo En Gadot. Pero hoy en día, en cuatro puntos dos y cuatro puntos tres, la forma más fácil de hacerlo es usar referencias a objetos. Entonces vamos a exportar un par de valores más. Y como ambos son el nodo tres Ds, podemos sujetar el tipo al nodo tres D, así que vamos a exportar la torreta, y vamos a exportar la bisagra de torreta. Y ahora que estos existen, podemos ir al tanque, y podemos arrastrar la torreta por aquí y la bisagra de la torreta, que es el punto de anclaje del cañón por aquí. Y luego los amontonaremos un poco. Por lo que los grados de rotación de la torreta van a ser modificados exactamente de la misma manera que lo harían los tanques creando un vector de rotación y usando la velocidad de rotación de la torreta tiempos de velocidad de rotación de la torreta Delta . Y vamos a hacer lo mismo por la bisagra, pero no del todo. Entonces los grados de rotación de bisagras actuales van a ser modificados por un vector tres, pero vamos a estar rotándolo a lo largo de un ángulo diferente. Vamos a estar rotándolo a lo largo del eje Z para que se mueva hacia arriba y hacia abajo porque el eje Z está aquí entrando y saliendo. Y entonces si lo hiciéramos rotar con el azul, que representa la Z, va a subir y bajar. Entonces eso significa que las propiedades X e Y del vector van a ser cero, pero la velocidad de rotación de la torreta delta o más bien el componente Z va a ser la velocidad de rotación de la torreta Delta. Y vamos a hacer una cosa más. Necesitamos sujetar los grados de rotación a nuestro rango de ángulo máximo, y lo hacemos con el método clamp F porque vamos a estar trabajando con flotadores Entonces Turrent bisagra rotación grados Y queremos la propiedad Z porque esa es la rotación hacia arriba hacia abajo Grados de rotación de bisagra Z es igual al valor de retorno abrazadera F. Y lo que queremos hacer es abrazadera F toma tres parámetros. El primero es el valor que estamos sujetando. El segundo es el mínimo del rango al que estamos sujetando, y el tercero es el rango máximo a lo que estamos sujetando. Entonces eso va a ser grados de ángulo máximo negativo y grados de ángulo máximo respectivamente. Entonces ahora si intentamos rotar nuestra torreta ras o bajar nuestra torreta fuera de este rango, este método la va a sujetar dentro de ese rango, y no vamos a tener la torreta girando en dirección vertical, que es exactamente lo que queremos. Entonces, ahora que ya hemos hecho todo esto, necesitamos modificar nuestro método de juego o nuestro método de entrada de teclas no manejadas del juego para que todo esto funcione Entonces, ¿cómo vas a hacer eso? Bueno, lo que vamos a hacer es que vamos a suponer que si el jugador tiene pulsada su tecla de control, está manipulando la torreta, y si no tiene presionada la tecla de control, están manipulando su tanque Así que tenemos que comprobar nuestra entrada Singleton, y vamos a utilizar el método es la tecla física presionada Y luego vamos a buscar la clave de control, y ahí está. Ahora, si se presiona la tecla de control, entonces queremos usar el giro en los valores de movimiento para la torreta. De lo contrario, queremos usarlo para el tanque. Así que tenemos juego de jugadores, torreta giratoria de jugador con el valor de giro y torreta de ángulo de jugador con el valor de movimiento. No obstante, esto funcionará, pero habrá un error. Y una de las mejores cosas de obtener más experiencia con la programación es que podrás detectar errores antes de que realmente te encuentres con ellos mientras estás probando. Entonces digamos que presionamos la tecla de control, y presionamos hacia abajo la tecla de flecha derecha, y estamos rotando la torreta, y luego soltamos la tecla de control. Bueno, esto va a saltar de esta sección hacia abajo a esta sección, lo que significa que no va a actualizar la velocidad de rotación de la torreta con el valor actual del giro. Entonces, en lugar de pasar cero aquí para evitar que la torreta gire, va a ir directo hacia abajo aquí. Entonces, lo que tenemos que hacer es que tenemos que detener explícitamente el movimiento y la rotación del tanque cuando estamos manipulando la torreta Y lo hacemos pasando explícitamente cero como las velocidades de giro. Y si estamos manipulando el tanque, entonces queremos forzar los valores de las torretas a Y esto debería funcionar. Entonces ahora si muevo mi tanque de la manera normal, es genial. Ahora bien, si mantengo el control, bueno, algo anda mal. Sin embargo, estamos cerca. Entonces se puede ver que si mantengo pulsado el control y el tanque está a la vez girando y girando, así parece que accidentalmente estoy usando los mismos valores en alguna parte. Velocidad de rotación en T, velocidad de ángulo de torreta. Uh, eh. Y aquí está. En lugar de usar la velocidad del ángulo de la torreta para acotar la torreta, estoy usando la velocidad de rotación. Ahora bien, eso debería funcionar. Y ahí lo tienes. Y como pueden ver, si intento hacer un ángulo de la torreta en un valor que sea mayor que el rango de ángulo que establecemos, no funciona. Y puedes incluso y, por supuesto, ahora si estoy moviendo un tanque y golpeo abajo si golpeo control, el tanque deja de moverse y la torreta sigue adelante. Bien. Entonces, como habrás notado, actualmente podemos conducir a través de árboles, rocas y colinas, y eso es malo. Entonces, en nuestra siguiente lección, aprenderemos a configurar la colisión, y después de eso, las cosas se van a poner interesantes. Podemos empezar a causar algunos estragos y destruir cosas. Entonces te veré en la siguiente lección. 15. Colisión: Bienvenida de nuevo. Esta lección va a ser infinitamente más simple que las dos últimas e incluso más simple que la anterior Entonces, si tu cabeza estaba dando vueltas a partir de todas esas tonterías vectoriales de matemáticas y rotación, esta va a ser un poco respiro Entonces vamos a mirar colisión, y vamos a arreglar esta pequeña advertencia amarilla. Entonces, esto se ha estado quejando desde que convertimos nuestro tanque en un cuerpo de personaje tres D que no tiene forma Entonces le vamos a dar uno. Entonces vayamos a nuestra vista de tres D. E hice clic en la Z, y bueno, antes que nada, me aseguré de que fuera y no es Me aseguré de que fuera una vista de puerto de dos vistas e hice clic en la Z e hice clic en la Y de tal manera que tenemos esta bonita vista de arriba hacia abajo y hacia adelante para Y así, como mencioné antes, nuestro tanque es un tanque tipo, que es un cuerpo de personaje tres D. Que es un objeto de física, y el objeto de física requieren formas de colisión para funcionar. Y como nunca agregamos un nodo de forma de colisión a esta cosa, hemos tenido este pequeño icono amarillo que se ha estado burlando de nosotros todo este tiempo Entonces vamos a agregar un nodo hijo, y vamos a agregar una colisión de forma tres D. Boom. Ahora, la forma de colisión tres D requiere una forma muy similar a las primitivas de malla que hemos estado usando Así que vamos a ir con forma de caja y ahora tenemos un montón de widgets que nos permitirán indicar el tamaño y orientación de Xbox. Entonces lo primero que vamos a hacer es que vamos a alargar esto un poco. Y entonces vamos a y por alguna razón, se está chasqueando Esto debe ser un bicho y Gadot. A veces se ajusta a los broches de presión en las rejillas, aunque no quieras que Entonces veamos si puedo allá vamos. No sé por qué estaba encerrado en eso antes. Pero de todos modos, puedes usar estos pequeños círculos rosados para cambiar el tamaño y la posición de tu caja. Entonces lo que queremos hacer es asegurarnos de que la caja cubra la totalidad de nuestro tanque en ambas direcciones. Entonces queremos que cubra el tanque en esta dirección. Y mirando hacia abajo, queremos asegurarnos de que sea lo suficientemente largo como para cubrir el tanque en esta dirección, también. Entonces ahora que tenemos una caja rodeando el tanque, cuando intentamos que el tanque se mueva usando el método Move and slide. Veamos eso otra vez. Entonces como tenemos en nuestro proceso de física mover y deslizar, Godot va a intentar chocar nuestra caja en forma de colisión Y como pueden ver, la pequeña advertencia va a desaparecer ahora. Va a intentar chocar esa caja en forma de colisión con cualquier otra caja con forma de colisión que tengamos en nuestro nivel de juego. Y ahora mismo no tenemos ninguno. Entonces hagamos que nuestros árboles, rocas y colinas colisionen Entonces nuestro árbol, volvamos a nuestro árbol, y nuestro árbol es un nodo tres D, así que vamos a darle una forma de colisión. Y si intentamos hacerlo, obtenemos tanto un error como una advertencia. El aviso, claro, porque no tenemos forma. Pero el error es que nuestro árbol no es del tipo correcto de nodo para hacer uso realmente de una forma de colisión. Por lo que hay tres tipos de cuerpos físicos que utilizan colisión. Ya tenemos un cuerpo de personaje tres D, que es nuestro tanque, pero luego también tenemos vamos a cambiar el tipo. Un cuerpo estático tres D, y un cuerpo estático tres D es un objeto de física que no se mueve. Y no sólo no se mueve, nunca se moverá, lo que significa que Gadot no va a intentar aplicarle gravedad ni nada más , sino que puede chocar Entonces, ahora que tenemos una forma de colisión, cambiemos la forma de colisión a un cilindro. Y ahora podemos cambiar el tamaño de nuestro cilindro y moverlo hacia arriba. Y otra vez, se está quebrando por alguna razón. Este es un bicho odioso. Ahí vamos. No sé por qué sigue haciendo eso. A mí me disgusta mucho. Pero nuevamente, podemos usar las asas para indicar el tamaño del cilindro. Entonces ahora nuestro árbol está completamente cubierto por una colisión Uy, por una forma de colisión Y en realidad funciona. Entonces, sí, se puede ver que está rodeada por este cilindro. Y vamos a hacer los demás también. Pero ahora, sin ningún código adicional en absoluto, si me encuentro con el árbol, boom, no puedo correr por el árbol. Así que agreguemos formas de colisión a nuestras rocas y a nuestras colinas, y luego podremos pasar a la siguiente lección. Entonces, de nuevo, vamos a tener que cambiar el cerro. Así que en realidad podemos cambiar la colina a un nodo hijo. Entonces vamos a tener que llegar a un cuerpo estático porque es una malla, que significa que vamos a perder toda esta información. Así que en realidad vamos a tener que ponernos engañosos. Vamos a agregar un nodo hijo, y va a ser un cuerpo estático tres D. Y luego vamos a hacer click derecho sobre esto y vamos a decir make scene root, y ahora están volteados El cuerpo estático tres D es enorme, y no queremos eso. Vamos a cambiar eso en un momento. Pero ahora el cerro ha sido criado al cuerpo estático tres D. Así que volvamos a transformarnos, y las transformaciones están bien Por alguna razón, esta cosa es enorme. No sé por qué es eso, pero vamos a darle forma de colisión. Y vamos con un gritos. Vamos con una doble vista otra vez. Y una vez más, eso no está bien. Ahí está. Doble vista, pluma. Lo tenemos abajo y arriba. Y supongo, ah, sí, es porque esas posiciones están apagadas, así que cambiemos eso Reiniciaremos esto a cero. Y ahora tenemos esto aquí, así. Entonces queremos mantener las rotaciones igual, pero queremos que sea localmente a 00 Y ahora el cuerpo estático tres D no es ni remotamente tan grande como antes, que es lo que queremos. Entonces lo haremos y vamos a mover esto para que podamos verlo. Y como esto es cuadrado en su base, agregaremos una caja como hicimos con el tanque. Y luego simplemente estiraremos a este tipo y lo rotaremos para que quede inclinado al mismo tipo de orientación angular que la propia colina Y perfecto. Y vamos a hacer lo mismo por una roca. Así que de nuevo, vamos a necesitar agregar un nodo hijo. Cuerpo estático tres D, hacer snoot. Vamos a reorientar Bueno, esa en realidad era correcta. Y le daremos al cuerpo estático su propia forma de colisión. Y también haremos de ese un cilindro. Mm. Porque a pesar de lo pequeños que son, en realidad no queremos lidiar con las interacciones físicas de conducir sobre rocas. Sólo queremos que el jugador no pueda moverse a lo largo de ellos o por encima de ellos. Nos ahorra mucho dolor de cabeza. Bien. Y lo último que vamos a hacer es que vamos a poner las máscaras de colisión. Entonces, ¿qué es una máscara de colisión? Una máscara de colisión es un conjunto de banderas que le dice a Gadot qué colisionar y qué no colisionar Y así debajo de nuestro tanque, podemos ver que hay una pestaña de colisión debajo del cuerpo del personaje tres D. Y si lo expandimos, tenemos un montón de capas y un montón de máscaras. La capa es la capa de colisión la que pertenece el objeto. Así que vamos a cambiar el nombre de algunos de estos. Así que edita los nombres de capa. La capa uno va a ser jugador. La capa dos serán obstáculos. Y capa tres, aunque aún no tengamos ninguna, seremos enemigos. Ahora podemos decir que el jugador está en la capa de colisión uno, que es jugador, y choca Y si desmarcamos esto, no intentará chocar consigo mismo, porque eso es a la vez tonto e imposible Pero si hacemos clic en dos y tres, eso significa que cualquier cosa que se ajuste a las capas de colisión ya sea de obstáculos o enemigos, el jugador chocará con él Entonces, si volvemos al árbol y si expandimos la colisión y la ponemos a obstáculos, y luego dejamos la máscara en uno, va a chocar con el jugador Y ahora haremos lo mismo por los cerros y los pondremos también sobre la capa de obstáculos. Chocarán con el jugador y lo mismo con la roca Y funcionalmente hablando, eso no ha cambiado nada. Oop. El, bueno, ¿ qué pasa ahí? Eso es extraño. ¿Moví el tanque de una manera que no debería haberlo movido? Bueno, una de las colinas ha cambiado. Oh, ya veo el problema. Me moví una de las colinas, y ahora está directamente encima del tanque. Entonces vamos a mover esa. Volvamos a la arena, y encontraremos el cerro que estaba justo en el centro ahí, y simplemente lo moveremos por aquí. Entonces tenemos una segunda colina por aquí, que está extrañamente orientada. Cambia eso. Debería ser mejor. Bien, ahora comencemos de nuevo el juego. Bien, mucho mejor. Ahora bien, si corro directo por esta roca, golpearé y pararé. Boom, y ahí vamos. Y ahora haremos lo mismo para uno de los cerros. Ir recto más allá de este árbol. Y boom, hemos golpeado la colina. Y como pueden ver, ya que estoy golpeando la colina en ángulo, me estoy deslizando por ella, y eso es lo que hace moverse y deslizarse. Si no querías deslizarte a lo largo del objeto con el que estás colisionando y solo hacer que tus tanques se detuvieran, existe un método llamado mover y colisionar Y se lo voy a mostrar muy brevemente. En realidad no vamos a usarlo, pero tenemos mover y colisionar, y mover y colisionar en realidad toma un montón más parámetros que mover y deslizar Al mínimo, se necesita nuestra velocidad. Pero. Pero no lo escala debajo del capó como lo hace el deslizamiento en movimiento. Entonces tenemos que modificar nuestra velocidad a través de nuestro Delta. Ahora bien, si vuelvo e intento estrellarme contra una colina, mi tanque no va a moverse por el cerro Sólo va a parar. Boom, y ahí va. Ahora todavía puede girar, pero ahora si empujo hacia adelante, el tanque no se deslizará por la colina. Entonces, dependiendo de qué tipo de juego quieras hacer, eso es preferencia personal. Puedes deslizarte o no deslizarte. Vamos a volver a deslizarnos solo porque es un poco más fácil. Y ahora que podemos chocar cosas, vamos a empezar a disparar proyectiles y a hacer estallar cosas. Entonces te veré en la siguiente lección. 16. El nodo de Body rígido: disparar una concha: Bienvenida de nuevo. En esta lección, vamos a ponernos violentos, y vamos a implementar los controles y las complejas matemáticas de tres D que nos permitirán disparar proyectiles contra nuestros oponentes. Pero antes de hacer eso, hay alguna reorganización que tenemos que hacer Entonces, una vez que empiezas a lidiar con tres D matemáticas, la orientación de tus modelos importa. Importa mucho. Y el hecho de que tengamos nuestro tanque mirando a lo largo del eje X va a empezar a darnos problemas porque Gadot en realidad asume que el eje Z positivo está hacia adelante Entonces, como mínimo, tendrías que rotar todos tus cálculos de ángulo 90 grados, y eso es una locura. No vamos a hacer eso. Entonces vamos a tomar todos nuestros subcomponentes de nuestro tanque porque el tanque en sí no va a ser girado de ninguna manera graciosa, pero vamos a tomar todos estos artículos, y los vamos a rotar 90 grados sobre el eje Z. Y eso es completamente incorrecto. Vamos a intentarlo de nuevo. Vayamos al cuerpo aquí. Y es de 90 grados a lo largo del eje y, no del eje Z. Y de hecho hoy tengo café sentado frente a mí, así que no tengo excusas. Bien. Ahora, por supuesto, es correcto, pero como la torreta estaba desplazada, la torreta necesita ser ajustada manualmente. Así que sólo voy a arrastrar eso sobre tal que esté en cero X y así perfectamente centrado. Y, hice esto mal. En realidad es de 90 grados en sentido contrario. Ahí vamos. Ahora, por supuesto, la cámara está apagada, así que vamos a tener que reposicionar la cámara completamente, y eso no es gran cosa Solo usaremos a nuestro pequeño tipo verde para maniobrarlo en las posiciones X Z correctas Nos aseguraremos de que transformamente hablando, esté directamente sobre la X, y luego simplemente lo rotaremos para que quede frente al tanque como debería ser Vamos a igualar esto a 180 negativo. Lo haremos una vista previa. Se ve bien. ¡Oh! En realidad, esa torreta está un poco adelantada. Bueno, vamos a traerlo de vuelta. Sí. Bien, ahora estamos bien y todo está bien orientado. Nos aseguraremos de que nuestro Bien. Nuestra caja de colisiones está ligeramente apagada. Además, creo que lo hicimos un poco demasiado grande. Simplemente vamos a reducir eso un toque, no es que importe una cantidad enorme, y estamos bien en esta dirección. Bien, otra cosa que voy a mencionar es que después de esta lección o durante esta lección, el inspector de nuestro tanque va a empezar a desbaratarse porque vamos a estar agregando, como, otras cuatro variables aquí con las que queremos poder jugar Afortunadamente, hay una manera de lidiar con esto. Podemos usar un par de anotaciones de exportación adicionales para organizar nuestra información aquí Ahora, el primero que es extremadamente útil se llama Export Group. Y eso lleva una etiqueta. Entonces y una vez que hagas esto, todo lo que sea exportable que venga después de esa etiqueta se pondrá en el grupo, así que ahora puedes colapsarla y volver a abrirla Y si quieres despejar al grupo, entonces simplemente pondrías otro de estos aquí y sacarías la etiqueta, y entonces todo volverá a donde debería estar. Ahora, por supuesto, a Gadot le gusta poner a los grupos en el fondo Entonces a pesar de que no tenemos grupo, grupo, no grupo, todas las cosas de no grupo van a ir a la cima, y todas las cosas grupales van a ir al fondo. Otro, que es un poco menos útil desde un punto de vista visual se llama Categoría de exportación, y eso hace un encabezado gris completamente nuevo por aquí. Y eso puede ser lo que quieras. Nunca se sabe. Entonces ahí tienes. Vamos a meter las cosas para la torreta en su propio grupo Y tenemos velocidad de giro, velocidad movimiento, eso es bueno. Ángulo de la torreta atrás, bla, bla, bla. Todas esas cosas están, de hecho, relacionadas con torretas, así que estamos bien. Y lo vamos a dejar así por ahora. Y antes de continuar, necesitamos hacer una modificación a nuestro código existente debido a la rotación del modelo de tanques. Y es que tenemos que cambiar el hecho de que estamos calculando nuestra velocidad usando la base de transformación como base, actualmente estamos usando la propiedad X, pero necesitamos cambiarla a Z. Y una vez que hagamos eso, nuestro tanque debería estar maniobrando alrededor de lo mismo H Bien, estamos bien. Ahora, vamos a crear y agregar el shell. Entonces, claro, lo primero que tenemos que hacer es que tenemos que crear el propio modelo shell, o más bien la escena shell. Entonces vamos a hacer nueva escena, y va a ser una escena de tres D. Pero en vez de usar un nodo, vamos a hacer click derecho, cambiar de tipo, y vamos a cambiarlo a un cuerpo rígido tres D. Ahora bien, ¿qué es un cuerpo rígido tres D? Cuerpo rígido tres D, como el cuerpo del personaje tres D y el cuerpo estático tres D que hemos estado usando hasta ahora. Es un objeto de física. Sólo en este caso, es un objeto de física que en realidad puede tomar fuerzas como la gravedad y empujar y así sucesivamente. Y vamos a tenerla afectada por la gravedad y también por la velocidad inicial del hocico de nuestra pistola para poder ser disparada y chocar con otros objetivos Así que vamos a renombrar esto y vamos a llamarlo shell. Y vamos a volver a cambiar a tres D, y vamos a agregar una instancia de malla tres D nuevamente. Y esta va a ser una malla de trail tubular. Y la razón por la que vamos a usar una malla de trail tubular es porque podemos manipularla de tal manera que podamos hacer que parezca un caparazón sin hacer nada más en realidad. Entonces vamos a hacer click izquierdo sobre la malla para abrirla. Pero lo primero que tenemos que hacer como estábamos haciendo antes, es en realidad rotarlo para que quede de cara hacia adelante. Entonces volveremos a bajar para transformarlo y lo rotaremos a lo largo del eje X para que ahora esté mirando hacia adelante. Y como podemos, aumentaremos los escalones radiales a diez, lo que significa que va a ser un poco más redondeado De hecho, podríamos aumentar eso aún más si quisiéramos. Pero cuantos más polígonos tiene un objeto, más lento es renderizar Así que vamos a empujar eso de nuevo hacia abajo ocho. En realidad no va a importar a la larga. Entonces para el de abajo aquí, vamos a cambiarlo de tal manera que estemos mirando hacia los lados para que podamos ver lo que estamos haciendo Y en realidad, para esta de arriba , hagámoslo de arriba hacia abajo. Bien, ahora ya podemos ver lo que está pasando. Entonces vamos a cambiar las secciones a dos, y vamos a cambiar el radio y la longitud de la sección. Ahora, queremos que esto pueda caber dentro del tanque. Y en realidad, guardemos nuestro trabajo y vayamos a arreglar el tanque mientras lo tengo en mente. ¿Y a qué me refiero con arreglar el tanque? Bueno, lo primero que vamos a necesitar hacer es que vamos a necesitar indicar dónde va a disparar el proyectil desde el tanque. Puede o bien agregar un nodo tres D, pero hay algo que es poco más útil para nosotros, un poco más útil para nosotros, y se llama marcador tres D. Y un Marcador tres D, como se puede ver, es hijo del nodo tres D, así que básicamente es solo un nodo tres D. Sin embargo, el marcador tres D es básicamente un punto de referencia. Es un poco difícil de ver desde aquí, déjame ver si puedo estirarlo un poco. Sí, no es fácil de ver. Pero un marcador tres D es básicamente el equivalente a un punto tres D. Y aunque es un poco difícil de ver en estas ventanas, a causa de los Gizmos, déjame ver si puedo . Ahí vamos. Bien. Entonces, si no seleccioné, es un poco más fácil de ver Entonces aquí mismo, se puede ver que es básicamente un conjunto de cruces que indica dónde está el punto en el espacio tres D. Y esto no aparece en el juego. Esto es solo una referencia para que puedas decir dónde está sin tener que seleccionarlo porque normalmente, si tuviera que seleccionar un nodo, entonces sería resaltado. Pero en este caso, el marcador siempre te muestra dónde está. Entonces he inclinado y posicionado el marcador de tal manera que esté dentro de nuestro cañón, que es lo que queremos porque el proyectil va a estar disparando desde el interior del cañón. Esto en realidad nos causa un par leve de complicaciones, pero a la larga se ve mejor. Quiero decir, entonces podríamos poner el marcador aquí, y luego vamos a engendraríamos el caparazón aquí Y eso está totalmente bien, pero entonces significa que el proyectil básicamente va a aparecer frente al cañón y luego disparar hacia afuera Y solo por el bien del realismo, en realidad queremos que nuestro caparazón aparezca dentro del cañón y luego se dispare hacia afuera. Entonces, el desarrollo de juegos se trata de compromiso. Bien, entonces ahora que tenemos un marcador y está apadrinado al barril y todo podemos volver a lo que estábamos haciendo Así que volvamos a nuestro caparazón. Pero primero, antes de hacer eso, llegamos a ver qué tan grande es realmente un barril. Entonces tiene un radio de 0.1 y una longitud de sección de 0.2. Recordemos eso. Entonces queremos que el radio sea un poco más pequeño. Entonces digamos 075. Y ya lo olvidé. ¿Cuál era el radio? ¿Cuál era la longitud, más bien? La longitud de la sección fue 0.2. Digamos, 0.175. Y una forma rápida de saber si esto es correcto o no, es que podemos tomar nuestro caparazón y podríamos arrastrarlo a nuestra escena principal del juego. Y podríamos ponerlo aquí mismo. Y, uh Y eso parece ser del tamaño correcto. Perfecto. Bien, entonces borraremos esto. Y volveremos a lo que estamos haciendo. Entonces volvamos al caparazón, y vamos a cambiar su material, material estándar, albedo, y vamos a convertirlo en un gris oscuro Y vamos a modificar una curva. Entonces, ¿qué es una curva? Una curva es una línea curva que afectará al objeto dependiendo del tipo de objeto que sea. Entonces en este caso, va a aplicar la curva a la sección del cilindro en la que nos encontramos. Así que en realidad vamos a bajarlo a dos o tal vez uno, digamos, y ahora estamos aquí, y podemos arrastrar esto y luego hacer clic para agregar otro punto y luego arrastrarlo hacia abajo. Y ahora se puede ver que la forma del cilindro realmente ha cambiado para seguir la curva. Y agreguemos, agregamos una segunda sección, y de hecho vamos a sacar esto un poco para que el caparazón sea un poco más Woop, eso es demasiado Y luego vamos a dar click en este pequeño asa aquí estas son curvas Bezier, creo que las llamas Y, uh entonces ajustamos eso un poco, y ahora tenemos una forma de bala real para nuestro caparazón, y está mirando en la dirección equivocada, así que tenemos que enfrentarlo en la dirección correcta. Entonces queremos rotar la malla tres D 180 grados a lo largo del eje y. Y ahora está mirando en la dirección correcta. Bueno. Bien, el caparazón va a necesitar dos cosas Va a necesitar una forma de colisión. Entonces ya tenemos uno de esos aquí abajo en nuestra historia. Vamos a hacer clic en eso. Dale una forma de colisión. La forma de colisión va a ser una Podríamos darle o una cápsula o podríamos darle un cilindro. Vamos a darle un cilindro porque hemos estado usando cilindros hasta ahora , de todos modos. Transformar. Vamos a tener que rotar a este tipo 90 grados. Y ahora vamos a redimensionarlo para que encaje, igual que hicimos para nuestros otros objetos Y en este caso, el ángulo en la parte delantera del proyectil en realidad no importa en términos de colisión, así que sólo vamos a dejar eso como está. Y por último, el shell va a requerir un guión. Y nos aseguraremos de ponerlo en nuestra carpeta de scripts. Y vamos a nombrar a la clase como shell. Ahora, shell va a necesitar hacer dos cosas. Va a necesitar hacer un seguimiento de cualquier colisión que tenga Y una vez que realmente disparemos la maldita cosa, en realidad vamos a querer que mire en la dirección de su trayectoria de vuelo Y eso en realidad es muy fácil. Eso lo podemos hacer ahora mismo. Entonces, en nuestro método de proceso de física, simplemente queremos usar la función look at. La función de mirar toma un objetivo y también requiere el up. Entonces, ¿cuál es el objetivo? Bueno, el objetivo es donde está viajando el proyectil y donde el proyectil está viajando en cualquier punto dado es la posición global del proyectil, que es un vector que indica dónde está en el mundo, más la velocidad lineal. Y la velocidad lineal es el vector que indica en qué dirección se mueve el proyectil y qué tan rápido. Entonces, si sumas esos dos juntos, obtendrás la dirección en la que se mueve el vector. Entonces esto ejecutará todos los fotogramas. Y básicamente cada fotograma, el proyectil va a actualizar su posición o su rotación y básicamente su orientación angular tal manera que esté mirando en la dirección en la que está disparando. Y de esa manera, el proyectil va a arquearse junto con su trayectoria de movimiento en lugar simplemente rebotar por todo el lugar de la manera en que lo haría como un objeto de física regular. Si no hiciste esto, en realidad, el proyectil estaría apuntando en la dirección en la que estaba disparando porque estamos a punto de orientarlo de tal manera que lo haga. Pero en realidad no se arqueará hacia abajo en vuelo. Simplemente, va a volar directo y luego aterrizar. Y eso es un poco aburrido. Eso no queremos. Y también vamos a necesitar hacer un seguimiento de las colisiones. Entonces hacemos esto conectando lo que se llama una señal. Ahora, una señal es un mensaje que cualquier objeto Gado puede enviar y cualquier otro objeto GA Do puede conectarse a esa señal y escucharla. Y cuando se emite la señal, entonces cualquier cosa que esté escuchando la señal llamará un método que vas a especificar. Entonces, en este caso, queremos la forma de colisión. No, en realidad no queremos la forma de colisión. Queremos el caparazón. Necesito hacer un par de cosas. Lo primero que tenemos que hacer es indicarle al shell que va a estar monitoreando en busca de colisiones Y lo hacemos expandiendo el grupo solucionador y haciendo clic en monitor de contacto encendido, y luego tenemos que indicar Max contactos tiene que ser mayor que cero Max contacts es un parámetro que dice, ¿cuántas colisiones va a verificar este objeto antes de que ya no le importe? Y queremos que tenga al menos uno. Puedes subir ese valor si quieres, pero tu caparazón realmente solo va a golpear un objetivo y luego explotar, así que no va a importar en este particular Entonces una vez que tengamos todo eso configurado, podemos dar click en el shell, y luego podemos pasar del inspector al nodo. Y el nodo te va a mostrar todas las señales que este nodo en particular es capaz de emitir. Y debido a que es un cuerpo rígido tres D con una forma de colisión correctamente establecida, el proyectil va a emitir estas señales, y el que nos interesa es el cuerpo ingresado. Entonces cada vez que cualquier otro cuerpo físico entra en la colisión de este cuerpo rígido, va a disparar este método si lo conectamos. Entonces vamos a bajar aquí al botón de conectar. va a decir que nos va a preguntar en qué objeto queremos poner la función y cómo queremos que se llame la función. Y ambos valores por defecto están bien, así que sólo vamos a golpear connect Y ahora, cada vez que el proyectil golpea otro objeto que es capaz de golpear, se llamará a este método. Y vamos a rellenar este método en un poquito. Pero también tenemos que asegurarnos de que nuestras capas de colisión estén establecidas para el proyectil, y el proyectil no va a formar parte de ninguna de las capas que ya hemos definido porque no es un jugador ni un enemigo ni un obstáculo. Así que en realidad podemos desmarcar todos estos para que no se considere parte de ninguna capa Porque el proyectil va a ser disparado tanto de los jugadores como de los enemigos. Entonces queremos que pueda chocar con el jugador, y va a ser el mismo caparazón para todos ellos. Entonces queremos que pueda chocar con el jugador. Queremos que pueda chocar con obstáculos, y queremos que pueda chocar con los Y una cosa que me olvidé de hacer es que se me olvidó darle a la arena cualquier tipo de colisión. Entonces el caparazón va a caer por el suelo si no hacemos esto. Volvamos aquí. a nuestra Instancia Mesh tres D, y necesitamos cambiar eso a bien, en realidad, lo que tenemos que hacer es agregar un cuerpo estático tres D, y vamos a llamarlo tierra. Y vamos a agregar la instancia de malla tres D que es el suelo a la misma, y luego vamos a agregar una forma de colisión al suelo. De lo contrario, el caparazón caería por el mundo, y eso sería malo. Así forma de caja. Nosotros va a ser difícil agarrarlos. Aquí. Y sólo queremos que esta forma colisione con proyectiles Entonces colisión de tierra. Vamos a darle su propia capa. Entonces esta es la capa del suelo, y sólo choca Bueno, en realidad, parece que vamos a necesitar una capa proyectiva, ¿no? Bien, entonces shell. Bien entonces el caparazón es un caparazón, y choca con todo Y solo verificaremos que nuestro Mm. Bien. Sí, porque a veces a veces cuando cambias las máscaras de colisión en varios objetos, si no lo haces bien, puede causar todo tipo de comportamientos tontos. Así que vamos a asegurarnos de que seguimos siendo buenos con nuestro tanque moviéndose. Boop, sí, todo está bien. Bien, entonces volvamos a nuestro guión del juego, y vamos a modificar nuestro controlador de control aquí Y queremos verificar si hay otro objeto de juego, y ese objeto de juego es UI excepto, que se mapea tanto a la tecla enter como a la barra espaciadora. Y vamos a usar el método I action pressed porque eso solo disparará en el marco que la tecla ha sido empujada hacia abajo. Si sigues manteniendo pulsada la tecla, esa acción no seguirá disparándose. Así que eso asegurará que obtengamos un proyectil disparado por tecla presionada. Entonces si entrada es acción acaba de presionar acepto jugador fuego Shell. Y en realidad aún no hemos creado el método del proyectil de fuego, así que hagámoslo ahora. Oh. Para poder disparar un proyectil, necesitamos tener una referencia al proyectil. Así que de vuelta dentro de nuestro tanque, vamos a proporcionar algunas variables de exportación más. Y hagamos un grupo de exportaciones para que podamos organizar estas cosas. Tenemos una torreta de grupo de exportación. Entonces hay una buena vuelta al tanque. Aquí vamos. Todo bien. Entonces lo primero que vamos a necesitar para poder exportar es lo que llamamos un prefab Y esto es básicamente un enlace a la escena que vamos a instanciar cada vez que disparemos un proyectil, que es nuestra escena de conchas Y como no tenemos que definir el tipo de esta escena, está bien si dejas esta vacía, pero es bueno saber que al tipo de escena se le llama escena llena. Entonces ahora si quiero, simplemente puedo arrastrar mi escena de caparazón por aquí. Se va a cargar automáticamente y almacenar en caché en esta variable cuando el tanque se instancie como parte del juego, que es actualmente Entonces ahora, cuando disparemos un proyectil, vamos a crear uno nuevo de estos objetos de concha. Entonces tenemos var shell, que es de tipo shell va a ser igual al shell prefab dot instanciate Y una vez que hagamos eso, en realidad necesitamos una cosa más aquí arriba que sea bastante importante, aunque está bien si la implementamos un poco más tarde, pero lo haremos ahora. Vamos a definir una señal de que el tanque dispara cada vez que dispara un proyectil. Y la razón por la que vamos a hacer eso es porque desde dentro del tanque, no tenemos acceso directo al mundo porque el tanque es hijo del mundo. Podemos obtenerlo llamando a los tanques propiedad padre, que es una propiedad incorporada de un nodo tres D, pero eso se basa en el hecho de que sabemos lo que es esta jerarquía, y sabemos que el jugador podría obtener el padre, que es el juego, y entonces podríamos obtener a Ana desde dentro del juego. Pero hay un montón de formas en las que podríamos romper esta jerarquía durante la producción. Entonces esto no es en realidad una buena idea. Queremos que las cosas estén encapsuladas tanto como sea posible, lo que significa que no necesitan saber otra cosa que no sea de ellos mismos. Entonces todo lo que hacemos es decirle al tanque que dispare una señal, Y vamos a darle una referencia al proyectil que se ha disparado. Entonces eso significa que después de instanciar nuestro shell, emitimos esta señal, y le pasamos el shell que acabamos Y ahora mismo no pasa nada. Esta señal simplemente se dispara al éter y desaparece y existe hasta la profundidad de calor del universo, o terminas tu juego, lo que ocurra primero Entonces, lo que tenemos que hacer es que necesitamos el juego para escuchar esta señal. Y hay un par de formas de hacerlo. Podemos conectarlo de la misma manera que lo hicimos con la forma de colisión en el caparazón, pero todavía no he decidido realmente si quiero que el tanque esté siempre existente o no. Así que vamos a definir una función lista. Ahora, ready se llama cada vez que un nodo entra en el árbol de escenas. Entonces es, a todos los efectos, la función a la que llamas cuando el nodo está listo, y quieres que haga un montón de cosas antes de que realmente comience a hacer cosas Entonces, en este caso, queremos que los jugadores Shell disparen una señal, y queremos conectarla a un método que vamos a llamar a Shell Fred. Y claro, Dios O está gruñón porque aún no hemos definido ese método, así que hagámoslo feliz Funk en proyectil disparado. Ahora bien, como se llama a este método en respuesta a la señal que definimos, requiere los mismos parámetros que la señal. Y como la señal toma un parámetro objeto de tipo shell, necesitamos definirlo como parte de nuestro manejador de señales, también Así que ahora tenemos este método va a ser llamado cuando reciba la señal de que el shell ha sido disparado. Y todo lo que el juego tiene que hacer es agregar Shell hijo, porque queremos que el juego agregue el shell a su gráfica de escena con todos los demás objetos. Entonces, si monitoreas durante la jugada del juego, y podemos verlo en un momento, entonces aparecerá aquí. Entonces hagámoslo. Vamos a ejecutar nuestro juego. Y puedes monitorear lo que está haciendo tu juego mientras el juego se está ejecutando. Y es un poco más fácil hacer cuando el juego está en modo Windowed, razón por la que no lo he sacado del modo Windowed Entonces, si volvemos a nuestro editor y vamos al gráfico de escena y hacemos clic en Remoto, este es el gráfico de escena real de tu juego de running. Local es con el que estás trabajando en el editor. Remoto es el que está en el juego. Entonces ahora si vuelvo a la ventana de mi juego y presiono la barra espaciadora, se puede ver que tenemos un caparazón. Se ha agregado al mundo del juego. Y ahora, si retrocedo, en realidad podemos verlo. Está justo aquí. Y eso es porque aún no le hemos dado fuerzas ni nada por el estilo. Entonces todo eso pasó y realmente no se puede ver desde este ángulo de cámara. Todo lo que pasó es que simplemente cayó y golpeó el suelo, y ahora está haciendo todo tipo de tonterías locas porque está chocando con el suelo Entonces podemos ver eso un poco más fácil si pasamos al caparazón, y vamos a acceder a Lock y golpeamos lineal Y. Y esto significa que el caparazón no va a subir ni bajar, independientemente de qué tipo de física se le haya aplicado. Entonces ahora si disparo un proyectil y me alejo, en realidad se puede ver dónde está. Y eso probablemente sea porque bueno, en realidad no sé por qué es eso, pero vamos a arreglarlo porque esto no es realmente lo que queremos de todos modos. Así que volvamos a Shell, y dejemos la Y lineal bloqueada por ahora porque queremos poder depurar dónde está apareciendo nuestro shell cuando lo engendremos por primera vez Bien, una cosa que tenemos que arreglar antes de continuar es que me olvidé de proporcionar el vector up para nuestra función de mirada. Entonces cada vez que mires, y también hay un montón de otras funciones que requieren un vector de referencia, generalmente el vector up, básicamente, solo tienes que proporcionar el vector tres punto arriba, que es un vector constante que indica hacia arriba en la dirección Y. Y Godot usa eso para todo tipo de cálculos para asegurarse que todo esté orientado correctamente Bien. Entonces, lo primero que tenemos que hacer para disparar nuestro caparazón correctamente es colocarlo en donde se supone que debe estar. Porque ahora mismo, lo que tengo la sensación que está pasando es que cuando engendramos el caparazón, es simplemente desovar a las 00 dentro del mundo Así que vamos a cambiar eso. Y para cambiar eso, necesitamos una referencia al punto de disparo, que es el marcador tres D. Así var proyectil punto de fuego marcador tres B. Así que ahora simplemente arrastramos esto por aquí, y tenemos una referencia al punto de disparo. También vamos a necesitar definir una velocidad de hocico para el proyectil. Entonces hagámoslo. Gracias Así es como rápido o cuánta velocidad vamos a aplicar al proyectil cuando se dispara, y podemos convertirlo en un int. Podemos hacer que sea igual a 20, y luego puedes cambiar ese valor más adelante si decides que es demasiado rápido o demasiado lento. Y antes de que realmente empecemos a colocar el caparazón en el mundo, también hay otra cosa que debemos hacer. Y es decir debemos proporcionar un valor aquí llamado Ignorar capa, que es un entero. ¿Y por qué vamos a hacer eso? Bueno, porque como mencioné antes, cada proyectil va a ser disparado ya sea por el jugador o por tanques enemigos, y no queremos que el proyectil choque con su propio equipo, por así decirlo Para el jugador, eso significa que no queremos que un proyectil disparado por el jugador pueda probar colisiones con el jugador, especialmente porque estamos generando el proyectil dentro del cañón del arma del jugador Vamos a necesitar un poco más de lógica para los enemigos porque si simplemente desactivamos la colisión en un proyectil enemigo contra otros enemigos, eso significa que los enemigos podrán dispararse entre sí. Entonces, cuando lleguemos al punto en el que estamos haciendo IA, básicamente vamos a tener los tanques que no disparen cuando no tienen una línea de visión clara para el jugador y cualquier otro tanque está cerca. Hay otras formas de resolver ese problema, pero así es como lo vamos a hacer. Lo que eso significa es que tenemos que proporcionar el índice de capa de la colisión que queremos desactivar cada vez que se dispara un proyectil porque el mismo método de proyectil de fuego va a ser utilizado tanto por los jugadores como por los tanques enemigos. Entonces, en el caso del jugador, va a ser la capa uno, porque, como recuerdas, los valores de las capas empiezan en una, aunque diga que es un poco cero, lo cual es algo detestable Así que tenemos proyectil de fuego igual a uno, y luego dentro del tanque, vamos a decirle al caparazón que establezca su valor de máscara de colisión igual a la capa ignore, y vamos a establecerla en false. Y eso significa que si un jugador dispara un proyectil y pasamos en uno como la capa de ignorar, va a ir al caparazón. Y va a establecer la capa de colisión o la colisión, ¿la hice capa o la hice máscara? Máscara de colisión. Eso es correcto. Quiero asegurarme de que sea la correcta. Entonces va a ir a máscara de colisión. Se va a establecer la capa uno igual a false, lo que significa que va a apagarla. Entonces eso significa que un proyectil disparado por el jugador no colisionará con el jugador, que es lo que queremos Y podemos ignorar este error porque no habíamos guardado esta función antes de ponerla aquí. Entonces fue gruñendo que las firmas no coincidieron, y ahora son buenas Una vez que hayamos hecho eso, realmente podemos comenzar a posicionar y orientar el shell Ahora, no queremos hacer nada a la posición o rotación de los proyectiles antes de que se le agregue al mundo. De lo contrario, vamos a recibir un mensaje de error, algo en la línea de Is inside trees igual a false. Y aunque en realidad no es un gran problema, no queremos que Godot nos esté lanzando errores Entonces las conchas posición global. Es igual a la posición global de Shell fire Points. Y ahora, si vamos a nuestro juego, y para que esto sea un poco más fácil de ver, vamos a rotar nuestro cañón. Y disparamos, ahí está nuestro caparazón. Ahora, claro, está mirando en la dirección equivocada, y no se mueve ni nada por el estilo. Y estamos a punto de arreglarlo a continuación. Orientar el caparazón es un poco más complicado. De hecho, esto me tomó un par de horas averiguarlo antes de filmar, así puedes beneficiarte de todo mi dolor. Entonces nos falta algo en términos. Bien, entonces lo llamé bisagra de torreta. Debe ser articulación de torreta, pero lo que sea. Boop. ¿Eso es mejor? Eso es mejor. Bien. Entonces, para poder rotar el proyectil, debemos tomar en cuenta en la dirección X, la torreta articula la rotación Z. Eso no tiene mucho sentido. Echémosle un vistazo. Entonces si volvemos al tanque, Boop. Bueno, vamos a verlo desde arriba. Entonces, el punto de anclaje del cañón, que nos hemos referido en el guión como bisagra de la torreta, está aquí mismo. Y debido a que el tanque está orientado hacia adelante, que está en la dirección Z positiva, giramos la bisagra con la rotación X. Pero debido a que el tanque en realidad gira dentro de su espacio local 90 grados, en realidad realmente lo estamos rotando con la dirección Z. Entonces eso es simplemente molesto ya que todos salen. Entonces la rotación Z, en este caso, es la rotación hacia arriba y hacia abajo porque cuando originalmente teníamos el tanque mirando hacia la derecha, uh, eso fue lo que lo movió hacia arriba o hacia abajo. Así que eso inclinará el caparazón en la dirección correcta. No obstante, necesitamos inclinar el caparazón tal manera que esté orientado hacia arriba, y por alguna razón eso nos obliga a revertir la rotación. No sé por qué es eso, pero lo es. Entonces hay que tomar en cuenta la rotación de la torreta en la dirección Y. Debido a que la bisagra de la torreta no gira realmente en la dirección Y. La torreta gira. Y volveremos a echar un vistazo a eso. Volvamos a tres D. Así que la bisagra, que está justo aquí ish no gira cuando gira la torreta. Entonces, para que el proyectil esté apuntando en la dirección que va a disparar, que tomar en cuenta la rotación de las torretas. Entonces, una vez que hagamos todo eso, el caparazón va a estar mirando en la orientación adecuada. Así que vamos a pasar, así, y vamos a disparar. Y me va a hacer el ridículo, ¿no? ¿Bien? Veamos cuál es el problema. Bueno, eso fue divertido de depurar. Bien, entonces por alguna razón, el proyecto maestro, donde conseguí esto trabajando ayer con exactamente los mismos números, no está haciendo lo mismo que esta versión del proyecto con exactamente los mismos números. ¡Hurra! Entonces la forma en que pude arreglar esto es haciendo un par de cosas. Primero, volvimos al caparazón, y nos aseguramos de que la orientación se hiciera de una manera ligeramente diferente. Te habrás dado cuenta de que inicialmente giramos desde el eje X primero, y no estoy seguro por qué lo hicimos. No debimos haberlo hecho en absoluto. Pero reinicié la rotación y la cambié de tal manera que en Y, nos movimos la giramos tal manera que el proyectil estaba mirando hacia adelante y en la dirección Z que el proyectil estaba mirando hacia adelante? ¿Qué pasa si vuelvo a cambiar esto a cero? Extraño. Entonces supongo que la orientación base de la malla lo requirió tal. No estoy muy seguro de por qué es eso. Y también verifiqué dos veces que las orientaciones de los tanques eran correctas, y aparenté la torreta debajo del cuerpo en lugar de directamente debajo del No estoy del todo seguro de por qué eso tuvo un efecto en ello. Realmente no debería haberlo hecho. Pero, sí. Entonces, una vez hecho todo eso, podemos efectuar la rotación por el Factor original para la Z, que era el valor negativo de la rotación de las bisagras de la torreta hacia arriba y hacia abajo, lo cual está bien. Pero para que la rotación Y funcionara correctamente, tuvimos que sumar la rotación de las torretas a la rotación de los tanques De lo contrario, se habría orientado correctamente solo si el tanque estuviera orientado hacia arriba o recto hacia adelante o hacia atrás. Entonces ahora, si vamos así y aquí arriba y luego golpeamos Barra espaciadora, y luego alejaremos el cañón para que lo veas. Ahora tenemos un caparazón perfectamente orientado. Y si oriento el tanque, Lo mismo. Entonces la moraleja de la historia es que a veces solo tienes que jugar con los números para asegurarte de que todo se alinee correctamente, porque visualmente hablando, muchas de estas orientaciones funcionan donde matemáticamente, no lo hacen Y eso es malo. Entonces, lo siguiente que tenemos que hacer es que tenemos que brindar lo que se llama impulso. Y un impulso en la física es una fuerza de una sola vez aplicada a un cuerpo. Entonces, si quisiéramos que el caparazón se moviera constantemente para siempre y para siempre, aplicaríamos una fuerza, pero no lo hacemos. Solo queremos que tenga una explosión inicial para que sea propulsada y luego la gravedad y la velocidad tomen el relevo. Y eso se llama impulso. Entonces un impulso es un vector tres. Y en este caso, y no estoy del todo seguro de por qué se hace de esta manera. Se pensaría que sería en la otra dirección, pero no lo es, y realmente no me importa. Comenzamos con el vector posterior, que está en la parte trasera del proyectil, y vamos a multiplicar eso por nuestra velocidad de hocico Y luego una vez que lo hayamos hecho, podemos aplicar ese impulso a nuestro caparazón. Desafortunadamente, eso no es todo lo que hay porque vector back es un vector normalizado, lo que significa que solo va a ser uno en la dirección Z negativa. Y no va a estar orientada correctamente a la orientación de los tanques. Entonces va a ser un básicamente, para abreviar una larga historia, tenemos que rotar este impulso con la orientación de los tanques. Así que podemos hacer eso justo aquí abajo. Entonces, si tomamos nuestro impulso inicial, que es un vector de espalda recta multiplicado por nuestra velocidad muscular, entonces echemos un vistazo a eso en nuestro caparazón así que la espalda recta es una unidad aquí, y luego la multiplicamos por la velocidad del hocico Así que en realidad es camino de regreso allí en alguna parte. Pero ahora tenemos que orientarlo al caparazón. Entonces volvamos a nuestro tanque. Entonces eso significa que tenemos que girarlo a lo largo y ojalá esto sea correcto, dado que acabo de cambiar todas las orientaciones, pero tenemos que girarlo a lo largo del eje derecho, que es el eje X a la orientación del caparazón Y luego tenemos que hacer lo mismo con el eje ascendente porque estamos inclinando el caparazón hacia arriba Aunque, en este caso, creo que desde que hemos agregado estos dos, no tenemos que compensar esto. Así que vamos a cambiar esto de nuevo a la rotación de shell Y y ver qué pasa. Y luego una vez hecho esto, podemos hacer shell, aplicar, y vamos a usar un impulso central, lo que significa que el impulso se va a aplicar directamente al centro del objeto. También es posible aplicarlo descentrado, pero en realidad no necesitamos eso. Entonces impulso que debería disparar el proyectil. Ahora, fíjate que no funcione. Sí, está un poco apagada. Al menos Ah, y parte del problema es, no creo que deshabilitemos el, todavía tenemos marcada Y lineal ahí, así 17. Entorno: iluminación del mundo y el Sol global: Bienvenido de nuevo. En este breve pero no menos interesante capítulo, vamos a ver cómo modificar la apariencia del entorno utilizando el entorno mundial y los nodos de luz direccional. Entonces, como pueden ver aquí, he eliminado la luz direccional que hemos estado usando como nuestro sol temporal durante el último par de lecciones, y también he cambiado el color de fondo de tal manera que se vea un poco como una puesta de sol. Ahora bien, esto está completamente en vista previa si tuviera que ejecutar el juego se puede ver que tenemos Nodite y el cielo es gris y no se ve en absoluto como el atardecer que creamos Y eso es porque estas son puramente vistas previas, y están controladas por estos dos botones aquí. Tenemos el ambiente de vista previa, que si apagamos, ahí va el atardecer, que cubre el suelo, el horizonte y el cielo. Y luego también tenemos vista previa de la luz solar. Entonces, si apagamos eso, entonces nuestra luz solar desaparece. Y si los apagamos a ambos, no podemos ver mucho de nada. Entonces, para lo que sirven es permitirte ajustar configuración de tu entorno y obtenerlos bien antes agregarlos a tu mundo de juego, porque en versiones anteriores de Gadot, tuviste que ajustar la configuración manualmente y luego ejecutar el juego cada vez que quisieras ver qué tan diferentes se veían, y eso fue solo un lastre para y eso fue solo un lastre Vamos a hacer clic en estos tres puntos, y obtendremos estos ajustes tanto para el entorno de previsualización como para el sol de previsualización. Y podemos cambiar todas las cosas aquí que queremos cambiar. Entonces para el sol, por ejemplo, podemos cambiar su ángulo. Podemos cambiar su acimut, sea lo que sea que eso signifique. Podemos hacer que el sol sea realmente caliente si quisiéramos estar tatuando, por ejemplo, y cambiar la distancia de las sombras Y una vez que tengamos un sol que nos guste, hagamos algunas sombras largas. Una vez que tengamos un sol que nos guste, volveré a poner esto a uno. Entonces podemos agregarlo a la escena como una luz direccional. Ahora, vamos a estar buscando más sobre mirar más la iluminación en una lección futura, pero la luz solar es simulada por una luz direccional. Entonces aquí está uno. Y luego notar que como agregué una luz direccional a la escena, ya no puedo meterme con el sol en el panel de vista previa porque como la escena ya contiene una luz direccional tres D, ya no te permite usar los ajustes de vista previa porque está usando los ajustes de lo que ya está en la escena. Y podemos hacer lo mismo, por el medio ambiente. Entonces como pueden ver, cambio el color del cielo a naranja. Puedo hacerlo aún más oscuro anaranjado si quisiera. O si quisiéramos estar en un planeta alienígena, podemos hacerlo verde. Y aquí hay una ligera limitación en que a pesar de que se puede alterar bien el suelo, aquí se puede alterar el color del suelo. Si quisieras, en realidad podrías alterar lo que se llama el Horizonte, que es esta pequeña franja resplandeciente en el medio entre el cielo y el suelo, pero no puedes hacerlo a través de la vista previa del sol Entonces decidamos que este sol verde lima es exactamente lo que nosotros y luego golpearemos Agregar entorno a escena, y obtenemos un nodo de Medio Ambiente mundial. Ahora, el nodo World Environment tiene una serie de opciones, pero una de ellas es que podemos modificar la configuración del entorno con la que jugamos aquí arriba, y que está en el recurso del entorno. Entonces, si hacemos clic en él, lo abriremos, y el que estábamos jugando es el cielo. Entonces, si abres el cielo y luego abres el material del cielo, el material del cielo es un cielo procedimental. Ahora también podemos usar skyboxes y esas cosas, y vamos a verlo en una lección posterior también Si expandimos el cielo, tienes que cavar muy profundo en éste. Y entonces si finalmente bajas y abres los ajustes del cielo ellos mismos, aquí están los escenarios que habíamos cambiado, y ahora si queremos cambiar el horizonte, podemos hacerlo. Ahora ve, ahí atrás tengo más de un horizonte naranja. Y también puedes cambiar el suelo, así que yo cambiaré el suelo, y lo haré rojo. Así que ahora tenemos un planeta verdaderamente alienígena con el que nos estamos metiendo Y también puedes cambiar el ángulo del sol aquí si es necesario, también. Y eso es muy profundo en. También hay una serie de otros ajustes, similares a los de los materiales que vimos antes para el espacio de la pantalla, la oclusión del ambiente, y también la niebla y la niebla volumétrica Y estos son un poco difíciles de hacer bien. Pero, ya sabes, si quieres si quieres pelear en una tormenta de nieve, ahí tienes Ahora bien, este entorno realmente afectará a todo el juego porque si vas al juego, ya que ese ambiente es parte de la arena, y la arena es parte del juego, entonces cuando entremos en el juego, lo veremos, y se ve un poco loco. Pero también puedes anular eso o al menos agregarlo agregando un entorno a tu cámara. Y de hecho, esta solía ser la única forma de hacerlo en Gudo así que es poco agradable que ya no tengas que lidiar con esto. Pero aún está disponible. Entonces digamos, volvamos a nuestra arena. Volvamos a World Environment. ¿Y apagué la niebla? Sí, parece que apagué la niebla. Bien. Entonces digamos que queremos que nuestro mundo sea, a falta de una palabra mejor, normal, pero en un nivel particular o a través de una cámara en particular, queremos un ajuste de niebla. Así podremos agregar un entorno directamente a la cámara, y eso nos dará a todos los mismos ajustes. Entonces ahora simplemente podemos ir bajo la niebla y podemos habilitarlo. Y ahora si corro el juego, debería combinar los dos, y lo hace. En realidad, se ve bastante bien. ¿Todas las cosas consideradas? Entonces, sí, eso en su nivel más básico, es como alteras el ambiente y la iluminación en tus escenas. Y nuevamente, vamos a mirar las luces direccionales y tal en una lección futura, pero eso te dará lo básico. Te veremos en la siguiente lección donde volvemos a empezar a codificar. 18. Juego: Añadir tanques enemigos mediante escenas heredadas: Bienvenido de nuevo. En esta lección, vamos a echar un vistazo a la creación escenas heredadas para que podamos subclasificar nuestro tanque y proporcionar un nuevo tanque que tenga funcionalidad adicional Entonces echemos un vistazo a nuestro tanque. Es un tanque bastante genial, y tenemos guiones que harán las cosas, y disparará, y se moverá y todas esas cosas buenas. Pero para un tanque enemigo, vamos a querer información adicional. Queremos que el tanque enemigo sea de otro color. Voy a hacer que los tanques enemigos se recarguen más despacio. Y además, van a necesitar ser controlados por una máquina de estado de IA, que vamos a desarrollar en la siguiente lección, quiero decir. Si no, definitivamente no menos de dos lecciones en el camino. Probablemente el siguiente. Pero de todos modos, lo largo y lo corto de ello es que queremos agregar un módulo de IA adicional a este tanque. Ahora, podríamos simplemente copiar la escena del tanque existente y luego agregarle nuestra nueva información. Pero como es un archivo completamente separado, si hacemos algún cambio al tanque original, no se propagarían al nuevo tanque, y queremos que lo hagan Entonces vamos a usar lo que se llama una escena heredada. Entonces entramos en escena, en lugar de nueva escena, diremos escena nueva y heredada, y nos va a preguntar de qué escena queremos heredar Así que heredemos del tanque. Ahora tenemos una nueva escena, y es nuestro tanque. El nombre está en blanco, lo que significa que es único. Pero todos estos nombres amarillos, estos son los nodos originales del tanque, pero están coloreados en amarillo para demostrar que son heredados de la otra escena. Ahora bien, si cambiáramos la otra escena, la información en esta escena se actualizaría. Entonces, por ejemplo, lo primero que hagamos es guardar esto y lo llamaremos tanque enemigo. Ahora si fui al tanque y fui al temporizador de recarga y cambié el tiempo de peso a cinco, y luego lo guardé Ahora bien, si vamos al tanque enemigo, el temporizador de recarga es ahora cinco porque está heredando del tanque original Entonces, volvamos a poner esto en dos. Sin embargo, es posible cambiar estas cosas independientemente de la clase original o de la escena original, más bien. Entonces, si volvemos al tanque enemigo, vamos a cambiarle el nombre a Enemy Tank. Y vamos a deletrearlo correctamente. Aquí vamos. Además, en realidad podemos cambiar los datos en estos valores, y anulará lo que viene del tanque original. Entonces el tanque original, el temporizador de recarga es dos, pero en el temporizador de recarga enemigo, vamos a cambiarlo a tres Ahora golpeamos guardar, y si volvemos al tanque original, el temporizador de peso sigue siendo dos, pero en el tanque enemigo, son tres. Y vamos a hacer lo mismo, vamos a cambiar ligeramente el color, y esa es la pestaña equivocada. Ahí vamos. Entonces, si vamos al cuerpo, vamos a seleccionar que no es la correcta. ¿Dónde está? ¿Cuál es? Ahí está. Vamos a cambiar el color. Bueno, podemos cambiar el color de la malla original. Sin embargo, como mencioné antes, eso se guarda entre escenas, y es un poco complicado, así que tendríamos que hacerlo único en esta escena. Y, en realidad no queremos hacer eso. Entonces, veamos una nueva característica, o al menos nueva en el sentido de que aún no la hemos mirado, la anulación del material de la superficie. Lo que esto hace es que puedes proporcionar un material completamente nuevo aquí, y anulará este material. Entonces ahora tenemos nuestro blanco predeterminado estándar, y bajaremos a albito y lo cambiaremos a un gris oscuro Y vamos a ahorrar. Y ahora, únicamente para los tanques enemigos, tienen una franja corporal gris. Y ahora vamos a poder diferenciarlos. Entonces ahora si entramos al juego, si queremos arrastrar uno a nuestra escena, que hacemos, tomaremos el tanque enemigo, lo arrastraremos hasta aquí, y luego usaremos la cosa para moverlo, y lo pondremos aquí y cambiaremos la forma en que está orientado. Y ahora en nuestra escena, tenemos un tanque enemigo. Y si lo miramos, tiene la información que no podemos ver porque es que no se exporta. Así que simplemente haremos clic en esto para abrirlo. Y ahí vamos. Regresamos a nuestro tanque enemigo, y podemos verificar que su información es la forma en que debería ser. Temporizador de recarga. Es. Ahora, si quisieras cambiar la información desde aquí, puedes hacer clic derecho sobre ella y seleccionar hijos editables Y eso le permitiría alterar esta información aquí, y se guardaría a esta instancia particular del tanque. Así que de hecho podríamos cambiar los colores de los tanques directamente desde aquí y hacerlos individualizados, aunque todos estén en el mismo equipo, por así decirlo Bien, entonces ese es el final de esta lección. Únete a mí en la siguiente lección, y continuaremos con más cosas geniales. 19. Destruyendo los tanques: Bienvenido de nuevo. En esta lección, vamos a aprender a configurar los tanques enemigos de manera que puedan ser destruidos por el jugador. Y lo primero que vamos a hacer es que vamos a mover el tanque enemigo para que sea un poco más visible para el jugador. De esa manera no tendremos que buscar al tipo cada vez que iniciemos el juego. Bien, mucho mejor. Entonces, lo primero que tenemos que hacer es cambiar algunos datos adicionales sobre el tanque que se heredó del jugador que ya no necesitamos. Entonces si expandimos el tanque, en realidad, no, deberíamos hacerlo desde la escena de los tanques para que afecte a todos los tanques. Entonces, lo primero que tenemos que hacer es que tenemos que ir a la cámara, y notarás que la cámara está puesta a corriente. Esto es malo porque solo queremos que la cámara del jugador esté actualizada, así que desmarcamos esto De lo contrario, estaríamos viendo el juego desde el punto de vista del tanque enemigo, y, ya sabes, aunque iguales derechos para los tanques y todos, solo queremos que el jugador pueda ver lo que está haciendo. Además, actualmente el tanque está configurado en la misma capa de colisión que el jugador. Entonces tenemos que desmarcar esto, y tenemos que verificar esto para que esté en la capa del enemigo Y no queremos que así sea Bueno, sí queremos que choque con otros enemigos porque no queremos que los tanques pasen entre sí, pero también queremos que choque con el jugador Y eso debería cubrirnos. Ahora bien, el otro problema es que el tanque está heredando actualmente o el tanque actualmente está configurado como tanque en el guión Y como mencionamos en el capítulo anterior, el tanque va a tener alguna información adicional que va a necesitar manejar en el guión. Así que vamos a ir al inspector y vamos a ir hasta el fondo donde dice, guión. Y esto muestra el guión que actualmente se adjunta al tanque enemigo. Y me sorprendió gratamente descubrir que recientemente actualizaron esto Entonces, si voy aquí y selecciono extender script, que es exactamente lo que queremos, generará automáticamente un nuevo script heredando del tanque llamado tanque enemigo, que es exactamente lo que queremos, excepto que lo queremos en la carpeta de scripts Bien, entonces ahora creamos esto. Y estamos bien. En versiones anteriores de Gadot, había que desadjuntar manualmente el script y volver a adjuntarlo o al menos crear manualmente el script y luego establecer el nombre de la clase y luego adjuntarlo en Y ahora solo es más aerodinámico. Tengo que amar el software de código abierto. Entonces vamos a nombrar este nuevo script de tanque, si alguna vez podemos deletrearlo correctamente, AI Tank. Y también vamos a cambiar algo de los tanques en general porque ahora mismo, es posible que un proyectil golpee no sólo un tanque, sino también los obstáculos o el piso de la arena. Pero lo único que queremos poder destruir es un tanque. Y hay un par de formas diferentes de indicar que solo los tanques pueden ser destruidos. Vamos a mirar uno de los más directos, y eso son los grupos. Entonces, si volvemos a nuestro script de tanque o si volvemos a nuestro objeto tanque y pasamos por debajo de nodo, vemos tanto señales como grupos. Entonces, si cambiamos a la pestaña de grupos, verás que no tenemos grupos. Entonces crearemos un nuevo grupo y lo llamaremos sllable. Ahora, se va a poner automáticamente debajo de los grupos de escena, lo que significa que solo es válido para cualquier objeto dentro de esta escena y no es reconocible fuera de la escena. Eso no queremos. Entonces vamos a hacer click derecho sobre él, y vamos a convertirlo en un grupo global. Eso significa que cualquier escena de todo el juego es ddable para este grupo Ahora, si golpeamos Guardar y vamos a nuestro tanque enemigo, podemos ver que el tanque enemigo, virtud de ser un tanque derivado se encuentra automáticamente en la categoría vendible Así que ahora bajo Shell, nuestro script shell, originalmente, tenemos este método en el cuerpo ingresado con el que no hemos hecho nada desde hace algunos capítulos ahora o algunas lecciones ahora. Entonces lo primero que queremos hacer es que queremos definir realmente el tipo de cuerpo que está entrando, y queremos que sea un cuerpo físico tres D. Y esto básicamente intentará forcefundir cualquier objeto que se pase a este método en un cuerpo físico tres D, y eso funcionará porque lo único con lo que puede chocar el caparazón es otro cuerpo físico tres Ds, que incluyen los cuerpos estáticos, cuerpos rígidos y cuerpos de caracteres. Entonces, todavía queremos que el caparazón desaparezca. Pero ahora, y en realidad, si no hicimos esto, esto es parcialmente por conveniencia. También es parcialmente que las variables que tienen sus tipos específicamente definidos son ligeramente más eficientes para que Gadot acceda Pero si tuviéramos que crear una declaración if then aquí, y fuéramos a ir cuerpo y luego darle un punto, bueno, no tenemos autocompletar porque Gadot no sabe qué tipo de variable es esta Entonces si lo forzamos a un cuerpo físico tres D, entonces ahora si bajamos aquí y golpeamos el punto, ahora tenemos autocompletar Y el método que queremos se llama I en grupo. Y me pregunto si puedes arrastrar esto. No, no puedes. Así que vamos a tener que escribirlo manualmente. Entonces, si el cuerpo que pasamos está en el grupo descascarable, entonces queremos destruir el cuerpo, y podemos hacerlo con el método de tres del cuerpo Ahora bien, si ejecutamos nuestro juego, deberíamos poder hacer estallar el tanque enemigo. Aún brumosa Boom. Inténtalo de nuevo. Boom. No. Boom. Bien, no estoy seguro de si estoy golpeando el tanque o estoy tengo un error en mi guión Ahí vamos. Golpe directo. Tal vez quiera que sea un poco más fácil golpear el tanque y experimentar o inspeccionarnos para investigar. Esa es la palabra que estoy buscando. Quizá queramos investigar por qué estaba pasando eso. Pero, sí. Entonces eso es todo por esta lección. Y en la siguiente lección, vamos a darle a nuestros tanques enemigos algo de astucia para que puedan disparar al jugador e intentar devolverle el tiro, porque de lo contrario, el juego no sería muy justo ni divertido, ¿verdad Bien, nos vemos ahí. 20. IA: máquinas de estado: Bienvenida de nuevo. En esta lección, vamos a aprender a crear una máquina de estado que en la siguiente lección, vamos a unir a nuestros tanques enemigos manera que puedan conducir, buscar al jugador, y luego dispararle, y luego tendremos un juego. Entonces, ¿qué es una máquina estatal? Una máquina de estado es una clase o un objeto o lo que tienes. En el caso de Godo, puede ser un nodo, y vamos a convertirlo en un nodo Pero independientemente, una máquina de estado básicamente monitorea un estado. ¿Y qué es un estado? Un estado está bien, es un estado de ser, de verdad. Entonces, por ejemplo, un tanque enemigo puede tener numerosos estados. Puede ser la búsqueda de un jugador. Puede estar atacando al jugador. Puede estar muerto. Básicamente, un estado es una forma de describir qué es o debe estar haciendo el tanque en un momento dado. Y podemos hacer la transición de un estado al siguiente en base a diversos factores. Entonces, por ejemplo, si el tanque no ha visto al jugador, podría estar en el estado de búsqueda, lo que significa que va a estar moviéndose por el mapa. Y luego una vez que haya visto al jugador, puede cambiar al estado de ataque, lo que significa que estará atacando al jugador, y luego así sucesivamente y así sucesivamente. No obstante, vamos a hacer esto de manera inteligente. Vamos a hacer una máquina de estado autónoma que pueda manejar teóricamente cualquier estado sin tener que codificarse específicamente para el tanque enemigo De esa manera, si quisiéramos agregar una máquina estatal a nuestros árboles, por ejemplo, para crezcan o que crezcan o se incendien o algo así, podríamos hacerlo muy fácilmente. Entonces lo primero que vamos a hacer es debajo de nuestra carpeta de recursos, vamos a crear una nueva escena, y esa escena va a ser un nodo. Y vamos a llamar a la escena nombre máquina estatal. Y esto es básicamente no puedo deletrear para salvarme la vida. Esto es básicamente solo una forma de rodapié creando una escena manualmente en el árbol de escenas Podríamos haberlo hecho fácilmente aquí arriba yendo a una nueva escena, pero realmente no importa. Entonces vamos a hacer clic en Bien. Y ahora tenemos una máquina estatal. Entonces si hacemos doble clic, podemos abrir la máquina de estado, y como puedes ver, es un nodo vacío sin absolutamente nada adjunto. Y eso es aburrido. Entonces vamos a agregar un script a nuestra máquina de estado, y va a llamarse State Machine. Vamos a asegurarnos de que vaya en la carpeta de scripts. Y ahora y vamos a ver cómo en la siguiente lección, puedes arrastrar y soltar esa máquina de estado sobre cualquier objeto que quieras. Entonces lo primero que vamos a hacer es darle su propio nombre de clase. ¿Y qué necesita hacer una máquina de estado? Bueno, la máquina de estado necesita monitorear cualquier estado en el que se encuentre actualmente y luego determinar cuándo es el momento de cambiar el estado. Y afortunadamente, la mayor parte de eso depende del propio Estado. Entonces nuestra máquina estatal simplemente necesita realizar un seguimiento de en qué estado se encuentra actualmente. Y probablemente solo dije eso, pero estoy envejeciendo. ¿Por nuestro estado? Bueno, en realidad, antes de hacer eso, necesitamos crear realmente una clase estatal. Así que vayamos bajo guiones. Vamos a agregar una nueva carpeta específicamente para nuestra máquina de estado. Vamos a arrastrar ahí el script de la máquina de estado , y afortunadamente, Gudo es lo suficientemente inteligente como para reconocer que hemos movido nuestro recurso, así que en realidad no tenemos que cambiar donde en realidad no tenemos que cambiar ninguna ruta de archivo ni nada Nada se romperá. Es glorioso. Entonces vamos a crear un nuevo script, y va a heredar Bueno, no va a heredar de Entonces, ¿deberíamos hacerlo de esta manera? Sí, ¿por qué no? Siempre podemos eliminar eso. Máquina de estado, nuevo script. Estado y luego crear. Ahora bien, un estado no va a ser un nodo, y eso es porque los estados no necesitan procesarse por sí mismos de manera independiente, ni realmente necesitan estar en el árbol de escenas. Solo queremos una clase de script GD independiente. Entonces vamos a llamarlo nombre, nombre de clase. Ocho. Ahora bien, podríamos convertirlo en un nodo, pero solo vamos a tener uno de ellos en juego en un momento dado para una máquina de estado, así que con la misma facilidad podríamos convertirla en una clase y asignarla dentro del script, lo que estamos a punto de hacer. Básicamente, cada nodo que agregues al árbol de escenas tiene una sobrecarga de procesamiento, por lo que no queremos tener más nodos de los que necesitamos. Y antes de hacer otra cosa, ahora podemos volver atrás y podemos decirle a la máquina de estado que tiene un estado de tipo estado. Entonces esta variable de estado es el estado en el que se encuentra la máquina de estado en un momento dado. Ahora, como la máquina de estado es un nodo, podemos darle una función de proceso, y eso significa que cada 60 segundos o básicamente tantos como sea capaz de manejar el juego, GIDO va a ejecutar esta función. Es similar a la función de proceso de física que vimos antes, excepto que siempre se garantiza que el sistema de física funcione a 60 fotogramas por segundo. La función de proceso no lo es. GIDO intenta ejecutarlo a 60 fotogramas por segundo, pero si tu computadora se ralentiza, la función de proceso suele ser la primera en fallar. Entonces le vamos a decir al Pozo, vamos a verificar primero. Entonces, ¿básicamente lo que queremos hacer es que queremos que el estado esté listo para cambiar? Si es así, cámbialo. Si no, trátelo. Sí, vamos a tener un error ahí esto es todo comentarios. Ahora, afortunadamente, todo esto se hace dentro de la propia clase estatal. Entonces vamos a definir una función llamada está lista para cambiar de estado. Y va a devolver un Bleion. Y nuestra clase estatal sólo va a ser un talón. Va a ser una clase abstracta. Y GaD no impone clases abstractas a menos que estés trabajando en C Sharp, lo cual no lo estamos. Pero nunca vas a instanciar a la clase estatal por Siempre lo vamos a estar anulando en las clases hijo a través de la programación orientada a objetos y la herencia Y eso lo explicaré en un momento. Técnicamente lo hemos estado usando todo el tiempo, pero voy a explicarlo con más detalle una vez que lo hagamos. Y éste va a devolver falso por defecto. Porque un estado completamente en blanco nunca va a cambiar de estado. Entonces, claro, vamos a necesitar una función de proceso. Y esta vez, no voy a poner el guión bajo delante porque en realidad, no sé por qué Godot usa guiones bajos para algunas de sus funciones internas así, pero no vamos a hacer eso, sobre todo solo porque entonces de un vistazo, podrías pensar que es un proceso de nodo, y no lo Y en realidad, una cosa que también vamos a necesitar es que vamos a tener que pasar la máquina de estado a cada uno de estos métodos. De hecho, podríamos, una vez que creamos el estado, simplemente proporcionar una referencia a la propia máquina de estado. En realidad, no, no tenemos que pasar en la máquina del estado. Lo que sí tenemos que pasar es lo que se llama el objeto monitoreable Y eso no es fácil de decir. Así que simplemente lo llamaremos objeto monitorable monitor. Y el objeto monitoreable, no vamos a definir realmente un tipo para porque literalmente puede ser Entonces proceso no necesariamente tiene que hacer nada. Y entonces vamos a tener otro método que va a ser básicamente un manejador de eventos, así sucesivamente cambiar estado Y una vez más, necesitaremos el objeto monitoreable. Un estado inalterado va a ser llamado cada vez que cambiemos nuestro estado. Entonces hablemos un poco más sobre este objeto de tabla monitor, y voy a evitar decir esa palabra tanto como sea posible porque no es fácil de decir. Y en realidad, ¿sabes qué? Podemos simplemente cambiarlo en lugar de monitor tina, lo que implica, ya sabes, que hay algo especial al respecto. Bueno, lo llamaremos monitoreado porque eso es lo que es. Y también es más fácil decir, Objeto monitoreado. Ahí vas. ¿Qué es un objeto monitoreado? Entonces la máquina del estado va a monitorear a lo que sea que esté adherida. En este caso, va a ser el tanque enemigo. Y el objeto que la propia máquina de estado y con ello los estados está monitoreando es lo que determina si los estados cambiarán o no. Entonces, por ejemplo, ya que si estamos monitoreando al tanque enemigo, podríamos querer pasar del estado de búsqueda al estado de ataque dependiendo de si el tanque ha visto al jugador. Entonces eso significa que la máquina de estado necesita poder monitorear un objeto. Por defecto, nuestra máquina de estado va a monitorear su padre porque la máquina de estado siempre va a estar conectada directamente al objeto que está monitoreando. Entonces crearemos una variable llamada nodo monitoreado, y crearemos una función, una función lista para nuestra máquina de estado. Y dentro de la máquina de estado, el nodo monitoreado se va a asignar de inmediato al padre de la máquina de estado. Entonces, si fuéramos a agregar nuestra máquina estatal al tanque enemigo, que echan a perder o lo haremos en la siguiente lección. Si tuviéramos que agregarlo aquí mismo, el método get parent devolvería el tanque, que es exactamente lo que queremos. Y luego vamos a pasar ese nodo monitoreado a las funciones de estado. Entonces hagámoslo. Ahora que estamos en proceso o ahora podemos llenar proceso. Si el estado actual está listo para cambiar estado basado en cualquier estado que esté en el nodo monitoreado, entonces el nuevo estado va a ser igual a, bueno, no lo sabemos todavía, ¿verdad? Porque tenemos bien, en realidad, ¿el estado lo definimos? No, no lo hicimos. Bien. Entonces hay un método más que el estado va a necesitar definir, y que se llama Determinar siguiente estado. Entonces cada estado va a saber a qué son los estados a los que puede hacer la transición. Y vamos a devolver una cadena. Y la cadena va a ser el nombre del nuevo estado al que queremos hacer la transición. ¿Y qué formato va a ser ese? Bueno, ya veremos en un momento. Entonces un valor por defecto o más bien un, así que básicamente, este estado abstracto que en realidad nunca vamos a instanciar va a devolver la cadena por defecto por defecto, porque Parte del diseño de mi máquina de estado en general es que quiero que tenga un estado predeterminado que va a ser el estado inicial en el que se encuentra la máquina de estado cuando se inicia por primera vez Y eso lo definiremos en breve. Pero ahora que hemos determinado siguiente estado definido, podemos decir, Bueno, en realidad, todavía no tenemos esto. Bien. Entonces lo conseguiremos en un momento. Pase. De lo contrario, si el estado no está listo para cambiar de estado, entonces el proceso de estado basado en su nodo monitoreado. Bien, entonces, ¿qué hacemos aquí? Bueno, vamos a necesitar una lista de estados que soporta la máquina estatal, así como sus nombres. Entonces para hacer eso, vamos a exportar un diccionario. Y si nunca antes has usado un diccionario, un diccionario es una lista de ítems, y te mostraré cómo funciona eso en un momento. Básicamente, es una lista de pares de valores clave, y una clave no está unida a un valor específico, por lo que puedes buscarlos. La mejor manera de describirlo es como una libreta telefónica, ¿verdad? Estoy mostrando mi edad. Las libretas telefónicas probablemente ya no existen. Pero digamos que tenías un libro de todos los números de teléfono en Estados Unidos, y la clave podría ser el nombre de la persona, y entonces el valor sería su número de teléfono real. Entonces, si supieras su nombre, podría buscarlos por su nombre, y le devolvería el número de teléfono. Entonces en este caso particular, el diccionario va a estar en blanco, pero una vez que creamos una nueva máquina de estado en el siguiente capítulo, podremos llenarlo. Pero por ahora, lo que queremos es que podamos reemplazar esto ahora con la sintaxis de acceder a una cadena o acceder a un valor en el diccionario. Entonces el estado va a ser igual a los estados, y accedes al valor de una clave con la notación de corchetes como lo harías para una matriz. Los estados determinan en realidad, no, no son estados. Es estado. Por eso estamos completando cualquier auto. Determinar siguiente estado. Y si recuerdo correctamente, si bien, deberíamos darle el objeto monitoreado El objeto monitoreado casi siempre va a ser necesario. Determinar los siguientes estados. Porque queremos poder hacerlo lo suficientemente elegante como para que el estado se determine sobre diversos estados del objeto. Y aquí estamos recibiendo un error, pero ahora que lo hemos guardado, eso debería desaparecer. No va a desaparecer. Ahí vamos. Bien, ahora, desafortunadamente, todavía no podemos ejecutar esto, pero hay una cosa más que debemos hacer antes de pasar al siguiente capítulo para que pueda implementar esto y mostrarles cómo funciona todo Y eso es que necesitamos agregar un setter al estado. En primer lugar, ¿qué es un setter? Un setter es una función a la que Gadot llamará, si existe para definir para asignar un valor a una variable en particular Entonces, por ejemplo, si aquí defino una función setter defino una función setter y siempre tienen la misma firma, siempre toma el valor Siempre que intento hacer algo como esto y digo, estado es igual a lo que sea que esto va a ser, Gadot llamará a esta función y pasará lo que sea que esto vaya a estar en como valor Entonces lo único que siempre queremos hacer en nuestro setter es asignar la variable al valor Pero en este caso, también queremos llamar al manejador estatal. Entonces ahora decimos estado sobre estado cambio con un objeto monitoreado. Entonces cada vez que hagamos esto, automáticamente va a hacer esto. Ahora bien, si no definimos aquí al setter, fácilmente podríamos poner esto aquí Pero como pueden ver, vamos a querer asignar el estado por defecto en listo, lo que bien podría hacer ahora mismo, estado es igual a estados por defecto. Y como también lo estoy configurando aquí, si no hice esto dentro del setter, tendría que acordarme de ponerlo aquí Entonces, si hay, como, código repetitivo que necesitarías hacer cada vez que cambias el valor de una variable, los setters son invaluables, y los vamos a estar usando mucho cuando miramos las interfaces de usuario porque cada vez que establecemos un valor, vamos a querer disparar una señal para notificar a interfaz de usuario que la variable ha cambiado para que podemos actualizar la pantalla. En fin, esto ya está hecho, pero como no tenemos estados, no nos va a hacer ningún bien, así que en realidad puedo ejecutarlo y mostrarte cómo funciona. Pero ahora podemos pasar a la siguiente lección e implementar la máquina estatal para el tanque enemigo, y voy a remediar a esa Post Haste. ¿Te ves ahí? 21. Añadir una máquina de estado al tanque enemigo a través de ECS …: Bienvenida de nuevo. Ahora vamos a agregar nuestra máquina estatal a nuestro tanque enemigo y establecer un estado predeterminado para que el tanque pueda procesar su estado, aunque técnicamente no esté haciendo nada. Y luego, una vez que tenemos todo ese marco en su lugar, entonces podemos comenzar a crear realmente la inteligencia artificial real que hará que el tanque funcione. Entonces echemos un vistazo a nuestro tanque. Y lo primero que vamos a hacer es simplemente vamos a arrastrar nuestra máquina estatal nuestro tanque. Boop, y ahí está Técnicamente, lo que estamos haciendo aquí es una forma del patrón de programación conocido como el sistema de componentes de la entidad. Y Godot como que le dice de labios en su arquitectura general en su arquitectura general en el sentido de que el tanque enemigo es considerado la entidad, y todas las cosas que hay debajo él se consideran componentes Si estás familiarizado con la unidad, está más sólidamente estructurada en unidad donde tienes un objeto de juego al que puedes agregar varios componentes Y la filosofía es que los componentes no tienen que saber nada de nada. Simplemente pueden lidiar con ellos mismos, y ese será el final de ello. Y la entidad es una especie de responsable de dejarles hacer lo suyo y también reaccionar a lo que hacen. Entonces en este caso, la máquina estatal, es un componente de la entidad, que es el tanque enemigo. Y aparte del hecho de que va a leer cosas de los datos de los tanques, a la máquina de estado no le tiene que importar nada de lo que esté haciendo el tanque , aunque eso puede cambiar. ¿Quién sabe? Vamos a estar diseñando esto a medida que avanzamos. Pero en pocas palabras, si tienes artículos que están unidos a un elemento maestro, y esos artículos están bastante bien sifonados o aislados, aislados unos otros Se puede considerar que un sistema de componentes de entidad. Entonces de esta manera, no tenemos que como dije, en nuestro último capítulo, no tenemos que hacer que la máquina estatal sepa una gran cantidad de lo que sea a lo que esté apegado porque su único propósito es monitorear estados. Entonces, vamos a crear algunos estados para que monitoree. Vamos a pasar por debajo de la máquina de estado, y vamos a crear un nuevo script, y va a heredar del estado, y va a ser llamado Estado inactivo Bien. Y luego haremos doble clic en él para abrirlo. Ahora bien, ¿qué va a hacer este estado inactivo? No va a hacer una maldita cosa. Es puramente un estado de marcador de posición para que pueda mostrarles cómo funciona esta arquitectura Entonces ahora que existe la máquina de estado y ya tenemos nuestro diccionario de estados definido, podemos llenar esta cosa. Entonces lo que haremos es hacer clic en esto, y ahora puedes ver que me va a pedir una nueva clave y un nuevo valor. Entonces voy a hacer clic en el pequeño lápiz aquí, y la clave va a ser una cuerda. Y como ya lo hemos usado, necesitamos definir la cadena por defecto. Ahora bien, ¿cuál va a ser el valor? Bueno, los diccionarios en Godot son increíbles porque sus valores pueden ser literalmente cualquier cosa Entonces en este caso, queremos que nuestro valor sea el script de estado inactivo que acabamos de crear. Pero antes de hacer eso, hagamos otra cosa. Nuestro estado inactivo va a necesitar algo. Entonces, si recuerda, tenemos un método llamado estado nhange. Entonces queremos que nuestro estado inactivo informe el hecho de que ahora es el estado actual. Entonces, en estado inalterado, vamos a agregar una declaración print que simplemente dice estado inactivo. Entonces, cuando cambiemos al estado, va a imprimirlo en la consola, y sabemos que todo este sistema que armamos en realidad está funcionando. Entonces nuestro nuevo valor va a ser un nuevo objeto. Afortunadamente para nosotros, en Godot, los scripts, incluso los scripts que no han sido instanciados o convertidos en nodos ni nada, solo los propios scripts son considerados objetos Más específicamente, si recuerdo correctamente, se consideran recursos. Entonces lo que tenemos que hacer aquí es desafortunadamente, la única opción que tenemos es el nuevo script GD, y no queremos eso porque va a asumir literalmente un nuevo script vacío en blanco Así que queremos desplazarnos todo el camino hacia abajo hasta el fondo aquí, y queremos ir a cargar. Ahora, también puedo hacer una carga rápida porque ya he hecho esto antes, pero no lo has hecho, vamos a pasar por todo el proceso. Entonces nos va a pedir que abramos un archivo. Ahora bien, si entramos en guiones, máquina de Estado, nosotros Z nada. Y eso es porque, curiosamente, un archivo de script GD no es un tipo de archivo reconocido para este tipo de cosas Entonces queremos bajar al fondo y seleccionar todos los archivos, y luego podemos seleccionar nuestro estado inactivo. Y lo último que tenemos que hacer es que tenemos que hacer clic en Agregar par de valor clave. Ahora nuestro script de estado inactivo está asignado a la cadena predeterminada en nuestra lista de estados. Y esto significa que tenemos que hacer una cosa más en nuestra máquina estatal. En nuestra función ready, necesitamos agregar realmente el punto Nu porque como el script GD es básicamente un recurso de clase, necesitamos instanciar uno nuevo en nuestro estado porque nuestro objeto state es un estado y no es un no Entonces, si hacemos esto, ahora que tenemos una máquina de estado en nuestro tanque enemigo, eso significa que cuando el tanque enemigo entre en el árbol de escenas al inicio del juego, va a llamar a su función ready, y va a bajar por la lista de los nodos dentro de él y llamar a su función ready. Y cuando llegue a la máquina de estado, la máquina de estado va a agarrar al padre, que es, por supuesto, el tanque como su nodo monitoreado. Entonces se va a establecer el estado igual al estado que hemos definido en nuestro diccionario bajo default. Y en este caso, es estado inactivo, así que vamos a recuperar eso, y luego vamos a llamar nuevo sobre eso, y eso nos va a dar un nuevo objeto de estado. Y solo para y en realidad, ni siquiera necesitamos imprimir eso ahí porque una vez que eso esté asignado, va a llamar a cambiar estado, lo que significa que deberíamos ver la palabra estado inactivo en nuestra consola. Entonces veamos si esto funciona. Y ahí está, estado inactivo. Bien, ahora que tenemos ese marco en su lugar, en realidad podemos comenzar a crear estados para el tanque enemigo para que realmente pueda hacer las cosas Vamos a necesitar agregar algunos componentes adicionales. Ahí está esa palabra otra vez a nuestra entidad de tanques, y luego una vez que hagamos eso, podemos trabajar con ellos dentro del estado. Así que comencemos. Antes de hacerlo, sin embargo, una nota rápida, el estado inactivo y los otros estados con los que vamos a estar trabajando hacen un uso intensivo de la herencia del paradigma de programación orientado a objetos del que Godot es un gran utilizador, por así decirlo Entonces lo que eso significa es que si creamos una clase base, lo cual hemos hecho aquí con un estado, y luego creamos una clase secundaria que extiende esa clase, pura virtud de extender la clase, obtenemos todo dentro de la clase. Entonces, si no hubiera definido esta función, el estado inactivo obtendría toda esta funcionalidad de forma gratuita, y aún así lo hace. Pero entonces si redefinimos nuestro método de estado de cambio, lo que hicimos, esto obtiene lo que se llama anulado por Entonces, si no hubiéramos hecho esto y simplemente hubiéramos usado el existente llamado el método existente on change state, no habría pasado nada. Entonces, lo que vamos a hacer es que vamos a crear un montón de clases secundarias para anular la clase estatal y luego anular la funcionalidad base con la funcionalidad secundaria heredada Y aún podemos acceder a la funcionalidad de la súper clase o a la clase padre usando la palabra clave super. Entonces, por ejemplo, si quisiera llamar al método de estado de cambio de base, simplemente podría decir super on change state. Por supuesto, tendría que pasar al objeto monitoreado. Entonces podríamos estar haciendo eso en algunos casos, pero lo más probable es que probablemente no lo estemos, pero esa funcionalidad está disponible para nosotros. Bien, suficiente teoría. Pongámonos agrietados. Antes de comenzar, una nota rápida. Tal vez recuerden en la lección anterior, arreglé un ligero error aquí donde tuve que agregar el punto Nu a la configuración del estado. También tuve que hacer lo mismo en el método de proceso para cuando cambiamos de estado porque originalmente faltaba esto, y una vez cambiamos de estado, eso habría causado el crash. Pero no causó un choque en nuestra lección anterior porque en realidad nunca cambiamos de estado, pero ahora estamos a punto de hacerlo. Entonces, en última instancia, nuestro tanque va a tener dos estados. O va a estar moviéndose por el mapa y buscando al jugador, que se llamará el estado de caza, o va a estar disparando al jugador, que se llamará el estado Disparo. Entonces, una de las primeras cosas que tenemos que hacer es que necesitamos crear esos estados. Entonces creamos un nuevo script, y ellos heredan del estado, y se va a llamar Estado de disparo Y abriremos ese lechón. Y entonces vamos a hacer, así mismo, 40 Hunting State. Ahora, hay un par de cosas que vamos a tener que hacer para sentar las bases para que todo esto funcione , y haremos todo eso y luego haremos el código para los estados Lo primero que tenemos que hacer es agregar ambos estados a nuestra máquina estatal. Entonces, si dejamos click en la máquina de estado, verás que aquí teníamos nuestro estado inactivo predeterminado. Entonces ahora agregaremos un nuevo estado o una nueva cadena de pares de valores clave, y se le va a llamar disparo. Y por supuesto, el valor va a ser un objeto, y luego arrastraremos ahí el estado de disparo y luego haremos clic para agregar el nuevo par de valores clave. Y entonces vamos a hacer lo mismo por nuestro estado de caza. Entonces lo llamaremos caza. Y eso lo agregaremos. Y ahora nuestra máquina estatal puede reconocer a todos nuestros estados. Entonces, para manejar el estado de caza, en realidad vamos a hacer primero el estado de disparo porque es lo más fácil de implementar de los dos, pero hay una cosa que vamos a tener que crear para poder hacer el estado de caza. Entonces, la búsqueda de caminos es un tema extremadamente complicado, y Godot tiene su propia navegación de búsqueda de caminos incorporada , pero no vamos a usar eso porque dado el hecho que estamos manejando manualmente la forma en que se mueve el tanque, va a producir mucho más código entonces me gustaría volcarte aprendiendo lo que está pasando Entonces voy a hacer una versión más simple de pathfinding, un poco más sencilla Entonces podrás investigar las mallas de navegación de Godot en mallas de navegación de Godot en tu propio tiempo o simplemente investigar la búsqueda de rutas Pero la forma en que voy a mostrarles cómo hacerlo es que definitivamente es uno de los estándares de la industria, aunque vamos a ver una versión muy, muy despojada de la misma. Entonces lo primero que vamos a hacer es que vamos a volver a nuestra arena. Y como puedes ver aquí, la arena tiene un montón de obstáculos diferentes y demás. Entonces vamos a crear un nuevo tipo de nodo para la arena. Entonces, lo primero que vamos a hacer es que en realidad vamos a agregar un nuevo nodo tres D. Y la razón por la que vamos a hacer eso es que solo para evitar que las cosas se desordenen, vamos a querer agrupar todos los nodos que vamos a agregar debajo de este nodo tres D. Así que vamos a agregar debajo de este nodo tres D. cambiarle el nombre a nodos Path ¿Y por qué estoy haciendo eso? Es porque voy a crear un nuevo tipo de nodo, que se llamará NaPoint y veremos cómo hacerlo en aproximadamente 2 segundos. Y lo que va a pasar es que voy a salpicar el mapa con estos NavPoints y los tanques, los tanques enemigos van a seguir estos NavPoints para moverme por el Y esta es una de las formas estándar originales de hacer IA en muchos shooters en primera persona y otros juegos como ese Es mucho más sencillo que intentar usar una malla de navegación singular, que es lo que Godot también te permite configurar. Básicamente, son muchos menos puntos de los que lidiar. Y lo vamos a hacer de esta manera porque te da una idea de lo que implicaría una solución más complicada. Y también nos da un poco de oportunidad de flexionar nuestras florecientes habilidades de matemáticas vectoriales en lugar de dejar todo a los Así que vamos a crear una nueva escena, y vamos a convertirla en una escena de tres D, y vamos a cambiar el tipo de escena a un cuerpo estático tres D. Y vamos a renombrar esa tres D a Nav Point. Y como hemos hecho antes, vamos a agregar una instancia de malla tres D a ese AVPoint para que podamos verlo Y vamos a hacer que sea una malla de cápsula porque ¿por qué no? Y vamos a alterar el material para que la malla de navegación sea realmente visible, bastante bien visible Le daremos un albedo de color amarillo. Y también vamos a expandirnos. Bien, la malla está bien. Cambiaremos la altura a 1 metro, lo que la convierte en una esfera. Interesante. Y luego vamos a reducir el número de anillos, porque quiero decir, en definitiva vamos a ocultarlo en unos minutos. Así que no necesita verse fantástica. Entonces agregaremos, por supuesto, una colisión forma tres D, y eso va a ser una esfera porque realidad hemos creado un objeto esférico, de todos modos. Bien, así que tenemos estos, y podemos cambiarlos un poco para que no quede inmediatamente en el piso Y no necesitamos adjuntar un guión a esto de ninguna manera . Pero lo vamos a salvar. Ahora, vamos a cambiar un par de cosas que en realidad no hemos cambiado antes. Lo primero que vamos a hacer es, por supuesto, vamos a establecer la colisión. Vamos a desmarcar la máscara porque el propio NavPoint no necesita verificar si hay colisiones Y vamos a añadir una nueva capa y vamos a llamarla NAV Points. Y vamos, por supuesto, a cambiar la capa de colisión NavPoints a NavPoints Y luego vamos a ir a la Instancia de Malla tres D, y vamos a bajar a las capas de instancias visuales, y vamos a desmarcar una y marcar dos Y vamos a cambiar nombres de las capas para que la capa dos sea NavPoints ¿Y por qué hice eso? Bueno, las capas visuales son similares a las capas de colisión en que puedes agrupar y también es similar a los grupos en que puedes agrupar las cosas y luego eliminarlas. Entonces lo que vamos a hacer en realidad es, vamos a ir al tanque, y vamos a ir a Cámara tres D. Y ahora la cámara tres D tiene esta máscara de desecho aquí Y básicamente, cualquier capa que esté marcada y todas estén comprobadas por defecto, la cámara verá. Ahora bien, no queremos que estos líos de navegación aparezcan en el juego, y la única cámara que vamos a usar es la del jugador o básicamente la unida a cualquiera de los tanques Entonces simplemente vamos a ir aquí a la capa NavPoints y desmarcarla. Y ahora, nuestros NavPoints no serán renderizados por la cámara del jugador Así que vamos ahora que tenemos un NavPoint, agreguemos algunos a nuestra escena Los agregaremos, y los arrastraremos al nodo de los nodos path para que se conecten a él como padre. Y asegurémonos de que esto es recto arriba y abajo. Vamos a alejar un poco. Y lo que vamos a hacer es básicamente vamos a poner estos puntos, y solo los duplicaré con Control V o Control D, y luego los colocaremos en varios vamos a colocar suficientes de ellos para que te hagas la idea. Lo que vamos a hacer es que nuestro tanque se va a mover de punto a punto. Se va a buscar todos los puntos que están dentro de su rango de movimiento. Va a elegir uno al azar y luego va a girar hasta que esté enfrentando ese punto y luego se va a mover hacia ese punto. Básicamente, todo lo que queremos hacer aquí es que solo queremos crear un montón de puntos o crear un montón, crear un montón de puntos NAB para darle al tanque algún lugar para moverse Ahora, claro, si tenemos los NavPoints instalados de tal manera que haya un obstáculo entre el a lo largo del camino, el tanque va a chocar con el Entonces queremos espaciarlos lo suficientemente separados como para que el tanque pueda encontrarlos cuando escanee en busca de nuevos puntos a los que ir, pero no de tal manera que sea posible ir realmente. Entonces, por ejemplo, si el tanque fuera a ir de este punto a este punto, queremos asegurarnos de que la línea entre ellos no incluya esa roca. Así que vamos a ajustar esto un poco, y lo haremos. Bien. Y eso es suficiente para que sea suficiente para la arena. Entonces, como puedes ver, en realidad puedes ver los NavPoints aquí Pero si tuviéramos que comenzar el juego, lo cual voy a hacer, vamos a verificar dos veces donde está el Volvamos al juego. ¿Bien? Entonces el tanque del jugador está justo aquí. Entonces ahora si tuviéramos que iniciar el juego, Ves que ninguno de los NavPoints está apareciendo en la ventana gráfica del jugador porque la cámara los está sacando a relucir, pero siguen ahí Bien, ahora que eso está configurado, vamos a modificar nuestro tanque enemigo para que pueda detectar al jugador y luego intentar dispararle. Lo primero que tendremos que hacer, obviamente, es ir al tanque enemigo. Pero lo que queremos hacer ahora es que queremos agregar lo que se llama un nodo D de área tres. Entonces iremos al tanque enemigo. Añadiremos un nodo hijo, y agregaremos un área tres D. Y un área tres D requiere una forma de colisión igual que nuestra forma de colisión tres D. De hecho, son básicamente lo mismo. Entonces agregaremos aquí un nodo hijo, que es, por supuesto, una forma de colisión. Y solo nos importan las cosas dentro de un radio XY del tanque. Entonces solo podemos hacer un cilindro. Ahora bien, esto también se podría hacer comprobando la distancia entre las posiciones globales de ambos tanques. Pero es menos código para hacerlo de esta manera, y además pasa todo al motor de física, que es más eficiente. Entonces la forma de colisión va a , bueno, antes que nada, vamos a reutilizarla un poco. Realmente no importa qué tan alto sea, pero solo para mantener las cosas visualmente consistentes, lo haremos casi tan alto como esté el tanque. Y luego necesitamos cambiar su radio al radio en el que queremos que el tanque pueda ver al jugador en. Entonces vamos a arrastrar a este tipo hasta que se trate de, digamos, 15 Ahora bien, esto es completamente arbitrario Es solo un radio en el que he decidido que quiero el tanque pueda detectar al jugador en. Fácilmente podrías hacerlo diez o 20. Yo no lo haría menos que la distancia que disparará el proyectil del tanque porque puedes hacerlo puedes hacerlo más grande. Está perfectamente bien que el tanque sea capaz de ver al jugador antes que los jugadores dentro del alcance. Pero, ya sabes, ya veremos cómo funciona eso. Entonces ahora mismo, lo mantendremos a las 15, y cambiaremos el área tres D, y lo llamaremos área de focalización. Y hay un bug con Godot donde un área tres D no detecta cosas que son estáticas a menos que se revisen tanto el monitoreo como el monitorable, lo cual es un poco Porque normalmente solo quieres que se revise el monitoreo para ver si las cosas van a la zona. Y así desmarcaremos monitoreable para éste, pero vamos a estar haciendo algo similar para Y volveré a visitar esa discusión cuando lleguemos al movimiento, supongo Estoy como que saltando por delante de mí aquí. Pero ahora que tenemos nuestra área de objetivo, lo que queremos hacer es antes que nada, cambiar bien los tanques enemigos que apuntan a la colisión del área, podemos apagarla por una cosa, o podemos apagar sus capas por una cosa. En realidad no tiene que estar en una capa, sino que solo queremos que choque con la capa del jugador, lo que no sólo rima, sino que también significa que al área sólo le va a importar si el jugador se mueve hacia Entonces ahora vamos al nodo y al área tres D, y por supuesto, queremos que el cuerpo entre y el cuerpo salga métodos Entonces los conectaremos al tanque enemigo. Y por alguna razón, el botón de conexión no quiere cooperar. Ahora, solo para demostrar que esto realmente funciona, vamos a hacer dos cosas. Vamos a imprimir el nombre del cuerpo cuando entre en el momento en que entre en el área, y luego imprimiremos el nombre del cuerpo cuando salga de la zona. Y tal vez estés pensando en este punto, bueno, ¿cómo puedo visualizar todas estas cosas que están pasando? Quiero decir, ¿cómo sabemos el alcance de nuestros yesos y nuestras áreas de colisión y esas cosas mientras depuramos nuestro juego Y creo que te lo mostré antes, pero si no lo hice, te lo volveré a mostrar. Si vas bajo depuración y hacemos formas de colisión visibles, podemos ver las formas de colisión de todos nuestros objetos. Entonces ahora si empiezo el juego, ahora puedes ver todas las formas de colisión que hemos establecido. Y aquí está el rango de objetivo para el tanque enemigo, y aquí está la forma de colisión de uno de los nodos de navegación. Entonces ahora si conduzco mi tanque hacia adelante, he entrado en la zona de objetivo de tanques enemigos, entonces dice tanque jugador, y ahora si salgo de la zona de objetivo, desencadena el otro método y también dice tanque jugador. Entonces tenemos un pequeño problema en que el cuerpo sólo está en alcance y por lo tanto válido dentro de este método. Necesitamos poder acceder a lo que sea que el tanque esté apuntando fuera de este método. Entonces, claro, eso significa que vamos a necesitar una variable, y la llamaremos target, y va a ser un cuerpo de personaje tipo tres D porque ese es el tipo de nuestro tanque jugador. Entonces objetivo es igual a cuerpo. Y cuando el cuerpo ha salido del área de objetivo, el objetivo es igual a nulo. Entonces, si en algún momento fuera del script del tanque, necesitamos acceder a una referencia al jugador mientras está en la zona de focalización, podemos usar esta variable. Y de hecho, la vamos a usar en nuestra máquina estatal. Entonces vayamos a nuestro estado de despido. Lo primero que vamos a hacer es darle un nombre. Y si bien está en mi mente, hagamos lo mismo por el estado de caza. Y tenemos que volver a nuestra máquina de estado, y necesitamos cambiar su estado predeterminado de este estado inactivo ficticio que creamos al estado de caza Y una vez que estamos ahí, necesitamos definir algunas cosas. Entonces, si recuerda, teníamos un montón de métodos de talón auxiliar dentro del estado Entonces lo primero es que necesitamos nuestro método debe cambiar de estado. Entonces en el estado de caza, queremos cambiar fuera del estado de caza si el tanque ha encontrado un oponente. Entonces lo que podemos hacer aquí es devolver el resultado de un cheque de lingotes Y lo primero que vamos a hacer. Y así esto es realmente válido. Cuando anulas un método, aunque no definimos un tipo de variable para un parámetro de entrada, podemos definirlo en una clase secundaria. Y en este caso, queremos hacer eso para ayudar a que nuestro auto se complete. Vamos a lanzar específicamente el objeto monitoreado a un tanque de IA. Ahora, vamos a devolver el resultado de que el objetivo objeto monitoreado sea igual a nulo. Y así si el objetivo objeto monitoreado no es nulo, entonces eso significa que debemos cambiar del estado de caza al estado de disparo porque encontramos un objetivo. Y a la inversa, queremos hacer exactamente lo contrario en el estado de disparo. Entonces deberíamos cambiar fuera del estado de disparo si el objetivo es igual a nulo. Y entonces, de igual manera, necesitamos poder indicar cuál es el próximo estado para cada uno de nuestros estados. Entonces, para el estado de caza, siempre va a hacer la transición al estado de despido. Y para el estado de despido, siempre va a trasladar la transición al estado de caza. Y solo para ayudarnos con nuestra depuración, vamos a hacer eco porque vamos a anular el estado de cambio de todos modos para ambos Entonces vamos a cuando lo definamos, vamos a hacer eco de cuál es el estado en el que estamos. Entonces en el estado de caza, estamos solo vamos a imprimir estado de caza. Y luego en el estado de disparo, gritos, necesitamos todo el método En el estado de fuego, vamos al estado Echo Disparo. Y ahora podemos verificar que ambos están funcionando si volvemos a nuestro juego. Ahora si maniobra hacia el tanque, tenemos un problema. ¿Cuál es nuestro problema? Bien, acceso no válido a la propiedad clave de disparo muñeca muñeca hacer Bien. ¿No los configuré correctamente? Echemos un vistazo. Ah, no usé la palabra estado. Entonces, como pueden ver, el error aquí es que estoy devolviendo la palabra, bueno, esta no se deletreó bien en primer lugar, sino que debería ser solo disparando en lugar de disparar estado Así que vayamos así. Y luego para el estado de caza, lo cambiaremos a caza. Ahora bien, eso debería funcionar. Entonces, como puedes ver, como ya hemos configurado nuestra máquina de estado para que haga la transición al estado predeterminado, el hecho de que fijemos nuestro estado predeterminado en el estado de caza significa que una vez que esté configurado y cambiado, Godot hará eco de la palabra de caza aquí para demostrar que estamos ahí por defecto Ahora si me voy, Uh, se está rompiendo de nuevo. ¿Qué hice esta vez? Bien, no está en la cosa. ¿Por qué están determinados estos estados de caza Hunt Aha Siguiente estado. Oh, cambié los equivocados. Uf. Bien. Determinar siguiente estado. Estado de disparo. Determinar siguiente estado. Caza. Bien. Una vez más con sentimiento. Ahí vamos. Entonces, desde que entré en la zona de focalización, se cambió al estado de disparo. Ahora bien, si vuelvo a salir, vuelve al estado de caza, que es exactamente lo que queremos. Bien, entonces ahora que tenemos nuestro objetivo y podemos cambiar de un lado a otro entre los estados de disparo y los estados de caza, ¿qué queremos hacer a continuación? Bueno, como vimos antes, tenemos un método de proceso. Y en nuestra máquina de estado, básicamente, en su método de proceso, comprobamos para ver si debemos cambiar de estado, y si no, debemos procesar el estado en el que nos encontramos actualmente. Entonces necesitamos anular el método de proceso para cada uno de estos estados. Y como estamos trabajando en el estado de despido ahora mismo, ese va a ser el primero que hagamos. Entonces, antes que nada, asegurémonos Cambiar todas estas firmas de tal manera que específicamente lancen el objeto porque eso es lo que queremos hacer. Y, por supuesto, vamos a tener que anular proceso en el estado de caza eventualmente también. Entonces en el estado de disparo, vez que tengamos un objetivo, que es el jugador, vamos a querer rotar la torreta de los tanques enemigos hacia el jugador, verificar para ver si tiene una línea de visión clara, y luego disparar al jugador. Y para hacer eso, necesitamos agregar un par de nodos extra a nuestro tanque enemigo. El primer nodo que vamos a agregar a nuestro tanque se llama un lanzamiento tres D. Un lanzamiento es básicamente una flecha que apunta a una posición objetivo dentro del mundo designada en coordenadas locales, lo que significa que usa el mismo espacio de coordenadas que el tanque. Y vamos a apodar a esta única línea de visión. Y necesitamos que el tanque enemigo pueda modificarlo y acceder a él desde dentro de su propio guión. Entonces vamos a exportar una variable llamada línea de visión, que es, por supuesto, una refundición tres D. Y luego arrastraremos esto por aquí Entonces un elenco es básicamente una línea, y trazará desde su punto de origen hasta el destino que le des, y podrá informar sobre lo primero que golpee por ese camino. Entonces, para nuestra línea de visión, si trazamos una línea desde nuestro tanque enemigo hasta el tanque jugador, y volvamos al juego por un segundo aquí. Entonces, si trazamos una línea, entonces esta será nuestra línea de visión raycast Si trazamos una línea desde el tanque enemigo hasta el tanque jugador, si no hay nada en el camino, entonces si decimos: Oye, ¿cuál es el tanque enemigo o con qué choca el lanzamiento de rayos?, recuperaremos nuestro objetivo Si hubiera, digamos, un árbol en el camino, la línea de visión reportaría lo primero que golpeó siendo el árbol, que significa que no tenemos una línea de visión al tanque de nuestros jugadores. Entonces, básicamente, queremos comparar a qué apunta la línea de visión emitida por el rayo, y si es el objetivo, entonces sabemos que tenemos una línea de visión clara. Entonces, ¿cómo hacemos eso? Lo primero que hacemos es regresar a nuestro tanque enemigo, y vamos a la línea de visión, y queremos que nuestro lanzamiento de rayos choque no sólo con el jugador, sino también con obstáculos y tanques enemigos, y no con el suelo, ni con proyectiles o no con puntos Nav De esa manera, puede detectar si hay un tanque enemigo o un árbol en el camino, o puede encontrar a nuestro jugador cuando lo encontremos. Vamos a hacer todo esto dentro del estado de disparo porque el estado de disparo va a contener la lógica que va a determinar si el tanque debe disparar o no a su oponente. Y la razón por la que hacemos esto aquí es porque si el tanque pierde de vista al jugador, entonces queremos hacer la transición fuera del estado de disparo y volver al estado de caza. Y esa información es incorrecta. Volvamos al tanque enemigo, y obtendremos la línea correcta, obtendremos el código correcto. Ah, bien. No es eso. Es esto. Bien. Entonces, ¿qué hacen estas dos líneas de código? El primero toma nuestro objeto monitoreado, que es, por supuesto, nuestro tanque enemigo, que es la entidad a la que está adherida nuestra máquina estatal, y actualiza su línea de visión, que es la línea de visión proyectada, su propiedad de posición objetivo, que es esta variable aquí, y lo establece igual a la posición del objetivo que es el objeto monitoreado actualmente apuntando a. Entonces como recuerdas, desde hace unos minutos, marcamos el objetivo igual al tanque jugador si entraba en el volvamos aquí. Establece el valor objetivo igual al tanque del jugador si entra en el área de objetivo. Y no tenemos que preocuparnos por verificar valores nulos ni nada porque el tanque no estará en estado de disparo a menos que tenga un objetivo. Y necesitamos este método para local porque la posición objetivo del objeto monitoreado es local a su propio espacio. Entonces necesitamos convertirlo al espacio de coordenadas del objeto monitoreado. De lo contrario, sería en el espacio global y los valores estarían equivocados. Entonces llamamos al método de actualización de lanzamiento de fuerza en la línea de visión para decirle a Godot que actualice inmediatamente el elenco, porque si no lo hacía, entonces Godot actualizaría el elenco en el siguiente fotograma, así que estaríamos fuera por Queremos que suceda de inmediato para que estemos comprobando lo correcto. Ahora bien, si ejecuto el juego, ya que todavía tenemos nuestras variables de colisión o aún tenemos nuestras formas de colisión establecidas, en realidad no obtenemos nada aquí. Hay una manera de encender estas cosas. Déjame ver si puedo configurarlo. Bien, me di cuenta de lo que salió mal. El lanzamiento de la línea de visión estaba originalmente en la base del tanque porque ahí es donde cae a cero. Originalmente comencé en negativo uno Y, que estaba aquí abajo, así que en realidad tuvimos que moverlo hacia arriba de tal manera que realmente pudieras verlo cuando apuntaba al objetivo contrario. Entonces ahora gong a Nat y corremos nuestro juego. Ahora puedes ver el elenco desde el tanque enemigo directamente a nuestro tanque. Y lo que tenemos que hacer a continuación es que tenemos que comprobar si qué choca o no el elenco con qué choca o no el elenco es el objetivo o no Entonces lo hacemos diciendo, monitoreé objeto, línea de visión, y el método se llama Get collider Entonces, si llamamos Get collider en la línea de visión, y necesitamos ver si es igual al objetivo del objeto monitoreado, que es, por supuesto, nuestro tanque jugador Y en realidad, antes incluso de hacer eso, lo que podemos hacer es, vamos a ir así y luego comentaremos esto. Simplemente imprimiremos con qué choca. Y no lo vamos a hacer de esa manera. Lo haremos monitoreado. Lo deletrearemos correctamente objeto. Punto de línea de sitio Obtener colisionador. Nombre del punto. Ahora, conducimos hasta aquí, se puede ver que está colisionando con el tanque del jugador Pero si voy aquí detrás de esta colina, El elenco de rayos choca ahora con el cerro Porque el elenco de rayos está pasando por la caja delimitadora de Hill antes de que nos golpee. Eso significa que el tanque enemigo no tiene una línea de visión para el jugador. Así que vamos a deshacernos de eso, así volveremos aquí. Entonces, si el tanque enemigo sí tiene una línea de visión para el jugador, queremos rotar la torreta hasta que esté de frente al jugador. Y para hacer eso, en realidad necesitamos un segundo reparto de rayos. Vamos a tratar vamos a comentar eso de nuevo. Ahora bien, ¿dónde vamos a poner este reparto de rayos? Este lanzamiento de rayos en realidad va a estar en la torreta, y va a estar orientado en la misma dirección que el cañón, porque queremos poder ver a lo que sea que apunte la torreta. Entonces agrega otro nodo hijo aquí, y ese va a ser un raycast otra vez, Hmm. Y esta va a ser la línea de objetivo, y sólo va a chocar con el jugador, y va a ser tan larga como nuestra zona de apuntamiento o área Entonces, ¿qué tan grande era nuestra área de objetivo? Nuestra área de objetivo es de un radio de 15 metros. Entonces eso significa que la línea de focalización tiene que ser 15. Pero dado que el tanque en sí se gira, eso significa que también necesitamos rotar la línea de objetivo. Ahora, como pueden ver, tenemos una línea que se extiende desde nuestra torreta hasta donde llega el radio de objetivo. Y vamos a cambiar eso un poco porque no queremos que así sea como es antes de que vayamos. Bien. Entonces ahora si volvemos a nuestro guión y podemos descomentar esto nuevamente, vamos a necesitar, obviamente, una referencia a nuestra refundición de segmentación Tanque enemigo, línea objetivo, línea objetivo. Y solo hagamos un rápido chequeo de cordura para asegurarnos de que si giramos la torreta, podremos rotar el molde correctamente. Sí, ahí va. Perfecto. Déjame volver a nuestro guión. De vuelta al enemigo. No, de vuelta al estado de despido. Y comprobamos si los objetos monitoreados la línea objetivo consiguen colisionador Si no es igual a nulo, entonces sabemos que estamos apuntando a nuestro jugador. Pero queremos verificar para ver si es igual a null porque si es igual a null, entonces queremos rotar la torreta. ¿Y cómo giramos nuestra torreta? Bueno, ya tenemos un método para eso. Objeto monitoreado. Creo que fue no recuerdo el nombre de la misma. Estaba en el tanque. Ahí vamos. Y se fijó la velocidad de giro. Y en este caso, nuevamente , puede ser uno o uno negativo. Entonces, si lo pongo en uno, eso va a indicar que siempre va a girar en la dirección positiva, que puede no ser necesariamente lo que queremos. Lo que tendríamos que hacer en realidad es determinar la orientación del objeto del jugador para ver si un negativo lo conseguiría allí más rápido que un positivo. Pero voy a dejar eso como ejercicio para ti. Entonces déjame ver si puedo aclarar el tema aquí. Entonces aquí está nuestro tanque desde arriba. Y digamos que el jugador está aquí. Bueno, si siempre giramos la torreta en sentido positivo, va a dar la vuelta de esta manera, lo cual está bien. Pero si el t 22. Cómo agregar una máquina de estado al tanque enemigo a través de la parte de ECS 2: Mmm lo primero que tenemos que hacer es forzar algunas variables de movimiento Entonces, en el estado de cambio para nuestro estado de disparo, que se llama cuando hacemos la transición al estado de disparo, queremos que el tanque detenga todo su movimiento y todo esté rotando y cualquier otra cosa que esté haciendo. Entonces estableceremos la velocidad de rotación y la velocidad de avance igual a cero. Eso significa que tan pronto como el tanque detecte un objetivo, detendrá todo y luego inmediatamente pasará a verificar su objetivo. Y vamos a hacer lo mismo por el estado de caza. Ahora bien, ¿qué es esta propiedad ociosa? Esta es una variable que necesitamos agregar a nuestro tanque enemigo. Y es un booleano. E indica si el tanque está o no en proceso de pasar de un punto de navegación a otro. Básicamente, si el tanque está inactivo, entonces queremos que encuentre otro punto de navegación y se mueva hacia él, porque nunca queremos que los tanques estén completamente inactivos. Aunque, quiero decir, tal vez lo hagas. De hecho, si te sientes aventurero después de que terminemos esta lección, tal vez puedas modificar los tanques de tal manera que se detengan periódicamente y, ya sabes, tal vez solo miren Pero por ahora, siempre van a estar moviéndose y patrullando y buscando al jugador Entonces en nuestro estado de caza, vamos a volver a hacerlo, cuando estemos en estado de cambio, vamos a obligar al tanque a ralentí, lo que significa que en su primer pase de procesamiento, va a encontrar una nueva posición para avanzar hacia él. Y vamos a necesitar una lista de esos puestos, y de hecho me estoy adelantando. Entonces volvamos a la escena del tanque en sí, y vamos a necesitar otra área. Y esta va a ser nuestra zona de movimiento. Y esta es la que tiene que ser tanto monitoreable porque si desmarcamos monitoreable, que es una palabra muy difícil de decir, incluso para un hablante nativo de inglés, no detectará nuestros puntos de navegación estáticos por alguna razón, lo nuestros puntos de navegación estáticos por alguna razón, cual no tiene mucho sentido porque monitoreable significa que esta área es detectable por otras formas de sentido porque monitoreable significa que esta área pero no queremos que sea detectable por otras formas de colisión. Entonces, lógicamente, apagaríamos esto. Pero hay un bug y Gadot donde si apagamos esto, no detectará objetos estáticos. Entonces lo dejaremos. Y en su colisión, queremos apagar su capa, y queremos que detecte puntos de navegación. Entonces cambiaremos eso y le agregaremos una forma de colisión. Esa forma, por supuesto, siendo un cilindro. Y moveremos el cilindro un poco hacia arriba y, claro, cambiaremos su no necesitamos un apretado para estar tan alto como es, y cambiaremos su radio a 20. Ally, hagámoslo 25. Y esto es algo arbitrario. Básicamente, este es el radio que se va a buscar puntos de navegación dentro, y queremos que sea más amplio que el rango de objetivo solo porque no queremos tener que llenar el mapa con puntos. Queremos poder tenerlos espaciados relativamente lejos unos de otros. Pero esto es completamente ajustable. Ahora, lo que necesitamos es que necesitamos que esta zona de movimiento pueda activar funciones en el tanque enemigo. Entonces vamos a conectar, de nuevo, el cuerpo entró. Y el cuerpo salió de los métodos para que nos conecte algunas funciones, y no sé por qué sigue desconectando eso, pero ahí está. Boom. Y ahora podemos volver aquí arriba y podemos definir una matriz llamada puntos Nav cercanos. Y va a ser una matriz de nodo tres D, aunque realmente no necesitamos obtener este grano fino con determinarlo o declararlo Solo podemos decir, y es una matriz o podemos eliminar esto por completo y simplemente hacer que se vea así. Pero en términos generales, quieres definir los tipos de tus variables, si puedes. Entonces, cuando el tanque está lo suficientemente cerca de un punto de navegación que está dentro del área de movimiento, va a activar esta función. Y cuando eso suceda, queremos anexar el cuerpo a nuestros puntos NAV cercanos Y cuando salga de ese rango, queremos borrar. Desde el cercano punto Nav. Por lo que esta variable siempre tendrá una lista de los nodos correctos dentro de ella. Ahora, también hay un método llamado get overlapping nodes que también podríamos usar, pero esto es un poco más claro para fines instructivos Entonces ahora que tenemos esto, podemos entrar en nuestro estado de caza. Y básicamente lo que queremos hacer es si el objeto monitoreado está inactivo, vamos a querer hacer algunas cosas, pero antes de hacerlo, nuestro tanque enemigo va a necesitar poder un seguimiento de su punto de navegación más cercano También conocido como el objetivo Nav Point, de cualquier manera. Y en realidad, los NaPoints son cuerpo estático tres Ds. Pero de nuevo, no hay que conseguir esto de grano fino con la definición Pero aquí, éste, probablemente deberías. Bien. Déjame volver al estado de caza. Entonces, si el objeto monitoreado está inactivo, entonces queremos darle un NavPoint cercano Por lo que su NavPoint más cercano va a ser igual al objeto monitoreado Obtener puntos de salida al azar. Y aún no hemos definido ese método. Entonces hagámoslo. Al menos en un talón. Vamos a tachar todos estos métodos, y luego veremos cómo implementarlos realmente Uh, eh. Mucho mejor. Bien, de vuelta al Estado de caza. Y una vez que tenemos un punto de navegación establecido, entonces en realidad queremos decir que ya no está inactivo Así que ocioso ahora es igual a falso. Y en el siguiente fotograma, vamos a comprobar para ver si el objeto monitoreado o. Ha llegado a su destino. Bueno, vamos a comprobar si no ha llegado a su destino. Si no lo ha hecho vamos a hacer algunas cosas, y voy a poner esas cosas en un momento. Pero si lo ha hecho, entonces queremos volverlo a ralentí para que pueda escoger un nuevo punto de navegación Bien, entonces si no ha llegado a su destino, entonces queremos ver si actualmente está enfrentando a su destino. Y si no está de cara a su destino, entonces queremos rotarlo hasta que finalmente lo sea. Entonces cada fotograma va a verificar para ver si está orientado a su destino, y si no, entonces dijimos que es objeto monitoreado por velocidad de rotación. Y aquí tenemos el mismo problema que tuvimos con la torreta, así que sólo vamos a establecer la velocidad de giro igual a una para que siempre vaya a estar girando positivamente. Y si está de cara a su destino, entonces queremos que se mueva hacia su destino. Así objeto monitoreado Establecer velocidad movimiento uno para que avance hacia su destino. Bien. Entonces ahora, una vez que implementemos estos métodos, tendremos un tanque móvil. Y por supuesto, también tenemos que asegurarnos de que apagamos adecuadamente la velocidad de movimiento y la velocidad de rotación. Entonces, si no ha llegado a su destino y no está enfrentando a su destino, entonces necesitamos establecer su velocidad de giro, pero si está de cara a su destino, entonces queremos que deje de girar y establezca su velocidad de movimiento. Y luego, por supuesto, una vez que ha llegado a su destino, establecemos su velocidad de movimiento igual a cero. Oh, ahora, vamos a implementar estos métodos. Así que hemos llegado a destino. Rico, por supuesto, devuelve un lingote. Y por ahora, puede devolver falso. Entonces tenemos Está de cara a destino. ¿Y fueron solo esos dos? Ha alcanzado está enfrentando, y luego obtener Nav Point al azar. Bueno, ya lo hemos hecho ya. Y supongo que debería mantener consistentes las convenciones de nomenclatura Dicho, soy terrible por eso. El Bien, entonces, ¿cómo obtenemos un punto de navegación aleatorio Boom. Entonces lo que estamos haciendo es ¿qué es esto? Probablemente sea el equivocado. Puntos Nav cercanos. Bien. Aah. El nombre es ligeramente diferente. Puntos Nav cercanos. ¿Correcto? ¿Qué me falta? Aquí vamos. Bien, ahora todo está alineado con mis notas. Entonces en este método, lo que hacemos es declarar un NavPoint y lo establecemos igual a null, y verificamos para ver si nuestro array NavPoints cercano que estamos manteniendo aquí, si el tamaño es mayor que Si es así, eso significa que tenemos NavPoints cerca. Y siempre debe haber NavPoints cercanos. Si no lo hay, entonces hicimos algo mal. Pero es solo el chequeo de cordura. Así que recorremos bien los Puntos NAV, hacemos un loop, y básicamente estamos comprobando para ver siempre y cuando el NavPoint que hemos seleccionado sea igual al punto NAV más cercano, o si es nulo, eso significa que necesitamos obtener uno nuevo, porque lo que queremos hacer es querer no intentar ir al mismo NavPoint en el que estábamos justo Básicamente, seguirá tratando de seleccionar un nuevo punto de navegación al azar hasta que obtenga uno que no sea del que acabamos de llegar o la primera vez a través de la primera vez a través del bucle, por así decirlo, porque cuando se llama por primera vez a la función, el punto de navegación va a ser igual a nulo. Entonces, por lo menos, este va a desencadenar. Entonces establecemos el punto de navegación igual a un valor de los NavPoints cercanos que es, por supuesto, una matriz, y usamos la función Randy Range Entonces Randy Range toma dos valores, el rango inferior y el rango superior, que es inclusivo Así que en realidad tenemos que reducirlo por uno negativo. Así que queremos comenzar en cero, que es el índice más bajo de nuestra matriz, y el índice más alto de la matriz es, por supuesto, el tamaño del tamaño de la matriz de la matriz menos uno. Uh, así que básicamente queremos un número aleatorio entre cero y el último elemento de la matriz. Así que una vez que asignamos un elemento array aleatorio a nuestro NavPoint, entonces básicamente estamos comprobando para ver, de nuevo, es el NavPoint que ya tenemos o simplemente existe en absoluto Entonces una vez que tenemos ese valor, lo devolvemos, y luego tendremos un punto de navegación aleatorio. Es muy fácil verificar para ver si hemos llegado a nuestro punto de navegación porque todo lo que tenemos hacer es verificar la posición global del punto de navegación hacia el que vamos, si la distancia entre la posición global de nuestro tanque y la posición global del punto de navegación es menor a 1.1. Y 1.1 es un valor arbitrario. Lo calculé monitoreando la posición global del tanque en cada cuadro a medida que se actualiza, y el número mínimo de unidades que el tanque mueve a la velocidad que hemos establecido es un poco más de una. Es como 1.08 o algo así. Entonces 1.1, si es menor que 1.1, entonces eso cubre ese rango. Entonces check usamos el método de distancia dos, que es, por supuesto, un método definido dentro de un vector, y por supuesto, la posición global de un nodo es un vector. Entonces verificamos la distancia entre nuestra posición global y el objetivo del punto de navegación al que vamos. Y si estamos lo suficientemente cerca de él que eran menos que el valor de movimiento de un solo cuadro, entonces hemos llegado a nuestro destino. Y por último, el más complejo del grupo. Está frente al destino. Entonces, lo que tenemos que hacer aquí es que necesitamos encontrar el vector entre que represente el ángulo que estamos tratando de enfrentar. Así que déjame volver al juego, y pondremos esto para acá. Ahora, lo que tenemos que hacer es encontrar el vector que representa esta línea, la línea que va del tanque al tanque enemigo, el tanque jugador al tanque enemigo. Y la manera de conseguir ese vector es restando la posición del tanque de la del tanque enemigo, y eso nos dará este Y queremos que apunte de aquí a aquí. Entonces restamos esto o restamos esto de esto. Y eso es Ups. Y eso es lo que tenemos aquí. Entonces el punto NAV más cercano. Bien, en realidad necesito corregirme un poco. Entonces no es el jugador. Es el punto de navegación al que vamos. Entonces digamos que el tanque enemigo iba de aquí para acá. Necesitamos obtener el vector que represente este camino. Entonces, la forma en que se obtiene eso es restando el origen, que es, por supuesto, el tanque del destino, que es el punto NAV Entonces los puntos NAV, la posición global menos la posición global del tanque, y la normalizamos. Y normalizarlo significa que acortamos la longitud del vector para que la longitud sea uno, lo que significa que va a ser mucho más corto porque lo único que realmente nos importa es el ángulo Y una vez que tenemos ese vector normalizado, calculamos el ángulo usando el método del ángulo dos para la base de punto de transformación Z. Y miramos la transformación antes cuando estábamos moviendo nuestro tanque alrededor El componente Z de la transformación representa el revestimiento del tanque. Entonces, si calculamos el ángulo a partir de aquí, a la forma en que se orienta el tanque, obtendremos el ángulo entre esos dos vectores. Y a medida que rotemos hacia el punto de navegación, ese valor va a hacerse cada vez más pequeño y cada vez más pequeño. Y eventualmente, si el ángulo entre los dos vectores es menor de un grado, entonces es bastante seguro decir que estamos apuntando hacia el destino. Entonces lo que hacemos es tomar el ángulo entre esos dos, entre el componente Z de nuestra base y el vector de cara, que acabamos de obtener. Y por conveniencia, estoy usando grados a radianes, el método grados a radianes porque me gusta pensar en grados y no sé cuál es el radián equivalente Entonces decimos grados a radianes un grado, y eso calculará el número adecuado de radianes porque el ángulo dos devuelve Entonces, nuevamente, comprobamos para ver si el ángulo entre estas dos cosas es menor que un grado y si lo es, entonces está de cara a su destino. Entonces todo esto simplemente debería funcionar perfectamente. Vamos a poner en marcha nuestro juego. Y nos equivocamos. Entonces, Girar torreta es en realidad probablemente el nombre equivocado de la función. Sin tanque enemigo. Sí, es la torreta Rotate Underscore. Bien. Ojalá, ese sea el único que rompí de esa manera. Ahí vamos. Por lo que ahora el tanque está rotando ojalá hacia uno de los puntos de navegación, y ahí va. Y ahora, claro, Sí. Entonces no lo hice, no volví a configurar estos nombres de funciones correctamente. Entonces, ¿qué tenemos? Hemos establecido la velocidad de avance y la velocidad de rotación igual a cero. Entonces, sí, es rotar la torreta cero. Y establecer la velocidad de movimiento. Entonces lo que realmente sucede ahí es eso porque como se puede ver, aquí está la colisión la esfera de colisión del punto de navegación. Entonces el tanque va a girar hasta que lo golpee, y luego va derecho hacia él. Pero ahora estoy lo suficientemente cerca como para que el tanque me haya visto, así que va a dejar de moverse, y ahora va a intentar rotar, como vimos antes y luego dispararme. A ver si eso realmente funciona. Y no funciona probablemente porque estoy fuera de la estoy fuera del rango. Eso probablemente solo requiere un poco más de ajuste de los valores, aunque Pero sí, así que voy a dejar aquí esta lección porque ya es demasiado larga. Si estás siguiendo junto con el proyecto para este capítulo, podría ser un buen desafío para ti intentar corregir estos errores. Si puedes, entonces definitivamente habrás dominado los conceptos que te estoy enseñando al poder solucionarlos Pero lo más probable es que solo esté ajustando literalmente los radios del Área tres Ds y los moldes Bueno, esa fue una grande. Únete a mí en la siguiente lección, y continuaremos con más cosas geniales. 23. SFX: audio en 3D: Bienvenido de nuevo. Vamos a mirar el audio posicional Pero antes de hacerlo, necesitamos hacer algunos ajustes leves a nuestro tanque y a nuestra máquina estatal de tal manera que podamos conseguir que el audio funcione correctamente. Entonces lo primero que tenemos que hacer es volver a nuestro script original tank dot gd, y vamos a agregar una variable llamada destroyed Y eso va a ser un Bool. Y si recuerdas, cuando destruimos a nuestros tanques enemigos o cuando destruimos o cuando ellos nos destruyen, simplemente dejamos libre el nodo y eliminamos el tanque de la existencia. Y eso es malo para el audio porque si estás intentando reproducir, por ejemplo, una explosión por ser destruido, el hecho de que el nodo reciba señales inmediato significa que no vas a escuchar ese efecto de sonido Lo vamos a hacer es que en lugar de borrar el tanque, solo vamos a voltear su valor destruido a true, y luego para el jugador, ignoraremos cualquier entrada adicional. Y para el enemigo, los cambiaremos a un estado destruido, que crearemos antes de hacer todas las cosas de audio posicional Entonces, agreguemos aquí una función en la parte inferior y la llamaremos Hit. Y en estos momentos, hit sólo va a ser un pase. Y luego en el shell, cuando golpea un objeto shellable, en lugar de liberarlo, vamos a llamar a su función hit Y ahora en el golpe, simplemente voltearemos destruidos a verdad. Y en nuestro juego, podemos subir a la cima aquí y básicamente decir, yo jugador destruido regreso. Eso significa que ninguna de las pulsaciones de teclas se procesará después de que el jugador esté muerto, lo cual es solo un lastre para todos, de verdad. Y para el tanque enemigo, como dije, vamos a necesitar un nuevo estado porque básicamente, cuando el tanque sea destruido, queremos que vaya a un estado donde ya no procesará. Entonces crearemos un nuevo script. Va a heredar de un estado, y va a llamarse nosotros lo llamaremos estado muerto, pero técnicamente está destruido Abre a ese tipo, dale un nombre de clase. Y, claro, vamos a darle vamos a su estado de cambio, y de esa manera, puede informar cuál es su estado actual. Y luego, por supuesto, en la máquina del estado enemigo, necesitamos agregar un nuevo estado a la máquina. Cadena destruida. El valor es, por supuesto, un objeto, y luego arrastramos nuestro estado muerto hasta aquí. Agregar par de valor clave, y ahora estamos bien. Ahora tenemos que modificar nuestros estados existentes para ir a este estado en caso de que se haya volteado la bandera destruida Y afortunadamente, el código es el mismo para ambos. Entonces entramos en estado de fuego, y en proceso, no, no en proceso. Determiné siguiente estado, no, uh debería cambiar de estado, regresamos, no necesitamos un extra encendido. Devolvemos ya sea objeto monitoreado objetivo es igual a nulo o objeto monitoreado destruido. En cualquiera de esos casos, entonces queremos cambiar de estado, y tenemos que hacerlo también en nuestro estado de caza. Entonces en el siguiente estado determinado, para ambos, comprobamos si el objeto monitoreado ha sido destruido, luego vamos a destruido. De lo contrario, vamos a disparar, al menos en el caso del estado de caza. Y luego en estado de fuego, o va a ser destruida o cazando. ¿Y qué hace el estado muerto? Bueno, no hace absolutamente nada. En este punto. Bueno, en realidad hace una cosa más. Vamos a detener incondicionalmente toda rotación y todo movimiento una vez que el objeto esté en este estado, esa manera, realmente habrá dejado de moverse, y será papá Bien, entonces tenemos la torreta Girar, tenemos la velocidad de movimiento establecida, y necesitamos rotar la torreta Bueno, ya los conseguí a los dos. Bien. Girar Girar, mover la velocidad. Ahí hay uno más. Necesitamos velocidad de giro. Ese es el indicado. Bien. Una vez que esos tres valores se hayan establecido en cero, el tanque ya no se moverá, y no hay forma de salir de este estado. Entonces una vez que el tanque está muerto, está muerto, lo cual es un lastre para todos , sobre todo para la gente en el tanque. Bien, ahora que eso está hecho, somos capaces de agregar nuestros efectos de sonido Pero vamos a asegurarnos de que eso funcione antes de que hagamos otra cosa. Entonces iremos por aquí, dispararemos al tanque enemigo, y boom, ha sido destruido. Y como pueden ver, estaba rotando, y ahora ya no está rotando. Ya no está haciendo otra cosa. Perfecto. Bien, agreguemos algunos efectos de sonido Entonces volveremos a nuestro tanque original. Bueno, en realidad, no, empezaremos en un nivel ligeramente superior. Bueno, hay dos tipos de sonidos en Gadot. Hay sonido posicional, y ahí está lo que se podría llamar sonido ambiental sonido ambiental escucharás desde cualquier parte del juego, y generalmente se usa para cosas como música de fondo. Nuestro caso, vamos a agregar algo de sonido ambiental a nuestra arena. Entonces agregaremos un nodo hijo, y vamos a usar el nodo reproductor de flujo de audio. Ahora, el reproductor de flujo de audio sin designación dos D ni tres D es un reproductor de sonido simple que siempre reproducirá el sonido al mismo volumen sin importar dónde se encuentre. Entonces vamos a renombrarlo, llamarlo ambiente. Y ya te he proporcionado tres efectos de sonido para este proyecto. Entonces, si descargas el proyecto para la Lección ocho, deberías tener estos sonidos ya importados. Si quisieras reimportarlas o importar tus propios sonidos para practicar la importación a un objeto GodObject Simplemente puedes tomar tus propios archivos de audio siempre que estén en formatos wave Og o MP tres, y simplemente arrastrarlos a tu carpeta de proyecto, y deberían importarlos de inmediato. Entonces iremos al archivo de audio Amazon Jungle Night, y lo arrastraremos a la transmisión. Y ahora estamos bien para ir ahí, y queremos comprobar la reproducción automática, lo que significa que va a comenzar tan pronto como el nodo entre en el árbol, lo que significa funcionalmente Ahora, tenemos un problema, y es que queremos poder cambiar los distintos niveles de audio de los diferentes tipos de sonidos. Entonces, por ejemplo, no queremos que nuestros ruidos selváticos sean más fuertes que nuestros disparos y nuestras explosiones Y eso lo logramos en virtud del bus de audio. Y hay múltiples buses de audio. Bueno, quiero decir, obtenemos uno a Master por defecto, lo que significa que todas las rutas de audio a través del autobús Master. Si agregamos un nuevo bus, por ejemplo, y lo llamamos ambient, y luego volvemos a nuestro reproductor de flujo de audio ambiental. Podemos cambiar el autobús a ambiente. Y ahora si bajamos el volumen aquí, el ambiente será más silencioso, aunque no hayamos bajado el audio ni el nivel de volumen de nuestro juego general Entonces vamos a agregar otro bus de audio, y este va a ser para efectos de sonido. Y esa va a estar a volumen normal. Entonces ahora, si cargamos nuestro juego, Ahora, suena como una jungla brumosa por la noche casi sin árboles en ella Y apaguemos esas formas de colisión. No los necesitamos por el momento. Bien, entonces ahora necesitamos que tanto el jugador como los tanques enemigos puedan hacer ruidos de disparo cuando disparen y exploten cuando explotan Entonces iremos a nuestra escena de tanque base, y agregaremos dos nuevos nodos. Vamos a añadir el reproductor de flujo de audio tres nodos D dos veces. Y vamos a cambiar el nombre de uno, y vamos a llamarlo Cannon. Y entonces vamos a llamar a la otra explosión. También necesitamos poder acceder a estos en el script. Entonces volveremos a nuestro script de tanque, y exportaremos estas variables. Y voy a hacer un nuevo grupo sólo porque queremos mantener las cosas organizadas. Exportar ar Cannon SFX audio stream player tres D. Y necesitamos otro para la explosión Y ahora volvemos a nuestro tanque, y simplemente bien, primero, ampliamos la categoría, y luego simplemente arrastramos estos por aquí para que tengamos acceso a ellos. Y ahora cuando entramos en nuestro fuego un método de proyectil, todo lo que tenemos que hacer es jugar con puntos de cañón. Y cuando morimos, juego de punto de explosión. Y como estos son Bueno, tenemos que conseguirlos. Primero tenemos que acertar los nombres. Es Cannon SFX y explosión SFX. Y como estos son audio tres nodos D, son posicionales, lo que significa que se ajustarán para la distancia del oyente de audio, que en este caso, es tu cámara por defecto. Oh. Bien, eso no funcionó. Y parte de la razón de eso es porque, bueno, están pasando por el autobús maestro, que no queremos. En realidad queremos que pasen por el autobús SFX. Eso es un poco grande. Vamos a arrastrar eso hacia abajo. Tacto. Bien, ahora esto debería funcionar. Y no lo hace, veamos qué me rompí. Ah, ya veo lo que me rompí. Claramente, no arrastré los efectos de sonido ahí dentro. Ustedes probablemente cogieron eso antes que yo. Bien, explosión Cañón. Bien. Ahora que en realidad tenemos audio, esto debería funcionar. Claramente, necesito una taza de café. Ahí vamos. Mucho mejor. Bien. Y como se puede escuchar el kaboom desde el tanque enemigo Y ahora lo haremos también me acercaré para que oigan al tanque enemigo disparándome. Y se puede ver que no va a ser tan ruidoso como antes. Y ahí lo tienes. Contamos con Audio posicional, audio tres D en Gado. Y ese es el final de esta lección. Te dije que sería mucho más rápido que el otro. Así que siéntete libre de jugar agregando tus propios sonidos. Y si quieres, toma lo que aprendimos agregando NavPoints y tal vez agrega algunas entidades de mapa a tu arena que podrían reproducir sonidos y hacerlos loop cuando se acerquen a ti De lo contrario, los veré en la siguiente lección. 24. Capas básicas de IU: Bienvenido de nuevo. En esta lección, vamos a aprender los conceptos básicos de la interfaz de usuario, y no va a haber codificación involucrada. Así que son unas vacaciones un poco más la cantidad de trabajo que hemos estado haciendo en las últimas dos lecciones. Entonces, iGado una de las cosas más útiles que puedes hacer es combinar dos activos D y tres D en una misma escena Y una forma en que puedes hacerlo, obviamente, es con el uso de nodos de control, que te permitirán superponer una interfaz de usuario de dos D en la parte superior de tu campo de juego. Entonces aquí está nuestra vista de las tres D. Y también tenemos otra ficha aquí para dos D. Ahora, claro, todavía no hemos hecho nada con dos D en absoluto, así que va a estar vacía. Pero cuando cambies a esa pestaña, verás que tienes un espacio de dos coordenadas D con el origen en la esquina superior izquierda aquí. Y este rectángulo morado serán los límites de tu pantalla. Y puedes cambiar el tamaño de este rectángulo pasando por la configuración del proyecto. Y luego ventana, y se mapea específicamente al ancho de la ventana gráfica y la altura de la ventana gráfica de tu ventana de juego Gado utiliza una coordenada uno por uno a escala de píxeles cuando hace sus interfaces de usuario. Pero también es posible escalarlos para tu ventana. Pero en realidad no vamos a hacer eso. Lo que solo vamos a hacer es poner nuestros activos directamente en nuestra interfaz de usuario e ir desde ahí. Entonces hagámoslo. Tenemos nuestra escena de juego aquí, y por supuesto, tenemos nuestros tres activos D dentro de ella. Así que ahora vamos a agregar una interfaz de usuario agregando un nodo hijo y agregando un control. Un control es el nodo de nivel más base de las interfaces de usuario. Y puramente en virtud de ser un control, siempre se va a renderizar encima de los tres D. Entonces lo que queremos hacer aquí es que en realidad queremos que nuestro control esté alineado a la parte inferior de la pantalla. Entonces vamos a hacer click en estos presets de ancla y vamos a hacer click en este, que es ancho inferior Entonces lo que va a hacer es que va a forzar la alineación y anclaje de ese control a la parte inferior de la pantalla y estirarlo por toda la pantalla. Podríamos agarrar podríamos agarrar estas asas y arrastrarla hacia arriba para hacerla más grande o más pequeña. Incluso podríamos moverlo porque un control no está bloqueado a nada. Un control puede ser del tamaño que quieras en cualquier posición que lo desees. Es solo que en muchos casos, realidad quieres anclarlo a las esquinas de la pantalla por diversas razones, generalmente para que si tuvieras que cambiar tu resolución, ya sea sobre la marcha o si vas a estar haciendo diferentes versiones de tu juego, podrías tener problemas con la interfaz de usuario que no escale correctamente. Entonces por ejemplo, si yo aquí están los puntos de anclaje, en realidad. Si cambié estos para que fueran así, y luego hice el control así, bueno, está anclado a este lugar en particular Y si tuviéramos que hacer la pantalla más grande, entonces podría no alinearse correctamente. En realidad podría ser así porque todo ha cambiado. Entonces vamos a orientar. Pero afortunadamente, no vamos a tener que preocuparnos por eso por ahora. Sólo vamos a estar construyendo para una resolución. Así que vamos a realinearlo hasta la parte inferior de la pantalla así, y vamos a agregar un nudo destrozado de textura Y un naufragio de textura hace exactamente lo que dice en la lata. Mantiene una textura. Y en este proyecto, te he proporcionado una textura singular y fuentes tou que vamos a utilizar para crear nuestra interfaz de usuario muy básica. Entonces vamos a arrastrar el archivo PNG sobre la textura, y ahí está. Y ahora, por la orientación que hemos hecho, en realidad está fuera de la parte inferior de la pantalla. Entonces veamos si no podemos realinear esta cosa correctamente. No, vas a ser así, ¿verdad? Bien. Vamos así. Una de las cosas gloriosas de trabajar con interfaces de usuario en Gadot es que a pesar de que es infinitamente más fácil de usar que mayoría de los otros motores de juego y tiene muchas menos peculiaridades que hay que evitar, las peculiaridades que sí tiene, a veces te encuentras peleando con él te encuentras Estás como, Oh, ¿ funciona esto de la manera que creo que lo hace? Sí, no, quizá. No lo sé. Bien, entonces cambiemos el rectángulo de textura a eso, y en realidad debería funcionar. En realidad, esto Bien, sí, volvamos. Intentemos esto de manera diferente. Pasaremos por el control y no hacemos eso. Haremos pantalla completa o ventana completa más bien. Y entonces de esa manera, el rectángulo de textura, si lo colocamos a fondo ancho, ahora escalará correctamente y debería ser de la manera que lo queramos. Y no tenemos que preocuparnos por el modo expandir ni nada, pero vamos a cambiar eso. En realidad, no, no vamos a pasar por alto eso. Pero si tuviéramos que cambiar el tamaño de esta textura o el tamaño del control, podríamos cambiar la escala de textura aquí. Y también vamos a utilizar un contenedor de margen, que a la larga es probablemente uno de los contenedores más útiles que tienes disponibles para las interfaces de usuario, junto con los contenedores VBox y HBox Los contenedores de panel también son increíbles. Y lo que vamos a hacer aquí es el contenedor de margen va a quedar completamente destrozado Pero como puse el contenedor de margen como hijo de la textura rect, cuando digo completo destrozado, para el contenedor de margen, va a ser el naufragio completo de Entonces, en el caso del control, cuando dije completo destrozado, su padre era la pantalla, por lo que era el tamaño completo de la pantalla Pero el contenedor de margen va a ser del tamaño completo del naufragio de textura Y lo que hace un contenedor de margen es que nos permite proporcionar márgenes para nuestra interfaz de usuario. Y eso está bajo el tema de diseño anula constantes. Entonces vamos con 20 para la izquierda, 20 para la derecha, diez para la parte superior, diez para la parte inferior. Nuevamente, estos son valores de píxel. Ahora, claro, no vamos a ver nada porque el contenedor de margen no tiene hijos. Entonces le vamos a dar uno. Vamos a darle el contenedor VBox contenedor vBox, como muestra el icono, tomará a todos sus hijos y los dispondrá de tal manera que estén orientados verticalmente Entonces, si tuviera que añadir, digamos un montón de etiquetas, aquí tenemos una etiqueta. Pongamos algo de texto. Y entonces si tuviera que duplicar esto algunas veces, puede ver que se apilan automáticamente uno encima del otro, lo cual es increíblemente útil para el diseño. Sin embargo, dentro de nuestro contenedor VBox, vamos a usar un contenedor HBox Y el contenedor HBox hace exactamente lo mismo que el contenedor VBox, pero lo hace en dirección horizontal Ahora, también una palabra de nota, mayoría de los contenedores cambiarán el tamaño de todos sus hijos de tal manera que ocupen todo el espacio disponible en ellos. Entonces, como pueden ver, el contenedor de margen es así de grande. Y luego cuando le puse el contenedor VBox, automáticamente se redimensionó para ocupar tanto espacio como el tamaño del contenedor de margen menos los márgenes Entonces aquí está nuestro margen de 20 píxeles, y realmente no me gusta ese diez. Creo que lo cambiaré en un segundo. Pero aquí está nuestro margen de 20 píxeles y aquí está nuestro margen de diez píxeles. Si no tuviéramos esos márgenes, entonces el contenedor VBox sería del tamaño del contenedor de margen Y no podríamos cambiar ese tamaño. No podríamos hacerlo más pequeño que eso porque así es como funcionan los contenedores. Entonces, volveremos a nuestro contenedor de margen y aumentaremos estos márgenes solo porque. Y ahora, dentro del contenedor HBox, vamos a proporcionar una etiqueta Y la etiqueta, como pueden ver, realidad no se puede ver nada en ella, así que vamos a darle algún texto. Lo que esto va a hacer es que en realidad vamos a crear un indicador aquí, que vamos a conectar para codificar en la siguiente lección que va a mostrar si nuestro tanque está o no listo para disparar o no. Así que tenemos estado, y vamos a cambiar el color de la fuente y todas esas otras cosas buenas. Entonces queremos ir a sobrescrituras de tema, colores, y queremos cambiar el color de fuente para que sea negro, y vamos a cambiar la fuente misma a la fuente de stencil que te proporcioné en el proyecto, porque es agradable y de aspecto militar Y luego iremos a tamaños de fuente, y hagamos eso 25. Y eso no es bueno. Hagamos eso 45. Mucho mejor. Ahora, se deja justificado en la parte superior izquierda, y en realidad lo queremos por encima a la derecha. Entonces hay dos formas de arreglar esto. El primero es que vamos a decirle a nuestro contenedor HBox que se alinee hasta el final, y eso soluciona nuestro problema, mayormente En realidad, sí, lo hace resuelve la mayor parte de nuestro problema porque nuestra etiqueta está donde necesitamos que esté. Y ahora, en lugar de agregar otra etiqueta, vamos a agregar una etiqueta de texto enriquecido. La etiqueta de texto enriquecido es una versión elegante de la etiqueta que tiene mucha funcionalidad adicional. Los puedes usar casi indistintamente. Hay algunas ventajas al usar una sobre la otra. La mayor desventaja que encontré de usar la etiqueta de texto enriquecido es que no siempre mide verticalmente con precisión, dependiendo de la jerarquía de control en la que la uses. Pero como estamos a punto de ver, tiene muchas otras habilidades que simplemente lo hacen realmente genial. Entonces lo primero que vamos a hacer es que vamos a bajar a maquetar y transformar. No, en realidad, no lo estamos. Vamos a ir a maquetación. Y aquí mismo, se puede ver el tamaño mínimo personalizado. Ahora, en la mayoría de los controles, esto por defecto será 00. Lo que hace Gadot es que comenzará con este tamaño mínimo. Es exactamente lo que podrías pensar. Entonces ahora mismo el tamaño mínimo es cero. Por lo que tanto en la dirección horizontal como en la vertical, este control se trata como cero. Sin embargo, verticalmente, en realidad se extiende hasta la altura del contenedor padre, por supuesto, el controlador HBox Pero vertical u horizontalmente, aquí no hay nada. Entonces para horizontalmente en la dirección X, digamos que nuestro mínimo es 200. Entonces ahora se puede ver, al mínimo desnudo expandido a ser de 200 píxeles. Y nos vamos a poner un poco más elegante. Vamos a bajar a las anulaciones de temas, y tenemos muchas más opciones para la etiqueta de texto enriquecido Y lo que queremos es estilos, normales. Bien, no podemos comprobarlo porque ahí no tenemos nada. Pero si extendemos esto, tenemos la opción de cajas de estilo. Entonces vamos a ir a style box flat, y ahora se puede ver que el fondo de la etiqueta está coloreado en. Sin embargo, no queremos ese gran color. Cambiémoslo a negro. Y pongamos algo de texto aquí. Y, por supuesto, ese texto es la fuente incorrecta y el tamaño incorrecto. Así que lo primero que vamos a hacer es cambiar el ¿dónde está? Fuentes. Vamos a cambiar la fuente normal. Y una vez más, no podemos hacer click en él porque no tenemos fuente en él. Vamos a usar la fuente LCD N, que es realmente genial. Entonces ahora puedes ver que tenemos una bonita fuente de aspecto LCD. Vamos a cambiar el tamaño, normal. Oh, estoy usando la equivocada. No es de extrañar. Tamaño de fuente normal, 24. Ahí vamos. Es un poco demasiado grande. Eso es bueno. Ahora, tenemos un pequeño problema aquí en que la fuente de la plantilla está un poco apagada en la dirección vertical, y la fuente LCD está perfectamente centrada Y no hay absolutamente nada que podamos hacer al respecto. Así que vamos a tener que tolerarlo. Podríamos hacerlo si solo estuviéramos usando diseño manual con cada control directamente bajo el control, podríamos empujar perfectamente la X y la Ys, pero quiero en esta lección, quiero mostrarte cómo interactúan los contenedores Entonces ahora queremos ir por debajo de los colores, y creo que el color por defecto, queremos que sea amarillo. Entonces es agradable y con aspecto computacional. Y ahora, este es el poder principal de la etiqueta de texto enriquecido. Tenemos lo que se llama código BB. Y si lo comprobamos, el código BB nos permite usar HTML como formato dentro de nuestra etiqueta. Entonces, por ejemplo, aunque establecemos nuestro color de etiqueta en amarillo, si tuviera que poner aquí un par de etiquetas de color, y usan corchetes y no corchetes angulares como HTML. Entonces, si intentas hacer esto, no va a funcionar. Entonces solo ve con esto. Color tengo dos de ellos ahí. El color es igual al rojo. Y ahora tenemos texto rojo. Y hay mucho formato que puede hacer BB Code. Desafortunadamente, no voy a poder entrar en todo ello, pero si tienes curiosidad, puedes simplemente Google código BB Gadot cuatro, y te llevará directamente a la documentación de Gado y te mostrará todas las etiquetas que son compatibles El que vamos a utilizar va a justificar nuestro texto dentro de la etiqueta. Entonces simplemente vamos a decir, bien. Y ahora la recarga está donde tiene que estar. Afortunadamente, está un poco abarrotado contra el borde de la cosa, así que lo llenaré con un par de espacios adicionales Y ahora eso se ve bastante bien. Obviamente podemos agregar un montón de otros indicadores y doodads a nuestra Pero esto es suficiente para ponernos en marcha. Entonces, si ejecutamos el juego ahora, tenemos una barra de estado. Y en la siguiente lección, te mostraré cómo conectar la barra de estado al código y usar señales para actualizar sus valores. ¿Te ves ahí? 25. Eventos y señales de UI: marcación: Mm hmm. Mm hmm. Bienvenido de nuevo. Antes de comenzar, vamos a duplicar el contenedor HBox para nuestro indicador de estado con Control D. Y la razón por la que vamos a hacer eso es porque queremos tener un segundo indicador para nuestro conteo de matanzas A pesar de que en este momento solo tenemos un tanque en el tablero, vamos a tener más. Y ahora que tenemos múltiples contenedores HBox aquí, vamos a cambiarles el nombre. Entonces cargas el estado y el conteo de matas. Y también es una buena idea cambiar el nombre de las etiquetas de texto enriquecido porque las vamos a estar usando como referencias directas. Entonces necesitamos saber cuáles son para poder decir la diferencia entre. Y la convención de nomenclatura que suelo usar en tal caso es el nombre del control y el valor porque eso lo diferencia entre eso lo diferencia de cualquier etiqueta que estemos usando para designar también la cosa porque tenemos una etiqueta, pero también tenemos Entonces, ¿cómo sabemos la diferencia entre los dos? Bueno, esta es estática y ésta es de valor. Y luego, claro, cambiamos la recarga del texto de recarga a un cero, y también deberíamos cambiar el estado de recarga del otro a listo porque eso es con lo que vamos a empezar Aunque podría ser un poco más inteligente refactorizar esto después para tenerlo configurado en cualquiera que sea el estado actual o inicial del tanque , pero no vamos a hacer eso Sólo lo pondremos a punto. Bien, entonces ahora que todo lo que está listo, necesitamos agregar un par de guiones, y luego podemos conectar todas nuestras señales. Entonces el primer script que vamos a agregar es uno al control real, que, por supuesto, debería renombrarse ahora que lo pienso porque es nuestra UI Y vamos a adjuntar un guión, que puede, por supuesto, hacerse desde aquí o aquí. Y realmente no necesitamos darle su propio nombre de clase, pero vamos a hacerlo de todas formas. Y dentro de la UI, deberíamos obtener referencias a los valores que vamos a cambiar. Que es una etiqueta de texto enriquecido. Bien. Y entonces como siempre, vamos a arrastrar estos por aquí. Necesitamos estas etiquetas para responder a señales de dos lugares diferentes. El valor de recuento de matanzas necesita responder a partir de una señal de cualquiera de los tanques enemigos, y antes que nada, aquí solo tenemos un tanque enemigo, pero vamos a estar reestructurando la escena en futuro cercano para que los tanques enemigos estén en diferentes lugares. Sólo va a pasar por debajo de un nodo secundario para los enemigos, muy probablemente, o tal vez el engendrador, quemaremos ese puente cuando lleguemos a El problema es, es que si cambiamos nuestra jerarquía, entonces como sea que tengamos nuestro tanque enemigo puede cambiar menos que pongamos una referencia a los tanques en el juego, realmente no queremos hacer eso. De igual manera, necesitamos obtener el estado de recarga del jugador, y el jugador donde está bien, pero, ya sabes, aun así Entonces lo que vamos a hacer es que vamos a agregar lo que se llama una carga automática. Así que vamos a ir a nuestra carpeta Scripts, y vamos a crear un nuevo script, y lo vamos a llamar Messenger. Y así es como llamo a todas mis cargas de auto. Puedes llamarlo como quieras. Entonces el mensajero, ahí está. El mensajero no necesita un nombre de clase porque vamos a pasar por la configuración del proyecto, y vamos a ir a Globals, y luego hacer clic en el icono de la carpeta, scripts messenger para agregarlo, y luego presionamos el botón de anuncio Y ahora, lo que ha pasado es que Gadot cargará este guión y lo instanciará como hijo de la escena raíz en el juego junto con la escena que hemos creado Y la forma más fácil de ilustrar eso es seguir adelante y hacerlo. Entonces, si ejecutamos nuestro juego, y si vamos a remoto, podemos ver que tenemos la escena raíz. Aquí está nuestra escena de juego, y ahora también tenemos a nuestro mensajero. Esto significa que podemos acceder a nuestro messenger desde cualquier script de nuestro juego simplemente usando su nombre. Entonces vamos a hacer eso. Antes de hacerlo, sin embargo, necesitamos configurar algunas funciones de ayuda dentro de nuestra interfaz de usuario. Entonces, ¿qué queremos hacer aquí? Lo que queremos hacer es que queremos que la interfaz de usuario responda a dos señales diferentes. Uno, cuando cambia el estado de recarga del jugador y otro cuando cambia el valor del recuento de matanzas Entonces vamos a necesitar proporcionar un par de funciones para hacer eso. Y dentro de este método, todo lo que queremos hacer es querer cambiar el estado de recarga como texto basado en el texto de estado o no, en función del estado. El estado es booleano Entonces, si es cierto, eso significa que estamos recargando. Si es falso, significa que no lo somos. Y normalmente, podríamos decir que estoy aquí, pero en realidad es un poco más ilustrativo de lo que estamos probando. De hecho, podríamos cambiar esto para recargar el estado. Y eso simplemente lo aclararía aún más, de verdad. Entonces, si el estado de recarga es igual a true, entonces el valor del estado de recarga tiene una propiedad llamada text Y a lo que queremos ponerle eso se va a complicar un poco. Así que vamos a marcarlo de nuevo aquí por un segundo. Así que tenemos múltiples cadenas que vamos a necesitar. Entonces comencemos aquí por un segundo. O va a estar recargando o va a estar listo. Sin embargo, si recuerdas, teníamos código BB aquí. Y no queremos tener que escribir este código BB cada vez. Fácilmente podríamos ir así, pero vamos a tener que hacer eso para ambas cuerdas, y es sólo un poco irritante Entonces lo que vamos a hacer es que vamos a definir una constante. Ahora, las constantes son como variables excepto que no se le permite cambiar su valor después de que se hayan establecido Y así como convención de nomenclatura, siempre me gusta poner mis nombres constantes en mayúsculas Entonces nuestra const va a ser recargar. Formato de texto. Y eso es, por supuesto, una cuerda. Y lo que va a ser es que va a ser nuestro código BB. Los dos espacios que necesitamos para asegurarnos de que todo esté correctamente espaciado y un porcentaje s. Y este es un token que vamos a usar para el formateo de cadenas, y veremos cómo funciona eso en un momento. Así que tenemos razón y eso. Entonces ahora lo que queremos hacer aquí es que queremos poner nuestro texto a esta cadena de formato de recarga, y luego usamos el signo de porcentaje para decir, vamos a formatear esta cadena con cualquier cadena que le demos Entonces conseguimos el formato de recargar texto, y luego es Godot automáticamente va a ver este símbolo y luego reemplazar el porcentaje s con la palabra Entonces eso significa que vamos a obtener esta cadena como resultado, y haremos lo mismo aquí abajo. Pero, honestamente, esto también es esto también podría ser machacado un poco más Es decir, técnicamente, podemos hacerlo así. Pero Ahora sólo tenemos que hacerlo una vez. Y entonces haremos lo mismo por nuestro conteo de matanza. Ahora bien, en este caso en particular, no necesitamos proporcionar el nuevo recuento de matanzas. Fácilmente podríamos ponerlo en el jugador y luego pasar el valor aquí como parte de la señal. Pero solo para mantener las cosas simples, lo dejaremos como parte de la propia interfaz de usuario. Entonces el conteo de matanza es un entero, es igual a cero. Y luego, cuando cambie el recuento de matanzas, simplemente vamos a subir nuestra variable por uno y luego estableceremos el valor de conteo de matanza. Igual a los formatos de texto de recarga, y sustituiremos los recuentos de muerte Y lo vamos a hacer correctamente con el adecuado. Ahí vamos. Bien, ahora conectemos nuestras señales. La primera señal que vamos a usar es la señal destruida del tanque enemigo. Entonces volvemos a nuestro mensajero y vamos a definir una señal Y no requiere ningún parámetro. Y luego si vamos a nuestro tanque enemigo, el tanque enemigo así que si recuerdas, nuestro tanque base tiene una función llamada hit, y esa función se llama cuando algún tanque es golpeado con un proyectil, y por lo tanto lo destruirá y reproducirá el efecto de sonido de explosión. Queremos que el tanque enemigo también emita esta señal, también. Entonces aquí es donde hacemos uso de herencia porque el tanque enemigo, que es de clase tanque AI, extiende tanque, lo que significa que ya tiene definido su método de tanque. Entonces no tenemos que hacerlo si no redefinimos esto y simplemente lo llamamos, el tanque enemigo va a tener esta funcionalidad Pero si lo redefinimos, ahora podemos agregar nuestra propia funcionalidad Lo que queremos hacer es que queremos la funcionalidad de las clases base. Entonces usamos la palabra clave super. Entonces decimos super dot Hit. Y eso llamaremos a las clases base método Hit. Entonces además de eso, queremos tener mensajero, tanque enemigo destruido. Emite punto. Ahora, cada vez que cualquier tanque enemigo sea destruido, le dirá a la clase mensajero que emita esa señal. Ahora, nuestra interfaz de usuario en su propio método ready, puede conectarse a esa señal porque, nuevamente, esa clase messenger está disponible para cualquier clase en cualquier lugar y en cualquier momento. Entonces solo hacemos mensajero, tanque enemigo destruido, conectamos, y proporcionamos el método que queremos conectar. Y ahora para el jugador, queremos hacer dos cosas. Para que podamos hacer esto Podemos hacerlo en dos lugares. Queremos que el jugador emita una señal que indique que su estado de recarga ha cambiado No obstante, el jugador es un tanque, no un tanque de IA. Entonces, si tuviéramos que poner esto en tanque, entonces podría estar disponible para cualquier tanque del juego, lo cual en realidad está bien porque solo tenemos conectarnos a la emisión de esa señal del jugador. No sé por qué a mi slock de gorra le gusta apagarse cuando uso mi guión bajo, pero ahí tienes Ahora, queremos conectarnos a esta señal, y la haremos en juego porque el juego tiene acceso a todo lo que necesitamos. Entonces ya nos conectamos al proyectil del jugador disparado aquí. Ahora nos conectaremos a o. no sé por qué no es auto completado, sino lo que sea. Y ¿cuál es el método al que queremos conectarlo? Bueno, necesitamos nuestro nodo UI, así que haremos lo que hicimos aquí para conseguir el tanque enemigo. También podríamos proporcionar una referencia a la interfaz de usuario en el juego. Y en realidad, también vamos a hacer otras cosas con la interfaz de usuario. Así que vamos a hacer una exportación. Y es un control. Sí, sabemos que estás roto ahora mismo. Bien, entonces ahora el jugador se va a conectar a las UI. En realidad, esto no es correcto. Debería ser UI porque en realidad tenemos una clase para UI. Todo bien. Ambos deberían estar bien, y ahora podemos usar Auto Connect. Así que ahora tenemos en el estado de recarga del jugador cambiado. Y aquí hay algo con lo que hay que tener cuidado. Siempre que intentes usar o cuando dejas que Gadot haga un autocompletado de un nombre de función en el método connect, siempre agrega amablemente los paréntesis de llamada al método, y no quieres eso porque Y entonces si intentas eliminarlos, Gadot borra todos los paréntesis Bien, entonces ahora ambos deberían estar conectados. Entonces, si entramos en nuestro juego, podrás ver que nuestro estado está listo. Si disparo, no pasa nada. Bien, vamos a tener que depurar eso. Pero si le disparo al tanque enemigo, debería conseguir un kit. Ahí está. Tanque destruido. Ahora tenemos que matar a la cuenta de uno. Ah, eh, ya veo el problema. En realidad nunca emitimos la señal. Entonces volvemos a tanque debería haber sido lo primero que hice. Entonces vamos a Fire Shell, y lo último que hacemos después de que se dispara el proyectil es simplemente emitir la señal con el valor de la variable de recarga Ahora deberíamos tener correcta. Sí. En realidad, no, no, me equivoqué. No sería la primera vez. Entonces el problema aquí es que cuando se agota el tiempo de espera del temporizador de recarga, necesitamos cambiar necesitamos decirle a la interfaz de usuario que el estado ha cambiado nuevamente Y esto es molesto porque ahora tendríamos que ir a todas partes en el juego que cambiaríamos esta variable y emitiríamos esa señal. Entonces tenemos que hacerlo inteligentemente. Y por eso, una vez más, necesitamos una variable setter o un método setter Entonces definimos un setter para el recargador. Y, por supuesto, recargar es igual al valor, y luego emitimos una señal, y ahora debería ser genial Perfecto. Ahora tenemos una interfaz de usuario completamente funcional. Entonces, lo siguiente que vamos a hacer es echar un vistazo a cómo utilizar algunos trucos inteligentes y componentes de la interfaz de usuario para crear un minimapa 26. Creación de un minimapa: Bienvenida de nuevo. En esta lección, vamos a agregar un minimapa a nuestra interfaz de usuario en el juego, y es mucho más simple de lo que piensas Vamos a utilizar los increíblemente útiles nodos Gado conocidos como sub viewports Si estás familiarizado con versiones anteriores de Gado, solían llamarse solo viewports, pero supongo que confundí a demasiada gente Así que lo primero que vamos a hacer es que vamos a volver a nuestra vista de dos D para que podamos ver nuestra interfaz de usuario aquí. Y queremos agregar un minimapa en la esquina superior derecha de la pantalla Para ello, necesitamos el control de interfaz de usuario conocido como el contenedor sub viewport Como su nombre indica, se trata de un contenedor, que básicamente es solo un control que contendrá una sub ventana gráfica Vamos a estirarlo al tamaño que queramos que sea, y luego vamos a y luego vamos arriba justificarlo con razón con los presets de anclaje correctos También nos vamos a asegurar de que sea cuadrado, diseñar Transformar tamaño 230 por 190. Eso no va a hacer. Digamos 200 por 200. Mucho mejor. Y luego lo deslizaremos un poco de tal manera que quede perfectamente justificado. Ahí vamos. Ahora bien, para poder usar un contenedor de sub viewport, como puedes ver aquí, tenemos una pequeña advertencia que dice que no tiene una sub viewport, así que cambiemos eso Vamos a añadir una sub ventana gráfica. Un puerto de sub view es básicamente una nueva ventana a tu mundo de juego. Renderizará lo que sea visible dentro de ese pequeño subespacio Y en nuestro caso, lo que queremos que sea visible hay una vista de cámara secundaria de nuestro mundo existente. Y no te preocupes, en realidad es mucho menos complicado de lo que parece. Entonces lo que vamos a hacer es que vamos a añadir otra cámara tres D a nuestro mundo principal del juego. Y ésta no tiene que ser actual porque ya vamos a tener una cámara actual en nuestro reproductor. Sin embargo, cambiemos el nombre de esto. llamaremos la espía Cam porque va a flotar por encima de nuestro mundo de juego. Entonces, vamos a traerlo hasta aquí y no hagamos eso. Volvamos aquí. Iremos a ver dos ventanas gráficas Entonces ahora podemos ver lo que ve nuestra cámara. Vamos. Haga clic. Ahí vamos. A veces mi computadora es lenta y gruñona y no le gusta hacer cosas. Bien. Si ahora bajamos y giramos la cámara, tal que hagámoslo de esta manera. Es más fácil. Si giramos la cámara, tal manera que esté orientada hacia abajo, 90 grados, no creo que lo hice bien. Las rotaciones siempre me confunden. ¿Dónde estamos mirando aquí? Oh, estoy mirando al cielo. Bien, es negativo 90. Me atrapa cada vez. Bien, ahora solo arrastramos esto hacia arriba hasta que podamos ver la totalidad del mapa o al menos tanto del mapa como permita Y eso es bueno, creo. O siempre podríamos ir así para que podamos ver esas cosas ahí. Eso es bastante bueno, creo. Notarás por defecto que está renderizando nuestros puntos de navegación Entonces, claro, tenemos que volver a subir a nuestra máscara de llamadas y hacer clic en la capa NavPoints para que no los veamos dentro de la cámara Ahora, todo lo que tenemos que hacer es arrastrar nuestra cámara espía a nuestra sub ventana gráfica Y ahora, si vas a dos D, puedes ver un poco de un lío feo porque lo que está pasando aquí es que el puerto de sub view, que es de 512 píxeles por 512 píxeles no se está estirando correctamente al tamaño del contenedor de sub viewport Afortunadamente, podemos arreglarlo simplemente marcando la opción de estiramiento, y ahora tenemos un pequeño puerto de vista. Entonces lo único que tenemos que hacer ahora es actualizar la cámara espía cuando nuestro jugador se mueva. Y normalmente pensarías que solo criarías la cámara espía al jugador. Pero si haces eso, entonces el jugador tendría que estar en la vista, y en realidad no queremos cambiar nuestra jerarquía aquí Entonces lo que podemos hacer es simplemente darle a la cámara su propio guión. Y como el jugador siempre va a existir, todo lo que tenemos que hacer es exportar una referencia al jugador, y lo llamaremos target y lo haremos un poco h más genérico en que puede tomar cualquier cuerpo físico tres D, pero solo vamos a usarlo para el jugador. Y luego arrastraremos al jugador por aquí. Y ahora, en el método de proceso Spy CAMs, que al parecer, no puedo deletrear. Ahí vamos. Todo lo que tenemos que hacer es actualizar las posiciones X y Z de la cámara para que sea la del jugador. No actualizamos el valor Y porque el valor Y representa la altura, el arriba o abajo, y queremos que se mantenga consistente. Literalmente solo queremos que vaya en las direcciones X o Z con base en el tanque. Entonces la posición global de nuestra cámara, tanto X, Y Z son iguales a los Objetivos posición global punto X y los Objetivos Posición global Z. Y eso debería hacer el trabajo A ver. Sí. Ahora bien, si muevo mi tanque, se puede ver que está actualizando todos esos. Otro ajuste que probablemente deberíamos hacer es orientar la cámara de tal manera que cuando el jugador gire, la cámara gire. Pero voy a dejar eso como un ejercicio para que veas si has dominado esta lección ventanas gráficas son increíblemente útiles en tres D. Incluso puedes usarlas para renderizarlas sobre la superficie de otro objeto Y si tenemos tiempo al final del curso, tal vez voy a entrar en eso como un poco de material extra. Te veré en la siguiente lección. 27. UI 3D con nodos Label3D: Bienvenido de nuevo. Esta lección va a ser bastante corta, y lo que vamos a hacer es mirar una forma rápida de agregar una interfaz de usuario tridimensional, también conocida como una interfaz de usuario diagética en nuestro entorno de tres D. Y vamos a hacer eso poniendo una etiqueta de nombre de estilo World of Warcraft por encima de todos nuestros tanques Entonces, como puedes adivinar, eso requiere agregar un nodo hijo, y el nodo hijo que vamos a estar buscando es la etiqueta tres D. Ahora, por supuesto, necesitamos orientar adecuadamente nuestra etiqueta tres D, así que vamos a traerla aquí, y la moveremos un poco hacia atrás para que esté sobre nuestra torreta. Ahí vamos. Y entonces vamos a abrir su texto. Y como puedes ver, hay algunos ajustes similares a los que obtendrías en tu etiqueta y etiqueta de texto enriquecido. Así que simplemente vamos a lanzar algo de texto de marcador de posición aquí, nombre del tanque Ahora, como pueden ver, sólo podemos ver el nombre del Tanque desde el frente y por la parte posterior. Si miramos a un lado, entonces no vamos a ver nada porque se trata de un verdadero objeto de tres D. Y a veces podrías querer eso, a veces quizás no. Estamos en la variedad tal vez no. Entonces lo que vamos a hacer es que vamos a extender banderas y vamos a cambiar Billboard a habilitado. Cartelera significa que el objeto siempre va a mirar hacia la cámara sin importar cuál sea su orientación. Ahora, también queremos extender un poco nuestro script de tanque, y lo vamos a hacer agregando una variable de exportación. Mm. Y, claro, vamos a arrastrar nuestra etiqueta tres D ahí dentro. Y en nuestro objeto de juego, vamos a cambiar el nombre del jugador y el nombre de los tanques enemigos a valores apropiados. Como ya tenemos desde que ya tenemos una referencia a nuestro jugador, simplemente podemos tomar la propiedad de la etiqueta del nombre del tanque y establecer su texto igual al jugador. Y luego agarramos a nuestro tanque enemigo de la misma manera que lo hicimos cuando nos conectamos como señal y hacemos exactamente lo mismo. Pero con el número apropiado de periodos, ahí vamos. Por lo que ahora puedes ver que el jugador tiene un Bien, tanto el jugador como el tanque enemigo tienen una etiqueta por encima de ellos. Ahora, he estado notando al jugar con la construcción en este punto, que hay algo dentro de los tanques enemigos usuario tanques enemigos inteligencia artificial que está causando un bucle infinito Entonces tal vez te hayas dado cuenta de esto tú mismo. Voy a investigarlo, y antes de pasar a la siguiente lección, voy a arreglarlo y luego hacerles saber cómo arreglarlo ustedes mismos antes de continuar. Pero este es el final del Capítulo nueve. Entonces a pesar de ese error, bien hecho. 28. Inicio del menú: Bienvenido de nuevo. Como prometí, depuré un poco el sistema de puntos de navegación y descubrí que básicamente no teníamos suficientes puntos de navegación dentro del rango de movimiento del tanque para que cuando llegase a un punto en el que solo pudiera seleccionar de un punto en particular, se quedó atascado Y nunca queremos que eso suceda. Entonces agregué un par de puntos extra en el mapa solo para evitar que eso suceda. En términos generales, quieres afinar tu capa de puntos de navegación tal manera que los objetos no se muevan entre sí, y además habrá suficientes puntos para que no se quede atascado así. Uh, también proporcioné un poco de código extra dentro de la función get random NabPoint, básicamente, y esto nunca debería suceder si configuras tus puntos de navegación correctamente Pero si llega al punto en el que el tanque solo tiene un punto para elegir, básicamente está atascado cerca del punto al que actualmente está más y no tiene otros objetivos a los que ir. Así que imprimí una advertencia y establecí el punto de navegación que iba a seleccionar igual a su NavPoint más cercano existente Y esta no es una solución ideal, pero evita que el juego se bloquee. Y en ese punto, te vas a dar cuenta de que algo salió mal y necesitas agregar algunos nodos más a tu cuadrícula de navegación. Bien, con eso fuera del camino, hablemos ahora de lo que estamos aquí para hablar en el capítulo diez. En esta lección, vamos a empezar a desarrollar nuestro juego y a agregar todo el juego como componentes que lo convertirán en un juego y no tanto en un prototipo Y lo primero que vamos a necesitar es un menú de inicio. Entonces, claro, volveremos a nuestra escena de juego. Y ya tenemos una interfaz de usuario en el juego, lo cual es genial, pero ahora podemos agregarle una IU de inicio del juego. Y vamos a ser bastante simples y perezosos al respecto. Básicamente vamos a dejar que la escena principal del juego maneje todos los componentes internos y externos de la interfaz de usuario y simplemente encenderlos y apagarlos según sean necesarios en lugar de cambiar a escenas externas. Para un juego más grande y complicado, eso definitivamente sería una buena idea, pero estamos manteniendo las cosas simples. Entonces, si agregamos un nodo hijo, podríamos agregar un control, pero en su lugar, vamos a agregar un contenedor de panel. ¿Y qué es un contenedor de panel? Un contenedor de panel es un contenedor, similar a los contenedores VBox, H box y margin que hemos usado antes Sin embargo, contiene una imagen de fondo que escalará en función del tamaño de su control. Y podemos cambiar esa imagen de fondo para que en realidad se vea como algo texturado. Pero por lo que estamos haciendo aquí, por defecto es un fondo negro semitransparente, y eso es exactamente lo que queremos porque básicamente solo queremos que el juego se desvanezca cuando aparezca el menú podamos hacer eso como un naufragio completo y obtener lo que tenemos ahí. Le cambiaremos el nombre. Y nuevamente, asegúrate de estar en la pestaña dos D cuando estés editando interfaces de usuario. Entonces ahora vamos a usar otro contenedor nuevo, y este se llama el contenedor central. ¿Y qué hace un contenedor central? Un contenedor central, toma todo lo que hay dentro de él , lo amortigua al tamaño más pequeño posible que pueda ser, y luego lo obliga a centrarse dentro de cualquier control al que esté unido Entonces en este caso, se adjunta al menú de inicio, por lo que va a centrar todos los controles dentro de él. Justo por aquí. Y va a mantener esa fuerza a ese tamaño en particular sin importar qué tamaño cambiemos el tamaño del menú de inicio Entonces dentro de nuestro contenedor central, vamos a usar a nuestro buen amigo el contenedor VBox, y dentro de eso, vamos a agregar una etiqueta Esta etiqueta va a ser el título de nuestro juego, que es Zone Battle. Nos aseguraremos de que esté centrada, aunque la fuente que estamos a punto de usar no se centre particularmente bien. El tamaño de la fuente será de 100, y la fuente en sí será nuestro amigo, la plantilla Entonces, en lugar de ubicarlo por aquí, simplemente podemos ir a Carga Rápida ya que lo hemos cargado antes y luego hacer clic en él aquí mismo, y boom, tenemos una plantilla Ahora, voy a mostrarte un truco muy pulcro. Dentro de su carpeta de proyectos, he proporcionado una textura de camuflaje muy horriblemente llamada Y vamos a usar eso para un efecto especial en nuestro título. Entonces lo primero que vamos a hacer es que vamos a agregar un naufragio de textura como hijo de nuestra etiqueta Y también vamos a renombrar esa etiqueta solo para que podamos o simplemente para que sepamos lo que es. Y nuestro naufragio de textura, necesitamos que sea del tamaño de nuestra etiqueta Entonces como señalamos antes, ya que es hijo de la etiqueta, si decimos completo destrozado, se va a forzar al tamaño de la etiqueta Ahora necesitamos aportar una textura. Así que vamos a arrastrar nuestra textura de camuflaje a la ranura de textura, y ahora es demasiado grande. Entonces vamos al modo expandir y decimos Ignorar tamaño. Desafortunadamente, está aplastado. Entonces cambiamos el modo stretch a tile, y ahora se ve bastante bien. Pero lo voltearemos un poco solo para ver si podemos conseguir una orientación un poco mejor. Uh, también podemos cambiar esto a Sí, eso no va a funcionar. A, Tile es. Bien, esto se ve bastante bien. Y ahora aquí está la parte elegante. Si bajamos volvemos a si volvemos seleccionar nuestro título de juego y bajamos a visibilidad, tenemos una opción llamada Clip Children Y si cambiamos eso por solo clip, ¿qué tan genial es eso? Recorta la textura subyacente a la propia etiqueta. Ahora, por supuesto, no es perfecto porque algunos de estos valores oscuros un poco oscurecen un poco, pero podemos cambiar el color de nuestro fondo masculino de inicio yendo a tema anula estilos y cambiándolo a un nuevo estilo box flat, que es de aspecto feo Entonces vamos a cambiar eso y hacerlo más oscuro. Y también dejaremos caer un poco el Alfa para que podamos ver el fondo a través de él. No va a resolver nuestro problema perfectamente. La oscuridad de la E sigue ahí un poco, pero, ya sabes, se ve bastante bien de todos modos. En realidad, no intentes esto. Vamos a moverlo a, como, un ish verde más oscuro. Sí, no es perfecto, pero se ve un poco mejor. No lo sé. No puedo decirlo realmente De todos modos, lo suficientemente cerca. Se entiende la idea. Entonces a partir de aquí, necesitamos agregar un par de artículos más. Queremos dejar que el jugador configure el número de tanques enemigos con los que inicia el juego. Entonces para hacer eso, necesitamos agregar otro contenedor HBox, que nos proporcionará otra fila para que podamos trabajar Y dentro de ese contenedor HBox, nuevamente, vamos a agregar una etiqueta Y esa etiqueta va a decir enemigos. Y, por supuesto, tendremos que cambiar la fuente y el tamaño de la fuente. Hagamos la fuente 50, y haremos otra carga rápida para recuperar nuestra plantilla También podríamos definir un tema aquí para usar para el menú, pero dado que solo vamos a estar cambiando el texto, y es solo un elemento extra para cambiar, usar normalmente tenemos que soltar el tema en la etiqueta de todos modos. Entonces, ¿cuál es la diferencia entre dejar caer un tema en la etiqueta y dejar caer la fuente y el tamaño de fuente en la etiqueta? Entonces, además de eso, necesitamos tener otro elemento en el contenedor HBox, y este se llama caja de giro Y también lo haremos así que no queremos la caja de giro aquí. Y en realidad, ahora que lo estoy viendo, es casi completamente invisible contra el telón de fondo verde, así que volveremos a cambiar eso. Pero con la etiqueta resaltada, vayamos al diseño de dimensionamiento de contenedores. Y entonces tenemos aquí valores tanto horizontales como verticales. Entonces, en general, un control sólo ocupará tanto espacio como necesite. Y esto se puede cambiar. Y una forma de cambiarlo es haciendo clic en Expandir, lo que significa que ocupará tanto espacio como pueda ocupar dentro del espacio que tenga a su disposición. Entonces en este caso, el contenedor VBox que estamos usando sólo va a ser tan ancho como el texto para el título Entonces eso significa que tenemos tanto espacio disponible para trabajar. Y entonces, claro, verticalmente, va a ser el HBox va a ser tan alto como el texto y el control, lo que sea más Pero horizontalmente hablando, si no hiciéramos esto, entonces ninguno de estos objetos ocuparía todo el ancho del control, lo cual está bien, aunque el control ocupe todo el ancho del control padre. Entonces lo que queremos hacer, como vimos, es ensanchar esto para que ocupe todo el espacio disponible para ello y nos deje la pequeña caja de giro ahí mismo Ahora, desafortunadamente, la única parte del cuadro giratorio que podemos cambiar es el color del texto y los botones de flecha. Y sólo podemos hacer eso a través de la definición de tema, que es algo detestable Así que sólo vamos a dejarlo como está. Pero haremos un par de cambios en la propia caja de giro. Vamos a cambiar la alineación del texto al centro, y vamos a cambiar el valor mínimo a uno porque de lo contrario sería un juego aburrido. Y vamos a cambiar el valor máximo a siete porque eso es todo lo que nuestro mapa pueda manejar cómodamente. Siempre podríamos cambiar eso si quisiéramos, y lo haremos redondeado para que solo escale en valores enteros enteros. El valor es uno, el valor máximo es siete. Bien, eso se ve bien. Ahora cambiemos de nuevo este color porque ya no nos está funcionando. Siempre hago eso. Siempre trato de arrastrar las flechas en lugar del Bien, eso es un poco más parecido. Y por último, vamos a necesitar dos botones. Así que agregamos nodo hijo de nuevo, y usamos un botón. El primer botón va a ser nuestro botón de inicio de juego. Y le cambiaremos el nombre como tal. Siempre es una buena idea cambiar el nombre de tus controles importantes de la interfaz de usuario, porque como puedes ver aquí, la jerarquía de la interfaz de usuario tiende a desordenarse realmente muy rápido Así que siempre es bueno poder ver lo que estás haciendo en cualquier momento. Y añadiremos un botón más. Y éste nos permitirá dejar el juego. Dios no lo quiera Y ahora, claro, tendremos que ir a las anulaciones de ellos y volver a cambiar las fuentes Entonces el tamaño de fuente es 50. La fuente en sí es, de nuevo, stencil. Y luego haremos lo mismo para empezar. Si estuviéramos haciendo algo más involucrado que solo cambiar la fuente y el tamaño, definitivamente ya habría creado un tema. Pero, sí. Bien. Entonces esta es nuestra pantalla de título. Y en la siguiente lección, vamos a utilizar lo que hemos aprendido aquí para crear una pantalla de pausa para que aparezca en medio del juego. Y luego en la lección posterior a eso, los conectaremos al código para que funcionen. Te veré ahí. 29. Menú de pausa: Bienvenida de nuevo. En esta lección, vamos a construir un menú de pausa que podamos usar para pausar el juego. Como habrás adivinado, nuestra interfaz de usuario se está desordenando un poco aquí, así que vamos a hacer clic en el globo ocular junto al menú de inicio para desactivar su visibilidad Ahora podemos trabajar sin trabas. Vamos a agregar otro nodo hijo. Y éste va a ser un contenedor central. Y la razón por la que queremos un contenedor central es porque nuestro menú de pausa no va a ocupar la totalidad de la pantalla. Entonces queremos que se centre en el centro de la pantalla. Entonces si hacemos completo destrozado aquí y vamos a cambiar esto al menú de pausa Ahora, dentro de esto, vamos a usar otro contenedor de panel. Ahora, claro, fíjate que no puedes ver el contenedor del panel, y eso es porque, como mencioné en la lección anterior, el contenedor central aplasta todo a su tamaño mínimo absoluto Entonces hay dos formas de arreglar esto. El primero es que podemos ir bajo diseño y transformar. No, no está bajo transformación. Está bajo diseño. Tamaño mínimo personalizado. Si tuviéramos que cambiar esto, entonces se puede ver que el control estaría haciendo cumplir un tamaño mínimo absoluto, pero no necesitamos hacerlo Da click en esto y restablecerlo de nuevo a cero porque todo lo que vamos a poner dentro del contenedor del panel va a dimensionarlo para nosotros. Y entonces de esa manera, no tenemos que preocuparnos por reajustar ese tamaño mínimo personalizado cada vez cambiamos el tamaño de nuestro contenedor de panel Entonces lo primero que vamos a agregar es un contenedor de margen. Y como hemos mencionado antes, un contenedor de margen literalmente solo proporciona la capacidad agregar márgenes a las afueras de nuestro contenido existente, lo que se ajustará una vez que realmente tengamos algunas cosas allí porque en realidad hay formas de lidiar con esa tontería por la que la fuente de la plantilla que estamos usando está un poco fuera de lugar. No podemos hacer nada al respecto en los botones, pero podemos hacer algo al respecto para el encabezado del menú, para lo cual vamos a usarlo. Vamos a agregar otro nodo hijo, y este va a ser un contenedor VBox Y dentro del contenedor VBox, vamos a agregar otra etiqueta Y claro, esta etiqueta va a decir Menú de pausa. Y lo centraremos, y luego bajaremos a hemovides, claro, el tamaño de la fuente va a ser 45 y la fuente, de nuevo, es Pareciendo un poco decente. Ahora, nos vamos a poner un poco de fantasía, y vamos a agarrar un nuevo tipo de control llamado separador H. Y el separador H es increíblemente útil porque básicamente proporciona la capacidad de agregar líneas que separarán tu contenido, y puedes controlar la apariencia de esas líneas de muchas maneras diferentes. Entonces la forma en que lo vamos a hacer es que vamos a ir a themoide otra vez, y vamos a cambiar el estilo separador, y va a ser un nuevo estilo de línea, que es un tipo de estilo que aún no hemos visto. Y luego a medida que lo abrimos, el color de la línea, vamos a cambiarlo a blanco para que coincida con nuestro texto. Y le vamos a dar un grosor de dos porque ¿por qué no? Y vamos a cambiar los márgenes de contenido. Y vamos a cambiar el margen de contenido superior a unos 16. Y como pueden ver, se levanta. A pesar de que el control está técnicamente aquí, levanta las líneas para que parezca que está más cerca de nuestra fuente. Y ahora que tenemos esto ahora que tenemos la fuente aquí, en realidad podemos alterar un poco nuestros márgenes tal manera que podamos hacer que se vea un poco mejor. Entonces, si volvemos a nuestro contenedor de margen y pasamos por debajo de las constantes Themoides, ahora podemos cambiar los Entonces comencemos con unos buenos diez píxeles por todas partes, y eso se ve bastante bien hasta ahora. Así podremos ajustarlo más una vez que tengamos nuestros otros botones, y vamos a añadir tres nuevos botones. ¿O vamos a añadir dos botones nuevos? Creo que vamos a añadir dos botones nuevos. Originalmente, estaba pensando que haríamos un quit to desktop, pero podemos hacer un quit to title. Entonces nuestro primer botón simplemente va a ser un botón de Zoom, que nos llevará de vuelta al juego, y nuestro segundo botón será un botón de salir al título. Entonces, claro, el Zoom va a decir, Zoom, y dejar de titularse va a decir dejar de titularse. Y ahora, aquí hay un truco realmente inteligente. Si mantienes pulsado Control y haces clic izquierdo para seleccionar varios nodos, si tienen propiedades en común, puedes cambiarlos todos a la vez. Entonces con estos dos seleccionados, ahora vamos a ellos sobre paseos, y podemos cambiar las fuentes y los tamaños de fuente sin tener que hacerlo individualmente. Carga tan rápida, stencil. Boom, ¿qué tan genial es eso? Y ahora vamos a ir hasta aquí. Y vamos con 40. Parece correcto. Y haremos doble clic aquí para volver a centrarlo. Y eso en realidad se ve bastante bien. Uh, los márgenes son, los márgenes son buenos. Bien. Ese es nuestro menú de pausa. Para que podamos hacer clic en la visibilidad para ocultarla. Y ahora en la siguiente lección, vamos a conectarlo con código y agregar la capacidad de iniciar y pausar el juego. Y si, te veo ahí. 30. Gestor del juego: estados inicial/final: Bienvenido de nuevo. En esta lección, vamos a escribir el código que conectará nuestros menús de inicio y pausa, así como agregar la capacidad para que el jugador muera y sea pateado de nuevo al menú de inicio para que pueda volver a intentarlo. Para hacer esto, sin embargo, necesitamos establecer un poco de marco. Entonces lo primero que tenemos que hacer, obviamente, es crear scripts tanto para el menú de inicio como para el menú de pausa. Y ahora que nuestra carpeta de scripts se está llenando un poco, agregaremos una nueva carpeta para poner nuestros scripts de interfaz de usuario en ella Y también debemos crear referencias a nuestro menú de inicio y pausa dentro de nuestro juego, también. Y obviamente, queremos que el menú de inicio se muestre cuando el juego se cargue por primera vez. Entonces, en el método listo para nuestro objeto de juego, podemos decirle a nuestro menú de inicio que se muestre. Ahora, tenemos un pequeño problema. Aunque se muestre el menú de inicio, el jugador aún puede moverse y el tanque enemigo aún puede moverse. Y esto se debe a que en realidad no hemos pausado ninguno de los procesamientos que sucederían mientras el juego se está ejecutando porque el menú se está mostrando Y queremos hacerlo tanto para el menú de pausa como para el menú de inicio. Ahora, podríamos entrar en los métodos de proceso para nuestros tanques y para nuestro juego y para todo lo demás y para la entrada de teclas no manejadas y básicamente verificar para ver si alguno de los menús se está mostrando y luego regresar prematuramente de Pero eso es mucho trabajo. Y la marca de un buen programador de juegos es una mayor sensación de pereza Entonces lo que vamos a hacer es que vamos a usar lo que se llama la propiedad pausada del árbol de escenas ¡Vaya! También vamos a golpear a un montón de patones aleatorios que no tienen absolutamente nada que ver con lo que estamos haciendo . Bien. Entonces, para tener acceso al árbol de escenas, utilizamos el método get tree. Y hay una propiedad del árbol de escena llamada pausado. Ahora bien, si lo establecemos en true, eso significa que ninguno de los procesamientos va a ocurrir. Entonces ahora si tuviéramos que ejecutar nuestro juego, se puede ver que absolutamente nada está pasando. I I Presiono alguna de las teclas, el juego no correrá o el tanque no se moverá por ahí. El único problema es que si hago clic bien, quiero decir, aún no hemos puesto ningún código detrás de ellos, pero permítanme hacerlo con fines ilustrativos. Entonces vamos a nuestro menú Inicio, y conectaremos el botón de salir, y lo haremos pasando a la pestaña de señales y obteniendo la señal presionada. Y si hacemos clic en Ir a la fuente, entonces irá directo al objeto que está transmitiendo la señal. Queremos desplazarnos un poco hacia arriba porque en realidad queremos adjuntarlo al script del menú Inicio. Entonces ahora solo digamos print, quit pressed. Entonces ahora si intentamos salir al escritorio, notarás que aquí no estamos viendo nada en nuestro rincón, y eso es porque, claro, nuestra interfaz de usuario tampoco se está procesando. Entonces la forma de cambiar eso es hacer clic en el componente de la interfaz de usuario, el control. Y esto funciona para cualquier nodo, realmente, pero sólo lo vamos a usar para nuestros menús de inicio y pausa. Y quieres ir bajo proceso. Y luego cambiamos el modo de proceso de heredar a siempre Y esto quiere decir que aunque el árbol de escenas esté en pausa, este objeto continuará procesándose Entonces ahora si volvemos a empezar nuestro juego, e intentamos salir, verás que el método quit pressed ha disparado y el mensaje ha aparecido en la consola. Entonces para dejar nuestro juego, solo tenemos que conseguir una referencia a nuestro árbol. Y luego simplemente decir dejar de fumar. Ahora, en un juego más pulido, querrías agregar un diálogo que diga: ¿ De verdad quieres dejar de fumar? Sí o no. En realidad deberías tener suficientes herramientas a tu disposición para crear una. Entonces, si decides que quieres hacer un poco de programación extra para hacer algo de aprendizaje, te pediría esta lección para agregar un cuadro de diálogo de confirmación que aparece cuando se presiona el botón salir y solo saldremos del juego si botón sí del se ha pulsado el botón sí del diálogo confirmado. Entonces ahora también queremos cablear el botón de Inicio también. Y bien podríamos dar ambos menús, nombres de clases y deletrearlos correctamente, claro. Y por supuesto, queremos conectar ambos botones del menú de pausa, también. Y en el caso del menú de pausa, queremos retomar el juego cuando se reanude Entonces, naturalmente, en este caso, vamos a retomarlo y de hecho, necesitamos establecer el proceso en nuestro menú de pausa también para siempre. Entonces, por supuesto, cuando retomamos, pausa es igual a falsa, y ocultaremos el menú de pausa. Ahora que tenemos todos nuestros talones conectados, necesitamos agregarles funcionalidad Entonces, en el menú Inicio, tenemos nuestro método pulsado con el botón de inicio. Y como puedes ver, el menú Inicio es un hijo del juego, y vamos a necesitar que el juego reaccione al botón del menú de inicio presionado porque queremos que el juego haga toda la contabilidad requerida para iniciar el juego cuando se haya pulsado este botón Godot tiene un lema que es una guía para dictar cómo deben interactuar padres e hijos Y esa pauta se llama call down signal Up. Lo que eso significa es que el juego puede manipular el menú de inicio directamente como vimos aquí por el juego llamando al método Start Men's show, pero el menú de inicio debería enviar una señal y dejar que otros nodos decidan qué hacer con él. Y como el juego es el padre del menú de inicio, entonces naturalmente reaccionaría a esa señal porque esencialmente estamos subiendo en la jerarquía. Por lo que el menú de inicio debería disparar una señal para que el juego reaccione. Ahora, el problema es, es que el juego se pausará cuando se muestre el menú de inicio, por lo que el menú del juego en realidad no podrá reaccionar Así que en realidad tenemos que poner tenemos que hacer dos cosas. De hecho, tenemos que poner el um sin pausa del árbol en el objeto del botón de inicio mismo, lo cual está bien Y luego tenemos que disparar un mensaje para que el juego y cualquier otro objeto interesado sepan que se ha iniciado un nuevo juego. Y así vamos a hacer eso. Obtenemos árbol pausado, igual falso Y luego entraremos en nuestro mensajero y definiremos una nueva señal. Mm hmm. Y nuestro menú de inicio encenderá esa señal. Y en realidad, otra cosa que tiene que hacer es esconderse. Entonces, actualmente, el juego realmente no va a hacer nada cuando comience el juego sino que conectará la señal de todos modos. Oh, lo hice mal. Es conectar Como dije, ahora mismo, no hace nada. Entonces veamos si eso realmente funciona. Vaya, tenemos un error. Y antes me topé con este error. No estoy del todo seguro de qué se trata, pero básicamente lo que está sucediendo es que por alguna razón, el NavPoint se está volviendo nulo cuando el tanque está saliendo de su estado inactivo, y eso es un problema Entonces si volvemos a nuestro estado de caza, así que si el objeto monitoreado está inactivo, verificamos para ver si hay un NavPoint Obtendremos el NavPoint y luego el objeto monitoreado inactivo es falso Pero eso supone que eso realmente funciona. Ahora bien, si eso no funciona, va a caer hasta el punto en el que asume que se ha establecido el NaPoint Entonces lo que tenemos que hacer aquí es que solo haremos una pequeña salvaguardia que diga, Si los objetos monitoreados más cercanos a NavPoint es igual a nulo, bueno, en realidad, no, no tenemos que hacerlo aquí Lo haremos aquí arriba. Entonces, si los objetos monitoreados más cercanos a NaPoint no son nulos, se puede establecer inactivo en false De lo contrario, en el siguiente ciclo, queremos volver a intentarlo. Ahora, también es posible que necesitemos volver a ajustar nuestra calificación de navegación Voy a investigar eso con un poco más de pruebas después de esta lección para ver si ese es el caso. Pero esto definitivamente nos ahorrará algunos problemas porque si el tanque nunca se mueve realmente, entonces sabemos que ese es el problema. Eso no es capaz de encontrar un punto Av. Esto podría ser solo una falla que tiene algo que ver con la pausa del juego. Pero sí. Entonces volvamos a esto, y veremos si eso funciona, y debería. Y él y el tanque enemigo se mueve y así sucesivamente y así sucesivamente. Bien, ahora queremos que aparezca el menú de pausa cuando se presiona la tecla de escape, y actualmente estamos haciendo todas nuestras entradas de teclas en la entrada de teclas no manejadas del juego, pero también podríamos hacerlo en el propio menú de pausa Si la memoria sirve solo porque no es visible no significa que no va a obtener eventos de pulsación de teclas Entonces probemos esa teoría. Y si me equivoco, entonces simplemente lo pondremos donde originalmente lo íbamos a poner. Si la entrada es pulsación física de teclas, escape y no visible, entonces queremos pausar el juego, y simplemente lo hacemos de nuevo por get tree, pausa como igual a true y show Bien, me acabo de dar cuenta de que me acabo de dar cuenta de un ligero bicho. Así que en realidad no estamos comprobando para ver si el juego se está ejecutando todavía. Entonces, si golpeo escapar ahora, vamos a conseguir un menú de pausa. Y eso no queremos. Entonces, solo queremos que esto suceda si no es visible, pero también bueno, en realidad, en vez de, si no es visible, vamos a comprobar para ver si el árbol ya se ha detenido Si no se pausa el árbol, entonces queremos hacer eso. Y ahí vamos. Así que ahora vamos a empezar el juego y ahora podemos hacer una pausa. Así que ya hemos manejado nuestro botón Zoom, así que a continuación tenemos que manejar nuestro botón de salir al título. Y, por supuesto, la forma más fácil de hacerlo es sumar otra señal. Y emitiremos esa señal desde nuestro menú de pausa. Y queremos que el menú de inicio monitoree esta señal. Todo bien. ¿Dónde está mi comienzo? Ahí está. Entonces en el método listo de nuestro menú de inicio, nos conectaremos a él. En realidad, podemos hacer un poco de atajo aquí. Entonces, lo que haríamos es proporcionar un nombre de función aquí, y luego proporcionaríamos una función aquí abajo. Pero todo lo que la función va a hacer es simplemente mostrar el menú de inicio, y hay una manera mucho más rápida de hacerlo. Vamos a usar lo que se llama una función Lambda. Y una función Lambda es literalmente solo una función que se define en línea sin nombre. Así que podemos proporcionar una definición completa de función aquí en lugar de un nombre de función. Y lo hacemos simplemente proporcionando la palabra clave funk y los argumentos de la función como lo haríamos aquí, pero no le damos un nombre, y luego simplemente agregamos el código después Entonces en este caso, el código literalmente solo va a ser para mostrar el menú de inicio. Ahora, estamos estamos en pausa o estamos en el menú Inicio. Y vamos a Inicio. El juego se está ejecutando. Pausa. Salir al título. Olvidé ocultar el menú de pausa. Pero, sí, así es como funciona eso. Y ahora si fuéramos demasiado bien, no podemos un juego nuevo porque el menú de pausa sigue siendo. Bien, así que deja de titularse, emite. Escóndete Y ahora deberíamos ser dorados. Y lo estamos. Es bastante genial. Bien, cuando salimos al título, salimos al escritorio. Se acabó el juego. Bien, ahora que podemos tener un menú de inicio y un menú de pausa, necesitamos configurar los estados del juego de tal manera que el juego salga el juego mostrará un mensaje y luego saldrá de nuevo al menú de inicio después de que el jugador muera. Y, nuevamente, la forma más fácil de hacerlo es proporcionar una función global. En realidad, no, ya no tiene el tanque No, hicimos eso lo hicimos con cáscara. Bueno, podemos ponerlo aquí. Por lo que podemos proporcionar una señal para cuando un tanque ha sido destruido. Y si abrimos nuestro guión de shell, ya que aquí ya estamos manejando la colisión del tanque , sí, podríamos hacerlo. Podemos hacerlo aquí. Podríamos hacerlo aquí o podríamos hacerlo dentro del método hit. Cualquiera de los dos es perfectamente aceptable. Pero si en realidad, ¿sabes qué? La forma más lógica de hacerlo. Lo siento, sigo rebotando por aquí. Pero si volvemos al tanque, tenemos una variable destruida, y una vez más, setters Destruido equivale a valor Mensajero, en realidad, tenemos que cambiar esto porque es para cualquier tanque. Tanque mensajero destruido, emita auto. Self es una palabra clave especial que indica el objeto que actualmente está ejecutando el script. Bien. Sí. Ayuda si deletreo las cosas correctamente. Boom. Ahí vamos. Bien, ahora, de nuevo, el único tanque cuyo mensaje nos importa es el tanque del jugador. Aunque esto en realidad es algo redundante, dado que en nuestro tanque enemigo, tenemos, eh, eh. Bien. Bien. Sí, aquí tenemos algunas señales redundantes, que normalmente quieres evitar, pero en este caso, sí queremos diferenciar entre el tanque enemigo y ser destruido y solo un tanque en general siendo destruido. Entonces en este caso, queremos conectarnos al método del tanque destruido del jugador. Aunque, ya sabes, si ese es el caso, no tenemos que ponerlo aquí. Porque aquí arriba ya tenemos varias señales. Y luego volveremos aquí abajo y se acaba de destruir un poco. Y entonces de esa manera, el juego puede conectarse con método de los jugadores destruidos. Lo que activará el final del juego. Y, por supuesto, eso significa que vamos a necesitar un poco más de interfaz de usuario. Entonces vamos a crear eso ahora. Vayamos al juego, y esto en realidad va a ser parte de la interfaz de usuario. Entonces podemos arrojar esto aquí. Será un hagámoslo un contenedor de panel. Sí. Será sobre el tamaño dar o tomar, y lo centraremos, que es otra manera. Esta es otra forma de centrar las cosas que no sea usar un contenedor central No obstante, si cambias el tamaño del mismo más tarde, vas a tener que volver a centrarlo. Entonces, si voy así, ahora está fuera de kilter, así que tendría que volver a centrarlo. Juego sobre diálogo. Etiqueta de nodo hijo. En realidad, no. Queremos un panel queremos un contenedor de margen. Voy a poner esos márgenes en un poco. Constantes Themoides. Vamos a darles a todos quince. Contenedor de margen. Etiqueta. La alineación horizontal ahora está centrada. Y ellos anulan. Carga rápida nuestra fuente stencil, cambia el tamaño del texto a mucho más grande Ahí vamos. Y ahora podemos agregar el código para vomitar esto y hacer una pausa por unos momentos y luego volver al menú de inicio. Entonces, claro, vamos a necesitar volver a nuestro juego, y exportaremos otra referencia. Todo bien. Y una vez que tenemos nuestro juego por encima de la demostración del diálogo, necesitamos pausar el juego y luego terminar el juego después de, digamos, unos 2 segundos. Entonces, en el método on player destroyed, usamos la palabra clave Awet Y lo que eso significa es que va a pausar el procesamiento de este guión en particular, en este caso, juego hasta haya disparado cualquier señal que indiques. Entonces lo que queremos hacer es querer conseguir nuestro árbol, y vamos a llamar a Create Ti que es el equivalente a crear un nodo temporizador como lo hicimos para el temporizador de recarga de tanques, pero es algo así como hecho de manera invisible Básicamente crea un nuevo nodo temporizador y lo conecta al árbol principal con este número de retardo de cuenta regresiva en segundos, y luego lo inicia Y queremos indicar que estamos esperando el método de tiempo de espera de este temporizador o señal de tiempo de espera, que se llama cuando el temporizador se agota Y también queremos conectar a esa señal nuestro método de manejador de endgame Ahora, desafortunadamente, esto no congela el juego. No hace una pausa en el árbol de escenas, como lo hicimos nosotros para hacer una pausa en el juego Y queremos eso porque no queremos pausar el juego porque si tuviéramos que pausar el juego en cuanto surgiera el juego sobre el diálogo, entonces cortaría la reproducción del sonido. Entonces el jugador moriría. Se produciría el sonido de explosión. Pero entonces saldría el diálogo y el árbol se detendría y y el árbol se detendría y en realidad no escucharíamos la explosión. Entonces es por eso que no queremos hacer nuestro punto Getree universal pausó llamada igual al árbol cuando destruimos al No obstante, sí necesitamos poner en juego un par de salvaguardas para evitar que las cosas sucedan mientras el jugador está muerto, porque, por ejemplo, si no les decimos a los tanques enemigos que dejen de disparar al jugador muerto, seguirán disparándole, lo que solo agrega insulto a la lesión Entonces bajo estado de disparo, lo arreglamos por en lugar de disparar incondicionalmente un proyectil, agregamos un cheque para ver si el objeto monitoreado, que es, por supuesto, el tanque enemigo, si es objetivo, que es el jugador está destruido o si no está destruido, no destruido, entonces disparamos un Y si se destruye, lo ignoramos. También necesitamos arreglar un error leve en el setter destruido de nuestro Tanque porque lo que estaba sucediendo aquí era que estábamos emitiendo la señal destruida independientemente del estado de la variable destruida Y sólo queremos admitir la señal destruida cuando el tanque realmente ha sido destruido, lo que significa que cuando se destruye es igual a verdad. Entonces lanzamos un check in aquí. Y la razón que importa es que si el jugador muriera y nosotros volviéramos al menú principal y luego volviéramos enseguida para comenzar un nuevo juego, el jugador seguiría muerto. Así que ahora en el inicio del juego, agregamos un jugador destruido Águilas False para voltear al jugador a un estado activo para que podamos jugar una nueva partida Desafortunadamente, ninguna de las otras variables que hemos establecido será igual a lo que se habrá restablecido. Por lo que el jugador mantendrá su antiguo conteo de Matar y tal. Y en realidad podemos cambiar eso. Entonces, si pasamos por debajo de UI, Kill count, podemos restablecerlo a cero. También podría ser una buena idea simplemente Sí, hagámoslo. Entonces, una mejor idea es en realidad tener el conteo de muertes o que la interfaz de usuario se conecte al método de inicio del juego. Porque múltiples cosas pueden conectarse a una misma señal. Y en realidad, no queremos hacerlo aquí. Queremos hacerlo dentro de la propia interfaz de usuario porque entonces eso mantiene todo autónomo. Entonces messenger, inicia juego, conéctate en Iniciar juego. Y luego en el juego OnStart, queremos volver a poner el conteo de matanzas a cero Ahora, desafortunadamente, las posiciones iniciales de los tanques jugadores y los tanques enemigos no se habrán restablecido, pero vamos a arreglarlo en la siguiente lección cuando implementemos un sistema de desove real Ahora, déjame asegurarme de que no me estoy olvidando de nada. Entonces el estado de disparo es bueno. El tanque destruido es bueno. Hemos hecho nuestras cosas en el juego. Entonces, claro, vamos a conectar endgame y en endgame, ocultamos el juego sobre diálogo y simplemente emitimos la señal de salir al título Y, claro, tenemos que volver a congelar el juego cuando vuelva a la pantalla de título, y no creo que haya hecho eso. Vamos a revisar. Bien, juego Cart. Que el enemigo me mate. Bien, entonces el jugador no se va a mover, pero como puedes escuchar, en realidad no hemos pausado el árbol Entonces vamos a necesitar hacer eso. Entonces en el final del juego, tenemos a Messenger renunciado a Title Amit. Entonces eso significa que el juego Bueno, el menú de inicio se ha conectado rápido a Title it Funk Show Y aquí, así que en realidad queremos agregar otra línea a nuestra Lambda aquí, que hará una pausa en el árbol. Así que podemos formatear esto un poco mejor simplemente pulsando Enter ahí. A Godot no le va a importar. Y entonces vamos a hacer Get Tree Casi igual verdad. Y eso debería resolver el problema. Y lo hace. Bien. Entonces ahora tenemos, hay una cosa más que tenemos que hacer, obviamente, y tenemos que verificar para ver si el jugador ha matado a todos los tanques enemigos, y si lo han hecho, entonces el juego debería haber terminado en ese sentido. O al menos, debería reiniciarse y reaparecer un número determinado de tanques Pero no vamos a hacer eso ahora. Eso vamos a hacer como parte del desarrollo del engendrador enemigo, lo que vamos a hacer en la siguiente lección 31. Sistema de engorde enemigos: Bienvenido de nuevo. En esta lección, vamos a codificar un sistema de desove que va a manejar insertar tanto a nuestro jugador nuestros enemigos en el mapa Pero antes de llegar a la codificación, hay algo de limpieza que tenemos que hacer. Entonces lo primero que debemos hacer es que deberíamos ir a nuestra arena, y debemos agregar un nuevo NavPoint porque necesitamos indicar dónde genera el jugador, también Entonces ya tenemos nuestra escena NavPoint, y la arrastraremos a la lista Una vez que esté ahí, le cambiaremos el nombre player spawn. Vamos a usar el nombre del engendro para indicar que ese es el punto de generación en el que el jugador debe desovar Además de eso, queremos cambiar el color de los puntos de generación que sepamos que es específicamente para el jugador Entonces, si hacemos clic derecho sobre él y seleccionamos hijos editables, ahora tenemos acceso a los hijos del objeto Como mencioné en una lección anterior, la malla es un recurso, y como todos los puntos de generación provienen de una misma escena, todos comparten el mismo recurso, lo que significa que si cambio esta malla, va a cambiarlos todos, así que no queremos eso Entonces ampliamos el desplegable y decimos hacer único, recursivo Y la razón por la que decimos recursivo y no solo hacemos único es que también queremos que el material dentro de la malla sea único, también Entonces ahora podemos ampliar esto e ir al material y cambiar su albedo y convertirlo en el color que quieras Elegí el verde. Y luego tenemos que mover a los jugadores engendrados a otro lugar. Voy a ponerlo en la misma esquina del mapa solo para que el jugador no genere encima de los oponentes Y también voy a cambiar la rotación del punto de spawn para que podamos indicar el origen en el que va a desovar el jugador Así que van a desovar en la ubicación con la rotación de este punto de desove en particular Y entonces lo siguiente que tenemos que hacer es necesitamos modificar realmente nuestro juego para tener en cuenta el hecho de que vamos a estar usando un nodo spawner Entonces lo primero que debemos hacer es eliminar el tanque jugador y el tanque enemigo porque el spawner va a estar sumando esos a la escena Y también necesitaremos agregar un spawner. Y también, sería una buena idea en este punto subdividir el objeto del juego en la jugable y la sección de interfaz de usuario Así que vamos a añadir un nodo hijo, y vamos a llamarlo playfield, y sólo va a ser de tipo node Nodo es el tipo de objeto predeterminado de nivel más bajo que puedes tener en Godot Y es muy útil para cuando quieras decir, quiero algo en una escena, pero no quiero que sea nada. Los nodos son geniales para agrupar cosas como estamos a punto de ver. Entonces cambiaremos el nombre de este nodo a campo de juego, y arrastraremos la arena debajo él de tal manera que sea un hijo del campo de juego Y el campo de juego también va a necesitar un spawner, que también va a ser Y claro, el spawner va a necesitar un script adjunto Y cambiará su nombre de clase a spawner. Y ahora estamos listos para comenzar a crear nuestro sistema de spawn. Lo primero que tendremos que hacer es dar cuerpo al spanor El engendrador necesita manejar múltiples cosas. Necesita configurar algunas señales. Entonces, claro, le daremos una función lista. Va a engendrar tanques enemigos. Y no sólo va a generar el tanque jugador, sino que también va a devolver ese tanque jugador al nodo de llamada porque queremos poder ponerlo en el mundo del juego Y no sólo queremos ponerlo en el mundo del juego, sino que también necesitamos conectar algunas señales y cosas al objeto del juego. Por lo que es un poco más fácil hacerlo devolviendo el objeto jugador. Pero también podemos pasar en el objeto de conexión, lo que vamos a hacer por los tanques enemigos de todos modos. Entonces ahora tenemos nuestros tres métodos, y por supuesto, esto se va a quejar porque quiere devolver un valor, y aún no tenemos un valor. Entonces ahora tenemos esos tropezados. Y claro, vamos a necesitar referencias a los archivos de escena que vamos a estar instanciando, que, por supuesto, son el tanque y el tanque de IA Entonces jugador tanque prefabricado es una escena llena. Y el tanque enemigo prefabricado también es una escena repleta. También necesitamos saber la cantidad de tanques enemigos que vamos a engendrar porque tenemos ese spinner en el menú de inicio Y va a por defecto a uno Y eso debería ser suficiente para que empecemos. Entonces, si entramos en el juego, en realidad, deberíamos entrar en el guión del juego. Entonces ya tenemos un montón de cosas aquí que hicimos en la lista para el guión del juego que presume que el jugador y el tanque enemigo ya están en la escena cuando comienza el juego Ese ya no es el caso, pero aún necesitamos este código. Entonces, en lugar de intentar recordarlo todo, solo vamos a controlar K y comentarlo todo. Y en nuestro inicio de juego, ahora tenemos información que hay que tratar. Así que pasemos por ahí. Y luego volveremos a eso. Puedes ignorar este error si lo estás obteniendo. Es una especie de bicho raro que Godot lanza. No apareció en ediciones anteriores, por lo que, presumiblemente, se arreglará No afecta nada de lo que estamos haciendo ahora. Bien, entonces en el spawner, ¿qué tenemos que hacer? Bueno, de nuevo, necesitamos engendrar el tanque jugador, y la forma más fácil de hacerlo, por supuesto, es crear uno nuevo Entonces var player va a ser un tanque. Y va a ser una instancia del jugador tanque prefabricado Entonces jugador tanque prefab instanciates y sólo para estar excesivamente especificando al respecto, podemos lanzarlo diciendo como Y ahora tenemos una copia de un tanque que podemos usar como nuestro jugador. Para que podamos devolver jugador. Pero vamos a necesitar hacer más que esto. También vamos a necesitar proporcionar una referencia al campo de juego, específicamente al objeto arena porque vamos a necesitar poder consultar sus puntos de generación. Y no queremos simplemente agarrar el nodo de puntos de generación directamente porque también vamos a necesitar acceder al padre de la arena, también Así que vamos a hacer que la arena A sea variable dentro de aquí. Spawner. Bien, entonces también tenemos que asignar estos valores. Entonces el terreno del campo de juego va a ser arena. El prefabricado de tanque jugador es, por supuesto, tanque, y el tanque enemigo prefabricado es tanque enemigo Entonces entre otras cosas que tenemos que hacer por el jugador es que tenemos que establecer su nombre, su rotación, y su posición. Entonces el nombre, tanto el nombre del nodo el valor de la etiqueta son bastante fáciles. Si queremos establecer el nombre del nodo, que es lo que aparece aquí en el árbol de escenas, simplemente decimos nombre del punto del jugador, y lo llamaremos jugador porque si lo dejáramos como lo que es para el tanque, sería tanque, y no queremos eso. Por lo que queremos indicar que este es el jugador. Ahora bien, si recuerdan, el tanque tiene una etiqueta de tres D, que creo que llamamos etiqueta de nombre de tanque, según el auto completo. Bien. Ahí está. Etiqueta del nombre del tanque. Entonces sí. El texto también es igual al jugador. A continuación, necesitamos obtener el punto de generación del que va a desovar el jugador Y la forma más fácil de hacerlo es que simplemente tomaremos nuestro terreno de juego Y obtendremos el nodo Nav Points. Oh, en realidad, hay una manera un poco más fácil hacer esto de lo que hice originalmente. Entonces lo que hice la primera vez que hice esto fue agarré el nodo NAV Points, y lo deletreé correctamente, lo que nunca hago Y luego usé el método find child y le di el nombre player spawn Pero no necesitamos hacer eso porque sabemos que siempre va a haber un spawn de jugador adjunto a los NavPoints, así que solo debería poder especificar directamente su ruta así Y en breve sabremos si eso en realidad no funciona, porque veremos un choque. Bien. Una vez que hayamos hecho todo esto, entonces necesitamos agregar al jugador al campo de juego Porque si recuerdas, no estábamos agregando ninguno de los objetos móviles a la arena, los estábamos agregando a la raíz del juego. Quiero decir, podríamos agregarlos a la arena, pero me gusta mantener las mallas de mi terreno separadas de los objetos móviles Entonces por eso tenemos campo de juego. Entonces, ¡Uy! Entonces el campo de juego es el padre del terreno de juego. Así que solo conseguimos padre hijo jugador. Y tenemos que hacer esto antes de intentar establecer la posición o rotación del jugador. Si no vamos a obtener error, y éste es uno que no debemos ignorar. Entonces, una vez que el jugador esté en el terreno del campo de juego, podemos cambiar su rotación y su rotación va a ser igual a la rotación de los puntos de generación Y la posición global del jugador va a ser igual a la posición global de los puntos de generación Ahora bien, si usas o no posición o posición global generalmente depende de los sistemas de coordenadas en los que estés trabajando. A veces importa, a veces no siempre usa la posición global solo para que no tenga sorpresas groseras. Pero, ya sabes, intentemos posicionar y ver si realmente funciona. Debería. Y ahora que todo esto está hecho, podemos volver a nuestro juego. Y, por supuesto, cuando comience el nuevo juego, tenemos que generar realmente al jugador y engendrar a los enemigos y hacer un poco más de inicialización de configuración antes de que comience realmente el juego Entonces como ya tenemos una referencia al jugador en nuestro juego, lo que vamos a hacer aquí dirá jugador es igual a Oh, tenemos un pequeño problema porque no tenemos una referencia al spawner Así que vamos a conseguir uno de esos. Bien, spater es un nodo, claro Y comentaremos todo esto para que podamos asignar realmente la variable de gritar en voz alta. Ahí vamos. Bien, Spanor. Boom. Ahora tenemos Spawner Bien, ahora podemos regresar y hacer esto. El jugador es igual al engendrador Dot. Entonces, en realidad, establecimos un Nosotros le dimos un nombre de clase, ¿verdad? Sí, lo hicimos. Así que volvamos al guión del juego que podamos usar Autocompletar Spawner no es un nodo. Spawner es un spawner. Bien, ahora volvemos aquí abajo, desove Spawner Y una vez que tengamos el tanque jugador, podemos conectar todas sus señales aquí arriba. Por lo que no necesitamos cambiar la etiqueta de los tanques del jugador. Ya lo hemos hecho, pero sí necesitamos conectar estos tres métodos. Muy bien. Y ahora deberíamos poder cuando empiece el juego, deberíamos poder ver a nuestro jugador. Y no podemos. Entonces eso se debe a que nuestro punto de generación es nulo, lo que significa que algo salió mal cuando intenté obtener el punto de generación. Entonces veamos qué hice mal aquí. De vuelta en un momento. Y claro, la respuesta fue que tenía el nombre equivocado para el nodo NavPoints en la arena Entonces en mi draft original del juego, lo había llamado NavPoints Y así, claro, ahí es donde estaba mi cerebro. Pero en esta versión de la misma, para la lección, la había llamado Nodos Path. Así que simplemente cambié el nombre al nodo, y la vida era buena. Entonces tenemos una cosa más que tenemos que hacer aquí en GameStart para evitar que el juego estrelle y se enoje Y eso es, por supuesto, configurar el objetivo de nuestra cámara espía, porque si recuerdas, nuestro minimapa usa una cámara secundaria adherida al reproductor Entonces, como sacamos al jugador de la escena, necesitamos volver a agregar el jugador a la Cámara Espía. Entonces el espía Cam es que no tenemos una referencia a la cámara espía porque nunca la habíamos necesitado antes, así que agregaremos una de esas también. Y si te estás rascando la cabeza preguntándote, Oye, ¿ es realmente tan común tener tantas exportaciones en una clase? Sí, sí, lo es. En algunos de los estudios profesionales anteriores en los que he trabajado que utilizaron Godot Oh, te sorprendería la cantidad de exportaciones que teníamos, sobre todo en lo que respecta a las interfaces de usuario. Eso fue de vuelta en los días Godot tres puntos O donde no era posible arrastrar y soltar Entonces, a pesar de que teníamos las variables exportables, todavía teníamos que hacer como getObject basado en el nodo encima de él Así que en realidad fue aún peor. Hay otras formas de acceder a los nodos directamente, como usar el nombre único. Pero en la práctica, descubrí que el nombre único se rompe la mayoría de las veces que no. Entonces, la forma más confiable obtener un objeto independientemente de dónde se encuentre, porque especialmente cuando estás desarrollando tu jerarquía, vas a estar moviendo mucho tus objetos alrededor. Así que normalmente no es bueno usar rutas de objetos como lo estamos haciendo como lo estamos haciendo en ese método spawn para obtener el objeto porque las referencias a objetos se actualizan cuando el objeto se mueve y las rutas codificadas no lo son Por lo que suele ser el caso de la herramienta adecuada para el trabajo correcto. De todos modos, nuestro espía Cam y yo nunca le dimos un nombre de clase al Spicam Aquí vamos. Juego. Camara Espía. Juego. Oh, claro, ahora que tenemos un error, va a ser un problema? Bueno, sí, va a ser un problema. Bien, déjame recargar el proyecto, y volveré en un segundo Bien, a través de la magia de la edición de post procesamiento, ya estamos de vuelta. Ahora volvemos a bajar a UI subview port container SpyCam. Arrastramos eso por aquí para que tengamos nuestra SpyCam y ya podamos eliminarlas Y entonces, ahora que se ha agregado el jugador, SpyCamt Target es igual a player, y ahora todo debería estar perfectamente bien desde el punto de vista del jugador Y lo es. Tenemos un jugador. Sin embargo, no estoy seguro de si el jugador está realmente desove donde debería estar Bien, entonces empecé a mirar esos dos objetos. Bueno, hay una manera de decirlo. Si roto todo el camino, puedo ver si realmente estoy en la esquina del mapa, y no parece que lo esté. Parece que estoy en el centro del mapa. Así que volvamos a la arena, y comprobaremos dónde sucede que está nuestro engendro de jugador Y lo pusimos ahí. Verifica la transformación. Bien, volvamos al engendrador. Y en lugar de posición, lo pondremos en posición global. Este puede ser uno de esos casos en los que realmente importa. Oh, ya veo el problema. La posición global del jugador es igual a la posición del jugador. Tiene la forma de sí misma, como diría Shakespeare. Queremos la posición del punto de generación además de la rotación del punto de generación Eso debería resolver el problema. Mucho mejor. Ahora los jugadores realmente en el borde del mapa donde pertenecen. Parece que están mirando en la dirección equivocada, aunque. Bien, juega tu engendro. Rotación amarilla. Lo queremos de esta manera. Probablemente sea cuestión de que la rotación Y va de esta manera, pero el tanque ha girado lateralmente Por lo que simplemente giraremos el tanque en sentido contrario. También podríamos voltear el signo de la rotación. Uh bien. No sé por qué eso no está funcionando. Déjalo en cero, digamos, 180. Bien, eso es mejor. De todas formas, te dan la foto. Puedes agregar datos al engendro del jugador para cambiar la forma en que el jugador ha engendrado Entonces ahora el jugador está haciendo lo suyo. Puede volver a disparar proyectiles. Pero en realidad, hablando de disparar proyectiles, sí tenemos que cambiar una cosa, y es decir, cuando se dispara el proyectil seguimos agregándolo al , seguimos agregándolo al juego, y no queremos hacer eso. Queremos agregarlo a Playfield. Y el campo de juego del juego se llama Oh, no lo hicimos Uh huh. No agregamos una referencia al campo de juego. Así que técnicamente no necesitamos ya que ya sabemos que el campo de juego existe bajo juego, así que solo podemos hacer Gende Playfield dot Ad child, y luego agrega que será padre del shell en el lugar correcto Pero obviamente también podrías exportar una variable de tipo nodo y luego arrastrar el campo de juego a eso De hecho, eso sería un poco mejor. Sería más eficiente porque todavía hay algo de sobrecarga cuando obtienes nodo. Entonces vamos a hacer eso. O. Bien. Y ese es el guión equivocado. Ahí vamos. Ahora tenemos que engendrar a los tanques enemigos Para hacer eso, necesitamos saber cuántos tanques tenemos que desovar Y si recuerdas, ponemos una caja giratoria para manejar tal cosa en nuestro menú de inicio. Justo aquí. Entonces tenemos que conectar esa caja de giro, y lo hacemos pasando por debajo del contenedor HBox Y es por eso que necesitas etiquetar tus nodos de manera más inteligente Entonces voy a hacer eso. Entonces el cuadro de giro, cada vez que cambias el valor en el spin boox ya sea escribiéndolo directamente o usando las flechas, dispara una señal llamada valor cambiado Entonces queremos conectarlo y lo conectaremos a nuestro menú de inicio. Y queremos que ese valor vaya básicamente a donde necesite ir. Entonces vamos a proporcionar otra señal en nuestro mensajero. Pero eso es un poco más detallado Bien, y claro, necesitamos darle un valor de la cantidad que ha cambiado a quien se conecte a esa señal. Entonces en nuestro menú de inicio, bajamos aquí y decimos messenger, y el conteo de spa cambió y pasamos en el valor que se pasa al método. Y eso lo hicimos mal. En realidad es emitir, que no puedo deletrear. Ahí vamos. Bien, ahora, cualquier cosa que deba importarle si ha cambiado o no el recuento de engendros enemigos se suscribirá a este mensaje Y eso, por supuesto, incluye a nuestro engendrador. Entonces en listo, el punto mensajero El recuento de engendros Enemigo cambió. Conectar. Y este es otro caso donde la función es tan pequeña que podemos usar una Lambda. Entonces solo diremos cantidad funk tanques enemigos es igual a cantidad Y eso significa que siempre que ese valor cambie, el engendrador lo sabrá Entonces ahora, cada vez que engendramos tanques enemigos, así que lo primero que tenemos que hacer es proporcionar dos variables Uno de ellos va a ser para el tanque enemigo que hemos engendrado Y eso va a ser un tanque de IA, claro. Y entonces también vamos a necesitar una variable de punto de generación. Y vamos a necesitar una variable de punto de generación porque cada tanque va a ser asignado a un punto de generación aleatoriamente dentro del mapa, excepción del punto del jugador, obviamente Ahora bien, sería una buena idea almacenar en caché este valor. Y con eso, quiero decir, vamos a necesitar duplicar la matriz de todos modos, pero no necesitamos obtener la matriz dos veces, aunque solo se va a hacer una vez a la vez, así que no es súper ineficiente si no, sí, vamos a ponerlo aquí Y los puntos de generación van a ser una matriz de nodos tres Ds. Y va a ser nuestro terreno de juego. Conseguir padre. Espera, no, no conseguir padre porque terreno del campo de juego es en realidad la arena que tiene los puntos Nav en ella directamente Sí. Entonces lo que solo vamos a hacer es que vamos a hacer obtener Node NAV Points. Y no queremos obtener el propio nodo NavPoints. Lo que queremos obtener es que son hijos, que es una matriz que incluye todos estos NavPoints Entonces queremos que los niños se dupliquen. Y la razón por la que queremos duplicarlo es que queremos modificar la lista que obtenemos, y eso quedará claro en un momento. Y probablemente también podamos hacer un forccast aquí como array Nodo tres D, no es que eso realmente importe, pero debería estar Bien, y también vamos a necesitar proporcionar lo que yo llamo la devolución de llamada. No sé si técnicamente cuenta como una devolución de llamada, pero básicamente es un método que necesitamos adjuntar a cada tanque enemigo, y ese es, por supuesto, el método de disparo de proyectiles de nuestro juego Entonces, si recuerdas, subimos hasta aquí, cada tanque enemigo que engendra, o al menos el tanque enemigo que sí engendramos tuvo que conectarse al método onsel disparado del Entonces afortunadamente para nosotros, en Godot, las funciones son objetos, y son objetos de tipo callable Así podemos pasar la función directamente aquí. Así que vamos a llamarlo manejador de shell, supongo, manejador de shell de tipo callable y ahora vamos a poder conectarlo correctamente Bien, así que tenemos nuestros puntos de generación, y tenemos nuestros tanques enemigos Entonces, lo primero que vamos a hacer, y en realidad podríamos hacer esto de una manera ligeramente diferente. Podría ser un poco más eficiente hacerlo de esa manera, pero vamos a hacerlo de esta manera de todos modos, es antes de que engendremos los tanques, queremos asegurarnos de que el número de tanques enemigos que vamos a desovar sea menor que el número de NavPoints en el Y también deberíamos haber tapado el valor máximo del spinner porque actualmente está establecido en siete. Y, quiero decir, tenemos más NavPoints que eso, pero ¿y si creamos un mapa que tuviera menos NavPoints Y, como, si eres un desarrollador en solitario, es fácil tener en cuenta este tipo de cosas, pero a veces solo quieres algunas salvaguardas adicionales en él. Probablemente sería una buena idea, como, en cuanto se inicie el juego para consultar el mapa y luego establecer automáticamente ese valor. Y cuanto más lo pienso , más es una buena idea. Echemos un vistazo a qué tan rápido se podría hacer eso. Ya tenemos nuestro menú de inicio. Ya tenemos a nuestro spawner. Entonces sí, hagámoslo aquí. Oh, sí, son accesibles porque de lo contrario, no podríamos mostrar Empieza aquí. Entonces, vamos a subir aquí, y configuraremos el menú de inicio. Y vamos a necesitar obtener el nodo correcto. Entonces vamos a necesitar la ruta al nodo, y eso no lo sabemos. Entonces si vamos por debajo del juego, menú Inicio, caja de giro, clic derecho, ¿dónde está? Copiar ruta de nodo. Para que podamos eliminar Menú Inicio porque ahí es donde estamos empezando. Menú Inicio, spin boox y las cajas de giro Valor máximo, la propiedad se llama guión bajo Valor máximo. Así que simplemente el valor máximo es igual al punto del campo de juego obtener Node Ups Alguna vez lo puso entre comillas. Tengo puntos dot get child count porque voy a temas cuántos tiene menos uno para dar cuenta del nodo player porque no queremos poder generar en el nodo player Entonces ese es un poco largo y feo de código. Probablemente no deberías hacer eso en, como, un juego real, sino solo para poner las cosas en marcha aquí con esa mínima cantidad de dolor, vamos a hacerlo así. Así que de vuelta en nuestro spawner, tenemos un error. ¿Cuál es nuestro error? Este es nuestro error porque no hemos terminado esta línea. Entonces lo primero es lo primero, asegurémonos de que eso realmente funcione. Y claro, sí obtiene Child Count con un valor nulo. Arena Playfield. Puntos Nav. El problema es, es que aquí tenemos un camino redundante. No necesitamos comenzar con el campo de juego porque estamos en el campo de juego Sólo tenemos que conseguir puntos Ana Nav. Ahora bien, esto debería funcionar. Y ahí estamos. Entonces ahora deberíamos poder cambiar esto a diez, que es el número de NAPPoints que tenemos Perfecto. Ahora nunca vamos a repasar, lo que significa que en el engendrador, podemos ignorar esta línea. No lo vamos a necesitar. Y solo para que podamos validar eso, solo pondremos esto aquí por ahora. Entonces, queremos recorrer el número de tanques enemigos que vamos a engendrar Entonces vamos a hacer eso con Tank. Vamos a definir un bucle de cuatro. La variable se llama índice de tanque, y está dentro y hay una función muy útil llamada range. Y si proporcionamos el valor, proporcionamos una cantidad singular como valor, nos va a dar una matriz de números de cero a ese número menos uno, lo cual es increíblemente útil para recorrer arrays Entonces, si nuestros tanques enemigos en realidad es igual a 11, alcance nos va a dar de cero a diez, que es exactamente lo que queremos. O al menos lo suficientemente cerca. Es el número correcto de valores. Entonces tanque enemigo es igual a, y esto es lo mismo que hicimos por el jugador. Así tanque enemigo punto prefabricado instanciar. Como tanque de IA. Y, claro, tienes que deletrear la palabra Como correcto. Creo que ese es un nuevo registro para mí mal ortografiando una palabra de dos letras Oye. Bueno, por eso soy informático y no profesor de inglés. Bien. Y una vez que tenemos un tanque enemigo, entonces tenemos que configurar algunos de sus detalles. Y, por supuesto, esos detalles son el nombre, el nombre del nodo y el punto de generación Y como ya tenemos una referencia al campo de juego sí, bien. Entonces, como mínimo, podemos decir simplemente jugar un terreno de campo, conseguir padre, agregar tanque enemigo hijo, y eso sería genial. Pero no es suficiente. Entonces, lo primero que tenemos que hacer, obviamente, es que tenemos que adjuntar la señal de disparo de proyectil a nuestra llamada y luego tenemos que cambiar el nombre del tanque enemigo. El nombre del punto del tanque enemigo es igual a. Y lo vamos a llamar enemigo sub o enemigo con esta ficha. Y, por supuesto, vimos en una lección anterior que ese token nos permite hacer reemplazo de cuerdas. Entonces como estamos intentando reemplazarlo con un número, Oh, en realidad, debería funcionar sin un lanzamiento de cuerdas. Vamos a probarlo. Y el número enemigo es simplemente índice de tanques más uno, porque queremos que sean de uno a lo que sea y no de cero a lo que sea. Y entonces vamos a hacer lo mismo para Bueno, así que al tanque enemigo lo llamaremos tanque enemigo con eso. Pero el nombre para mostrar Solo seremos el número enemigo. Y estos son arbitrarios. Esto es solo yo decidiendo que esto es lo que es. Puedes hacerlas lo que quieras. Y ahora, claro, tenemos que encontrar un punto de desove Pero antes de hacerlo, en realidad sería un poco más eficiente o al menos más, supongo, menos complicado porque el spawner y el juego o el terreno del campo de juego tienen exactamente el mismo padre, así que solo podemos decir get parent Bien, ahora que el tanque se ha agregado al campo de juego, podemos establecer un punto de generación Y claro, cuando el tanque genera por primera vez en el mundo, su posición es igual al vector punto cero, que es una constante que indica que el vector es cero, cero, cero Entonces, mientras ese sea el caso. Entonces, siempre y cuando enemigo mientras que la posición del tanque enemigo sea igual al vector 30, esto significa que no está asignado Y lo que queremos hacer aquí es que queremos seguir recogiendo nuevos puntos de generación hasta conseguir uno válido Y la única vez que el punto de generación no va a ser válido es si es el punto de generación del jugador. Entonces, punto de desove Whoops. Curt te maldice auto completo. El punto de generación es igual a, y ya tenemos nuestra matriz de puntos de generación Entonces es igual a los puntos de generación con el índice de un número aleatorio de cero al tamaño de los puntos de generación menos uno Entonces eso nos dará cualquier índice desde cero hasta el final del punto de generación porque el máximo de puntos de generación o el índice máximo de una matriz siempre es igual a su tamaño menos uno Entonces, una vez que tenemos un conjunto de puntos de generación, queremos eliminarlo de la matriz de puntos de generación porque ya lo hemos elegido Entonces simplemente decimos puntos de desove, borra el punto de generación. Queremos borrarlo sea válido o no porque lo que va a pasar es que como ya estamos haciendo un bucle para los tanques, después de establecer este punto de generación de tanques, vamos a volver a la cima, crear un nuevo tanque, y luego queremos seleccionar entre los puntos de generación restantes Y no queremos incluir el que acabamos de elegir. Entonces, si siempre eliminamos el punto de generación que acabamos de elegir, entonces nunca vamos a obtener un punto de generación duplicado. Y es por eso que duplicamos la matriz G children del nodo NavPoints porque vamos a estar borrando cosas de él Y si usáramos la matriz original de los hijos originales, entonces estaríamos eliminando puntos de NavPoints de nuestro mapa, y no queremos hacer eso Entonces para algo como esto, trabajar siempre en una copia duplicada. Así que los puntos de desove borran. Y queremos comprobar el punto de spawn si el nombre del punto de spawn es igual al inicio de los jugadores porque si es, o fue ese jugador spawn, no me acuerdo Vamos a ver. Jugador engendrar Dicen que la memoria es lo primero que hay que ir cuando envejeces. Al menos creo que sí. Se me olvida. Bien, así que si el nombre del punto de generación no es igual al engendro del jugador, entonces lo que hacemos es del tanque enemigo sea igual a la posición del punto de generación Y eso nos debería hacer. Et le echamos un vistazo. Bueno, en realidad, no. No vamos a poder probar esto porque cuando estamos comenzando el juego, en realidad no estamos generando ningún tanque Entonces tenemos que volver al juego. Y ahora que se han tratado estos , podemos eliminarlos. Y luego volvemos a bajar a Empezar juego. Así que hemos engendrado a nuestro jugador. Hemos puesto nuestra cámara espía. Ahora tenemos que decirle al engendrador que genere tanques enemigos, y tenemos que pasar en la función que vamos a adjuntar, que es, por supuesto, en proyectiles disparados y tenemos que pasar en la función que vamos a adjuntar, que es, por supuesto, en Y ahora deberíamos poder generar un número determinado de tanques en nuestro mundo Empecemos con dos y tenemos un error. Todo bien. Tratando de asignar tipo, bla, bla, bla, tipo Oh, bien Entonces el problema aquí es que está tratando de asignar un tipo de nodo de matriz a una variable de tipo nodo tres D. Hemos especificado nuestra matriz de puntos de generación como un nodo tres D, pero debido a la magia del polimorfismo, realidad está intentando devolver un nodo y no se puede lanzar hacia arriba Entonces si cambiamos esto de tal manera que, bueno, no tenemos que decir que es un nodo tres D, podemos quitar eso y vamos a cambiar esto a simplemente nodo Ahora, vamos a intentarlo de nuevo. Engenere dos tanques, comience el juego. Todo bien. Tenemos un jugador, y tenemos dos tanques. Y por supuesto, se están moviendo individualmente. Y como pueden ver, Godot está manejando la física por ellos. Así que ni siquiera tienes que preocuparte de que se muevan uno alrededor del otro, aunque si ambos están intentando hacerlo en el mismo punto, simplemente chocarán Entonces tenemos un juego de trabajo. Lo único que nos falta es un juego sobre condición, una condición de victoria para el jugador. Entonces eso es realmente fácil y rápido de agregar dado todo lo que ya hemos configurado. Te voy a desafiar a que lo hagas como complemento de esta lección. Pero haces una pausa si quieres, pausas el video, pruébalo tú mismo, y luego continúas viendo el video, y te mostraré cómo lo hice. Bien. Pero antes de meterme en eso, tenemos un error bastante grande que hay que arreglar a menos que te guste que tu juego sea realmente desafiante. Entonces, si te das cuenta o te habrás dado cuenta si estás jugando con esto, si empiezas un juego y luego mueres, y luego comienzas otro juego, va a haber más tanques engendrados de los que le dijiste que engendrara Y eso es porque ninguno de los objetos del juego anterior está siendo eliminado por el engendrador antes de que realmente empecemos el Entonces, la forma más rápida de hacerlo y podemos hacer que el sponor lo haga o podemos hacer que el juego lo haga Simplemente podemos hacerlo en el juego. Ya es bastante fácil. Entonces todos nuestros objetos, todos nuestros tanques están siendo unidos al campo de juego Entonces queremos pasar por el campo de juego. Y no queremos hacer eso. Así que cuatro niños en el campo de juego Consigue niños. Esto recorrerá a todos los niños del campo de juego y lo pondrá en la variable child para que hagamos algo con Y todo lo que tenemos que hacer es que tenemos que ver si el niño está en el grupo vendible porque ponemos todos los objetos que se pueden quitar del juego en ese grupo ya que pueden ser destruidos Entonces, si el punto hijo está en el grupo Sin puntos infantiles Shellable Y eso debería resolver nuestro problema. Todo bien. Ahora, vamos a configurar nuestro juego sobre condiciones. Entonces, lo primero que tenemos que hacer es hacer un seguimiento de la cantidad de tanques que han muerto frente al número de tanques que aún quedan. Y la forma más rápida y sencilla hacerlo es volver debajo usuario porque la interfaz de usuario ya está haciendo un seguimiento del recuento de muertes Entonces todo lo que tenemos que hacer es también hacer un seguimiento del valor del spawner Y la forma más fácil de hacerlo es agregar otra variable llamada Kill count target. Que también es un número entero. Y como ya tenemos una configuración de señal, simplemente podemos monitorear si el recuento de engendros enemigos ha cambiado Y una vez más, podemos usar una función Lambda, que simplemente dirá kill count target es igual a la nueva cantidad. Y ahora, cada vez que cambia el conteo de matanzas, queremos verificar este valor. Y si el conteo de matanzas es igual a este valor objetivo, entonces hemos ganado. Obviamente, vamos a cambiar eso en un momento. Pero lo siguiente que tenemos que hacer, obviamente, es que necesitamos proporcionar un juego sobre estado para que el jugador haya ganado, y también necesitamos poder informar al jugador que ha ganado. Entonces vamos a cambiar un poco las cosas. También tenemos un viejo bicho. Déjame ver si puedo encontrarla. Entonces el problema aquí es que cada vez que se golpea un tanque, ya sea que haya sido destruido o no, emitirá la señal de destrucción del tanque enemigo, lo cual es malo porque eso significa que puedes seguir acumulando muertes disparando el mismo tanque Entonces si volvemos a nuestro caparazón, si el cuerpo está en grupo descascarable y el cuerpo no se destruye, entonces podemos llamar golpe Para indicar que el proyectil ha impactado contra el tanque. O sea, está pegando independientemente. Eso es una especie de nombre inapropiado, supongo. Ya está revisando y disparando si hay colisión. Es solo que esta es básicamente la contabilidad que ocurre cuando se golpea el tanque Y no tenemos que seguir haciendo eso y otra vez si el tanque ya ha sido destruido. Entonces eso va a resolver eso. Y ahora solo tenemos que agregar el framework para terminar el juego. Entonces, bajo juego, podemos proporcionar una nueva función para mostrar el juego sobre diálogo porque lo que podemos hacer es que podamos hacer que el juego sobre diálogo informe si el jugador ganó o perdió o no. La forma más fácil de hacerlo es proporcionar una función. Y esta función básicamente mostrará el juego sobre diálogo, y bien lo mostrará con un mensaje de éxito o un mensaje de fracaso dependiendo del valor de esta variable de éxito. Entonces, si es éxito, entonces agarramos nuestro juego de UI sobre el diálogo que ya tenemos, y agarramos la etiqueta del contenedor de margen, que es, por supuesto, esta etiqueta aquí. Y cambiamos su texto en función si el jugador gana o pierde o no. Y luego, claro, hacemos el mismo código que hicimos aquí donde mostramos el diálogo, y luego esperamos 2 segundos para luego conectarnos para terminar juego. Así que ahora en el jugador destruido, todo lo que tenemos que hacer es mostrar el diálogo del juego con la variable false. Y necesitamos proporcionar una manera para el jugador muestre ese diálogo y gane. Entonces necesitamos otra señal en nuestro mensajero Y necesitamos disparar esa señal desde la interfaz de usuario aquí. 32. Múltiples ángulos de cámara: Mm. Bienvenido de nuevo. Vamos a mirar a crear un sistema de cámara dinámico, o supongo que la mejor manera de ponerlo sería un sistema de múltiples cámaras. Por lo que ha llegado al punto ahora donde hemos ampliado la funcionalidad de nuestro tanque lo suficiente como para que un simple tanque ya no lo vaya a cortar porque queremos agregar un sistema de cámara a nuestro tanque, pero no queremos agregarlo al tanque enemigo que se deriva de tanque. Así que vamos a tener que crear una nueva escena heredada, y vamos a heredar de Tank y vamos a salvar esta, y lo vamos a llamar jugador Tanque y jugador tanque es, bueno, tenemos que volver a nuestro reproductor y actualizar nuestro jugador tanque prefabricado para usar realmente tanque jugador en lugar de tanque Y ahora mismo, nada va a cambiar porque son exactamente la misma clase. Pero en el tanque jugador, queremos agregar una plataforma de cámara. Así que tenemos nuestra cámara existente tres D, pero queremos más. Así que vamos a volver aquí y vamos a cambiar o mejor dicho vamos a añadir un nodo, y este va a ser un nodo tres D. Vamos a llamarlo. Cámaras. Y vamos a mover la cámara existente debajo de las cámaras, y eso no va a funcionar. Y hay una razón para eso. Entonces simplemente agregaremos cámaras adicionales directamente aquí en lugar de preocuparnos por hacerlo elegante y agregar una plataforma adicional. ¿Puedo cambiar el nombre de la cámara? No. Bien. Y todo eso tiene sentido. No quieres, en realidad no puedes cambiar ninguna de la información subyacente del nodo. Entonces eso está bien. Entonces simplemente agregaremos un par de cámaras adicionales. Bueno, agrego otra cámara tres D. Y este nombre le dará nombre o mejor dicho, le daremos un índice adicional dos. Entonces tenemos Cámara tres D dos y Cámara tres D tres. Entonces cámara tres D dos, siempre he querido tener una cámara en la torreta para que puedas ver dónde está girando realmente la cámara, aunque eso no nos va a hacer ningún bien, ¿verdad? En realidad, no, podemos padre del Podemos padre de la cámara a la torreta. Eso lo hicimos con el marcador tres D antes. Entonces agrega cámara tres D ahí. Y luego nos aseguraremos de que esté orientado en la dirección correcta. Sí, eso se ve bien. Vista previa. Oh, está al revés. Y para que conste, eso es lo que es esa flecha morada para mostrarte la orientación correcta del tanque. Entonces, en este caso, lo queremos a cero. Y ahora podemos ver nuestra torreta en nuestra torreta. Y queremos que esté el tercero, digamos, Bueno, está bien donde está. Es una cámara orientada hacia atrás. Y en realidad, ¿ sabes qué? Podemos agregar así que tendremos que hacer esto ligeramente diferente a la forma en que lo planeé originalmente. Pero agreguemos un nodo en lugar de un nodo tres D, y este será un equipo de cámara. Y literalmente solo va a tener un guión con referencias a nuestras cámaras existentes. Y ahora, no estamos creando un nuevo nodo. Estamos agregando un guión. Y vamos a exportar cámaras var. Y las cámaras van a ser una matriz de cámaras tres Ds. Y, sí, ayuda si no agregas tu propia notación tonta. Bien, entonces ahora tenemos una matriz, y podemos indicar el tamaño de la matriz. Entonces tenemos tres cámaras en total. Uno, dos, tres. Y ahora podemos arrastrar las referencias a nuestras cámaras existentes a esta matriz. Y todo lo que necesitamos es un método único que procese la entrada clave no manejada Y vamos a comprobar para ver si se han pulsado la una, dos o tres teclas. Y si tienen, entonces cambiaremos a la cámara correcta. Se presiona la tecla física. Clave uno. Y vamos a crear un método llamado switch to camera, y vamos a proporcionarle el índice correcto. Entonces en este caso, podemos llamarlo podemos usar el mismo índice que la cámara, pero vamos a necesitar cambiar los índices porque va a estar apagado por uno. Y luego solo haremos otra cosa. Mm. En realidad, vamos con un LF aquí. F. Muy bien. L F. Cámara uno, Cámara dos, Cámara tres, Cámara tres. Y ahí tenemos un yo redundante. Eliminar. Bien. Y claro, no tenemos switch a cámara. Así funk Whoops Y esto es bastante sencillo. Todo lo que tenemos que hacer es decir cámaras índice de cámara menos uno porque tenemos que compensar el hecho de que los índices empiezan en cero, pero estamos empezando en uno aquí, y con la misma facilidad podríamos hacer este cero. Quiero decir, ¿por qué no? Menos confuso de esa manera, supongo. Bien. Corriente igual verdadera. Y dado que a Godot solo le importará la última cámara que se ha puesto a corriente, entonces no deberíamos tener que preocuparnos por hacer un seguimiento de qué cámara está actualizada Entonces veamos si eso realmente funciona. Y si no es así, entonces haremos algunas modificaciones. Jugador del juego Y ahí vas. Ahora contamos con un sistema multicámara. Y eso fue muy fácil. Bien, hemos terminado de codificar por el momento, así que pasemos al siguiente capítulo, y comenzaremos a hablar de actualizaciones gráficas. Revisaremos los materiales y veremos las mallas y todas esas otras cosas buenas Nos vemos ahí. 33. Mejores explosiones con efectos de partículas: Bienvenido de nuevo. En esta lección, vamos a remediar el hecho de que cuando algún tanque recibe un disparo, simplemente se detiene. Simplemente yace ahí. Hace ruido, y es realmente aburrido. Entonces vamos a arreglar nuestras explosiones de tanques con algunos sistemas de partículas Ahora bien, lo mejor de los sistemas de partículas es que se ven complicados en la superficie, pero una vez que aprendes uno o dos pequeños trucos pulcros sobre ellos, básicamente puedes Jugar con ellos hasta el contenido de tu corazón sin siquiera entender realmente lo que hacen la gran mayoría de las características. Y como todo se actualiza en tiempo real en la ventana de GadoEditor, básicamente puedes simplemente jugar con todos los ajustes, y cuando consigas algo que te guste, puedes rodar con Entonces un sistema de partículas es un nodo, igual que cualquier otro nodo en GADO. Entonces vamos a agregar una nueva escena. Vamos a seleccionar otro nodo, y vamos a ir con GPU Partículas tres D. Ahora, hay una diferencia entre partículas GPU y partículas de CPU. Las partículas de GPU se procesan en su tarjeta gráfica en su GPU. Las partículas de CPU son procesadas por el procesador central de su computadora. La diferencia entre los dos es que las partículas de GPU tienen más rendimiento en un sistema acelerado de tres D. Además, y esto es algo detrás de escena, el equipo de Godot básicamente está dejando atrás las partículas de CPU en el sentido de que no las están priorizando sobre las partículas de GPU Entonces no le están agregando nuevas características, pero están dispuestos a dejar que la gente lo lleve a la paridad con las partículas de GPU Entonces, básicamente, ve con partículas de GPU a menos que simplemente no funcionen en el hardware al que estás intentando apuntar. Es una buena regla general. Así que vamos a crear una nueva GPU partículas tres D, y por supuesto, no hace nada. Porque en realidad aún no hemos montado nada. Entonces las dos cosas principales y verás un poco verás una advertencia y verás un error por aquí. Dice que nada es visible porque no se han asignado mallas para dibujar pasadas, y no se asigna un material para procesar las partículas, por lo que no se imprime ningún comportamiento Eso significa que necesitamos asignar ambas cosas para nuestras partículas hagan cualquier cosa. Lo primero que agregaremos son los pases de sorteo. El sorteo pasa, y hay que añadir al menos una determinará el aspecto de tus partículas. Entonces tenemos que darle una nueva malla de algún tipo. Y vamos a estar usando partículas texturadas bitmapeadas Así que vamos con una malla cuádruple. Y ahora se puede ver que en realidad tenemos una partícula aquí. En realidad, aquí tenemos un montón de partículas, pero como no tienen ningún comportamiento, en realidad no se están moviendo. También tenga en cuenta que reorganizé le hice dos cosas al proyecto en esta lección Lo reorganizé para que tengamos un montón de subcarpetas, estamos llegando al punto en que vamos a estar agregando muchos más recursos a nuestro proyecto, y no queremos que las cosas se desordenen Entonces puse todas las fuentes, los gráficos, y las escenas y los efectos de sonido en sus propias carpetas. Hablando de lo cual he agregado un par de texturas de partículas al proyecto para que las uses cuando estés haciendo tus propios sistemas de partículas. Todos estos están disponibles gratuitamente en opengameart.org Hay otros lugares donde puedes conseguirlos en Internet o incluso hacer los tuyos propios si así lo deseas. Una vez que hacemos clic en el pase y la malla y la extendemos, ahora tenemos la oportunidad de cambiar lo que parece, igual que lo haríamos para las otras mallas con las que hemos trabajado De hecho, como puedes ver, podemos usar cualquier tipo de malla que queramos. Entonces, si quisiéramos una caja o una cápsula o lo que sea, para conseguir una mirada más de tres D a nuestras partículas, podríamos hacer eso. Pero vamos a ir con una malla cuádruple, y luego tenemos que aportar un material, y deberíamos ser expertos en eso en este punto. Entonces vamos a ir con un nuevo material estándar, y podemos abrirlo. Ahora, hay una serie de ajustes adicionales para un material de partículas que para los materiales regulares. Y también hay un par de interruptores adicionales que si no los volteas, tres cuartas partes de la configuración de tu sistema de partículas no van a funcionar, y vas a pasar dos o 3 horas golpeándote la cabeza contra la pared preguntándote por qué ninguno de tus ajustes se está llevando a cabo Y definitivamente no estoy hablando por experiencia en esa. Entonces, lo primero que vamos a hacer es ir a Albedo, claro, y vamos a tirar una de nuestras texturas Entonces te voy a mostrar cómo hacer dos sistemas de partículas diferentes, uno explosivo y uno constante. Y también he proporcionado el sistema de partículas que creé para el tanque y adjunto al tanque en este proyecto. Entonces puedes seguir esta lección para ver cómo funcionan todos estos ajustes, y luego puedes intentar crear los tuyos propios, y luego también puedes inspeccionar los que creé para el tanque. También te mostraré cómo usar los guiones para desencadenar las explosiones para usar script GD para desencadenar las explosiones al final de la lección Entonces ahora que volvemos aquí, necesitamos una textura, otra vez. Entonces esto va a ser una especie de fuego, sí, especie de textura ardiente o un sistema de partículas ardientes, Entonces vamos a usar la explosión oh ocho textura y traer eso por aquí. Ahora, como pueden ver, no hay transparencia, por lo que necesitamos habilitar la transparencia. Y también necesitamos expandir el color del vértice, y tenemos que hacer clic y activar el uso como albedo Y esto es lo que nos permite cambiar los colores y la transparencia y todas esas cosas buenas de nuestra textura. Y como esta es una textura de tres D, pero estamos usando una textura, puedes ver que cuando giras alrededor, la textura se sesga y desaparece porque está mapeada sobre una cosa en tres espacios D. Entonces, para cambiar eso, necesitamos cartelera de la textura, y habilitaremos la cartelera de partículas. Y lo que eso hace es que siempre va a hacer la textura nos mire sin importar en qué orientación se encuentre la cámara. Y en este caso, eso es exactamente lo que queremos. Y también necesitamos bien, no necesitamos, pero sería una buena idea hacer clic en mantener escala de esa manera, si queremos cambiar la escala de las partículas, y lo más probable es que lo hagamos, eso permitirá que eso suceda, también. Si no, y cambiamos alguna de las curvas de escala, ninguna de ellas surtiría efecto. Bien, entonces tenemos un material. Tenemos un pase. Ahora vamos al material de proceso. El material de proceso dicta lo que realmente sucede con las partículas a lo largo del tiempo y muchas otras cosas Entonces necesitamos un nuevo material de proceso de partículas. Ahora que tenemos uno, se puede ver por defecto, nuestras partículas están desovando y cayendo hacia abajo Y eso se debe a que la funcionalidad predeterminada del proceso de partículas es simplemente golpearlo con gravedad y llamarlo un día. Pero eso no queremos. Lo que en realidad queremos es un par de cosas. Así que volvamos a subir a las partículas GPU tres sección D, y dejaremos emitiendo encendido por ahora. Pero lo que vamos a hacer eventualmente es que vamos a activar un disparo porque un disparo básicamente significa que un conjunto de partículas van a emitir, y entonces eso va a ser todo. Eso es exactamente lo que queremos para una explosión. Entonces apagaremos eso por ahora solo para que podamos ver qué está pasando. Entonces tenemos lo que se llama explosividad, y esto es exactamente lo que dice en la lata Cuanto más explosivo sea, más instantáneamente engendrarán las partículas Y es un poco difícil de ver ahora mismo porque, de nuevo, todos están desove con la misma velocidad y todos están siendo afectados por la misma dirección Así que vamos a subir el número de partículas a, como, 25. Y la explosividad está bien, y la aleatoriedad de la que no tenemos que preocuparnos Aleatoriedad si no estuviéramos usando explosividad, la aleatoriedad determinaría la aleatoriedad de la frecuencia con la que las partículas emitirían Así que no necesitamos preocuparnos colisión, el dibujo o los senderos. Esas son opciones elegantes con las que no vamos a tratar. Entonces, normalmente, las partículas no chocan con el ambiente Si quisieras que lo hicieran, necesitarías agregar un nodo especial llamado colisionador de partículas GPU a tu sistema de partículas Y esto está relacionado con eso. Y no nos hace falta que nos importe el dibujo en absoluto. Entonces, una de las cosas los sistemas de partículas es que son extremadamente nerd, y hay muchos ajustes que nunca vas a necesitar a menos que sepas absolutamente que los vas a necesitar. Entonces, si miras un entorno en particular, vas, ¿por qué alguna vez usaría eso? Entonces no tienes que hacerlo. Es genial. Entonces bajo material de proceso, aquí es donde podemos empezar a hacer que nuestras partículas hagan cosas. Entonces vamos bajo banderas de partículas. Y realmente no tenemos que preocuparnos por ninguno de estos. Entonces estos dictarán cómo la partícula se alinea a sus diversas direcciones También podemos agregar amortiguación como fricción, lo que ralentiza las partículas con el tiempo hasta que se detienen. velocidad de desove y la velocidad de desove y la exhibición son como las tres más interesantes Entonces, si pasamos por debajo de posición, se puede ver que tenemos la oportunidad de establecer la forma de la que engendran las partículas Entonces en este momento están spunning desde un punto, lo que significa que todos están desove exactamente en el mismo punto del mundo, pero podemos cambiarlo para que desove dentro Entonces ahora se puede ver que está desove dentro de un área circular aquí, y podemos cambiar el tamaño de la esfera para obtener partículas mucho más dispersas o una caja o así sucesivamente y así sucesivamente, incluso un anillo El anillo puede ser divertido, especialmente para el fuego. Un poco difícil de y luego puedes cambiar el eje del anillo para cambiar el tamaño del anillo, la altura del anillo, el radio del anillo, el errato del anillo Sí, no sé si realmente quiero hacer eso. Dejémoslo como a Entonces tenemos ángulo y velocidad, y estos dos son sumamente importantes. Entonces te vas a acostumbrar mucho a este control en Gadot menos cuando estés usando los sistemas de partículas Este es el único lugar en el que realmente lo he visto usado en Gdo, y básicamente proporciona un rango que puedes expandir arrastrando estas pequeñas flechas particulares de cositas . Esa es la palabra que busco. Y también puedes desplazar todo el rango por sí mismo cambiando haciendo clic y arrastrando sobre el rectángulo Y eso indica el rango, mínimo y máximo que pueden tener los distintos ajustes. Entonces, en el caso de un ángulo, cuando una partícula genera, puede tener un ángulo que va desde este valor hasta este valor Sin embargo, no queremos ser tan particulares o locos, así que pongámoslo 0-360, y eso está bien Eso significa que la partícula puede generar potencialmente en cualquier orientación angular El divertido es la velocidad. La velocidad dicta qué tan rápido van a explotar tus partículas desde donde están, y la propagación determina su dirección En un ángulo a su alrededor. Entonces si quieres, como, una cosa más parecida a la fuente, bajarás el spread, y si quieres una más explosión buscando una, puedes subir el spread. Desafortunadamente, ahora mismo, no se parece a nada porque, nuevo, no tenemos ninguna velocidad. Entonces agreguemos algo de velocidad. Hagamos nuestra velocidad como dos. Entonces ahora puedes ver que tenemos un poco más de eso. Y ahora si tuviera que cambiar el spread, se puede ver que están explotando en un ángulo más amplio Bien, entonces no queremos que nuestras partículas estén bajando porque no es así como funciona una explosión. Entonces, ¿está bajo animada? No, está bajo aceleraciones. Bien. Entonces, para evitar las partículas simplemente caigan hacia abajo, tenemos que apagar la gravedad. Y la gravedad está bajo aceleraciones. Y como pueden ver, ya está establecido en negativo 9.8, lo que es, por supuesto, la gravedad de la Tierra tirando hacia abajo. Si cambiamos esto a cero, Boom. Ahora tenemos partículas que simplemente explotan en cualquier dirección Ahora se puede ver cómo funciona un poco mejor el spread por el hecho de que la gravedad está apagada. Entonces lo vamos a dejar a los 180, y ahora tenemos una explosión que sale hacia afuera. No obstante, las partículas mismas no se ven tan bien. Entonces tenemos dos problemas. La explosión desaparece demasiado rápido, así que elevemos la vida útil de cada partícula a 2 segundos. Y otra gran cosa de este sistema es que casi todas las propiedades en un sistema de partículas, junto con cada propiedad que existe en Godot en general tienen una punta de herramienta muy informativa Entonces, si no sabes lo que hace un entorno en particular, simplemente pasa el cursor sobre él y te dirá Desafortunadamente, cuando empieces a bajar a Cosas como esta, no vas a conseguir nada. Sólo va a decir, Esta propiedad sólo se puede establecer en el inspector. Bueno, estoy en el inspector, así que déjeme hacerlo. Entonces algunos de ellos con los que tienes que jugar. Pero Godot en realidad tiene una documentación increíblemente buena sobre los sistemas de partículas, y voy a vincular eso en los materiales complementarios para este curso Entonces tenemos la gravedad, y también tenemos la capacidad de cambiar las aceleraciones lineales radiales y tangenciales de las partículas, pero no las usaremos Sin embargo, podríamos. Podríamos simplemente subir esto, y cambiaría la forma en que las partículas realmente aceleran. No lo sé, como que me gusta este. Dejémoslo así. aceleración radial básicamente determina cómo las partículas se acelerarán fuera de su radio, lo cual no tiene mucho sentido a menos que lo veas en acción. Entonces, aquí está. Y subamos el amortiguamiento solo un poquito para ver qué pasa. Básicamente, la amortiguación ralentizará gradualmente tus partículas hasta que se detengan. Sí, no un fan no un fan de eso, en realidad. Voy a apagar la amortiguación. Subir. Ahora, la divertida es la exhibición. Mostrar es cómo puedes cambiar y ajustar la apariencia general de tus partículas Entonces te voy a mostrar cómo básicamente funcionan las curvas de color y las escalas, y luego puedes aplicarlo al grueso de todas las demás. Entonces, en términos generales, las partículas serán controladas por un rango individual. Entonces en este caso, escala significa que la escala literal de la textura. Entonces si planteamos esto, entonces algunos de los whoo, eso es demasiado grande. Algunas de las partículas pueden ser más grandes que otras porque van a desovar con un valor de escala entre este rango Así que vamos a hacer ese 0.25. Así que ahora podemos conseguir algunos pequeños. Ca floración. Entonces también tenemos lo que se llama una curva, y las curvas son divertidas. No es muy ilustrativo hacer la curva de escala, así que te mostraré el color. Te voy a mostrar las curvas de color. Más específicamente, la curva Alfa. Y nuevamente, ninguno de estos funcionará a menos que enciendas el color albedo o uses un albedo y el color del vértice en los ajustes del material para Entonces, si vamos a Curva Alfa, podemos seleccionar una nueva textura de curva. Y, claro, por alguna razón, mi inspector se desplaza hasta la cima cada vez que amplío alguno de estos No sé por qué es eso. Pero entonces si hacemos clic en él, ahora tenemos la oportunidad de establecer una curva. Entonces, si cambias esto a una nueva curva, ahora tenemos una curva, y hacemos clic en una curva, y podemos ver la curva. Con el tiempo, el ajuste normal de texturas para este valor se multiplicará por el valor en esta curva. Ahora, claro, dado que acabo de agregar una curva, ya no puedes ver mis texturas porque todas se están multiplicando el Alfa se está multiplicando por cero largo de la vida de la textura, y eso no es lo que nosotros. Si arrastramos esto hasta uno, ahora volvemos a donde estábamos antes, lo que significa que la base Alfa de la textura, que es, por supuesto, una, se multiplica por, nuevamente, una a lo largo de la vida. Entonces aquí es donde empieza. Aquí es donde nace la partícula. Aquí es donde muere la partícula. No hay ninguna metáfora ahí dentro en absoluto. Y así si cambiamos esto, si hacemos clic por aquí y agregamos otro punto y luego arrastramos esto a cero, ahora puedes ver que con el tiempo, las partículas se desvanecerán. Así que a lo largo de su vida, el Alfa irá bajando gradualmente hasta que desaparezca. E incluso podemos sumar más puntos. Entonces, lo que me gusta hacer para que las texturas no, como, aparezcan tan rápido es llevar mi valor inicial a cero y luego arrastrar este punto medio hasta aquí para que realmente se desvanezcan tiempo y luego se desvanezcan gradualmente con el tiempo. Y eso es muy ordenado. E incluso se puede hacer esto con los colores. Entonces, si quieres cambiar el color de la textura, puedes agregar un pozo, agregarías un degradado a la rampa de color. Entonces hagamos que los gradientes sean ligeramente diferentes a las curvas Pero muchas de estas características tienen curvas disponibles para ellas. Entonces como puedes ver aquí, tenemos una curva de ángulo y así sucesivamente. Entonces bien, vamos a cerrar ¿dónde estábamos? Bien, tenemos un gradiente de rampa de color. Boom, entonces abrimos esto, y ahora tenemos un gradiente. Y si nunca antes has trabajado con gradientes en Godot, básicamente puedes agregar puntos dentro del degradado, y estamos a punto de hacerlo y luego cambiar el valor el valor del color en cada punto para que los colores se mezclen suavemente entre ellos a lo largo de la distancia del Entonces aquí, tenemos negro en un extremo y blanco en el otro, lo que nos da un bonito desvanecido en la propiedad. Es por ello que ahora se puede ver que la textura empieza en negro y luego se desvanece a blanco a lo largo de la vida útil de la textura Entonces agreguemos un par de puntos más aquí, y haremos doble clic en este. Y todo lo que hice fue dejar clic aquí para agregar estos puntos. Ahora bien, si cambio este negro por decir amarillo, Eso significa que la textura comenzará en amarillo y luego se desvanecerá a un poco negruzca Y luego cambiemos esto a naranja por, como, un naranja brillante. Y luego éste a un rojo. Entonces ahora puedes ver que las texturas son básicamente está comenzando con un tinte amarillo y luego va a un tinte naranja y luego va a un tinte rojo y luego simplemente se desvanece al color original de la textura Ahora bien, para una explosión, en realidad no queremos hacer esto, pero si estuviéramos haciendo fuego, lo cual te mostraré cómo hacer en un momento, algo como esto viene muy útil. Entonces esto es en realidad una especie de textura pésima para una explosión Entonces déjame darte uno mejor. De hecho, pude idear algunos ajustes para hacer que esto simplemente se hinche un poco para que pareciera una explosión real, pero tardó una eternidad, y no recuerdo cuáles son los ajustes. Um, podría verificarlos dos veces, pero sería mejor para mí cambiar realmente el material porque quiero mostrarte en realidad, vamos a convertir este en humo y luego y luego haré el de explosión. Entonces volveremos a cambiar la textura. Cambiémoslo a humo negro. Vaya, primero tengo que abrirlo. Aquí vamos allá, material. Textura humo negro. Boom. Y vamos a despejar esto simplemente yendo desplegable y golpeando claro. Dejaremos en las curvas Alfa. Apagaremos la explosividad. Subiremos la cantidad a aproximadamente 1:50 y cambiaremos la extensión del ángulo a, como 20, y cambiaremos la dirección de X a cero a Y uno, lo que significa que ahora va a subir Entonces ahora tenemos unas bonitas partículas de humo enojadas. Están subiendo un poco demasiado. Así que vamos con la velocidad inicial de 0.5. ¿Cómo es esa mirada? Algo así como mejor. Oh. Bien, podría ser peor. No está mal. Y ahora haremos una segunda que sea una especie de explosivo. Y en realidad voy a ser padre de ella. No, no, no lo estoy. Voy a agregar un nodo hijo, y voy a añadir un nodo tres D porque así es como hice el sistema de partículas original. Entonces tenía un nodo tres D, y Ups. No puedes hacerlo así. Lo que tienes que hacer es cambiar este No. Nodo tres D, clic derecho Hacer raíz de escena. Ahí vamos. Eso les da la vuelta. Ahora agregamos un así que queremos que este siempre esté funcionando. Y luego agregamos otro sistema de partículas GPU. Y éste va a disparar algunos escombros en explosión cuando explote el tanque Para que podamos volver al tiempo, y eventualmente pondremos un tiro. Pero queremos que nuestra explosividad vaya a uno. Queremos apagar esto por el momento para que podamos ver lo que estamos haciendo. La aleatoriedad es buena. Entonces, por supuesto, necesitamos otro material de proceso y un pase de dibujo con un nuevo material. Este material lo vamos a hacer como prisma porque se ven adecuadamente, uh, como metralla Entonces vamos a cambiar cómo se ve así. Reduciremos el tamaño solo para que no sea un bloque gigante. Entonces, por supuesto, necesitamos un material. Ahora, en este caso, no vamos a usar transparencia ni colores locos ni nada, así que simplemente usamos un albedo No le voy a dar una textura, pero lo que voy a hacer es que lo voy a hacer gris para que parezca una pieza de metal que se lanzó fuera del tanque, y no necesitan cartelar ni nada por el estilo, tampoco. Y ahora vamos a nuestro procesador de partículas. Las banderas de partículas son finas, posición de desove. Haremos que emitan desde un punto. El ángulo va a ser buena pregunta, en realidad. ¿Cuál va a ser el ángulo? Bueno, la dirección otra vez va a ser hacia arriba. Y vamos a hacer un spread de alrededor de 75. Y vamos a darle una velocidad inicial. Digamos la velocidad. No queremos que ninguno no tenga velocidad. Así que pasemos de, como, cinco a 20. Y ahora, sin ningún cambio en absoluto, realidad tenemos una explosión de aspecto bastante decente. Entonces vamos a cambiar esto ligeramente. Queremos cambiar los ángulos potenciales de ellos. Entonces iremos 0-360. Y entonces de esa manera, cada vez que engendran, van a desovar con un ángulo aleatorio Y podemos alinear el eje Y de la partícula con su dirección, y eso también es bastante genial. En realidad ahora en realidad se vuelven en el aire, algo así como. Bien, así que si vuelvo a emitir y enciendo un disparo, se puede ver que la emisión se habrá apagado. Y eso es porque un solo disparo es exactamente lo que significa. Es un solo disparo. Vamos a aumentar el número de partículas aquí. Boom. Ahí vamos. Ahora, un solo disparo literalmente va a disparar todas sus partículas a la vez y luego llamarlo un día, y luego ya no disparará. Entonces, si usted indica, digamos, 200 partículas aquí, y no tenía explosividad volcada a una como yo, simplemente se filtraría esas 200 partículas, una, dos, tres, cuatro, cinco, seis, siete Y luego una vez que todos estuvieran hechos, ese sería el final de la misma. Con la explosividad levantada, como nosotros, todos disparan a la vez, y luego ya no disparan Entonces esto es lo que nos permitirá mezclando todos estos diferentes efectos o estos diferentes sistemas de partículas, esto es lo que nos permite hacer efectos de explosión. Entonces déjame mostrarte el que hice para el tanque. Entonces emitiendo así que aquí está la explosión inicial, Kaboom. Y luego aquí están los escombros. ¡Vaya! Kaboom. Literalmente el que acabo de mostrarte. Humo también de manera similar. Y luego también agregué uno para fuego que en realidad no tiene textura. Es literalmente solo, literalmente, solo las partículas cuadradas. Y eso es porque no tengo una textura de fuego decente a la mano. Pero de todos modos, los tengo apagados porque solo queremos que todos ellos habiliten y hagan lo suyo cuando explote el tanque Entonces agregué este sistema de partículas a mi tanque, y dentro del guión para el tanque en nuestra función hit, agarro una referencia a las partículas de explosión, niños porque queremos a los Niños, que son los sistemas de partículas reales y no el propio nodo. Y luego recorremos a cada niño y dijimos que está emitiendo propiedad a true. Y luego una vez que hayamos hecho eso, tendremos una agradable explosión. Y te voy a mostrar cómo se ve en acción porque realmente me gusta. Entonces, agrega un par de enemigos más porque de lo contrario, no llegaremos a ver realmente la explosión antes de que termine el juego. Entonces ahora si me acerco sigilosamente a este tipo de aquí, muy pulcro. Y eso es mucho más gratificante que solo ver parar a los tanques. Y ahora solo va a quemar y fumar por toda la eternidad, al menos hasta que termine el juego. Bien, eso eran sistemas de partículas. Y en la siguiente lección, estaremos realizando otra inmersión profunda o una mejor inmersión profunda en los materiales para que nuestros tanques no se vean tan planos. Te veré ahí. 34. Redistructurización de tus tanques: materiales repasados: Bienvenida de nuevo. En esta lección, vamos a echar un vistazo las opciones adicionales que tiene disponibles para usted al crear un material para las diversas partes de su tanque o cualquier otra malla o material disponible en su proyecto. He proporcionado todos los archivos relevantes como parte del archivo de proyecto en el directorio graphics slash Metal Texturas, pero también proporcionaré enlaces en los materiales complementarios para este curso con el fin de obtener algunos usted mismo porque puede hacer estos mapas usted mismo si sabe hacer o no pudo obtenerlos de varios repositorios en o incluso usar herramientas en línea para hacerlas. Entonces un buen lugar para conseguir estas texturas sería ambientcg.com Nuevamente, he proporcionado un enlace a eso para los materiales complementarios. Y si quisieras hacerlas tú mismo a partir de una textura individual que creaste, también podrías ir a normalmpline.com Y nuevamente, he proporcionado un enlace a eso en los materiales complementarios. Oh, como pueden ver, ya he empezado a jugar con algunos materiales, pero vamos a crear uno o más bien modificar uno directamente. Entonces vayamos al frente de nuestro tanque, que es, por supuesto, malla desde 387, y expandiremos la malla, y expandiremos el material. Ahora, ahora mismo, es un poco aburrido porque es literalmente solo un color singular individual. Entonces queremos cambiar eso. Entonces iremos al albedo, y aquí tenemos un slot para textura Así que vamos a arrastrar una textura ahí dentro. Arrastraremos el archivo de color de los proporcionados. Y ahora puedes ver que en realidad anula o superpone una textura sobre nuestro material tintándolo con el color que proporcionamos Así que déjame agarrar este color. Si tuviéramos que cambiar esto y ponerlo todo el camino de vuelta a blanco, entonces se podría ver que la textura en sí no se ve realmente afectada. Y luego si queremos teñirlo, solo le damos el color otra vez. Pero podemos hacer más que eso porque tenemos un montón de archivos por aquí. Podemos cambiar la metalicidad. Y, por supuesto, eso también tiene una textura. Entonces, si proporcionamos la textura de metalura, eso puede cambiar el aspecto metálico del material También podemos cambiar la rugosidad, que es la textura de la rugosidad. Y se puede ver ahora que esto le está dando un poco más de profundidad y sensación a la textura. Entonces, antes de que estos baches no fueran realmente no se veían tres D, y realmente no existían en absoluto. De hecho, déjame despejar esta textura, y voy a así que puedas ver la diferencia ahora es que, Bien, solo se ve como un montón de manchas de colores Y ahora, si volvemos a meter la aspereza aquí, se puede ver que en realidad se ve como algo, ya sabes, podrías pasar la mano y sentir Entonces también tenemos mapas normales. Ahora hay dos tipos diferentes de mapas normales, mapas normales, ya sea en formato DX o GL. Godot trabaja con el formato GL. Entonces vamos a usar el GL normal. Y éste es un poco confuso. Entonces Godot tiene soporte para un mapa de altura, y en otros motores y en otro tipo de herramientas, eso suele llamarse mapa de desplazamiento Y realmente no puedes ver mucha diferencia con esta configuración de iluminación en particular, pero está ahí. Ahora bien, si no te gusta la forma en que la textura se estira sobre el objeto en particular en el que estás trabajando, puedes volver a ir, debajo del material, y vas a ir a la opción de escala UV. Y déjame resetear este solo para que veas la diferencia. Entonces, porque a veces porque en realidad no estamos usando, como, modelos reales que tienen el mapeo UV realizado dentro del software de modelado de tres D, así que Godot básicamente simplemente estira la textura a través de toda la superficie del objeto, como considere conveniente, pero eso puede no funcionar para nosotros, así que podemos reducirla cambiando el zoom de la textura Bien, entonces ahora tenemos un pozo, tenemos un tanque muy diferente, de aspecto más texturizado Y si entramos en nuestro juego, definitivamente puedes ver la diferencia, sobre todo cómo está jugando la luz a través de él y lo diferente que se ve. Y claro, como hicimos esto en nuestra escena de tanques base, los tanques enemigos se ven exactamente iguales. Y también se puede ver la forma en que la luz está cambiando debido a la reflectividad de los tanques Oh, tenemos un error. Todo bien. Rompí algo. Entonces esto es algo que se arreglará para la siguiente lección, pero sea lo que sea, te garantizo que es irrelevante para esta lección en particular, así que no nos preocuparemos por ello En fin, eso eran materiales y sus diversos mapas. Te veremos en la siguiente lección. 35. Calcomanías: Bienvenido de nuevo. Estamos en el tramo de casa. Antes de continuar, solo quiero mencionar que, sí, sí arreglé el error que surgió al final de la última lección. Básicamente, cuando reorganizamos cosas en el capítulo donde creamos al engendrador enemigo, el tanque enemigo base no tenía un conjunto prefabricado de proyectiles porque el tanque que habíamos puesto directamente en el juego era donde en realidad habíamos Entonces, por alguna razón, nunca se propagó. Y luego cuando lo trasladamos al al spawner, claro, ya que estábamos trabajando fuera de la plantilla, y el shell prefab Y entonces, claro, en realidad nunca permití ninguno de los tanques y las lecciones posteriores a eso me dispararan, así que nunca se me ocurrió. En fin, lo largo y lo corto es que he regresado y arreglado la escena de los tanques enemigos para todas las lecciones de, creo que es 104 Capítulo diez, Lección cuatro en adelante Por lo que el error debería ser corregido retroactivamente, pesar de que apareció en el video Oye, sobre cosas más interesantes. Hablemos de calcomanías. Las calcomanías son realmente geniales. Son una manera en la que puedes agregar detalles de textura adicionales a tu juego sin tener que hornearlo en tus modelos. Entonces, por ejemplo, he creado un pequeño cráter de concha de explosión que aparece como calcomanía en el suelo aquí donde choca el proyectil Ahora, no me puse lo suficientemente elegante como para ponerlo en los árboles ni nada. Entonces, si le disparas a un árbol, no lo verás. Pero esto es calcomanía en su nivel más básico. Y veamos como hacer uno. Las calcomanías son nodos, En Gado. Entonces, si creas una nueva escena, y le das una base de tipo calcomanía, y solo crearemos una nueva muy rápido para que veas cómo se hace eso, otro nodo, calcomanía. Entonces, si creas una nueva calcomanía, deshazte de eso. Y le das una textura por su albedo. Al mínimo, eso es todo lo que necesitas. Entonces, en nuestro caso, no necesitamos hacer otra cosa. Lo que normalmente haríamos es rotar la orientación de las calcomanías de tal manera que coincidiera con la superficie normal de la malla a la que la estábamos fijando Pero no necesitamos hacer eso porque solo lo estamos uniendo al suelo, por lo que su orientación superficial predeterminada es perfectamente fina. Así que vamos a nuestro script shell, y por supuesto, dentro de nuestro shell, como hemos hecho antes para otras cosas similares, agregamos una variable de exportación de tipo packed scene para la calcomanía prefab, y luego arrastramos en el cráter shell que acabamos Y luego cuando el shell impacta con algo, instanciamos una copia de la calcomanía Lo agregamos al padre del caparazón como hijo porque el padre del caparazón es el campo de juego y luego colocamos al cráter la calcomanía, que es cráter, la posición global de los cráteres a la posición global del Y obviamente tenemos que hacerlo en ese orden porque si tuviéramos que establecer la posición global antes de agregar al niño, obtendríamos un mensaje de error. Pero, sí, eso son calcomanías. Puedes usar calcomanías para cosas como salpicaduras de sangre, suciedad, todo tipo de cosas así. Um, lo estamos haciendo dinámicamente aquí por la forma en que funcionan los proyectiles, pero también podrías usarlo para agregar textura a tu terreno. Y cuando actualizamos nuestro terreno en una lección posterior, que en realidad puede ser la siguiente lección, fuera de control. Pero de todos modos, una vez que actualicemos el terreno, entonces lo haremos ahí para ver cómo agregar algo de variedad. En fin, eso son calcomanías. Te veré en la siguiente lección. 36. Importación de modelos externos: Bienvenida de nuevo. En esta lección, te voy a mostrar algunas formas de importar modelos externos a tu Godot Desafortunadamente, dado el hecho de que Godot soporta una gama bastante amplia de formatos de modelo, y también dado que muchas veces, si vas a estar sacando modelos gratis de Internet, lo cual casi te puedo garantizar que lo harás para tus primeros juegos a menos que sea o por casualidad conozcas a un modelador de tres D, muchas veces vas a tener En este punto para Gado 43, es posible importar casi siempre sin dolor los tipos de archivo GLTF y FBX Pero a veces los activos que quieres o no están en esos formatos o incluso si lo son, el artista no dio todos los pasos requeridos para que el recurso esté disponible correctamente en GADO. Entonces lo que vamos a hacer es que vamos a importar algunos activos, y voy a mostrarles algunas formas comunes de corregir algunos errores básicos que pueden estar surgiendo durante sus importaciones Por lo que todos los recursos serán proporcionados como parte de este proyecto de lecciones. Y además, también te he proporcionado algunos activos no fijos para que juegues e intentes arreglarte después de que te enseñe qué hacer Entonces primero, déjame cerrar un montón de estas escenas porque no las vamos a usar. Y lo primero que vamos a hacer es arreglar nuestra roca porque tiene un aspecto muy redondo. Entonces tenemos un conjunto de rocas disponibles para nosotros, y estas fueron descargadas de Open Game art. Y como puede ver, se proporcionaron en una serie de formatos compatibles, entre ellos Kalata, que es DAE OBJ e incluso un Pero si abres el Godot, verás que faltan algunas dependencias y otras cosas por diversas razones Entonces no vamos a arreglar esa dependencia rota. Lo que vamos a hacer es crear una nueva escena a partir de un archivo existente. Así que tenemos nuestro archivo DAE aquí, y haremos clic derecho sobre él y haremos nueva escena heredada. Entonces eso nos dará un nuevo Godot con esa malla como instancia de malla dentro de ella. Y en realidad, ya sabes, esto es bueno. Así que vamos a copiar la instancia de malla. Y en realidad, déjame ver si esto va a funcionar. Déjame volver a la roca aquí. Ya tenemos una malla. Y tenemos un OBJ vamos a ver si podemos meter eso ahí dentro ¿Funcionará eso? No. ¿Qué tal eso? Sí, eso va a funcionar. Entonces mesh Instance tres Ds tomará los objetos de punto como un recurso de malla Y si no tienes un OBJ, si solo tienes, como, un DAE o lo que sea, entonces puedes simplemente hacer lo que hice y hacer un click derecho y obtener una escena heredada, y luego puedes copiar esa Instancia de Malla tres D. ¿Cuál es el camino aquí? Sí, sigue siendo el DAE. Interesante. De todas formas, así que Godot hará algunas importaciones detrás de escena De todas formas, podemos hacer clic derecho y copiar este nodo. Y volver a nuestra roca, aunque en realidad no necesitamos hacerlo porque ya la importamos. Entonces sí, así que tenemos nuestra malla. El problema es, es que las texturas de malla no estaban vinculadas. Afortunadamente, las texturas nos fueron proporcionadas, por lo que podemos ajustar manualmente el material para nuestra malla. Desafortunadamente, para un DAE, no indica específicamente el recurso de malla, pero muchos de los formatos de archivo de malla importados tendrán su material oculto bajo lo que se llama una superficie. También puede proporcionar un material existente o uno nuevo bajo la modificación de material de superficie. Entonces la superficie es el material real para la roca. Ahora, lo que podemos hacer es hacer que nuestra malla sea única y luego decir única recursiva, y eso nos permitirá cambiar el material Y en este caso, ya nos han proporcionado un material, así que podemos simplemente arrastrarlo. Y por la razón que sea, eso no actualizó las texturas. Entonces bien. Pero sí nos proporcionó algunos ajustes de material, y nosotros tenemos las texturas nosotros mismos. Así que vamos a arrastrar nuestro PNG rock al albedo, y eso ya se ve mejor Y ahora tenemos un, no parece que tengamos un metálico por aquí, pero sí tenemos una rugosidad y sí tenemos un mapa normal Y tenemos un especular, que en realidad puede pasar por debajo metálico Vamos a probar eso. Eso se ve bastante bien. Entonces ahora tenemos una roca de aspecto bastante decente aquí, y podemos cerrar esto. No guardar. Ahora bien, si salvamos nuestra roca y volvemos a nuestra escena de arena, deberíamos ver aquí algunas rocas mucho más parecidas. Y ahí vamos. Tenemos algunas rocas guapas. Entonces, vamos a hacer lo mismo por los árboles. Y en este caso, los árboles. Así que de nuevo, te he proporcionado múltiples tipos de rocas para que juegues para hacer algo similar. Ahora, para los árboles, tenemos un problema similar en que los árboles que se proporcionaron están en formato FBX Ahora, a partir de Godot cuatro puntos tres, puedes importar archivos FBX directamente Godot a eso alrededor de la era de cuatro puntos dos Y si estás trabajando en cuatro puntos dos, es posible que aún tengas que hacer esto. Pero hay un convertidor FBX externo que usa Godot. Y por ejemplo, si hago doble clic sobre esto, así que si haces doble clic sobre esto, puedes ver que su material no fue configurado correctamente. Y también puedes ver que tenías la opción de usar un importador específico. Ahora, UFBX es, por supuesto, el importador que ahora viene liado a partir de 43 con Godot, así que solo deberías poder Entonces el problema aquí es que, nuevamente, el material, pesar de que han proporcionado un material, no tiene textura, sino que nos han proporcionado la textura. Entonces, lo que ya he hecho es que he creado un nuevo material estándar, que para hacer eso, simplemente haces clic derecho en crear nuevo recurso, y luego material estándar. Así que hasta ahora hemos estado creando archivos de material estándar dentro de nuestros modelos existentes. Así que esta es la primera vez que en realidad estamos usando un archivo de material externo. Pero lo que hice fue tomar la existente la piel provista y la arrastré hasta aquí al albedo Entonces, afortunadamente, el propio árbol estaba correctamente mapeado, por lo que todo lo que se requería era volver a linchar Entonces, si vamos a Young Tree y hacemos una nueva escena heredada, y seleccionamos múltiples para que obtengamos todos estos. Y luego abrimos las mallas, podemos De nuevo, tenemos un material debajo de la superficie, que no es lo que queremos Entonces podemos configurarlos para que vuelvan a ser recursivos únicos. Y luego bajo superficie, podemos cambiar el material a nuestro nuevo material estándar. Y ahora bien, parece que ese modelo en particular no está funcionando bien. Pero de todos modos, aquí hay uno que seguí todo ese proceso antes con uno de los otros modelos, y aquí está. Entonces eso realmente funcionó. Entonces la moraleja de la historia es, desafortunadamente, veces vas a tener que hacer un poco de masaje para conseguir modelos disponibles gratuitamente para trabajar en Godot Pero los problemas más comunes son los materiales rotos o las texturas rotas, y solo te mostré dos formas de arreglarlo. Así que buena suerte. Vamos, um, pongamos realmente este árbol que actualmente funciona en nuestra escena arbórea. Entonces haremos doble clic en eso para abrirlo. Nos desharemos de estas dos instancias de malla. Y entonces lo haremos ¿Dónde estaba nuestro árbol? Arrastremos ese árbol hacia aquí ahora tenemos un árbol. Entonces, si guardamos esto y volvemos a nuestra arena, nuevamente, los árboles se ven bastante groovy Entonces, deshagámonos de esa causa que no funciona. Bien, así es como exportar o importar modelos a Godot Y en nuestra siguiente lección, vamos a mejorar un poco la arena, y ese será el final del curso. Entonces te veré ahí. 37. Mejorar el nivel del terreno: Mm hmm. Mm hmm. Bienvenida de nuevo. En esta lección, nuestra lección final, vamos a hacer un par de cosas. Lo primero que vamos a hacer es vamos a cambiar nuestro Skybox Así que tal vez recuerden, y de hecho ya lo borré aquí que teníamos un skybox que venía de los ajustes de cielo predeterminados producidos por el Godot Podemos cambiar eso. Entonces, si volvemos a nuestra arena y vamos al nodo World Environment que creamos hace muchas, muchas lecciones, podemos dar click en él para expandirlo, y luego dar click en el cielo Y ya lo he expandido aquí. Ahora, antes tenía una textura de cielo procedimental en esta caja, que ya he limpiado. Podemos cambiar eso a cualquier número de cosas. Entonces, vamos a darle otro cielo nuevo, y eso lo abriremos. Y ahora tenemos la opción de establecer un material de cielo. Ahora, antes se fijó en un material de cielo procesal, y así es como teníamos esto aquí. Pero también podemos proporcionar lo que se llama un material de cielo panorámico. Y los cielos panoramáticos son la forma en que agregas cajas gráficas reales del cielo Ahora, crear una textura panorámica está más allá del alcance de lo que estamos tratando de hacer aquí, pero lo hago, he proporcionado uno del paquete All Sky de Richard Whitlock, que está disponible en la Biblioteca de Activos Godot Proporciona un montón de escenas existentes de Godot Skybox y diez texturas skybox diferentes Así que he proporcionado uno aquí. Y si haces clic en el Skybox para abrirlo, verás que tienes la opción proporcionar un panorama Ahora, por alguna razón, bueno, bien, ahora va a funcionar. Genial. Pero antes tuve un problema arrastrando esto por encima. Y así, si arrastras la textura a esa ranura, ahora obtendrás un skybox La otra opción, por supuesto, es hacer clic y hacer ya sea carga o carga rápida. Pero una vez que hayas hecho eso, puedes ver ahora que tienes un hermoso cielo panorámico, y necesito Woop ahí vamos Hermoso Allá vamos. Bueno, ya entiendes la idea. Pero de todos modos, sí, este cielo es ahora que cubre la totalidad de nuestra escena ambiental, y se ve muy bien. Se ve mucho mejor que el original. Entonces, a continuación, arreglemos la serena. Lo primero que vamos a hacer es que vamos a agregar límites reales. Entonces, si recuerdas de cuando probablemente probaste cosas y jugabas antes. Es posible salir del borde de la arena, y como no estamos aplicando gravedad alguna, eso significa que nuestros tanques van a flotar hacia el espacio. No les va a pasar a los tanques enemigos porque solo pueden ir o solo pueden ir de NavPoint a NavPoint, pero definitivamente le puede pasar al jugador, y eso es Así que arreglemos eso. La forma más fácil arreglarlo es simplemente proporcionar algunas colinas colisionadoras alrededor de la frontera del monte Entonces vamos a agarrar una colina. Vamos a hacer click derecho y duplicar ese cerro, y luego necesitamos a Editable Children Y entonces tenemos que hacer que las mallas sean únicas. Y la colisión única para que podamos cambiarlos. Ahora, vamos a cambiar el nombre de esta Colina a la frontera fronteriza Hill North. Y vamos a mover esto aquí arriba. Vamos a Whoa, eso es interesante. Cambiaremos la orientación de este cerro de tal manera que Dónde está nuestra transformación. Dónde está nuestra transformación. Necesitamos los 90 grados de esta manera. Sí. Bien. Y vamos a sí, vamos a mencionar eso un poco. Tráelo un poco hacia adelante. Y ahora podemos cambiar la malla real. Entonces si vamos aquí, tenemos XYZ. Cambiaremos la dirección X a 100, que es el Whoa, eso no está bien Cambiaremos lo terrible, es porque está girado. Bien, ahí cambiaremos la dirección Z. Vamos a traer esto por aquí. Y tenemos uno de esos. Y luego vamos a duplicar todo esto. Cámbialo a Sur. Arrástralo hacia abajo. Uy. Colina Fronteriza Sur. Y podemos simplemente duplicar ambas y rotarlas de tal manera que estén al este y al oeste. Y olvidé cambiar la colisión, así que lo arreglaremos en un momento. Haz eso rotar. Negativo 90. La orientación está un poco apagada. Podemos arreglarlo con bastante facilidad. También puede simplemente estirar estos para que sean mejores Z uno oh cinco. Sí. Y luego haremos lo mismo por East Hill. Sí, bien, supongo que lo son. Bien, parece que ahí tenemos un pequeño hueco . Eso no está bien. Bien. Eso es mejor. Y ahora tenemos que arreglar las colisiones. Así que volvemos a nuestras formas de colisión, y afortunadamente, podemos simplemente editarlas aquí. Y, por supuesto, vamos a tener que restablecer sus transformaciones. Y la orientación está un poco apagada, pero está bien. Simplemente arrastraremos eso así. Arrastra eso por aquí y arrastra eso por aquí. Y luego hacer lo mismo para los otros tres. Esa es la correcta. Sólo tenemos que volver a rotarlo ahora. Y reorientarlo un poco. Haz lo mismo para los otros dos. Sí, parece que ambos son buenos. Sólo tenemos que cambiar la rotación. Cero. Y están apagados en términos de Z, así que vamos a arreglar eso. Bien. Ahora, deberíamos ser capaces de dejar de conducir al espacio. Ahora, vamos a arreglar este terreno es un poco feo. Entonces, de manera similar a como lo hacíamos antes, he proporcionado un conjunto extra de texturas para este proyecto en la carpeta Graphics Desert Texturas. Así que ahora podemos simplemente crear un nuevo material, crear nuevo material estándar estándar de recursos. Sí, lo llamaremos. Desierto. ¿A dónde fue eso? Ahí está. Bien, y ahora podemos no necesitaremos sombreado, pero no necesitaremos el color Vertex Vamos a necesitar nuestro albedo. Y no arrastrará ahí el Rock 29. Bien, me vas a dar me vas a dar pena. Roca 29 Albedo Arrastre de roca. Ahí vamos. Y no lo hacemos realmente no necesitamos metalizado. Nosotros sí necesitamos rugosidad y necesitamos la normalidad. Entonces aquí está nuestra aspereza. ¿Por qué esto sigue desapareciendo? Mapa normal. Habilitado. Y nuevamente, tenemos que asegurarnos de usar el correcto, que es el GL normal. Y en realidad tenemos uno para oclusión ambiental, así que encendamos eso y veamos qué pasa Detener. Las alegrías del software de código abierto, a veces solo quiere actuar de manera tonta Todo bien. Y sí tenemos un mapa de desplazamiento, por lo que es habilitar la altura. Y esta vez voy a hacer esto de la manera normal. Gráficos, texturas desérticas, desplazamiento. Bien, Dan, volveremos a nuestra arena, y queremos establecer el material de nuestra malla de tierra Instancia tres D. Así que abre nuestra malla, y cambiaremos el material. ¿Podemos hacer clic en cargarlo? No. Lod. Tress del desierto. Ahí vamos. Bien, entonces es un poco de aspecto grande. Y la forma más rápida de solucionarlo es cambiar la escala de la UV Entonces, si abrimos la textura y bajamos a UV uno, podemos cambiar la escala aquí. Entonces, pongámoslo en 0.5. Y eso no es bueno. Vamos a establecerlo en 1.5. Eso es un poco mejor. La iluminación es un poco extraña. Probablemente tenga algo que ver con la puesta de sol, supongo. Apaguemos esto. No, no es el sol. Hmm. Bien, hay para que podamos ver, en realidad, aquí está pasando algo interesante. Entonces, ¿qué tenemos? Bien, entonces parece que la textura de Rock 29 era mala. Vamos con el color Rock 29. ver si eso lo resuelve. Sí, mucho mejor. Bien. Eso me gusta. Bien, así que ahora que tenemos ese aspecto bien, podemos proporcionar el mismo material nuevamente a nuestras colinas Y solo hagámoslo directamente en el propio cerro, razón por la cual usar escenas heredadas es maravilloso. Así que regresaremos a Hill, ampliaremos nuestra malla. Y reemplazar nuestro recurso, y ahora podemos cargar rápidamente porque ya lo hemos usado, open, boom. Bien. Estas colinas se ven mejor. Al menos en cuanto a textura. Quiero decir, obviamente, seguimos usando una malla muy inadecuada Pero, um, Bien, y, por supuesto, nuestras mallas fronterizas no están usando el mismo material porque las hicimos únicas, así que tenemos que ponerlas así que tenemos que Y claro, se ven terribles. Así que tenemos que cambiar de nuevo nuestro escalado de UI. Reiniciamos eso a uno. Todavía parece basura Vamos al No. Bien, entonces en este punto, vamos a tener que cambiar la escala de la textura en una sola dirección. Así que aquí hay un pequeño icono de enlace. Entonces, si haces clic en él, eso significa que si cambias y asegúrate de que sea blanco. Si los cambias a todos, entonces eso significa que todos ellos se cambian. Pero si no quieres que ese sea el caso, vuelves a hacer clic en él para que se vea roto. Y en este caso, creo que solo queremos cambiar la X y la Z. así que vamos Oh, está cambiando todo, ¿no? Y eso no queremos. Oh, claro, obviamente, porque estamos usando las mismas texturas que usamos antes o para las otras mallas Así que vamos a tener que hacer que estos sean únicos otra vez. Y afortunadamente, podemos hacerlo simplemente haciendo clic derecho sobre todas ellas, expandiéndolas , yendo al material, y luego haciendo hacer Único. Y ahora deberíamos poder arreglarlos sin romper todo lo demás. Pero volvamos a nuestro desierto original. Asegúrese de que las básculas sean correctas. Sí, originalmente eran 1.5, lo cual estuvo bien. Y ahora podemos cambiar todos estos, ojalá. B material. Ahora bien, estos materiales deben ser únicos. UV uno. Ahí vamos. Esa es la cosa cinco. Ahí vamos. Eso está empezando a verse un poco mejor. Bien. No es perfecto. ¿A lo mejor podemos hacer 15? Sí, eso se ve infinitamente mejor. Bien. Ahora, vamos a ejecutar nuestro juego y ver cómo se ve. Todo bien. Creo que en este punto, podríamos querer apagarlo de la niebla. Pero, ¿dónde está el tanque enemigo? Ahí está. El escalado de la textura sigue siendo un poco fácil. Lo haríamos por el material. Bien, apaguemos la niebla en la cámara o para el ambiente ambiente. Niebla. Oh, eso es correcto. Porque está habilitado en la cámara. Eso lo hicimos. Así que volvamos a nuestra escena original de tanques y vayamos a la cámara y apaguemos una niebla Z. Bien, ahora intentemos esto de nuevo. Derecha. Se ve mucho mejor. Obviamente, queremos jugar con el sol direccional porque ahora todo está en total oscuridad. Entonces hagámoslo. Volvamos a nuestra escena de juego. Y en realidad es en la arena mundo Ambiente direccional Luz. Y podemos plantear esto Bien, entonces dónde está el Oh, ahí está Ahí está la pequeña flecha. Ahí vamos. Entonces, si lo giramos hacia abajo, así que ahora el mapa está más directamente a la luz del sol, arrastremos eso por aquí para que podamos tener algo de sombra en marcha. Bien, esto debería verse infinitamente mejor. Entonces en este punto, puedes jugar con él para conseguir en realidad, siento que siento que esa textura sigue siendo bastante desagradable. Volvamos a aquí. Y cambiaremos la escala UV a tres. Bien. Se ve mejor. En este punto, no es más que cuestión de ajustar hasta que se vea ti te gustaría que se viera Como puedes ver, la textura se ve infinitamente mejor en el minimapa, pero aquí está algo aplanada y sesgada por el tamaño de la arena Pero si realmente vas a las colinas, se ve mucho mejor. Aunque, sí, sigue siendo un poco raro ahí abajo. En fin, eso nos lleva al final de nuestro curso. Siéntete libre de seguir jugando con los ajustes de las texturas y la iluminación y todo hasta que consigas algo que te guste, porque en este punto, como dije, es literalmente solo retocar al gusto Espero que hayan disfrutado de este curso y se unan a mí para ver los conceptos básicos del desarrollo de tres D en Godot, y los veré la próxima vez 38. Exportar tu juego: Echemos un vistazo rápido a cómo exportar tu juego para que otras personas puedan jugar tu obra maestra. Exportarás tu juego pasando por Project Export, y necesitarás descargar los ajustes preestablecidos relevantes para tu sistema Entonces, por ejemplo, si quisiera exportar al escritorio de Windows, daría clic en el botón Agregar y seleccionaría Escritorio de Windows. Y luego, claro, si no tenemos presets disponibles, nos dirá que no hay plantillas de exportación disponibles en la ruta esperada Por lo que tendríamos que descargarlas, administrar plantillas de exportaciones, descargar e instalar desde el mejor espejo disponible. Y una vez hecho eso, deberías poder exportar tu proyecto. Puede cambiar cualquiera de los ajustes disponibles si es necesario. Por ejemplo, puedes agregar puedes agregar un ícono o cambiar cualquiera de estas otras cosas. Pero si en realidad no sabes lo que significa cualquiera de estos ajustes, está perfectamente bien dejarlos como por defecto. 39. Proyecto de clase: crea tu propio juego 3D: Es momento de poner en práctica todo lo que has aprendido. Para el proyecto de clase, construirás tu propia versión del juego Zone Battle usando los sistemas que desarrollamos a lo largo de este curso. El objetivo no es copiar todo a la perfección, sino aplicar los conceptos centrales y hacer suyo el proyecto. Tu proyecto puede incluir un tanque jugable con controles de movimiento y torreta, un entorno de tres D con iluminación, enemigos con comportamiento básico de IA, efectos de sonido y elementos de interfaz de usuario como puntuación o minimapa Eres bienvenido a personalizar el proyecto. De hecho, te animan a. Cambia el diseño del nivel, ajusta el comportamiento del enemigo. Experimenta con materiales o agrega tus propias características pequeñas. Cuando estés listo, sube capturas de pantalla o un breve clip de juego de tu proyecto a la galería de proyectos. También puede incluir una breve descripción de lo que construyó y qué partes le parecieron más interesantes o desafiantes. Voy a estar revisando los proyectos y dejando comentarios. Tengo muchas ganas de ver tus juegos. 40. ¡Felicidades!¿Qué sigue?: Enhorabuena. Has llegado hasta el final del curso. Has aprendido a trabajar dentro de Gdo, navegar en tres espacios D, construir entornos, implementar física, controles, IA, audio, interfaz de usuario y sistemas de juego. Ciertamente mucho. Y juntó todas esas piezas en un juego completo de tres D. Más importante aún, ahora entiendes cómo se estructuran los GIDOjects y cómo los diferentes sistemas se comunican entre sí Esa base es la que te permite seguir aprendiendo y experimentando por tu cuenta. Gracias por tomar este curso y por crear a mi lado. Estoy emocionado de ver a qué llevas tu viaje de desarrollo de juegos a continuación. Buena suerte y creación feliz.