Domina Godot 4: crea un Roguelike de supervivientes con GDScript | Chris Tutorials | Skillshare

Velocidad de reproducción


1.0x


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

Domina Godot 4: crea un Roguelike de supervivientes con GDScript

teacher avatar Chris Tutorials, Game Developer

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.

      Introducción al curso

      1:43

    • 2.

      Configuración del proyecto Godot

      6:38

    • 3.

      Arte, sonido y complementos ~ Importación e instalación

      8:46

    • 4.

      Movimiento del jugador de arriba abajo

      34:39

    • 5.

      Cómo reproducir animaciones a partir de hojas de sprites

      9:51

    • 6.

      Player State Machine

      18:49

    • 7.

      Entrada del jugador como componente

      13:08

    • 8.

      Cambia animaciones con señales

      9:17

    • 9.

      Voltear un personaje en 2D

      13:41

    • 10.

      Capas de mapas de césped y mosaico de tierra

      16:38

    • 11.

      Coloca árboles como accesorios en el mapa

      15:16

    • 12.

      Cómo agregar toques y arreglar la clasificación Y

      9:41

    • 13.

      Proyectiles de efecto spawn con temporizador

      14:54

    • 14.

      Mover proyectiles en dirección de lanzamiento

      6:25

    • 15.

      Configuración de enemigos y casillas de éxito

      16:55

    • 16.

      Infligir daño a enemigos con hits boxes y estadísticas

      9:14

    • 17.

      Estado de muerte cuando el enemigo alcanza los 0 HP

      13:59

    • 18.

      Rotación y apuntación de proyectiles con carga de armas

      5:43

    • 19.

      Cómo agregar efectos de sonido y música

      7:21

    • 20.

      Sistema de combate Singleton

      5:48

    • 21.

      Animación de texto de combate flotante

      18:26

    • 22.

      Movimiento enemigo con seguimiento del jugador en Godot 4

      16:53

    • 23.

      Genera enemigos en una curva de tiempo

      15:36

    • 24.

      Fuera de pantalla con el desplazamiento calculado

      19:25

    • 25.

      Desparcimiento de un enemigo al azar según condiciones de peso y tiempo

      15:11

    • 26.

      Configuración de Hurtbox y Enemy Hitbox

      7:09

    • 27.

      Definiciones de temporizador de invencibilidad del jugador y estadísticas personalizadas.

      10:45

    • 28.

      Implementación de daños periódicos en las cajas de éxito enemigas

      4:35

    • 29.

      Derrota de jugadores

      7:40

    • 30.

      Probar y mejorar el comportamiento ante un jugador derrotado

      5:06

    • 31.

      Creación de una escena de Pickup2D

      6:00

    • 32.

      Implementación del sistema de captación de experiencias con herencia

      4:42

    • 33.

      Cómo configurar Collector2D y fijar las animaciones del jugador

      5:24

    • 34.

      Creación de mecánica de caída enemiga y redimensionamiento de pastillas

      11:32

    • 35.

      Generación de posiciones aleatorias de caída de artículos

      4:45

    • 36.

      Implementación de una área de gravedad de una pastilla

      10:31

    • 37.

      Cómo crear una interfaz de usuario con barras de progreso HP y EXP

      11:15

    • 38.

      Implementa un sistema de UI basado en estadísticas con señales

      10:38

    • 39.

      Guiones dinámicos de pantallas HP y EXP para la interfaz de usuario del jugador

      16:06

    • 40.

      Depuración y optimización de UI y scripts de recogida

      5:11

    • 41.

      Sistema de nivelación con experiencia y progresión de estadísticas

      18:39

    • 42.

      Configuración de umbrales y conexiones de señal para las recompensas para aumentar de nivel

      9:47

    • 43.

      Cómo crear el diseño de la UI y el texto animado

      8:39

    • 44.

      Diseñar la interfaz de usuario de la selección de recompensas y los ajustes finales

      8:35

    • 45.

      Creación de un sistema de nivelación de armas para las actualizaciones del juego

      9:55

    • 46.

      Artículos de armas para mejorar la potencia armística

      13:24

    • 47.

      Crear un sistema de selección de artículos ponderado para las recompensas de aumento de nivel

      14:30

    • 48.

      Selección de recompensa por programación con propagación de señal

      18:35

    • 49.

      Aplicación de estadísticas de nivel de armas al parto de proyectiles e instancias

      10:03

    • 50.

      Construcción de un arma de cinta giratoria

      10:21

    • 51.

      Cómo crear una interfaz de usuario para mostrar armas y el inventario del juego

      19:40

    • 52.

      Conexión de señales y configuración de la interfaz de usuario de armas para la pantalla dinámica

      19:31

    • 53.

      Cómo crear elementos para mejorar las estadísticas

      11:14

    • 54.

      Implementación de las tomas HP Boost y correcciones de nivel en la UI

      10:33

    • 55.

      Creación de una pastilla de poción saludable para las gotas enemigas

      5:23

    • 56.

      Implementación de la sacudida de cámara para los efectos de impacto y muerte del jugador

      10:14

    • 57.

      Creación de un juego en pantalla con la navegación del menú principal

      8:29

    • 58.

      Seguimiento de puntuación alta y visualización de la interfaz de usuario para las derrotas de los enemigos y el tiempo de supervivencia

      17:15

    • 59.

      Cómo guardar y cargar notas altas con JSON

      13:54

    • 60.

      Diseño de un menú principal con visualización de alta puntuación y funcionalidad de inicio del juego

      11:22

    • 61.

      Supervivientes de la escritura: mejoras en el juego y depuración

      16:34

  • --
  • 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.

128

Estudiantes

1

Proyecto

Acerca de esta clase

¿Quieres construir tu propio auto de Roguelite lleno de acción, incluso si no sabes nada de programar?

Este curso para principiantes te guía paso a paso a través de la creación de un juego 2D completo, "Script Survivors", usando Godot 4 y GDScript, el poderoso lenguaje de secuencias de comandos de Godot. Sin necesidad de experiencia previa en codificación o desarrollo de juegos, aprenderás mediante la práctica y construirás un prototipo pulido desde cero.

Qué aprenderás:

  • Domina los conceptos básicos y las mejores prácticas de GDScript: escribe código limpio y reutilizable con convenciones de nombramiento adecuadas (por ejemplo, snake_case), exporta variables para facilitar los ajustes y documenta tus scripts con comentarios para mantener el mantenimiento.

  • Crea mecánicas básicas de juego: implementa armas de ataque automático (como lanzas y crecillas), sistemas de desgeneración de enemigos con curvas de dificultad ajustables, colección de experiencia (EXP) y un sistema dinámico de nivelación de jugadores con mejoras impactantes.

  • Aprovecha el sistema de escenas y nodos de Godot: organiza tu juego usando escenas para tener modularidad (por ejemplo, escenas del jugador, enemigos y del mundo), nodos para objetos del juego (CharacterBody2D, Sprite2D) y temporizadores para programar eventos con precisión.

  • Crea sistemas de combate atractivos: diseña mecánicas de salud y daños, incluidas formas de colisión para lograr interacciones precisas, cuadros de invencibilidad y mejoras de armas multiobjetivo para que el juego sea satisfactorio.

  • Agrega detalles con sistemas de UI y guardado: Crea interfaces de usuario intuitivas (por ejemplo, pantallas con altas puntuaciones, pantallas de aumento de nivel) utilizando nodos de control e implementa un sistema de guardado/carga basado en JSON para realizar un seguimiento de las altas puntuaciones de los enemigos derrotados y el tiempo de supervivencia.

  • Usa máquinas de estado para una lógica más inteligente: utiliza el complemento de IA Limbo para gestionar el comportamiento de personajes y enemigos (por ejemplo, inactivo, huye, estados de ataque), simplificando la lógica compleja y preparándote para patrones de IA avanzados.

  • Aplica patrones de desarrollo de juegos reales: aprende habilidades transferibles como encapsulamiento (por ejemplo, secuencias de comandos GameManager y SaveLoad), gestión de recursos (por ejemplo, PlayerContext) y organización de proyectos para ampliar tu escala en proyectos más grandes.

Al final de este curso, tú:

  • Tener un juego de acción en 2D completamente jugable con enemigos, mejoras y un menú principal, listo para mostrar en tu portafolio.

  • Navega con confianza por el editor de Godot, desde el gerente de proyectos hasta el inspector, y usa herramientas como AnimationPlayer y las texturas atlas para obtener visuales perfectas al píxel.

  • Estarás equipado para crear tus propios juegos con una base sólida en Godot 4, GDScript y flujos de trabajo de desarrollo de juegos, listos para abordar nuevos proyectos con facilidad.

¿Por qué este curso?

  • Para principiantes: comienza por lo básico, con explicaciones claras de la interfaz de Godot, la sintaxis GDScript y los conceptos de desarrollo de juegos, lo que garantiza una curva de aprendizaje fluida.

  • Aprendizaje práctico: sigue la clase para crear "Script Survivors", un prototipo completo con pixel art, música chiptune y efectos de sonido, guiado por ejemplos prácticos.

Habilidades del mundo real: aprende técnicas profesionales como máquinas de estado, serialización JSON y diseño modular, y te prepararás para proyectos de desarrollo de juegos más grandes.

¡Únete ahora y comienza a crear juegos de acción adictivos que hagan que los jugadores vuelvan por más!

Conoce a tu profesor(a)

Teacher Profile Image

Chris Tutorials

Game Developer

Profesor(a)

I believe the best way to learn technology--and programming in particular--is through video-based learning. My role is to provide clear, hands-on video tutorials that guide you step-by-step, but ultimately, it's up to you to engage actively, absorb the concepts, and practice consistently. This approach helps you become a more confident and skilled developer.

I specialize in Godot game development using GDScript and C#, breaking down complex topics into manageable lessons that empower you to build your own projects from the ground up.

If you want to experience my teaching style before enrolling, check out my free tutorials on my YouTube channel, Chris' Tutorials. I look forward to helping you grow as a programmer and creator!

Ver perfil completo

Level: All Levels

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. Introducción al curso: Hola a todos, Chris, aquí. Y en este video, tengo algo realmente genial. Me emociona compartir con todos ustedes. Es mi nuevo curso de desarrollo de GidoGame para crear un juego similar a Survivor Así que ahí tenemos mucho contenido. Es decir, son más de 60 lecciones y casi 12 horas de video. De lejos, es el curso de desarrollo de juegos más largo y completo que he publicado. Entonces, si alguna vez has pensado hacer tu propio divertido juego de Survivors Light, eso es exactamente lo que vamos a hacer. Lo construiremos paso a paso, desde cero. Estaremos usando la versión 4.4 de GIDOEngine, que probablemente ya sepas que es gratuita y de código abierto Así que vamos a codificar todo en script GD. Que es el lenguaje específicamente hecho para el editor Gadot Es apto para principiantes, es fácil de leer y está estrechamente integrado en el motor ado. Así que funciona fantásticamente para hacer prototipos de juegos como este Entonces, si eres nuevo el desarrollo de juegos o ya has hecho un poco de codificación y solo realmente quieres solidificar tus habilidades con un nuevo proyecto interesante, creo que este curso va a ser para ti tus habilidades con un nuevo proyecto interesante, creo que este curso va a ser para Empezaremos simples, poniéndonos cómodos con elementos esenciales como el movimiento de arriba hacia abajo del personaje. Entonces realmente empezaremos a hacerlo crecer, construyendo a partir de algunos conceptos genuinamente complejos. Pondrás estadísticas de personajes, sistemas de nivelación, recolección de objetos, incluso construiremos un sistema de desove que colocará a todos tus enemigos fuera de la pantalla para que puedan enjambrar al jugador desde todos los lados Entonces, en pocas palabras, nos pondremos realmente manos a la obra con el sistema de escenas Godos two D. Eso va a cubrir todo lo demás, desde proyectiles hasta crear interfaces de usuario pulidas Al final del curso, tendrás un superviviente totalmente jugable como prototipo de juego visto en segundo plano y todo el conocimiento que necesitas para convertirlo en un proyecto más grande Entonces, ¿qué dices? ¿Estás listo para convertir esas ideas de juego en algo real? Ven y únete a mí en el curso, y construyamos juntos algo bastante increíble. 2. Configuración del proyecto Godot: Hola a todos, Chris aquí, en este video, comenzaremos con el primer paso de nuestro proyecto Survivors Like y GD Script descargando el GDOEngine Si aún no lo sabes, Gadot es un motor de juegos de código abierto gratuito que tiene su propio idioma primario, GD Script escrito específicamente para Gdo, que es lo que vamos a usar para codificar Es un lenguaje de scripting. Puedes, por supuesto, usar otros idiomas en Gdo como C Sharp, que tiene un fuerte soporte incorporado con una Mnoversión La mayoría de los tutoriales que encuentres van a estar en GDScript porque GD Script es rápido para comenzar con Tiene realmente una gran integración con el Editor EUI. Es fácil de usar, y no tienes que compilar tus scripts cada vez que quieras hacer cambios en él. Entonces, en lo que respecta a la simplicidad, especialmente para proyectos pequeños, GD Script tiene mucho a su favor. Entonces mirando el sitio web de Gado, voy a estar usando la versión de lanzamiento actual de Gado 4.4 0.1. Específicamente va a estar descargando la versión no mono de la misma, lo que significa que no cuenta con soporte de C Sharp porque la versión de GD Script solo permite exportar a la web Pero si usas el Gado Mono, esa función no es compatible. Entonces Gadot 4.5 ya está bajando por la tubería, y hay un par de características que creo que son bastante geniales saliendo. Pero como estamos tratando de mantener este curso para principiantes nivel intermedio, no quiero abrumar a nadie con todos esos conceptos Así que sigamos adelante y haz clic en Descargar y agarra 4.4 0.1, y queremos la versión azul aquí. No es Mono. Esto va a ser solo para GD Script. Si querías C sharp, puedes grabar.net. No vamos a necesitar eso para esta versión del proyecto. Podría crear una versión C Sharp del curso más adelante si tiene sentido. Ya veremos cómo van las cosas. Entonces vas a querer guardar esta instalarla y luego abrir el GadoEditor Entonces, una vez que lo abras, deberías ser golpeado con el gerente de proyectos, que te dará una lista de tus proyectos actuales. Probablemente no tengas mucho aquí. Podría haber algunas demostraciones. Pero lo que vamos a querer hacer es crear nuestro nuevo proyecto. Así que vamos a crear un nuevo proyecto, y puedes darle a este el nombre que quieras. Voy a llamarlo guión Survivors nombre sutil, sé, porque es guión GD, y es un estilo sobreviviente Así que voy a poner esto en mi directorio de tutoriales, que he configurado específicamente para este tipo de tutoriales de formato largo. Así que vamos a establecer eso como la carpeta actual, y deberíamos ver algo así como el nombre del proyecto aquí y la ruta al proyecto completo. Porque hice Script sobrevivientes Una palabra, en realidad no puso un separador aquí abajo. Entonces solo usaré un guión como separador predeterminado para espacios. Y vamos a querer el renderer en modo móvil. Este es un curso de pixel art, así que realmente no necesitamos el renderer Ford por ningún motivo, y solo seguiremos adelante y crearemos con eso Entonces, una vez que tu proyecto se haya iniciado, deberías ver el puerto de tres vistas D aquí Una de las cosas interesantes de Gadot es que tiene dos flujos de trabajo completamente separados para dos D y tres D, pero sí los soporta a ambos A diferencia de Unity, son entidades completamente separadas. Entonces no es fingir dos D en un sistema de tres D. En realidad son completamente dos D. Y si miras a la izquierda en esta ventana de escena, verás que aquí hay bien, realmente cuatro tipos de nodos, dos escenas D, tres escenas D, interfaz de usuario. Y luego si hacemos clic en otro nodo, ahí está la clase base aquí nodo, que no tiene componentes 2d3d a él Entonces no es una posición en ninguna parte, lo usarías para cosas como sistemas, procesamiento de información de fondo, no objetos realmente en el mundo del juego. Para todo lo que hay en el mundo del juego, generalmente, vamos a estar usando una escena dos D. Entonces ese va a ser un icono de nodo azul por aquí, igual que la diferencia. Y luego la interfaz de usuario son los nodos de control. Entonces eso está marcado por el verde, cualquier cosa que sea un botón en pantalla, texto de combate flotante, ventanas pop up de UI, como cuando estamos haciendo selección de recompensas por lo que puedes obtener por subir de nivel. Esos son todos los nodos de la interfaz de usuario. Entonces, claro, a medida que avanzamos, voy a explicar más sobre qué es realmente un nodo. Por ahora, vamos a cubrir un poco más la interfaz. Entonces tenemos el sistema de archivos en la esquina inferior izquierda. Ahí es donde vas a tener todos tus archivos en Gdo incluyendo cualquier activo importado, tus archivos SEN, que es donde tomas uno o más nodos, y los guardas en una escena, de la cual puedes crear copias de cualquier parte de tu juego Entonces es básicamente una plantilla que puedes reutilizar. Y luego otros archivos Gdo y no Gudo como recursos también Entonces en el Viewport aquí, tienes tu acceso X, Y aquí. Un punto distintivo es abajo es en realidad la dirección positiva para el eje Y. Entonces, si estás hablando de moverte hacia arriba, quieres ir negativo Y, y si quieres moverte hacia abajo en la pantalla, estarías hablando de un valor Y positivo. Derecha es X positiva, y luego izquierda es negativa X. Así que eso será realmente relevante cuando estemos moviendo a nuestros personajes por la pantalla. Quieres asegurarte de que se muevan en la dirección correcta y que también estás obteniendo la entrada para la dirección correcta. Si miras muy de cerca el punto de 1,200 píxeles, al menos para mí, habrá los límites de nuestra interfaz de usuario Por lo tanto, la interfaz de usuario suele estar en su propia capa de lienzo separada. Entonces es algo completamente separado mundo de los dos juegos D en sí. Se podría pensar en la interfaz de usuario de la interfaz de usuario como una especie de capas en la parte superior de la cámara, ya que está viendo los dos mundos D. Así que cada vez que la cámara se mueva, todos los elementos de la interfaz de usuario también se van a mover. Pero los objetos del mundo del juego no se mueven con la cámara en general. Entonces, si mueves la cámara, la interfaz de usuario permanecerá en su lugar y todo lo que hay debajo de ella, los personajes, los enemigos, esos no se mueven con la cámara. Y ese es uno de los mayores factores distintivos entre los dos nodos D y los nodos de control de la interfaz de usuario Cualquier cosa que sea un elemento UI es un nodo de control en Gadot. A la derecha, tenemos el inspector que se utiliza para definir cualquier propiedad sobre sus nodos. Cuando escribes scripts, puedes darle una etiqueta at export, que la marca como editable dentro del inspector Eso es muy importante. Vamos a estar haciendo mucho de eso. Así que editarás eso por aquí. Por supuesto, hay otros Windows que tienen una importancia variable. También los cubriré en los videos posteriores. Entonces, en el siguiente video, nos pondremos en marcha con nuestro proyecto. Importaremos todos los activos artísticos que necesitamos, incluyendo audio, música, arte, fuentes. Y luego también hay un par de plugins que creo que serían sumamente útiles para el proyecto, los gratuitos para descargar y usar. Entonces cubriremos todo eso en el segundo video. 3. Arte, sonido y complementos ~ Importación e instalación: Entonces en este video, vamos a continuar con configuración de nuestro proyecto obteniendo todos los activos y audio y complementos todos configurados en los proyectos que estamos bien para comenzar a trabajar. Entonces sobre PaySPN, tengo todos los enlaces a los activos que necesitamos para el curso, todo lo que utilicé en el proyecto de pre grabación para sobrevivientes de guiones Entonces, si sigues el enlace aquí arriba en la parte superior, voy a hacer zoom en eso. Básicamente puedes simplemente ir a cada uno de estos enlaces, y solo necesitas las versiones gratuitas de cada activo. Tengo que compartirlo de esta manera para respetar la regla de no redistribución que tienen muchos de estos activos, pero básicamente solo necesitas seguir los enlaces a cada página de la tienda y agarrar la versión gratuita Entonces, antes que nada, Pixel Crawler tiene nuestro modelo basado en personajes que usaremos para armar algunas armas y enemigos Es realmente el núcleo de este tutorial, así que eso es lo que realmente basamos mucho del Alfa. Así que a continuación Íconos de fantasía de cuervo. Para los elementos de la interfaz de usuario, la interfaz de usuario Crimson Fantasy. La fuente, voy a estar usando m5x7. Pero honestamente, puedes elegir la fuente de pixel art que creas que se ve bien También hay mucho en el punto de picor IO. Para algunos efectos de sonido básicos de audio de juegos, Leo pasa RPG Essentials SFX gratis Y luego para la música, The Red Hearts preparado para Dev por Tall Beard es música de melodía de chip absolutamente perfecta para el estilo del juego Survivors Light. En realidad funciona muy, muy bien. Bien, entonces descargas todos los archivos zip, y luego lo que puedes hacer es hacer clic derecho en el sistema de archivos, crear una nueva carpeta para el arte. Voy a poner todas las imágenes aquí. Y luego haz click derecho, crea una nueva carpeta para audio, cualquier cosa que esté en Efectos de sonido o música, voy a estar poniendo ahí. Y luego abrirlo rápidamente en Windows File Explore, o el equivalente si estás en Max o Linux, es hacer clic derecho y hacer Open and File Manager. Bien. Y luego solo quieres extraer todos los archivos en esa carpeta de arte. Entonces aquí tenemos la GUI de fantasía Crimson, tenemos los íconos de fantasía, y luego el pack gratuito Pixel crawler La única excepción es que para los íconos de fantasía, hay como tres o cuatro versiones diferentes de la misma. Solo estaba usando las hojas completas de sprites. Estos son los más fáciles de trabajar en Gadot porque puedes crear un recurso de textura de atlas, y luego simplemente elige el ícono que deseas seleccionar para eso Por cada uno de los elementos a los que vas a estar asignando un ícono, simplemente me resulta mucho más fácil trabajar de esa manera Y también Para Gadot, si está importando cada icono por separado, que es una opción con ese paquete, lleva mucho tiempo cargarse realmente en el motor Entonces, cuando tienes tus imágenes empaquetadas en un archivo como este, es simplemente mucho más eficiente. Creo que es el camino a seguir. Aparte de eso, creo que solo estaba trayendo todo el directorio. No cambio los nombres de los archivos ni nada por el estilo. Normalmente, en Gadot, irías con carcasa de serpiente para los nombres de tus carpetas de directorio, pero creo que es simplemente más sencillo usar lo que los artistas proporcionaron aquí y simplemente ir con eso Por lo que no debería causar ningún problema ni nada. Solo tal vez un poco en optimizado, pero eso está perfectamente bien. Y luego para el audio de los efectos de sonido, si abres el zip, simplemente vendremos así. Y la música, solo estaba tomando el salto de caja de los tres Red Heearts, que es la primera pista musical De hecho, puedes seleccionar la pista de música que quieras usar para tu nivel de juego, pero creo que esta funciona muy, muy bien Ya sabes, vamos a seguir adelante y previsualizar por un minuto. Sí, así que una pista absolutamente asesina para los juegos de estilo Survivor, creo. Así que una vez que importas todo, lo pones en tus archivos. Si reabres la ventana de Gado, deberías ver todo lo que se importa en estas carpetas correctamente, y luego debería mostrarse aquí a la izquierda Así que podrías recibir algunos mensajes de error cuando estés importando cosas por primera vez. Simplemente puedes confirmar que los archivos están ahí, y eso es lo principal importante aquí. Creo que estos mensajes pueden ser ignorados. Drop Stable ni siquiera tiene nada que ver con ese proyecto. Podría estar relacionado con el almacenamiento en caché en mi computadora. Pero lo importante es que aquí tenemos los archivos . Puedes hacer doble clic sobre ellos. Se puede ver que se le está reconociendo, como la música de ahí y los efectos de sonido por aquí. Entonces parece que estamos bien. Así que adelante y claro ese logo. Entonces necesitamos dos plugins para el curso. Uno, creo que es solo una gran calidad de vida cuando estás navegando por el sistema de archivos por aquí. Se llama colapsar carpetas porque podrías notar que cuando abres un montón de carpetas como esta, realmente no hay una manera fácil colapsar o plegarlas todas de nuevo hacia abajo para que puedas ver tu sistema de archivos completo aquí en una ventana. Entonces lo que quieres hacer es ir al Asset Lib aquí arriba en la parte superior y luego buscar colapso. Entonces haga clic en la barra de búsqueda tipo colapso. Y entonces el que queremos por aquí es colapsar carpetas. Entonces descarga eso. Instalarlo Bien, diré instalado correctamente. Ahora queremos ir a Project en la parte superior izquierda, configuración del proyecto y pasar a la pestaña plugins aquí. Comprobación habilitada, pulsa Cerrar. Y lo que eso hace es que crea este pequeño icono por aquí donde puedes colapsar todo, y puedes tener todas las carpetas, volver a la raíz. Nada está expandido, y es mucho más fácil navegar por el sistema de archivos con eso. Creo que es sólo un botón muy práctico. Debería estar ahí en Gadot básico, honestamente. Entonces el otro es un plug in mucho más involucrado, y lo vamos a estar usando para máquinas estatales en Gadot También se usa para árboles de comportamiento, pero debido a que la IA es muy simple y un juego de supervivientes, aquí solo vamos a estar pegándonos con las máquinas estatales No hay necesidad de hacerlo más complejo con un árbol de comportamiento. Entonces estamos buscando Limbo AI, y como estoy en 4.4, voy a estar usando Limbo AI 4.4, claro Podrías notar que actualmente aquí, al menos, todavía no hay 4.5 fuera porque, bueno, quiero decir, 4.5 todavía en Dev, así que puede funcionar si decides usar la versión Dv o puedes encontrarte con algunos problemas. Probablemente funcione, pero, ya sabes, puede haber un error aquí o allá. Entonces, ya sabes, otra razón para apegarse a la versión estable de Gado. Entonces vamos a descargar esto, y este va a ser nuestro enchufe de máquina estatal . Podemos instalarlo. Tomará un poco más porque este es un enchufe bastante grande. Voy a hacer caso omiso de estos mensajes una vez más. Eso podría estar sucediendo porque el nombre del proyecto es el mismo, aunque el directorio sea diferente, así que simplemente cambiaré el nombre del proyecto para que esas cosas dejen de aparecer. Ojalá, esto solucione. Así que sólo voy a cambiar el nombre y darle el nombre GD script ahí. ¿Es una etiqueta extra? Cerremos que voy a borrar los mensajes, y solo recargaré el proyecto mientras estoy por delante y solo veré si hay algún problema cuando vuelva a cargar el No, bien, parece bueno. Bien. Entonces, si verificamos configuración del proyecto del proyecto y vas a Plugins, notarás que Limbo AI no aparece aquí La IA del limbo en realidad está escrita en C plus plus, lo que podría ser la razón por la que no aparece como un enchufe cado específicamente Me imagino que lo hizo para maximizar la eficiencia del código ya que CplusPlus es más rápido que el script C Sharp y GD Pero sí, así es como es. Entonces, para confirmar que Limbo AI funciona, podemos crear rápidamente una nueva escena TD aquí en la parte superior izquierda Y luego haz clic derecho aquí en el nodo raíz, el nodo dos D, agrega un nodo hijo y busca solo escribe en Estado. Deberías ver pop up del estado del limbo y estado BT. Siempre y cuando veas aparecer esas clases de Limbo AI, entonces sabrás que el plugin está instalado correctamente Entonces, para recapitular, deberíamos tener un audio nuestros efectos de sonido sobre cinco carpetas aquí, al menos una pista de audio Y el arte, deberíamos tener GUI de fantasía Crimson, los íconos de fantasía de Raven, y solo estoy trayendo la carpeta completa de hojas de sprites, y luego Pixel Crawler para nuestro personaje principal, nuestros accesorios de fondo y enemigos, accesorios de fondo y enemigos, especie de activo de arte principal para la serie de Y luego una fuente. Así que traje m5x7 como fuente TTF de punto. Creo que otros tipos pueden funcionar también, pero probablemente lo mejor es simplemente ceñirse al mismo para mayor consistencia. Y luego tenemos agregaciones, carpetas colapsadas, y Limbo AIA Entonces esos deberían ser todos los archivos externos que necesitamos traer para este curso. Todo lo demás va a ser script GD que escribamos, o escenas que configuramos u otros archivos Gadot que creamos, también, como recursos que pueden guardar en un Entonces eso va a ser todo para este video. A continuación, vamos a empezar a crear nuestro personaje de juego de dos D de arriba hacia abajo y agregar algunos controles básicos de movimiento al personaje, que pueda moverse en la pantalla. 4. Movimiento del jugador de arriba abajo: Entonces, en este tutorial, vamos a implementar el movimiento de personajes de arriba hacia abajo para nuestra escena de personaje de jugador principal. Pero justo antes de entrar en eso, sí quiero señalar que podemos eliminar la carpeta demo del Limbo AI que importa automáticamente con el enchufe en sí mismo Si quieres pasar por la demo o mantenerla ahí, eres bienvenido a hacerlo. Esto incluye ejemplos sobre cómo usar Limbo AI, pero te estaré mostrando en video esos pasos para la máquina de estado específicamente Así que en realidad no necesitamos eso para nuestro proyecto. Voy a quitar eso. Bien, y ahora estamos listos para comenzar. Así que queremos comenzar con una escena dos D en la esquina superior izquierda, así que voy a hacer clic en crear nodo raíz dos escena D. Entonces eso nos va a dar un nodo base dos D. Ahora bien, la raíz de nuestro personaje, términos generales, queremos ser un cuerpo de carácter dos D, que es un tipo de nodo dos D. Así que podemos hacer clic derecho sobre nuestro nodo dos D e ir a cambiar Tipo, y luego vamos a escribir en carácter. Encontraremos el cuerpo del personaje dos D. Tenga en cuenta que esto hereda del cuerpo físico dos D, que es un objeto de colisión Que es un tipo de nodo dos D. Así que hay toda una serie de clases o tipos de objetos de los que el cuerpo del personaje está heredando, y adquiere todos los rasgos de todas las clases que le preceden Entonces eso significa que cualquier cosa que un cuerpo físico dos D pueda hacer, un cuerpo de personaje dos D también puede hacer. Entonces vamos a golpear cambiar aquí al cuerpo del personaje dos D. Y tan pronto como lo hagas, habrá esta pequeña señal de advertencia de triángulo amarillo que dice que el objeto de colisión no tiene forma. Entonces necesitamos hacer clic derecho y agregar un nodo hijo, que va a ser una colisión en forma dos D, y solo voy a acercar el centro 0.00 aquí. Aún no verás nada porque en realidad no hemos agregado un sprite Pero comencemos haciendo clic en forma y el inspector en el lado derecho y haciendo nueva forma de círculo. Así que podríamos volver a editar eso y reducir su tamaño, pero primero necesitamos el sprite para poder ver realmente con qué estamos trabajando Entonces tomemos el nodo raíz y también renombrémoslo presionando F dos. Y sólo voy a llamarlo jugador. También podrías llamarlo personaje de jugador o personaje jugador cuerpo dos D, lo que sea que tenga sentido para ti. Y luego vamos a guardar esta escena, que es básicamente la escena raíz y cualquiera de los nodos hijos en un solo archivo, un archivo de escena TACN punto en nuestro proyecto Entonces si pulsamos Control S para guardar, entonces entonces hacemos clic en la esquina superior derecha, esto crea un nuevo botón de carpeta. Y vamos a darle un nombre. Voy a hacer personajes, voy a minúsculas, que suele ser el nombre estándar de Gadol, caso de serpiente Entonces, si necesitas espacios, pondrías guión bajo y luego otras cosas, algo así Entonces hagamos personajes. Y luego en personajes, voy a crear una carpeta para el reproductor solo porque sé de antemano, habrá un montón de guiones, y luego podremos combinar esos todos en el mismo subdirectorio Entonces voy a crear una nueva carpeta. Jugador. Y digamos Bien. Así que tenemos player dot TSC y vamos a guardar eso en este directorio o carpeta Así que guarda la escena ahí. Entonces en Godot, tu proyecto se compone esencialmente de escenas dentro de escenas Entonces podrías tener una escena de juego principal. Tenemos toda la configuración del sistema, y bajo eso, podrías cargar en la escena del mundo del juego, que es el mapa de dos D y los objetos que deberían poblar y dentro de ese mundo de dos D, tendrías, por supuesto, tu escena de jugador, las escenas para tus enemigos, tus orcos, tus esqueletos, etcétera Y así, cuando tu escena se guarda en un archivo, es muy fácil instanciar esto porque solo va a ser básicamente tomar los datos guardados y cargar una copia de los mismos y ponerlos en tu Así que muy rápido, en realidad podría demostrarlo. Si hacemos clic en esta nueva pestaña, crear un nuevo botón de escena. Podemos agregar una nueva escena dos D aquí. Llamemos a esto el mundo. Entonces le pegaré a F dos para cambiarle el nombre, y esto solo será mundo. Podemos mantenerlo como un nodo estándar dos D. Realmente no lo necesitamos para tener otra cosa que no sea una posición en la pantalla. Entonces, vamos a darle a Control S para salvar esta escena. Voy a salir a la raíz y podemos simplemente salvar a World Dot TSN dentro de aquí Bien, ahora queremos agregar una copia de nuestro jugador al mundo. Entonces, lo que podemos hacer es arrastrar la escena del jugador a la jerarquía mundial en la pestaña de escena en la parte superior izquierda. Así que solo arrastras al jugador punto TSN aquí arriba bajo Mundo. Y ahora hay una copia del jugador dentro del mundo del juego. Entonces sabes que está ahí porque puedes pasar el cursor sobre él. Diré jugador aquí. Se puede ver el icono para el cuerpo del personaje dos D, y se puede ver la forma de colisión que definimos. Ahora, todavía no hay sprite. Vamos a agregar eso ahora mismo. Entonces golpearé Controlarnos para salvar el mundo. Iremos al jugador. Voy a hacer clic derecho sobre el jugador, agregar un nodo hijo que estamos buscando sprite Así que Sprite dos D. También hay un nodo Sprite dos D animado, y ambos pueden ser utilizados prácticamente para los mismos fines Configuraron las cosas de manera un poco diferente. Yo diría que para los personajes de los jugadores, en realidad es más fácil trabajar con Sprite dos D y luego definir las propiedades que necesitas para animar en el reproductor de animación Nos adentraremos más en la animación de un sprite en el siguiente video Entonces agreguemos un nodo Sprite dos D. Y por ahora mismo, vamos a querer cargar en una textura. Cuando estamos cargando en la textura aquí, no vamos a establecer una sola imagen de sprite En realidad vamos a establecer una hoja de sprites. Entonces obtenemos nuestra hoja de sprites del directorio art. En el pack de orugas Pixel, tenemos, creo que fueron entidades, personajes, cuerpo A, y animaciones Así que sólo empezaremos con el ídolo. Entonces para este personaje, obtienes una hoja de sprites abajo y arriba Cuando estás haciendo dos juegos D de arriba hacia abajo, en realidad puedes simplemente voltear la hoja de sprites laterales De izquierda a derecha, lo que significa que no necesitas crear una cuarta hoja de sprites para izquierda y derecha porque puedes reutilizar la misma hoja de sprites, y funciona igual Te ahorra mucho tiempo para animarlo de esa manera. Así que queremos que Idle down comience solo para poder ver realmente el personaje que estamos viendo. Así que vamos a cargar eso aquí. Entonces este es un sprite de carácter base. Entonces la idea aquí es que pudieras agregar ropa como un sprite adicional encima de ella, hacerle cualquier personalización, pero las animaciones en el núcleo permanecen iguales ya que desarrollarías el personaje final para básicamente diferentes estilos y apariencia Bien, así que probablemente destaquen algunas cosas. En primer lugar, el personaje obviamente no tiene ropa. Entonces este es un sprite de carácter base. La idea es que lo que harías es tomar sprites adicionales de ropa y agregar esos encima de tu animación base para el personaje final, tal vez como un sombrero de mago o algo así Y la idea es que puedas intercambiar sprites para terminar tu personaje final Pero para las animaciones base, se proporcionan aquí en el paquete gratuito, y solo construirías a partir de ahí. Así que solo estaremos trabajando con esto para el tutorial. Los otros dos temas obvios es, bueno, uno, tenemos cuatro copias del personaje que se muestran en pantalla a la vez. Entonces queremos que sea así solo uno se muestra. Y la forma en que lo hacemos es ir a la pestaña de animación aquí, y cambiamos los fotogramas H por el número de sprites que están mostrando en esta hoja de sprites horizontales Así que solo cambio fotogramas H a cuatro. Y ahora solo está mostrando la posición cero del fotograma, que es el primer sprite en esta animación inactiva El tercer problema es que es muy borroso para el pixel art Así que podemos arreglar esto en todo nuestro proyecto subiendo a la configuración del proyecto, y queremos desplazarnos hacia abajo hasta, creo que es renderizador No, texturas. Entonces renderizado y luego textura por defecto filtro de textura lineal aquí es más apropiado si estás haciendo, supongo, cosas como arte vectorial. Pero para el pixel art, que tiene que ser Pixel Perfect, quieres cambiar esto al más cercano. Y en cuanto lo hagas, básicamente va a mostrar cada píxel renderizado de manera nítida, como cabría esperar de un juego de pixel art Y más o menos para el proyecto, eso es todo lo que vas a necesitar hacer para configurarlo específicamente para un formato de pixel art. Ahora, el personaje y la forma de colisión son un poco raros aquí ahora mismo. Generalmente, para los juegos de arriba hacia abajo, quieres que la forma de colisión vaya a algún lugar alrededor de los pies del personaje. Entonces me gusta mantener mis escenas aún centradas a las 00 para que sepa básicamente la posición exacta en la que el personaje está representado en el mundo del juego y el offset no sería raro ni nada por el estilo. Entonces, lo que realmente queremos hacer aquí es compensar no la escena base. Queremos mantener eso en cero, cero, pero el nodo sprite Entonces, si seleccionas el Sprite dos D y presionas W para ir al modo de movimiento, puedes hacer clic izquierdo y mantener presionado y arrastrarlo hacia arriba Si quieres encajarlo al eje Y, puedes mantener presionada la tecla Mayús, lo que te ayuda a evitar que vaya a la izquierda a menos que vayas muy lejos. Y solo queremos arrastrar esto hasta que los pies del personaje estén básicamente por ahí. Y entonces queremos que la forma de colisión sea una representación del área de pies del personaje porque aquí es donde se le permitiría al personaje chocar con otros objetos Entonces tiene sentido que la posición sería donde los personajes realmente parados en el mundo del juego de dos D. Um, acostumbrarse a la perspectiva de dos D hace falta un poco de acostumbrarse porque es un poco menos obvio, supongo, que tres D, donde simplemente sería más como la vida real. Entonces aquí solo tenemos que darle la ilusión de que nuestros personajes realmente están parados ahí mismo, pesar de que el characterprte va de aquí a aquí, esta es la zona donde el personaje está Así podemos salvar eso ahí. Eso debería ser bueno. como referencia eso fue de 4.12 pixeles En realidad voy a redondear eso a cuatro, solo un poco de preferencia para tratar de mantener todo a los tamaños perfectos de píxeles. Para un juego de Pix art, probablemente no sea gran cosa y cause algún problema, pero, ya sabes, por si acaso. Así que ahora si hacemos clic de nuevo a nuestra escena mundial, veremos que nuestro personaje está realmente parado en el mundo del juego. Y si queremos jugar al mundo, pulsaríamos este botón de reproducción de aquí, que reproduce la escena actual del mundo. Y podremos ver al personaje muy, muy pequeño en la esquina superior izquierda. En realidad es casi imposible verlo. Entonces, lo siguiente que probablemente queremos es agregar una cámara. Así que vamos a hacer clic derecho sobre el mundo, agregar un nodo hijo, hacer una cámara dos D. Y aunque el mundo crea automáticamente una cámara por defecto, incluso cuando no se ha agregado un nodo de cámara, cuando en realidad definas correctamente una cámara, puedes configurar el Zoom, que es muy útil para Pixart porque estamos hablando de trabajar con, como, 48 píxeles por 32 píxeles caracteres, algo así así. Así que queremos tomar el Zoom y probablemente bache que hasta cerca de tres o cuatro podemos ver la cámara dos D ahora también está centrada en el punto cero en lugar de ser más de esta caja de lienzo por defecto aquí. De hecho podemos ver que la cámara es esta línea rosa. Y si corremos la escena ahora, nuestro personaje debería estar centrado y mucho más grande y más visible. Entonces, si quieres, puedes chocar eso hasta un cuatro. Creo que tres es bastante bueno por ahora. Lo cambiaré más tarde si es necesario. Pero mientras puedas ver al personaje, creo que eres bueno. Otra cosa cuando estamos jugando el juego, creo que quiero que esto sea mucho más visible. Entonces aumentemos el tamaño de la ventana ahora para que podamos diseñar para un tamaño de pantalla más grande de manera más adecuada para que, ya sabes, cuando estemos haciendo nuestras vistas previas, ustedes puedan ver realmente lo que está pasando mejor. Así que vamos a la configuración del proyecto, y voy a tomar la pantalla de la ventana y cambiar esto a algo mucho más grande. Entonces creo que algo así como 1980 para 180 sería bueno. O sea, eso depende de cuál tu resolución para tu pantalla. Para mí, eso va a ser algo así. Bien, voy a probar esto desde mi pantalla. Estoy trabajando en un monitor blanco extra bastante grande aquí, así que un poco de prueba por error. Creo que eso va a funcionar bien porque entonces todavía puedo ver el botón uh Of por aquí. Así que, por cierto, reproduce la pausa de la escena principal y detiene los botones actuales del proyecto en ejecución. Yo diría, mientras lo veas , entonces eso va a estar bien. Entonces con nuestro juego Canvas, así de grande, probablemente también quiero impulsar el Zoom. De hecho, puedes editar las propiedades mientras se ejecutan los juegos. Así que sólo puedo tomar este Zoom y cambiarlo a cuatro. Volvamos a tocar, y podrás ver que el tamaño se actualizó de inmediato. Entonces, si eso es lo suficientemente grande para ti, puedes quedarte con eso o podemos subir hasta cinco. Sabes, tal vez en realidad voy a hacer un 5.0 Zoom ahí. Ahora por el momento, ustedes realmente lo han estado esperando. Vamos a entrar en el código real. Entonces necesitamos crear un guión que extienda el cuerpo del personaje dos D y que tenga eso adjunto al jugador. Podemos hacer todo eso de una sola vez haciendo clic en el botón izquierdo del jugador y luego simplemente haga clic en el adjuntar un script nuevo o existente al nodo seleccionado. Y sólo vamos a llamar a esto el jugador punto gd guión Y en realidad no vamos a usar el cuerpo del personaje plantilla dos D script de movimiento básico. Es decir, um si recuerdo más para platformers porque agrega saltos y honestamente, podemos escribirlo mucho mejor Así que vamos a darle a Create, y eso nos va a saltar al editor de guiones aquí. Así que por ahora, solo lo guardaré como el editor de scripts embebido. Pero también puedes hacer clic en este botón de aquí y hacerlo flotante si quieres ir a pantalla completa con el editor de scripts que puede ser útil si realmente te estás metiendo en la codificación de GD Script Pero aquí, este guión va a ser bastante rápido y sencillo, así que no es necesario, de verdad. Así que vamos a subir a la cima. Bien, entonces podemos ver que nuestro script extiende el cuerpo del personaje dos D. Esto significa que nuestro script tiene la clase base del cuerpo del personaje dos D. Bien, así que si pasamos el cursor sobre el cuerpo del personaje extiende dos D, puedes ver la jerarquía de clases aquí bajando del cuerpo del personaje dos D, todo el camino a un objeto Gadot base Esto solo quiere decir que en todo el camino, heredará las habilidades de cada una de esas clases diferentes Entonces un cuerpo de personaje TD en realidad puede hacer mucho. Sólo vamos a necesitar un poquito de ella, de verdad. Así que solo ten en cuenta que todo lo enumerado ahí, cada una de estas clases, que puedes saltar dando click sobre sus nombres si quieres leer sobre ellos es algo que el cuerpo del personaje dos D también puede hacer. Entonces, leer todo eso sería mucha documentación en este momento, bueno conocerla. Bueno para leer a medida que avanzas, pero un poco abrumador por ahora mismo. Entonces trabajemos en nuestra clase. Queremos darle un nombre de clase para que este script pueda ser fácilmente referenciado desde otros scripts por su nombre yendo al inicio de la línea. Y luego presionando Enter. Vamos a subir a la primera línea y escribir el nombre de la clase jugador. Y ahora, hemos definido este guión como el guión de los jugadores. Entonces esto es básicamente un símbolo global ahora en nuestro proyecto que podemos buscar y usar solo haciendo referencia al jugador escrito exactamente así con Verás a medida que avanzamos en el curso que eso es sumamente útil, sobre todo para algo así como un guión de jugadores, que muchas otras clases van a necesitar tocar. Así que vamos a trabajar en la función de proceso de física para el personaje. Entonces, escribamos FU NC para la función y luego subrayemos. Y verás que este menú se rellena automáticamente con los métodos que se definen dentro de las clases padres Estas son básicamente funciones que podemos anular y agregar en código para que realmente haga algo o cambie lo que originalmente hizo la clase base. Entonces queremos proceso de física aquí. Si encuentras proceso de física y presionas Enter, nos dará la definición completa de la función aquí para el nombre aquí, subrayado proceso de física Bien, entonces aquí tenemos el nombre de nuestra función. El guión bajo aquí indica que está destinado a ser privado como y no accede desde otros scripts y solo para ser contenido o encapsulado desde dentro de este script El Delta aquí es el nombre de nuestro parámetro, y float es el tipo de nuestro parámetro. En el script GD, no tienes que escribir realmente tus funciones Entonces, si lo quieres, podrías quitar este flotador de colon y simplemente llamarlo Delta. Ahora, ¿qué es Delta? Bueno, eso terminaría siendo lo que el collar decidiera pasar a esta función, que en este caso, básicamente no tiene nada que impida que sea otra cosa que un flotador. Prácticamente esperarías que fuera una carroza. Entonces en este caso, es mucho mejor declarar realmente su tipo con dos puntos y luego flotar aquí. Por lo que sí recomiendo esto. Y luego aquí también un componente opcional de la declaración de función. Tenemos esta flecha, que es un guión junto a la tecla cero. Bien, y luego por aquí a la derecha, tenemos la flecha de retorno apuntando al tipo de vacío de retorno. Vacío significa que no tiene retorno. No esperas que realmente devuelva nada que usarías dentro de otras funciones. Entonces, para escribir eso manualmente, harías guión y luego un gradual y firmar Y esa es tu flecha de retorno apuntando al tipo de retorno. Bien, entonces, claro, cuando escribimos esto, nuestra función en realidad no tiene nada en ella. Puedes hacer que una función no haga nada escribiendo pasar minúsculas, así que esa es una palabra clave reservada ahí Pero sin eso, si lo deshago, entonces verás que este error aparece en la parte inferior de aquí diciendo endantblock esperado después de la declaración de la función, lo que significa que debería haber algo aquí después de que se declare la función Y puedes ampliar esta lista aquí para ver todos los errores dentro de tu script actual, una pequeña ventana bastante práctica ahí. Tan bueno si necesitas copiar y pegar, solo puedes seleccionarlo todo y copiarlo. Y puedes pegarlo en cualquier otra aplicación que estés usando. A lo mejor estás haciendo un reporte de error o algo así. Bien, así que finalmente, podemos empezar a escribir algún código de función. Sé que voy un poco lento, tratar de mantenerlo accesible aquí, especialmente en los videos anteriores definitivamente va a ser mucho más intenso a medida que avanza el curso. Entonces, antes que nada, para nuestro proceso de física, queremos que el personaje se mueva, lo que significa que necesitamos una velocidad y necesitamos una dirección en la que el personaje se vaya a mover. Entonces, en algún lugar tenemos que declarar qué tan rápido se mueve nuestro personaje. Entonces podríamos declararlo bien en la función. Pero en realidad, lo que quiero hacer ahora mismo es hacer una variable de exportación donde realmente podamos cambiar la velocidad en el editor muy fácilmente simplemente yendo por aquí la derecha y luego tecleando la velocidad que queramos. Y podemos cambiar eso durante el juego, también. Así que vamos a escribir a la velocidad de exportación var y darle el tipo de flotador. Así que vamos a recorrer esto lentamente primero. En Export aquí hay una palabra clave que la declara como capaz de ser editada en el inspector. Bien, y entonces var aquí significa variable. Velocidad es el nombre de la variable. Colon aquí define el tipo, y luego float es el tipo. Para que podamos tomar esta velocidad. En realidad vamos a escribir pase aquí para el proceso de física y luego presione Control como para guardarlo. Y verás que la velocidad aparece aquí y la parte superior derecha para el guión del jugador. Asegúrate de tener seleccionado el nodo jugador , y podrás ver esto. Ahora, también se puede ver que el valor por defecto es 0.0. Entonces ese es el valor predeterminado para float. Probablemente por velocidad, en realidad quiere asignarle un número real a eso. Entonces voy a tomar esto y decir iguales, vamos con 100.0 hit Control S. Ahora el valor predeterminado se carga aquí arriba automáticamente porque no hemos establecido un valor personalizado Si estableces un valor personalizado haciendo clic aquí, digamos 150 y presionas Enter ahora la velocidad es 150. Si cambiamos el valor predeterminado a 200 aquí y presionamos Guardar dentro del script, entonces verá que el valor personalizado aún anula el valor predeterminado de 200 Puedo presionar el botón de reinicio aquí para restablecerlo a la predeterminada, así que ahora son 200. Ahora quiero que la velocidad del guión sea de 100. Creo que eso es lo que tenía para el proyecto por defecto. Siempre podemos cambiar eso más tarde y siéntete libre de establecer la velocidad de tus jugadores a lo que sea que te sientas cómodo. Eso es completamente. Y así es como podemos tener nuestro editor definido propiedad para ser usado dentro del script. Así que las variables de exportación son realmente útiles para hacerlo más accesible para editar los detalles de cómo editaría nuestro script sin necesidad de saber nada sobre cómo funciona realmente el código. Bien, entonces tenemos nuestra velocidad. Ya podemos escribir proceso de física. Bien, entonces veamos aquí. Voy a obtener primero la dirección de entrada. Bien, así que por ahora mismo, queremos declarar una variable de dirección, así var dirección. Y verás que estoy escribiendo esto dentro de la función. Entonces esto la convierte en una variable local a la función, es decir, en cuanto se hagan las funciones , esta va a ser borrada. Solo se usa dentro de la función a menos que devolvamos como nuestro tipo de retorno. Entonces es temporal, básicamente. Y vamos a establecer esto igual a input. Ahora sé que estoy capitalizando el yo porque este es un nombre de clase al que estamos haciendo referencia Entonces la clase de entrada es que se podría pensar en ella como una clase global. Puedes acceder a ellos en cualquier lugar si necesitas que haga algo por ti. Y vamos a estar usando la clase Import para obtener un vector. Entonces un vector va a tener X y un componente Y, un vector dos, más bien. También hay vector tres para tres juegos D, que se suma en el eje Z. Pero para dos juegos D, solo tienes X y una Y, lo que con solo quitar ese tercer eje hace dos juegos D sean un poco más fáciles de entender y trabajar con ellos. Entonces queremos obtener la X negativa aquí. Se pueden ver los parámetros que esta función está definiendo, y en realidad hay algunos extra por aquí como zona muerta, que no necesitamos. Pero los cuatro que necesitamos son X negativo, X positivo, Y negativo, y Y. positivo Así que en uno de los dos videos anteriores, creo que sí toqué esto, pero X negativo y Gadot queda en la pantalla Entonces queremos entrada para izquierda. Ahora, se puede ver que se completa con algunos nombres de cadenas de acción predefinidos Ya sabes, es un nombre de cadena, por cierto, porque tiene un ampersand aquí frente a la cadena, que son citas, y luego el nombre real aquí, terminando Pero todas estas son acciones de interfaz de usuario predeterminadas, y no es una buena idea usarlas realmente. En el sentido de controlar a tu personaje porque ya controlan la interfaz de usuario por defecto. Así que vamos a subir a la configuración del proyecto. Así que proyecte la configuración del proyecto en la parte superior izquierda, Mapa de entrada, y escribimos una nueva acción. Voy a escribir a la izquierda y luego hacer clic en Agregar. Entonces nuestra acción izquierda, voy a presionar Agregar evento aquí, y me gusta usar las teclas WASD Es bastante estándar para muchos juegos. Entonces voy a simplemente escribir A aquí donde dice escuchar entrada y una regla. Asignarlo automáticamente a la clave A, física o Unicode. Entonces básicamente, A en tu teclado. Puedes hacer clic en Bien ahora. Y ahora moviéndose a la izquierda está asignado a A. Y queremos hacer eso para arriba abajo y derecha también. Entonces escribe a la derecha, agrega, y luego hacemos clic aquí para asignar la clave, agregar evento, presionar D para derecha. Golpea Bien. Ahora vamos a aguantar. Haga clic en agregar evento, presione W para arriba, agregue una acción, abajo, haga clic en Agregar evento, S para abajo, y ahí está nuestra entrada de movimiento. Entonces Kidob manejará automáticamente la conversión de esas pulsaciones de teclas en la acción real que podemos usar dentro de la columna de función vectorial de clase G de entrada Entonces lo que queremos hacer aquí es poner los nombres de esas acciones que acabamos de escribir Entonces podemos hacer cotización dejada aquí. Y verás que en realidad se llena automáticamente, y puedes simplemente presionar Enter aquí para confirmarlo para X negativo para X positivo, queremos correcto También puedes ver aquí simplemente apareció un poco, así que solo podemos hacer doble clic en él. Entonces el tercero negativo Y, podemos escribir abajo o encontrarlo en la lista. Entonces abajo. Y luego para Y positiva, oh, en realidad lo mezclé. Y negativo está arriba, Y positivo está abajo. Así que voy a agregar Y positiva aquí abajo, y luego por aquí, voy a borrar el abajo y escribir arriba. Así que estoy bastante seguro de que ahí está. Definitivamente lo averiguaremos en un minuto una vez que juguemos la prueba. Queremos tomar la dirección de entrada, y si no es cero, entonces queremos movernos. Entonces, si es cero, solo queremos dejar de mover nuestro personaje por completo. Entonces puedes hacer eso diciendo si dirección. Entonces esto básicamente ya comprueba si la dirección es igual al vector cero o no. Entonces, si dirección significa que no es cero, entonces podemos tomar la velocidad de nuestro personaje. Ahora bien, ¿de dónde sacamos la propiedad de velocidad? Bueno, nuestro clásico se encuentra el cuerpo del personaje dos D, y la velocidad es una propiedad del cuerpo del personaje dos D. Así que si tuviera hacer clic derecho sobre el cuerpo del personaje dos D e ir al símbolo de búsqueda, puede desplazarse hacia abajo aquí y ver la velocidad aparece aquí mismo en la lista de propiedades. Entonces, cualquier propiedad o método, que es una función dentro de una clase que pertenece a una clase padre, van a ser heredados y utilizables por esa clase heredadora Entonces dentro de un jugador, podemos tomar la velocidad y podemos establecerla a queremos la dirección multiplicada por la velocidad. Ahora, verás este componente Delta aquí. Este es el tiempo entre fotogramas. No necesitamos asignarlo aquí para el estilo de movimiento particular que estamos usando, que es mover y deslizar. Hay otro movimiento y choca, donde pasarías y el Delta cuando llamas a esa función, si no recuerdo correctamente Entonces es un poco extraño que, ya sabes, el Delta se contabiliza automáticamente aquí, pero así es como funciona. Entonces se presiona cualquier pulsación de tecla para el movimiento. Vamos a asignar la velocidad a la dirección multiplicada por la velocidad. Entonces aquí abajo después de eso, podemos hacer movernos y deslizarnos. Ahora, ¿qué pasaría ahora mismo? En realidad, sería más fácil sólo de mostrar. Vamos a tocar, y aún no hemos seleccionado una escena principal. Entonces, seleccionemos la escena mundial como nuestra escena principal. Yo sólo voy a subir los directorios aquí y elegir mundo. Haga doble clic. Tenemos un personaje. Y si presiono una tecla de movimiento y lo solto, verás que no detiene a nuestro personaje. Simplemente se mantendrá deslizante, lo que podría usarse para algún tipo de mecánico de iluminación. Pero para el movimiento regular, en realidad queremos agregar una declaración se aquí como el seguimiento a nuestra I. Así que se y luego asegúrate de poner el colon al final. Entonces eso básicamente declara lo que viene siguiendo como un bloque para que la función continúe ejecutando código. Y queremos tomar la velocidad. Queremos reducir eso hacia Serrel. La velocidad es igual al vector dos. Así que en realidad estamos creando un nuevo vector dos aquí, y ponemos paréntesis aquí Se puede ver que el tercer tipo de construcción de un vector toma un valor X y un valor Y. Entonces, dentro de los paréntesis, presiona Enter. Entonces esto va a separar el primer paréntesis del segundo y deja muy claro escribir la lógica X aquí y luego la lógica Y justo debajo de ella Entonces queremos movernos hacia el punto de velocidad x a cero. Y sólo vamos a hacer eso la velocidad actual. Entonces esto básicamente significa que en cuanto lo soltamos, estamos bajando la velocidad a cero de inmediato. Hay muchas maneras diferentes en las que puedes hacer esto. Puedes hacer que disminuya gradualmente con el tiempo si usas una función larp Pero este es probablemente el más sencillo. Así que vamos a ir con eso. Muévete hacia. Y luego en la segunda línea aquí, queremos obtener el valor Y para la nueva velocidad. Así que muévete hacia el punto de velocidad actual Y, estamos haciendo que se acerque a cero en el cambio o Delta de velocidad. Entonces lo guardamos ahí, y esto significa que esto va a tomar nuestra velocidad actual, que podría ser, digamos, hacia la derecha a toda velocidad, y vamos a bajarla por la cantidad de velocidad completa, lo que significa que inmediatamente va a caer a cero. Nos acercamos a cero. Así que en cuanto soltamos nuestras teclas de entrada, nuestro personaje deja de moverse, es el resultado final de. En realidad cuenta eso. Entonces para declarar un comentario, si quieres hacer eso, pones un hash tag y luego la descripción. Para que puedas mantener tus comentarios en línea si lo deseas, en general. estos días, en realidad los saco a la parte superior de la función así, así Control X y luego Control V para pegarlo. Y si quieres que este texto aparezca en la documentación generada automáticamente para tu clase, entonces puedes hacer dos ampersands Y guárdala, y luego eso va a agregarla a la documentación de la clase del jugador. Y podemos acceder a esa documentación pulsando Buscar ayuda aquí. Buscamos player, nuestra clase personalizada, hit open, y podrás ver el nombre de nuestras propiedades, que en este caso solo se refiere a una variable que existe como parte de la clase local. En este caso, podríamos referirnos simplemente como una variable que es un estado local existente dentro de la clase en lugar de una variable local de una función. Para que puedas editar y leer de estos según necesites. En otros lenguajes de programación, cosas como campos o propiedades están mucho más claramente definidas. Pero creo que generalmente para la mayoría de las funciones básicas de GD Script, su propiedad y variable terminan siendo lo mismo No declararías algo así como un campo privado de respaldo como lo harías en C Sharp. Yo diría que en la mayoría de los casos, sin embargo, porque, ya sabe, todavía habría algunas razones para hacer eso para tener un respaldo privado a su propiedad pública. Aquí puedes ver el método aquí y si nos desplazamos hacia abajo las descripciones del método. Entonces proceso de física. Tan pronto como soltamos nuestras teclas de movimiento, nuestro personaje deja de moverse. Así que esto es en realidad una de las cosas más geniales del script GD es que es esencialmente la generación de autodocumentación Siempre y cuando pongas los comentarios donde se supone que van con los dobles ampersands, puedes comentar un campo o una propiedad Puedes comentar un método. Y esto es realmente útil. Hace que sea fácil para otras personas entender básicamente tu código sin leer todo el script de arriba a abajo. Así que en realidad podrías hacer lo mismo con la velocidad aquí. Entonces dos ampersands y dicen el movimiento base, la base, la velocidad de movimiento base, del personaje del jugador Control S guardar, y luego podrá ver nuestra documentación aún está abierta aquí en la ventana de script. Entonces si hago clic en Player, puedes ver, oh, ahora, nuestra propiedad de velocidad tiene una descripción que se puede leer fácilmente. Entonces eso es muy útil. Téngalo en mente. Y ahora podemos seguir adelante y darle a Play. Entonces vamos a mover nuestro personaje WASD. Ahora veremos en cuanto detengamos Import, el personaje deja de moverse. Que es más lo que esperarías de un personaje que se mueve en cualquier estándar como hierba o piedra o lo que sea, cosas que deberían tener fricción, no hielo. Y ese es el movimiento básico vamos a utilizar para el resto del juego, básicamente. Ahora, obviamente, los personajes no animados. No tenemos las animaciones de ejecución. No está mirando la dirección como debería todavía. Esas son todas las cosas que vamos a cubrir en futuros videos en el futuro. Una última cosa que quiero agregar a una última cosa que quiero agregar para este personaje, bueno, estamos por delante de las cosas, es agregar solo una propiedad de nombre para mostrar más. Entonces voy a agregar realmente una exportación para una var, un nombre para mostrar. Y esto va a ser un nombre de cadena tipo. Y vamos a establecer eso igual a ampersan lo que sea por defecto que quieras, solo puedes hacerlo jugador y golpear Entonces para nuestro reproductor, podemos ver ahora que la propiedad de nombre de cadena de nombre para mostrar es editable dentro del inspector Entonces voy a cambiar esto y ponérselo a Jaco, porque vamos a hacer que nuestro personaje por defecto, tenga un arma de lanza Entonces creo que eso funciona. En los juegos de Survivor Light, generalmente, tendrías múltiples personajes entre los que puedes seleccionar. Entonces, tener a todos ellos un nombre para mostrar distinguido tiene sentido. Ahora, muy rápido, también hay una propiedad de nombre que tienen todos los nodos. Eso se refiere al nombre del nodo aquí arriba. Pero se pueden ver cosas como colisión forma dos D. No porta espacios y nombres de nodos. Entonces, usar eso como tu nombre para mostrar puede ser un poco raro. Como, digamos que agregas una subclase como el dragoon de fuego Pero podrías hacer el nombre del nodo del reproductor aquí, Freragoon sin este espacio, por lo que puedes tener un nombre para mostrar separado distinguido tener una propiedad personalizada como Entonces, ¿qué es eso para el dragoon? Hit Control S. Y eso parece aceptable por ahora mismo. Eventualmente, tomaremos esta entrada y la moveremos a un guión separado. Tomaremos estadísticas como la velocidad de los personajes, y también haremos que sea un guión separado. Pero este es un buen comienzo. Entonces eso va a ser todo para este video. Traté de reducir la velocidad aquí intencionalmente para cubrir toda la terminología del guión que vamos a usar para el script GD como, ya sabes, la base para el resto del curso, estas son todas las cosas que van a seguir surgiendo una y otra vez Espero que no haya sido demasiado lento para nadie, pero vamos a estar acelerando desde aquí. Entonces hasta el siguiente video, los veré. 5. Cómo reproducir animaciones a partir de hojas de sprites: Entonces, como están las cosas en este momento, nuestro personaje técnicamente puede moverse, pero no hay animación para el sprite en absoluto. Así que queremos que nuestro personaje se anime cuando corre ídolos y, por supuesto, la animación de la muerte también cuando perdemos el juego Bien, así que lo primero que vamos a hacer es cambiar la hoja de sprites aquí Si miras en el pack Pixel Crawler, podemos agarrar la hoja de sprites Idol para pasar la noche, o puedes usar el pícaro o el mago si Así que cojo esto y lo traeré aquí. Y estos son básicamente sprites orientados hacia los lados. Notarás que este personaje no tiene un up o un down. Algunas ventajas de esto, sin embargo. En primer lugar, si solo estás animando una dirección y luego volteándola, que es lo que realmente hace el superviviente estándar Es mucho más fácil construir personajes porque solo necesitas animar una dirección Y en segundo lugar, puedes saltarte por completo los árboles de animación y enfocarte en un reproductor de animación y una máquina de estado que controla la lógica para tu personaje cambie entre estados como Idle y dadas esas razones, en realidad solo vamos a cambiar a la hoja de sprites Idol nocturno aquí Podrías usar el ídolo prácticamente indistintamente. Después podrías usar, como, la hoja de sprites pícaro, como ahí mismo o el mago de aquí también Entonces, cualquiera de esos va a funcionar perfectamente bien, y ya está la configuración para tener tres clases de caracteres ahí mismo. Pero iba por más de un caballero que empuñaba lanza para empezar. Entonces, como un personaje llamado agroun, este spright le queda como que le queda, y podrá lanzar lanzas Bien, entonces tenemos nuestro juego de hojas de sprites aquí. Queremos convertir esto en una animación ociosa. Los fotogramas He ya se han configurado aquí, pero necesitamos un reproductor de animación real para poder hacerlo. Entonces haga clic derecho en el nodo del jugador, agregue un nodo hijo. Busque reproductor de animación. Agrega eso en. Entonces, cuando tengas el reproductor de animación, la ventana de animación estará aquí en la parte inferior. Puedes hacer clic aquí mismo si aún lo necesitas. Y queremos ir a animación y luego Nu y escribir el nombre de la animación. Así que estamos comenzando con la animación inactiva, así que solo vamos a escribir Idle. Y podemos agregar en una pista de propiedad. Así que vamos a agarrar del Sprite dos D algunas de estas propiedades, a saber, la textura. Entonces haz doble clic en eso. Vamos a hacer clic derecho en Property Track, agregar en H frames, y luego propiedad Track, Sprite dos D. V frames. Entonces por último, por ahora mismo, al menos necesitamos el propio número de fotograma. Así que agrega y enmarca como una propiedad. Así que ahora podemos tomar este Zoom y acercar un poco en nuestra hoja de sprites Primero, quiero tomarme el tiempo de chasquido aquí abajo donde dice 0.033 3 segundos y cambiarlo a 0.1, decir que vamos a estar trabajando en intervalos de 0.1 segundos o una décima de segundo A continuación, habilite este ajuste al cursor de la línea de tiempo. Ahora podrás simplemente hacer clic aquí a los intervalos de 0.1 segundos, hace que sea mucho más fácil trabajar con ellos. Es posible que hayas visto en esta brillante hoja que hay cuatro fotogramas de animación. Así que vamos a recorrer esos cada 0.1 segundos, lo que significa cuatro por 0.1, queremos una animación larga de 0.4 segundos. Entonces por aquí en el lado derecho, escribe 0.4, y luego esta cosa que parece flechas alimentándose unas a otras. Bucle de animación, quieres hacer clic en eso para que hagamos nuestro bucle de animación Ahora, en nuestra línea de tiempo de animación, no hay fotogramas clave que definitivamente queremos establecer un fotograma clave al inicio de la animación para todas estas propiedades Así que haga clic derecho insertar clave. Si dejaste clic aquí, verás que el valor de la textura ya está preestablecido para esta animación nocturna inactiva. Si no lo es, entonces vas a querer cambiarlo a la hoja de sprites Idle Desde aquí, puedes arrastrar y soltar así y poner eso ahí. Entonces, lo que significa este fotograma clave es que al inicio de nuestra animación a 0.0 segundos cuando esta animación comience a reproducirse, va a establecer la textura en nuestro sprite a este valor, lo que significa que tan pronto como comience la animación, cambiamos la hoja de sprites Ahora, marcos H, también queremos hacer clic derecho y clave Serta. Ahora ya preestablecimos nuestro valor aquí como cuatro en este brillante dos D. Así puedes ver que cuando claves Serta, agregará cualquier valor en el que esté configurado actualmente como el punto de fotograma clave en la línea de tiempo de animación Y cada vez que estos fotogramas clave golpean, eso significa que el valor en ese momento es ese valor Ahora, para nuestro juego Pix art, casi siempre vamos a estar usando el modo discreto por aquí en el extremo derecho. Se pueden ver estos tres puntos. Lo que eso significa es que el valor no cambia hasta que llega al punto clave del fotograma. En algo más como un juego de tres D, podrías hacer animación continua, lo que significa que irá gradualmente entre los valores de los fotogramas clave Entonces, si tuvieras algo así como un fotograma clave de posición, entonces animará la posición entre la posición inicial de cero y la posición final de 100 a lo largo del medida que avanza esta línea de tiempo de animación Así que mucha animación en los juegos en realidad solo está cambiando los valores de las propiedades en tu objeto a medida que pasa el tiempo. Bien, así que continuando con V frames, podemos hacer clic derecho insertar una clave. Verás que el valor aquí, si dejamos clic en el fotograma clave ya está establecido en uno. Eso es lo que queremos. Una vez más, si miramos la hoja de sprites Idol, tiene cuatro marcos H, marcos horizontales y un marco vertical en términos de filas y columnas Entonces por eso tenemos cuatro para fotogramas H y uno para cuadro V. No hay mucha personalización que tenemos que hacer aquí. Solo tenemos que asegurarnos de que al inicio, esté ajustado a esos valores para que nuestra animación se reproduzca correctamente. Ahora bien, lo que realmente tenemos que hacer es poner en nuestros cuatro fotogramas de animación aquí. Así que haga clic derecho en el primer marco y haga Insertar clave. Verás que para frame, en realidad te muestra una vista previa del sprite Va a mostrar muy útil, pero también puedes hacer click izquierdo sobre él y ver que está configurado en valor cero. Ahora queremos chasquear a 0.1. Si aún no elegiste aplicar ajuste al cursor de línea de tiempo, puedes hacerlo aquí Eso hará que sea mucho más fácil ir al 0.1. Supongo que también puedes escribir manualmente el valor si quieres saltar en la línea de tiempo. Normalmente simplemente chasqueo con el cursor del ratón, aunque. Después haga clic derecho en la sección del marco, la fila del marco y haga la tecla de inserción. Ahora conseguirás una línea que va entre estas. Esa línea significa que no hay cambio de valor entre aquí y aquí. Es sólo una continuación del mismo valor. Entonces queremos hacer clic aquí y cambiarlo a uno, y eso significará que ahora va a estar reproduciendo el segundo fotograma de animación. Dado que la hoja Bright es como una matriz de valores, comienza en cero, no en uno. Generalmente, en la programación, así sería como funciona. Entonces uno es en realidad el segundo fotograma de animación y cero es en realidad el primer fotograma de animación. Vamos a hacer clic derecho en 0.2, insertar una clave, hacer clic en el punto clave del marco, y luego cambiar el valor a dos, y luego ir aquí a 0.3. Derecha, haz clic en la tecla de inserción. Haga clic aquí, cámbielo a tres. Ahora bien, ya no deberías ver ninguna línea entre ninguno de estos marcos. Podemos ir al inicio aquí, golpear play, y ahí está nuestra animación para el personaje. Ahora, una vez más, porque solo estamos haciendo animación izquierda y derecha, solo vamos a necesitar hacer un ídolo, una muerte, y una animación de ejecución aquí. Y luego controlaremos el volteo del personaje de una manera diferente . Te lo mostraré más adelante. Así que una configuración mucho más simple y mucho más fácil de agregar nuevos personajes si quieres hacer eso. Así que vamos a duplicar esta animación porque mucho de esto en realidad vamos a reutilizar. Sólo vamos a cambiar quizá el valor del fotograma He y la textura. Y dependiendo de cuántos marcos de ejecución haya, podemos cambiar los marcos aquí también. Pero vamos a duplicarlo haciendo clic aquí en animación y hacer duplicar, y vamos a hacer Run. Bien, ahora queremos hacer click en la textura, y queremos arrastrar y soltar la hoja de sprite de ejecución y hasta aquí Podemos ver que esto tiene seis fotogramas de animación. Entonces, lo que eso significa es que necesitamos cambiar el valor de los fotogramas H aquí a seis. Queremos cambiar la duración de la animación a 0.6 porque ahora estamos trabajando en seis fotogramas, no en cuatro. Y entonces vamos a querer ir a 0.4 segundos y sumar en el quinto fotograma de animación. Así que inserta la clave, da clic aquí, cambia el valor a cuatro para el quinto fotograma y luego pasa a 0.5 segundos. Haga clic derecho aquí, inserte la tecla, izquierda, haga clic en el fotograma clave, cambie el valor 4-5 y presione play Y ahí está nuestra animación redonda. Por lo que duplicar ahorra mucho tiempo. Bien, ahora agreguemos en la animación de la muerte mientras estamos en rollo. Así que vamos a duplicar y sumar en la muerte. Y entonces queremos cambiar la textura aquí, por supuesto, a la sábana mortal de la noche. Así que arrastra y suelta la hoja de muerte en el inspector de fotogramas clave Puedo contar aquí. Hay seis marcos. Así que vamos a hacer clic. En realidad, no necesitamos cambiar nada más porque simplemente lo duplicamos de alrededor. Sólo podemos darle a Play. Pero se puede ver que está en bucle. Entonces los personajes no suelen hacer eso. Así que queremos desactivar realmente bucle haciendo clic dos veces aquí. Lo hará para que la animación haga bucles de ida y vuelta. Al igual que, va hasta el final y luego de vuelta al inicio. Eso sería más útil para algo así como una plataforma móvil. Queremos hacer clic por segunda vez para desactivar el bucle por completo. Entonces ve a 0.0, presiona play, y la animación debería detenerse aquí al final. Y luego una vez que la animación de la muerte se haga más tarde, solo necesitamos hacer algo como clave un Game Over para nuestro personaje, y entonces eso será todo. Bien, entonces, ¿qué animación va a estar jugando cuando ejecutemos el juego? Bueno, vamos a golpear play y averiguarlo. Bien, entonces puedes ver que la animación inactiva está ahí, pero en realidad no está reproduciendo ninguna de las animaciones. Uh, en realidad no establecimos una animación para Reproducción automática en Inicio Nuestras animaciones eventualmente van a ser controladas con algo llamado máquina de estado. Eso será en lo que nos metamos más en el siguiente video. Vamos a hacer clic en Reproductor de animación y cambiemos aquí la animación que estamos viendo de muerte para correr. Y vamos a dar click aquí a este pequeño botón de reproducción automática al cargar Así que haz clic en ese hit play, y ahora verás que independientemente de si nuestro personaje se está moviendo o no, va a estar reproduciendo la animación de ejecución. Tenga en cuenta que tampoco voltea direcciones automáticamente. Ese será un script sencillo que agregaremos más adelante también. Pero tenemos tres animaciones sobre nuestro personaje, y tenemos la capacidad de cambiar entre ellas llamándolas por su nombre. En el siguiente video, crearemos la máquina de estado con un estado de movimiento que podrá cambiar entre inactivo y Ejecutar. 6. Máquina de estado de jugador: Bien, entonces nuestro personaje tiene reproductor de animación y la capacidad reproducir la animación de ejecución, pero queremos cambiar entre animaciones idol y run dependiendo si hay entrada clave para nuestro personaje o no. Entonces vamos a controlar esto con una máquina de estado. Entonces, si recuerdas al inicio del curso, agregamos en Limbo AI, que es una máquina de estado y sistema de árbol de comportamiento que puedes usar en Gado fuera de la caja, te ahorra mucho trabajo, no tener que hacerlo manualmente Va a estar pegando a las máquinas estatales para el curso. Creo que son solo un poco más fáciles de trabajar en el futuro y mucho mejores para configuraciones simples como esta Y esto es, para ser honesto, una configuración muy sencilla. Entonces, hagamos clic derecho sobre el jugador en la base en un nodo hijo. Y vamos a estar buscando la palabra clave limbo. Entonces verás aquí Limbo HSM estado jerárquica Al igual que en el nodo raíz aquí, la propia máquina de estado va a controlar los estados, los estados del limbo, y va a poder alternar entre ellos a medida que añadimos transiciones entre esos estados Entonces, vamos a crear el Limbo HSM. Y luego voy a hacer click derecho aquí y vamos a agregar nuestro primer estado agregar nodo hijo. Entonces queremos un estado limbo y simplemente crear eso. Entonces la jerarquía es la máquina de estado raíz, y todos los estados son lo que podemos cambiar entre. Y cada uno de estos estados van a ejecutar código diferente dependiendo de en qué estado se encuentre el personaje. Para este curso, en realidad solo vamos a tener un estado de movimiento y un estado de muerte. Así que muy sencillo. Pero sigue siendo importante porque queremos saber cuándo nuestro personaje debe cambiar al estado de muerte, y el estado de movimiento va a estar controlando las animaciones de ralentí y movimiento. Técnicamente, podrías separar Idle y pasar a sus propios estados, pero esencialmente van a estar ejecutando el mismo código porque ya sea que el personaje esté inactivo o se mueva, sigue siendo libre movimiento para el personaje Es solo cuestión de qué animación va a estar reproduciendo. Y no creo que eso necesariamente justifique un estado completamente separado Entonces vamos a hacer click derecho sobre Limbo HSM, y le voy a adjuntar un guión Esto se llamará, digamos, jugador subrayado HSM. Entonces es el jugador máquina de estado jerárquica. Vamos a crear eso. Y luego aquí arriba en la cima, vamos a, por supuesto, querer darle el nombre de clase, jugador HSM En términos generales, como voy a mostrar aquí en el sistema de archivos, si buscamos HSM, lo que sea que pongas como caso de serpiente para el nombre de archivo, también querrías tener el nombre de la clase aquí arriba, pero esto, por supuesto, tiene mayúsculas y te saltas los espacios porque este es un símbolo tipo Es una muy buena idea mantener sincronizados este nombre y el nombre del guión. Por lo que el jugador HSM nos va a ayudar a controlar el cuerpo del personaje del jugador a través de los estados que existen en el Limbo Entonces queremos agarrar al jugador y configurarlo como el agente que controla la máquina de estado. Bien, entonces primero para nuestro jugador HSM, queremos una referencia al jugador que va a estar manejando nuestra máquina estatal Así que vamos a hacer en la exportación var jugador de tipo jugador. Y si hemos definido el nombre de la clase para nuestro guión corporal de jugador de personajes como jugador, esto debería aparecer bien. Y se puede ver en el inspector aquí a la derecha que sí se presentó. Entonces, si quieres, puedes hacer clic en Asignar y asignarlo al jugador ahora mismo. Entonces eso significa que nuestra máquina de estado jerárquica del jugador ahora tiene una referencia al jugador Entonces lo que queremos hacer es asegurarnos de que en Rady, que este script va a configurar la máquina de estado inicializándola con el reproductor como agente Así que vamos a crear la función, subrayar Rady, y el tipo de retorno va a ser Prácticamente siempre es para funciones listas porque esta es una función de nodo predeterminada destinada a configurar tu nodo, como en uno de estos nodos de aquí a la izquierda, algo que existe dentro de tu escena después de que se hayan definido todas sus propiedades. Entonces la función ready ejecuta el código que cuando el objeto esté listo, va a hacer algunos pasos finales de configuración Muy común para usar antes de que el objeto realmente comience a correr en la escena, pero haciendo los pasos esenciales de configuración final. Mientras seguimos adelante con esto, también voy a introducir algunos conceptos nuevos también. Entonces, en primer lugar, la afirmación aseverar. Así que vamos a escribir en afirmar. Entonces esto significa que pasas en alguna condición y esperas que evalúe a verdad. Entonces en este caso, lo que queremos comprobar es que el jugador en realidad se ha establecido en el inspector. Siempre que estableces una variable de exportación aquí, básicamente dependes del diseñador o de quien esté configurando el proyecto del juego para rellenar realmente estos campos, y es muy fácil definir uno de estos, especialmente si tienes muchos scripts corriendo con estas variables de exportación. Son muy convenientes para configurar las cosas en el inspector, pero es propenso a errores del usuario. Entonces solo podemos afirmar que el jugador no es nulo. Ahora ve que hago signo de exclamación y luego un signo igual. El signo de exclamación significa invertir lo que sea que intentes probar Entonces, si jugador es igual a nulo, que en realidad serían dos signos iguales como ese, entonces comprobarías que el jugador es nulo. Pero si haces un signo de exclamación y un signo igual, entonces estás diciendo que el jugador no lo es y cada vez que haces una declaración, tienes la opción de pasar también un mensaje de falla opcional Entonces, ¿qué quiere que le diga a quien esté ejecutando el guión cuando esa condición no sea cierta? Entonces en este caso, me gustaría algo así como jugador agente debe estar configurado en el HSM Así máquina de estado jerárquica. Entonces solo estoy poniendo aquí en la parte superior, mencionando muy claramente que se trata de una máquina de estado jerárquica Entonces, si alguna vez tienes alguna duda sobre por qué está HSM, bueno, está ahí arriba así que vamos a mostrar esto en acción Si ejecuto la escena, no va a fallar porque hemos establecido el nodo reproductor como referencia en la variable de exportación para un jugador. Pero si desconfiguro al jugador aquí mismo y lo ejecutamos, vas a recibir un mensaje de error inmediato Va a decir que fracasó la aserción. El agente del jugador debe estar configurado en el HSM. Entonces la afirmación es solo un cheque para asegurarse de que lo que esperas que sea verdad es realmente cierto Por lo que escribir declaraciones contra una condición es la idea general de probar dentro de la programación en general. Para ir más avanzado que esto, escribirías pruebas unitarias o pruebas de integración usando un marco de pruebas como GD Unit o GUT Godot unit testing GD Unit o GUT Godot unit Eso definitivamente va más allá del alcance de esta serie de cursos, pero es algo para buscar si tienes tiempo después porque escribir pruebas, asegúrate de que tu código esté realmente escrito bien, y puede ser útil en el largo. Atrapa bichos temprano. Entonces, sigamos adelante con eso. Sólo vamos a usar estas pequeñas afirmaciones de aseveración así. Se puede ver cómo funciona. Si la condición falla, entonces obtenemos un mensaje, y eso nos deja saber que, oh, nos olvidamos de establecer algo que deberíamos haber establecido algo. Entonces es bastante práctico, en realidad. Entonces, asegurémonos de que en Limbo HSM, una vez más, asignemos al jugador Y luego hagamos la configuración del propio HSM. Así que en realidad voy a hacer de esta una función separada porque esto va a hacer algunas cosas diferentes. Así que vamos a crear otra función aquí abajo, la función. Y cuando digo función, realmente me refiero a FU y C, solo digo. El guión bajo configuró HSM, y luego los paréntesis, la flecha de giro y el vacío tenían un espacio extra ahí Entonces lo que queremos llamar en la máquina de estado es inicializar, y tenemos que pasar en un agente Como mencioné, el agente en este caso, es el jugador para pasar en el jugador, y luego necesitamos llamar a configurar HSM Dentro de la función ready. Así subrayado configuración HSM. Bien, entonces para recorrer esto, estoy convirtiendo en una función privada con el guión bajo aquí, lo que significa que solo deberíamos estar ejecutando esto dentro de este script del jugador HSM La inicialización hace toda la configuración de fondo para la máquina de estado, y va a hacer que opere con el reproductor como agente La otra cosa que tenemos que hacer aquí mismo es establecer el estado inicial. Entonces, ¿qué estado vamos a ejecutar primero? También cambiemos el nombre del nodo Limbo HSM a jugador HSM. También me gusta mantener este tipo de sincronizados con el guión adjunto a él. Entonces jugador HSM aquí. Equivale al HSM del jugador dentro de la ventana de escena. Y luego el estado del Limbo aquí, llamaremos a esto el estado de movimiento y luego le adjuntaremos un nuevo guión También una ventaja de si le cambias el nombre antes de adjuntar el script, si haces el botón derecho, das clic en el estado y luego adjuntas el script ahora, verás que el nombre del script también tiene por defecto el nombre del nodo Así que mantener esas tres cosas sincronizadas generalmente es una buena idea mantiene las cosas organizadas. Y solo guardaremos esto en la carpeta del reproductor por defecto por ahora, y vamos a heredar del estado Limbo Crear. Bien, entonces voy a llamar a esto el estado de movimiento, nombre de clase estado de movimiento. De hecho, podríamos volver a usar esto para el enemigo también. Ya que todos van a estar esencialmente usando la misma configuración de animación. Entonces el estado de movimiento, vamos a necesitar los nombres de dos animaciones, que son nuestra animación inactiva y nuestra animación de movimiento, que se ejecuta. Entonces voy a decir export para Idl anim, y vamos a configurar este tipo a un nombre de cadena Y vamos a establecer por defecto el valor a Idle. Ahora, poner el ampersand aquí para convertirlo en un nombre de cadena es en realidad opcional Cuando se declara como un nombre de cadena aquí, la variable, se va a convertir automáticamente. Entonces es opcional si quieres hacer esto como Ah, así que vamos a hacer exportar var. Yo solo lo llamaré ejecutar animación porque así es como se va a llamar por defecto en este proyecto, y haremos igual ampersand Poner un par de comentarios aquí dos hashtags hace que los comentarios aparezcan en el inspector. Entonces, si voy al inspector y pongo el cursor sobre la animación inactiva, puedes ver que los comentarios realmente aparecen ahí automáticamente, lo cual es muy útil También puedes ver cómo se define la propiedad como un nombre de cadena con un valor predeterminado de inactivo o run para el y para ello, queremos asegurarnos comprobando el reproductor de animación que nuestros nombres coincidan. Así se puede ver que estaba haciendo un ídolo minúscula, carrera en minúscula Es sensible a la carcasa cuando estás usando estas cuerdas. Así que asegúrate de que coincida aquí y aquí, lo que sea que aparezca en el reproductor de animación para inactivo y correr. Bien, entonces voy a hacer click derecho sobre el nombre del Estado Limbo aquí y buscar el símbolo Y vas a ver que hay un montón de métodos especiales que tiene este nodo enter, exit, y setup y también actualizar. Entonces estos son métodos específicos de estado. Suenan algo parecido. A lo que tendrías en un nodo Gadot estándar. Pero la diferencia es que estos solo se ejecutan cuando la máquina de estado en realidad está usando este estado. La máquina de estado solo ejecuta el código de uno de los estados a la vez, y los otros estados básicamente simplemente se sientan ahí pasivamente hasta la máquina de estados haya determinado que es el momento de hacer la transición a un estado diferente Entonces eso significa que puedes escribir básicamente cuatro conjuntos de código y solo uno se va a ejecutar a la vez, y eso es muy útil para evitar que sucedan cosas innecesarias mientras tu personaje no debería estar haciendo esas cosas. Al igual que un personaje no debería estar atacando cuando el personaje solo está corriendo y no hay entrada de ataque. Por lo tanto, no permites que ese código se ejecute administrándolo con una máquina de estado. Bien, entonces queremos comenzar con esta función enter. La palabra clave virtual para estas funciones aquí significa que aunque pueda haber una implementación predeterminada para la función, podemos escribir nuestro propio código personalizado, que cambia completamente lo hace cuando estas funciones realmente se ejecutan. Echemos un vistazo al script de estado de movimiento, y vamos a estar haciendo subrayado de función Enter Entonces, ¿qué queremos que ocurra cuando el estado de movimiento entre dentro de la máquina de estado? Así que queremos tomar el reproductor de animación, y queremos establecer su animación en ocioso o correr dependiendo de si el personaje se está moviendo o no. Bien, ahora para nuestro estado de mudanza, ¿cómo vamos a conseguir una referencia al reproductor de animación? Entonces la idea es que para nuestro agente, sólo va a tener un jugador de animación, el reproductor de animación del jugador. Hay varias formas en las que puedes obtener esa referencia dentro de tu script Move State. Sólo voy a tratar de mostrarle al que de la parte superior de mi cabeza, creo que aquí sería lo más práctico. Entonces si vamos al jugador HSM, entonces podremos exportar una referencia al reproductor de animación Así que vamos a hacer en la exportación var reproductor de animación, y luego Colon reproductor de animación. Bien, un comentario para dejar claro que este es el reproductor de animación del jugador, y luego lo asignamos en el inspector. Ahora bien, la razón por la que lo estoy haciendo en este guión lugar de los guiones infantiles, como los estados, es que solo quiero una referencia exportada aquí, y luego la usaremos para obtener el reproductor de animación de nuestros guiones estatales. Entonces, si saltamos al guión de estado de movimiento, podría simplemente obtener muy rápidamente la referencia que tiene el jugador HSM aquí en la parte superior haciendo algo como get parent y luego dot animation player Entonces eso es realmente todo lo que tendrías que hacer ahí. Y ahora podemos asignarlo a una variable local si queremos. Otra opción sería que pudiéramos tener un método que siempre obtenga esto o podríamos guardarlo en caché aquí localmente. Entonces solo necesitamos tomar este valor aquí y luego asignarlo a una variable local. Así var, voy a decir guión bajo reproductor de animación, que es de tipo reproductor de animación Entonces podría estar en Enter, pero lo cambiaré para configurarlo más tarde. Haremos jugador de animación de subrayado. Igual, Obtener padre. Sí. Se puede ver autocompletar, deshizo del nombre de la función ahí Esta debería ser tu línea completa aquí. En Enter ahora mismo, va a asignar el reproductor de animación a lo que sea el reproductor de animación de padres. Así que eso lo hace un poco más fácil que tener que tener referencia de variable de exportación en cada uno de estos scripts de estado. Los guiones estatales en cambio solo dependen el padre tenga una referencia al reproductor de animación, lo cual creo que es justo porque un jugador HSM realmente va a estar controlando las animaciones en el jugador de todos modos Entonces creo que la configuración tiene sentido en este caso. Ahora, en lugar de en Enter, que se llamará cada vez el personaje ingrese al estado, implementaré la función de configuración. Función, configuración de guión bajo y luego autocompletar que devuelve void Tomaremos esta línea y la pondremos aquí así. Entonces la configuración solo se ejecuta una vez cuando la máquina de estado se inicializa Entonces, básicamente, no necesitamos obtener el reproductor de animación cada vez que ingresamos al estado, solo una configuración establecida. Ahora, lo que sí queremos que ocurra en Enter es que reproduzcamos la animación correcta. Entonces en este momento, no tenemos la forma correcta de determinar la animación porque nuestro código para eso está realmente atrapado en el guión del jugador con esta dirección que se establece en una variable local. Entonces vamos a tener que sacar eso más tarde para que esto funcione completamente. Pero lo que podemos hacer ahora mismo es hacer animación player dot play, y digamos comencemos con la animación inactiva. Ahora, no, estoy poniendo en la variable aquí, una referencia a la animación inactiva, que resolverá al nombre de la cadena. Entonces esto espera un nombre de cadena, pero no nos cuesta escribir esto aquí abajo. Queremos asegurarnos de que es la variable para que todavía tengamos la opción de cambiarla en el inspector, si eso tiene sentido. Generalmente, por regla general, si tienes algo que quieres cambiar, eso es una cadena, quieres sacarlo a algún tipo de variable en lugar de escribirla duro cada vez que la referencies en el mismo script. A veces, si el mensaje solo se va a usar una vez en ese lugar específico, está perfectamente bien escribir la cadena de su código en su código de función. Eso también puede estar bien. Bien, entonces va a reproducir la animación inactiva tan pronto como comience el estado de movimiento. Ahora, para probarlo, queremos apagar la ejecución automática dentro del reproductor de animación. O tal vez en realidad no lo hacemos. Detengamos el juego y lo ejecutemos como es, y en realidad debería entrar en la animación ociosa o eso pensé. Así que vamos a tratar de producir el juego automático en carga aquí. Ahora, sin Autoplay en carga, creo que no debería jugar nada Y así todavía tenemos el problema de que parece que el estado no está entrando porque la animación no se está reproduciendo. Entonces lo que podemos hacer para demostrarlo es volver al editor de guiones. Y voy a establecer un punto de quiebre aquí haciendo clic izquierdo a la izquierda del número de línea en el guión. Y esto va a significar que cuando llegue a esta línea de código, se va a romper y nos permitirá ver qué pasa en el debuker Entonces voy a golpear play, y no va a golpear ahí, lo que significa que el estado nunca entró realmente. No está activo. Entonces eso significa que tenemos que volver al guión de HSM y asegurarnos de que el estado de movimiento esté realmente activo al inicio del juego Entonces entremos al jugador HSM. Y creo que lo que me olvidé aquí fue llamar en realidad set active en el propio jugador HSM Por lo que queremos establecer active true. Nosotros inicializamos, que ejecuta la configuración, pero no la hemos activado, lo que en realidad hace que la máquina de estado comience a funcionar Entonces ahora si le pegamos a play, golpearemos esa línea Enter en el estado de movimiento. Entonces esto prueba que el estado de movimiento en realidad está siendo reconocido por la máquina de estado. Para ir un poco más detallado, puedes mirar el seguimiento de pila en la parte inferior, y puedes ver, si lees atentamente, que la función enter de estado de movimiento se ejecutó, y se ejecutó después de que se ejecutara la configuración HSM, y en realidad puedes hacer clic aquí y saltar a la línea de código, lo que provocó que Enter se ejecutara en el estado de movimiento Ver set Active true aquí, que llama al Enter en el primer estado que se ejecuta. Y todo esto ocurrió, si hace clic en la línea de fondo en HSM de configuración lista Entonces se puede ver, básicamente lo que llevó a entrar siendo llamado. Entonces fue la función ready en el llamada el HSM de configuración, que llamó set active y luego set active hizo que se ejecutara el estado de movimiento Entonces ahora si aún no lo has hecho, puedes desmarcar este punto de interrupción y puedes dar click aquí abajo para continuar o presionar F 12 en el teclado, y podrás ver que el estado inactivo se va a ejecutar Si quieres cambiar eso al estado de ejecución, así que tomamos run aquí y reemplazamos play Idle animation por play run animation, pulsa play. Y ahora se puede ver que está reproduciendo la animación de ejecución cuando entra el estado. Entonces, en el siguiente video, nos centraremos en controlar realmente el estado de movimiento con la entrada del jugador para asegurarnos de que estamos reproduciendo la animación correcta en el momento adecuado. 7. Entrada del jugador como componente: Nuestro estado de movimiento es reproducir la animación en el reproductor de animación para nuestro personaje, pero en este momento no tiene el código para saber cuándo cambiar a la animación de ejecución, cuándo hay entrada real del jugador. Entonces para manejar eso, si miramos el guión del jugador, podemos ver que aquí es donde se está adquiriendo la dirección para el jugador, y lo estamos haciendo con una variable local para la dirección. Entonces esto funciona para esta función de proceso de física, pero entonces no podemos usar la dirección de entrada en ningún otro lugar que no sea aquí. Así que querríamos sacar eso a algún tipo de variable de propiedad a la que puedan acceder otros scripts. Ahora, podríamos hacer algo como dirección VR aquí del vector dos, y luego cambiar aquí mismo para establecer la dirección variable local. Y esa probablemente sería la opción más sencilla. Juntos. Sin embargo, creo que si seguimos por esta ruta y colocamos toda la entrada dentro del guión del cuerpo del personaje del jugador, entonces realmente estaríamos rompiendo una separación de preocupaciones. Entonces, el guión del cuerpo del personaje del jugador se trata principalmente de simplemente mover al jugador. Si agregamos toda la funcionalidad de entrada, adquiriendo todas las entradas de los jugadores en ella, entonces ahora el guión va a servir para dos o tres o incluso más propósitos ya que seguimos abarrotando el guión del jugador Entonces voy a tratar de sacar esto a un script de nodo separado que nuestro script de jugador aún puede usar, pero también podemos hacer referencia, digamos, nuestros estados para manejar toda la entrada para nuestro personaje jugador. Así que vamos a hacer clic derecho en el nodo del jugador, y voy a estar agregando un nodo hijo. Vamos a escribir en nodo aquí. Entonces esta será solo una clase de nodo básico, create. Y quiero renombrar esto para que sea entrada del jugador. Vamos a adjuntarle un guión. Haga clic derecho adjuntar guión, entrada del jugador. Y podemos darle el nombre de clase, entrada del jugador para que se pueda referenciar fácilmente en una variable de exportación. Entonces ahora desde nuestro guión de jugador, tenemos que básicamente agarrar esto, y solo voy a controlar C, pegarlo a la entrada del jugador, para que pueda ponerlo ahí. Pero donde realmente queremos obtener la dirección está dentro del método de entrada. Entonces ahora mismo en el guión de los jugadores, proceso de física está ejecutando cada frame de procesamiento de física de nuestro juego, que por defecto es algo así como 60 veces por segundo. Probablemente no estamos presionando las teclas 60 veces por segundo, así que eso es mucho innecesaria get vector call y probablemente no importaría tanto para un personaje de jugador. Pero en general, creo que puede ser un poco mejor en el guión del jugador manejar la entrada de dirección dentro del método de entrada de subrayado de función Así que la función de subrayado de entrada, básicamente, cada vez que se envía un evento de entrada al juego, entonces pasará por este método y verá si hay algún código para que responda Y la forma en que verificamos si el evento es realmente relevante para nosotros es que básicamente verificaríamos nombre de la acción en el evento en sí. Entonces vamos a escribir if, y voy a hacer un nuevo método si guión bajo es acción de movimiento Y vamos a pasar en el evento a esta función. Entonces vamos a hacer algunas cosas. De lo contrario, vamos a simplemente pasar y no hacer nada todavía. ¿Cuál es la función I movimiento acción? Por lo general, solo nos estamos protegiendo contra otro tipo de acciones, y solo queremos procesar la entrada si la acción es una acción de movimiento. Entonces diremos que la función es acción de movimiento. De tipo evento, evento de entrada. Y entonces esto va a devolver un booleano. Entonces un booleano es un verdadero valor falso. ¿Es una acción de movimiento? Verdadero o falso? Entonces esto va a verse algo así. Retorna evento que es acción, y en realidad vamos a copiar y pegar estos nombres por ahora mismo. Bien, para que podamos ver aquí estoy repitiendo la misma cadena aquí que está aquí arriba. Entonces, en general, trataría sacarlos a su propia variable separada. Pero podríamos Sí, ¿por qué no hacemos eso ahora mismo? Y luego te voy a mostrar un paso podemos ir más allá de eso, incluso. Así que vamos a poner una variable aquí, Var left action o en realidad, digamos que var left es de tipo string name, y va a ser igual a este valor aquí mismo. Así que vamos a Control C, copia esto, pégalo aquí abajo, y luego voy a seleccionar esto de nuevo. Voy a presionar Control R para buscar y reemplazar, y voy a reemplazarlo por izquierda. Ahora, cuando estés usando esta herramienta, va a reemplazar lo que has seleccionado actualmente. Entonces quiero reemplazar esto con el nombre de la izquierda, así que voy a presionar Reemplazar. Ahora, el segundo, al que automáticamente va a saltar o tal vez no Uh, aquí mismo, sí queremos mantener como Cita de Ampersand a como Cita de Ampersand Así que hagamos clic en Siguiente coincidencia, y encontraremos aquí abajo queremos reemplazar esto con left, así que presiona Reemplazar. Y eso va a ser básicamente ahí. Probablemente deberíamos encargarnos de este mensaje de error ahora mismo, también. Entonces voy a declarar esta dirección lejana, y nos preocuparemos por asignarlo correctamente en un minuto Bien, para que se deshaga del mensaje de error, puede guardar el script para ahora mismo. Entonces ahora mismo, me movimiento acción está regresando si la acción es la acción de izquierda. Entonces, ¿el nombre de la acción en el evento coincide con el nombre que queda? Ahora, tenemos otras tres acciones, así que tenemos que verificar aquí otras tres condiciones. Entonces, saquemos esto rápidamente. Voy a seleccionar este Control X para cortarlo, escriba a la derecha. Ve aquí abajo, crea una nueva variable var right, string name equals, y luego Control V para pegarla. Entonces tenemos la variable asignada a la cadena nombre derecho. Y haz lo mismo para arriba. Así que selecciona esto. Control X para cortar, teclear hacia arriba. Ve aquí abajo. Var up es de tipo string name, y es igual a Control V para pegarlo N. Y apenas una vez más. Control X. Escriba abajo, baje aquí, abajo, nombre de cadena es igual, Control V, pégalo. Bien, entonces ahora tenemos nuestras cuatro variables que corresponden a los nombres de cadena reales que realmente estamos pasando a métodos como este. Quieres otro truco divertido, podrías tabularlos así, seleccionar justo detrás de la pestaña de golpe de signo igual, detrás de la pestaña de golpe de seno igual, detrás de la pestaña de golpe de signo igual, detrás de la pestaña de golpe de seno igual, así. Y en realidad puedes alinear todos estos y se ve bonito y todo eso. Podría ser un poco más legible. Depende de ti si te gusta tener la pestaña o no. Bien, pero ahora lo importante es terminar este método, necesitamos revisar las otras acciones. Entonces vamos a hacer espacio. Y luego el carácter de línea recta, que es shift y justo debajo del retroceso, la línea vertical Entonces la línea vertical, la línea vertical, y hay que mantener presionada tecla Mayús para hacer eso, al menos en mi teclado. Entonces esas dos líneas verticales significan o. Supongo que en realidad podrías escribir o así, y sería lo mismo. Y podríamos intentar eso si eso en realidad es un poco más fácil de leer y hacer evento punto es acción, y queremos Derecha. Aguanta. Escriba el nombre de la variable. Bueno. Entonces, parece que eso funciona. Así que vamos a hacer eso de nuevo o evento que accione arriba o evento es acción abajo. Bien, entonces ojalá eso tenga sentido. Estamos comprobando si el evento es acción izquierda, acción derecha, acción arriba o acción descendente. Ahora bien, esta línea va un poco larga. Se puede ver esto como punto de corte verticalmente. Entonces estas son una especie de pautas generales aquí. Se puede ver que tenemos 107 caracteres en esta línea. No es un problema. Quiero decir, creo que es bastante legible, pero si quieres que tu código baje más verticalmente, entonces realmente puedes dividirlo aquí presionando Enter. Ahora bien, si le pego a Control S aquí, nos va a dar un problema. Se va a esperar expresión después o. Así que actualmente no sabe que estamos tratando de saltar a las siguientes líneas. Entonces, lo que realmente tienes que hacer es poner una diagonal inversa justo después de la O, y ahora sabe que esto continúa en la siguiente línea puedas seguir haciendo eso así, Barra diagonal inversa Enter para poner una nueva línea, y luego hacer una diagonal inversa Enter y poner Ahora bien, yo diría que esto se ve bastante limpio aquí. Entonces tenemos nuestras cuatro condiciones, y va a verificarlas todas, y en cuanto una de ellas evalúe la verdad, va a volver a ser verdad Y si ninguno de ellos es cierto, entonces es falso. Entonces, si la acción es una acción de movimiento, entonces vamos a poder procesar nuestro código de movimiento. Bien, entonces aquí es donde asignamos realmente el vector. Hay dos lugares donde vamos a usar la entrada. Uno es para la dirección de orientación y otro es para la dirección del movimiento. Entonces vamos a obtener la variable para la entrada. Var entrada es de tipo vector dos, vamos a establecer que igual a Importar punto G vector. Y al igual que antes, queremos izquierda, derecha, arriba y abajo. Bien. Y ahí está nuestro aporte. Así que cada vez que presionamos cualquier tecla, queremos establecer la entrada direccional. Entonces la dirección simplemente va a ser igual a cualquiera que sea el valor de Importaciones. Pero con la dirección de orientación, es un poco especial. Un personaje en un juego de cuatro direccionales dos D no puede enfrentar al vector 00 porque eso sería básicamente mirarse a sí mismo, no mirar a la derecha, arriba a la izquierda o abajo, que son las únicas direcciones que puede mirar. Cuando estamos asignando el vector de orientación, solo queremos hacerlo si la dirección no es cero Entonces si la entrada no es igual al vector 20, entonces para un vector dos dirección de cero, eso significa que X es cero e Y es cero, recuerden, los vectores tienen componentes X e Y. Entonces dado que esa condición está establecida, entonces podemos tomar frente y ponerla a la entrada. Y vamos a deshacernos de este pequeño pase aquí porque no necesitamos eso. Y luego en la parte superior aquí, var mirando como de tipo vector dos. Podemos simplemente por defecto esto a, digamos, vector dos punto derecho, que funciona perfectamente. Si siempre se espera que nuestro personaje mire a la derecha por defecto en la carga, podrías, por supuesto, hacer eso a la izquierda en su lugar si quieres. Y luego la dirección aquí, queremos reemplazar esto con el vector dos o si quieres ser un poco más elegante, aunque este es el valor por defecto también, podríamos decir colon es igual al vector dos punto cero. Entonces esto aquí mismo en realidad significa que estamos inferyendo el tipo de la variable de la asignación, y la asignación es un vector dos, lo que significa que esto automáticamente va a ser asignado a un vector dos, lo que significa que no tienes que escribir este vector dos es igual al vector dos Eso sólo se ve un poco gracioso. Entonces, del mismo modo, en realidad puedes hacerlo aquí abajo también. Y que sea un poco menos prolijo, aunque ambos funcionarán perfectamente bien aquí El único inconveniente es que si cambias este vector de dos puntos a la derecha en algo así como una cadena, que esto también va a ser técnicamente correcto porque ahora está a ser técnicamente correcto porque ahora asignado a la cadena de vector dos puntos a la derecha, y eso significa que esto es ahora una cadena Entonces, hay que tener un poco de cuidado con eso. En realidad no he visto que eso sea un problema. Entonces creo que en estos casos, inferir el tipo de la variable lugar de declarar el tipo de variable directamente es perfectamente razonable y bien y a menudo un poco Entonces hasta ti, puedes hacer ambas cosas. Si estoy viendo las cosas correctamente, creo que ese es básicamente nuestro guión de jugador por ahora. Volveremos y le agregaremos señales un poco más tarde. Bien, entonces en nuestro guión de jugador, cambiemos las cosas aquí. Entonces, en lugar de tener una variable local para dirección y asignar la dirección en lugar de proceso de física, lo que vamos a estar haciendo es golpear en Exportar var input es de tipo player input Y aquí abajo para el proceso de física, lo que queremos estar haciendo es obtener la dirección actual de la entrada. Así que var dirección, y voy a inferir el tipo de inport dot direction, va a ser asignado a la dirección local, y luego usamos eso para el resto de nuestro script comprobando, Es la dirección en realidad un valor que no es vector 20 es lo que esta línea significa aquí Y si es así, tomamos la dirección y la multiplicamos por la velocidad. La diferencia ahora es que la entrada es administrada por un script completamente separado. Nuestro guión de jugador se mantiene más limpio, y tenemos un componente de entrada de jugador reutilizable que podría usarse para diseños de personajes completamente diferentes que necesitan el mismo tipo de entrada del jugador, incluso si el personaje realmente maneja la mecánica de su movimiento de manera completamente diferente. Así que vamos a hacer clic en el guión del reproductor, y queremos asegurarnos de que Import está asignado. Entonces como antes, lo que podríamos hacer es poner función, subrayado listo, y afirmar que entrada no es nula y darle el mensaje Se debe asignar entrada para el cuerpo del personaje se mueva correctamente, ejecute el juego, vea que nuestra afirmación falla, lo cual es bueno Haga clic en el reproductor y asigne la entrada a la entrada del jugador, ejecútela una vez más y vea que realmente funciona. Y si haces WASD, puedes ver que se mueve en función de la entrada de nuestro script de importación del jugador 8. Cambia las animaciones con señales: este momento nuestra entrada direccional arriba abajo izquierda derecha está controlada por el script de entrada del jugador, pero aún no tenemos las animaciones controladas por la dirección en ese guión. Entonces, si echamos un vistazo al script de estado de movimiento, podríamos imaginar que podríamos simplemente agarrar una referencia a la entrada del jugador y obtener padre en ella igual que antes. Este método, aunque generalmente funciona bien, depende del script HSM del reproductor, teniendo una referencia a todas estas propiedades Si cambiamos el script jerárquico de la máquina de estado del jugador , en cualquier momento, puede romper cómo funciona este script, y el script también tiene una especie de dependencia directa del padre que tiene todas estas propiedades Así que no podríamos reutilizar esto en una máquina de estado completamente diferente que no tenga, digamos, un reproductor de animación expuesto. Entonces lo que puedes hacer como otra opción es usar pizarras Entonces miramos por aquí a la derecha cuando tengas seleccionado el HSM, puedes ver que el plan de Blackboard es una Entonces, cuando creas un plan Blackboard, le dice a cualquier nodo hijo en el sistema de la máquina de estado qué va a tener acceso Y en este caso, queremos la dirección de orientación de la entrada del jugador. Entonces voy a crear un nuevo plan de Blackboard aquí en el jugador HSM, y luego presionaré Podemos ir por aquí y agregar una variable, y queremos agregar vamos con el frente. Entonces, cuando hablamos de las animaciones, lo que es más relevante para nosotros es la dirección que el personaje está tratando enfrentar en lugar de la dirección en la que se mueve el personaje. Esas suelen ser lo mismo, pero no siempre. Así que tendremos frente aquí, y luego en el desplegable, vector dos, así podemos hacer clic en Administrar por aquí y luego agregar una variable Y vamos a buscar el vector de dirección dos. Así que cambia el tipo de float al vector dos. Y luego podemos golpear Bien, así que para obtener esta dirección también y que se use a través de nuestros diferentes estados de máquina de estado, queremos ir a binding, y luego direction, queremos vincular esto al script de importación del jugador. Pero si lo hacemos ahora mismo, nada va a aparecer. Entonces, una de las limitaciones a la vista del sistema Lambo AI es que para vincular una propiedad al plan Blackboard, esa propiedad necesita ser exportada variable Entonces, si vamos a player Input, podemos tomar dirección aquí y simplemente darle en la exportación y luego guardar. Entonces haces clic en el jugador Importar, verás que la dirección aparece aquí arriba. Técnicamente, esto significa que podrías cambiar la dirección antes de que comience el juego. Se va a sobrescribir de inmediato por esta función Iport tan pronto como presione una tecla Así que en realidad no hay mucho inconveniente. Es solo que se tiene que exponer la dirección para que esto funcione. Entonces en el HSM, ahora podemos vincularnos al script de inport del jugador, y vamos a estar buscando la propiedad direction Así que elige dirección y golpea abierto. Bien. Entonces, si lees esto ahora, la dirección ahora está enlazada a la dirección de importación del jugador, lo que significa que cualquier cosa que establecemos en dirección de importación del jugador va a reflejarse en este Blackboard, y podremos usarlo dentro de nuestros scripts como el estado de Entonces, mientras estamos en ello, también podemos poner el reproductor de animación en el plan de Blackboard, y eso eliminará la dependencia entre el estado y el HSM Vamos a gestionar y agregar una variable, voy a decir reproductor de animación. Y vamos a escribir y elegir Node path, creo que es lo que queremos aquí. Bien. Haga clic en Bien. Y asignamos esto al reproductor de animación. Entonces ahora si leemos desde la pizarra para el reproductor de guiones bajos de animación de propiedades, deberíamos poder obtener una referencia al reproductor de animación Bien, entonces ahora si vamos a Mover Estado, cómo va a quedar esto es más así. Por lo tanto, el jugador de animación de subrayado va a ser igual a Blackboard Por lo que el Blackboard se crea en tiempo de ejecución, basado en el plan Blackboard Así que este es básicamente el objeto runtime donde obtenemos las variables que necesitamos. Entonces tenemos que hacer Blackboard dot, Get VR, obtener guión bajo var, y estamos buscando el nombre de la propiedad Entonces, en este caso, ese va a ser jugador de guión bajo de animación El valor predeterminado será nulo. Queremos que se queje si no puede encontrarlo porque eso significa que nos equivocamos en algún lugar alrededor de nuestra configuración Ahora, básicamente podemos eliminar esta línea ahora, y ahora nuestro script no depende en absoluto del script HSM Simplemente depende de que el Blackboard se esté configurando para tener un reproductor de animación, cual recibirá un mensaje de error si no tiene reproductor de animación en el Blackboard Entonces ahora para la dirección, sólo tenemos que conseguir eso en actualización, supongo. Entonces función, actualización de subrayado, y vamos a estar obteniendo la variable actual de Blackboard Entonces esa va a ser la dirección VR. Va a ser igual al punto de Blackboard Get VR, y estamos buscando dirección Y no podemos inferir este tipo de variable porque no sabemos qué va a devolver realmente Git VR aquí Así que vamos a declararlo como un vector dos. Bien, entonces ahora tenemos la propiedad direction, y nuestro script ni siquiera necesita saber nada sobre el script de entrada del jugador. Todo lo que hay que saber es que la pizarra tiene una propiedad de dirección, y podemos usarla para nuestras animaciones Entonces muy simple, si la dirección no es cero, eso es forma corta para eso, entonces vamos a reproducir la animación de ejecución en el reproductor de animación. Así subrayado reproductor de animación, juego de puntos, animación de ejecución, Ale, reproductor de animación, juego de puntos, animación inactiva Así que sigamos adelante y pulsemos Reproducir ahora y veamos si esto funciona. Entonces si FUE y D, entonces puedes ver que obtenemos el movimiento de animación para nuestro personaje. Ahora, aquí hay un gran defecto, que es que el desplazamiento en nuestros sprites no coincide Ahora bien, esa es solo la naturaleza de cómo se configuraron las hojas de sprites específicas Creo que el tamaño de cada cuadro no coincide. Entonces crea un desplazamiento. Ahora, eso sería algo que puedes arreglar en un editor como A Sprite, si eres el artista, o si solo quieres que funcione, para este caso, podemos hacerlo en el reproductor de animación Entonces en el reproductor de animación, podemos ir a digamos vamos a comprobar la animación inactiva. Y aquí lo tenemos centrado aquí como esperaríamos. Entonces, cuando vamos a la animación de ejecución de Run, solo necesitamos asegurarnos de que esto coincida con la animación inactiva. Entonces vamos a querer enmarcar clave la posición en cada una de nuestras animaciones. Entonces agreguemos una pista, pista de propiedad. Veamos, el Sprite dos D porque estamos hablando del desplazamiento del sprite, no del desplazamiento del personaje del jugador Y entonces queremos posición aquí. Entonces agreguemos una clave. Ahora mismo está en negativo 14. Voy a ir a Idle. Y luego vamos a agregar la misma propiedad por adelantado. Entonces posicione dos D y luego agregue el fotograma clave aquí. La razón por la que estoy haciendo esto es porque la posición de inactividad ya es correcta, así que no quiero tener ese cambio cuando estoy configurando la carrera. Mientras estamos en ello, vamos a comprobar la muerte. Creo que la animación de la muerte está en realidad en el lugar correcto. Entonces todo lo que tenemos que hacer es ir aquí, agregar la pista, sprite dos D, posición Bien, inserta la llave. Bien, y entonces eso debería ser bueno. Entonces ahora necesitamos cambiar el valor de la ronda a animación específicamente. Así que pulsa Q para ir al Modo Selección. Clic izquierdo en el sprite. Deberías tener esta caja grande. Se puede ver probablemente de dónde vino el offset de aquí porque aquí arriba hay mucho espacio vacío. Pero de todos modos, así que solo tenemos que golpear W y luego mover esto hacia arriba a la derecha por ahí. Déjame comprobar la transformación. Sí, 27 píxeles negativos. Creo que eso es lo que tenía y el en el proyecto de borrador. Así que vamos a fotogramas clave eso. Vamos a golpear Play y a ver si eso es mejor. Entonces WASD, ya casi está ahí, pero creo que tiene que ser unos pixeles más altos Entonces vamos a W y luego movamos esto hacia arriba. Intentemos 30, le pegamos a W. N , todavía no está ahí. Bien, vamos a subir más esto. Voy a ver la animación ociosa. Bien. Y ahí es donde están sus pies en el suelo. Entonces volvamos a correr. Bien, y sus pies deberían estar aquí arriba, dos pixeles debajo del fondo. Bien, y luego inactivo, y luego corre. Bien, me olvidé de enmarcarlo con llave. Entonces déjame moverlo una vez más. No creo que necesitemos el desplazamiento X. Vamos a fotograma clave que en negativo 30 píxeles aquí. Bien, vamos a golpear play y probar una vez más. WASD. Eso me parece correcto. Entonces iremos con eso. Vamos a golpear Sop en el jugador aquí Y solo para ser claros, como una solución a más largo plazo, sería mejor probablemente entrar y arreglar las hojas de picos de animación y solo asegurarse de que todas tengan el mismo tamaño, independientemente de la cantidad de movimiento que haya en las animaciones para que no sea las animaciones para que necesario meterse con la posición. A largo plazo, esto es un poco más difícil de manejar, así que es mejor si solo se fija en la hoja de animación directamente. Bien, entonces para nuestros personajes al ralentí y movimiento, así que lo último que realmente tenemos que hacer por nuestros personajes, el movimiento básico es hacerlo voltear cuando nos movemos hacia la izquierda y luego voltear hacia atrás cuando nos movemos hacia la derecha Ese será el siguiente video, así que te veré en el siguiente. 9. Voltear un personaje en 2D: Entonces tenemos nuestro movimiento arriba abajo izquierda derecha para el personaje, y puede volver al estado inactivo. Eso es genial. Lo que necesitamos cambiar aquí, sin embargo, es que nuestro personaje necesita poder voltear de derecha a izquierda, dependiendo de si tenemos una entrada izquierda o derecha. Así que queremos básicamente voltear el nodo sprite de izquierda a derecha. Ahora, Sprite tiene directamente un flip H aquí. Sin duda podríamos decirlo en un guión personalizado para voltear la H en función de lo que sea que haga la entrada del jugador. Para ir un paso un poco alejado de eso. En cambio, lo que podríamos hacer es en realidad poner un nodo padre que se voltea a sí mismo cuando cambia la dirección de entrada del reproductor, y luego eso volteará automáticamente el nodo sprite porque el nodo sprite es hijo de ese nodo padre dos D. Así que si hago clic en el nodo reproductor y agrego un hijo, agreguemos un nodo dos D, y luego lo llamaré voltear dos frente a dos D. Vamos haga clic derecho en él, adjunte un guión. Vamos a poner esto en la ubicación por defecto, crear, y vamos a hacer que el nombre de la clase voltee dos frente dos D. Y esto va a voltear la escala X en la transformación, dependiendo de si el carácter está mirando hacia la izquierda o hacia la derecha. Bien, entonces, ¿qué significa esto básicamente? Si agarro este brillante dos D y lo tiro bajo voltear a enfrentar dos D, y luego pongamos esto de nuevo arriba donde estaba antes, hacia la parte superior de la jerarquía, voy a tomar flip a enfrentar dos D, y luego por aquí a la derecha, desmarque el vínculo entre X e Y porque sólo estamos cambiando la escala X. ¿Bien? Y luego escribe uno negativo para la X, y verás que el personaje voltea hacia la izquierda Si escribimos uno a la X, el personaje mira hacia la dirección original, que está a la derecha. Por supuesto, debes tener un poco de cuidado con la configuración. Si pones tus armas debajo del flip para enfrentarte a dos Dno, entonces eso significa que tus armas también van a estar mirando hacia la izquierda o hacia la derecha Ahora, a veces quieres eso, y en otros casos, no haces tu sistema de lanzamiento de proyectiles más adelante, no quieres que voltee en base a lo que es esta escala de nodos Pero si tuvieras, digamos, poner una lanza en la mano del personaje, probablemente querrías que ese sprite mire la dirección correcta cuando estás mirando hacia la derecha o hacia la izquierda cuando estás Entonces solo hay que tener cuidado con qué nodos pones debajo aquí, porque cualquier cosa que esté bajo volteo para enfrentar dos D en la jerarquía ahora va a voltear cada vez que ese nodo padre voltee Así que solo ten en cuenta lo que está parentado a qué, y deberías estar bien Así que dentro de nuestro flip to facing two D script, queremos agregar una var de exportación. Y vamos a decir input, que es de tipo player input. Ahora, por ahora mismo, depender de la entrada del jugador significa que este guión es específicamente el guión de un jugador y no necesariamente utilizado por los guiones enemigos. Para un guión tan pequeño, en este caso, podría valer la pena tener la referencia directa a la entrada del jugador porque eso solo te da la configuración más simple y práctica. Y entonces lo único que necesitas para asegurarte es que la entrada está realmente asignada en el inspector. Entonces podemos hacer eso con la aseveración. Vamos a hacer una función de subrayado ya y luego aseverar que la entrada no es nula y digamos, para voltear la referencia a la entrada del jugador se requiere, una vez más, siempre puedes simplemente ir al top hit play, y va a golpear tu aserción, que esa prueba sea buena De lo contrario, en este punto, podemos simplemente obtener el acceso a la señal desde entrada del jugador y usarlo para voltear este nodo siempre que cambie la dirección de orientación. Si recuerdo, aún no he puesto las señales. Entonces, si hacemos clic derecho sobre la entrada del jugador, buscamos el símbolo, queremos ir a la parte superior y declarar algunas señales. Entonces una señal es como un evento. Si vienes de otros idiomas como C Sharp, es un evento. Y en este caso, lo que eso significa es algo desencadenado dentro de tu código y quieres notificar a los objetos suscritos que algo ocurrió y opcionalmente pasar alguna información contextual o datos al objeto receptor Bien, entonces déjame seguir adelante y declarar uno, y luego te lo explicaré un poco más simple. Entonces señal es la palabra clave, y luego diríamos enfrentando cambiado, y querríamos pasar en la dirección que cambió también, así podríamos decir valor o cara, y eso va a ser un factor de tipo dos. Entonces estamos declarando el parámetro. Lo que estamos enviando a cualquier objeto receptor va entre estos paréntesis aquí Entonces la señal se enfrenta a cambio. Entonces el evento cada vez que la propiedad frente en este caso, aquí abajo cambia, queremos enviar una señal que permita a cualquier objeto suscriptor saber que el valor de orientación ha cambiado Entonces en ese momento, pueden responder a ello en su propio código. Y lo que esto significa es que no es necesario verificar constantemente la propiedad frontal de la entrada del jugador en cada actualización de fotogramas. Solo tienes que esperar a que el guión te notifique que el valor realmente ha cambiado a algo diferente. Entonces tienes esa información significativa, y solo necesitas actualizar como una vez cada pocos segundos porque tu jugador solo cambió su dirección de movimiento una vez cada 3 segundos o dirección de cara en este caso. En otras palabras, te vuelves dependiente de una señal activa tu otro código en lugar de verificar constantemente un valor para detectar cambios manualmente Entonces con nuestra propiedad frente aquí abajo, queremos tomarla y agregar un setter para que cuando cambie el valor de orientación, en realidad emitamos la señal cada vez que cambia Entonces, si agregas dos puntos al final, esto te permite declarar a tus setters y getters Simplemente puedes hacer una de ellas. No tienes que hacer ambas cosas. Entonces en este caso, queremos decir valor establecido. Y tenga en cuenta que esto está en una nueva línea. Entonces en este caso, realmente estamos declarando una función, aunque, en realidad Y esto solo se ejecuta cada vez que establecemos el valor de esta propiedad en algo nuevo. Así que estamos cambiando el valor predeterminado de simplemente establecer el valor y no hacer nada más para configurarlo y hacer algo de código extra. Entonces, cuando establecemos el valor, queremos tomar frente y fijarlo al valor. Entonces eso sería lo que hace por defecto. Si no declaras ninguna función setter Getter, el Getter simplemente sería más así, regreso enfrentando, ¿verdad? Eso es lo que esperarías. Se accede a la propiedad por nombre, frente, y devolverá el valor en el que está establecido. Entonces, si no necesitas código personalizado para el Getter, no necesitas declararlo porque eso es lo que hace por defecto, y esto es lo que enfrentaría haría por defecto Ahora bien, si quieres hacer algo como emitir una señal, entonces necesitas el código extra. Entonces ahora queremos decir frente cambió el nombre de la señal punto emitir, por lo que emitimos la señal, que significa que cualquier objeto se suscriba a ella ahora va a ser notificado, pero queremos pasar en la información del frente Entonces pasamos de frente. Entonces estamos tomando este valor, enviándolo a través de la señal, y luego en nuestros otros guiones, vamos a recibir esa información, y podemos decidir qué hacer con ella. Ahora bien, hay otro truco que quiero mostrar aquí, sin embargo, que es que no queremos enfrentar cambio para que se emita cada vez que establecemos el valor de orientación. Esto podría estar configurándose en el mismo valor en cada fotograma. Creo que el cheque de acción de movimiento en realidad protege contra eso porque esto solo se activaría realmente cuando hay una acción de movimiento real, que sería, en este caso, como presionar la tecla derecha o soltar la tecla derecha o lo mismo para las otras direcciones. Pero siempre es bueno estar más a la defensiva en la programación. Simplemente asuma que tus otras suposiciones no son necesariamente correctas y luego protegerte de ello. Entonces vamos a poner un guardia aquí. Si enfrentar ya es igual al valor, entonces eso significaría que no hay cambio. Entonces solo queremos regresar aquí. No necesitamos establecer el frente porque el valor ya está asignado al frente. Ya es correcto, y no necesitamos emitir la señal, y no debemos emitir la señal porque el valor en realidad no cambia. Por lo que tenemos esta guardia contra los malos sets a la propiedad frente. Pero si se pasa esa guardia, entonces colocamos el frente y emitimos la señal. Entonces con todo eso, la señal ahora va a emitir. Y podemos simplemente ir a nuestro flip a enfrentar dos D. Y luego de afirmar que Import no es nulo, entonces sabemos que está establecido Así podemos ir a la entrada de punto orientado cambiado. Verás que la señal en realidad está referenciada por su nombre aquí, y tiene ese pequeño símbolo o señal de Wi Fi. Así que ponemos los revestimientos de puntos de entrada cambiados. Entonces ahora estamos viendo el nombre de la señal, y queremos conectarnos a él. Entonces punto conecta. ¿Y qué queremos conectar con él? Bueno, esa sería una función callable que configuramos aquí Para mantener las cosas, creo, lo más simple posible, deberíamos crear una función personalizada en la parte inferior. Entonces voy a decir subrayado enfrentando cambiado. Va a seguir dando error porque no hay ninguna función con ese nombre dentro de nuestro script. Entonces si le pego a Enter un par de veces, diremos función, subrayado al enfrentar cambiado Ahora bien, ¿qué parámetros va a tomar esta función? Bueno, va a tomar lo que sea que pasó a la señal. Entonces, en este caso, estarías mirando hacia la dirección. Entonces voy a decir P, subrayado frente, P como en parámetro, dejando muy claro que este valor viene de los parámetros que se pasaron a la función Y entonces este es un vector dos. No vamos a devolver nada, así que vamos a regresar nulo. Y ahora podemos escribir el código para responder a la señal que emite frente cambiado. Bien, entonces cuando se cambia la orientación, queremos tomar la dirección X del frente y usarla para determinar si debemos mirar hacia la derecha o hacia la izquierda. Entonces, si p punto frente al punto X es un valor positivo, entonces lo que queremos hacer es tomar la escala X de este nodo dos D, la vuelta al nodo de orientación, y queremos establecerlo igual al valor absoluto del punto de escala X. Cuando tomas el valor absoluto, estás haciendo un número siempre positivo. Entonces, para enfrentar a la derecha, estamos haciendo bien nuestra dirección positiva. Así que siempre queremos enfrentar a la derecha siempre que la entrada esté realmente orientada hacia la derecha. Ahora, no vamos a decir otra cosa. Vamos a decir otra cosa si P frente a X es menor que cero, así que no queremos ese caso cero porque nuestros personajes no deberían poder enfrentar el punto 00 en el vector dos que realmente no existe como dirección de cara para este tipo de dos juegos D. Entonces no queremos hacer nada cuando ese es el caso. Entonces por eso estoy comprobando si el valor es menor que cero, porque menos de cero en realidad estaría mirando hacia la izquierda. Entonces hacemos punto escalado X, y vamos a establecer eso igual a negativo una vez valor absoluto escalado punto X. Bien, entonces esto va a dar siempre un número positivo, y entonces siempre vamos a hacerlo Entonces, probablemente haya algunas formas diferentes de matematizar esto aquí, pero creo que eso debería funcionar bien. Bien, entonces vamos a dos D vista. Hacemos clic en voltear a enfrentar dos D, y asignamos la entrada del jugador. Bien, entonces ahí es donde vamos a conseguir la señal. Vamos a conectarnos a él en Rudy de nuevo en nuestro guión de cara Bien, así que si le pego a play, hagamos el movimiento correcto. Nuestro personaje mira hacia la derecha, y si golpeo a la izquierda, nuestro personaje mira hacia la izquierda. Si hacemos arriba a la izquierda, estamos mirando a la izquierda. Si hacemos abajo a la derecha, estamos mirando hacia abajo a la derecha. Solo prueba todas las ocho direcciones en las que nuestro personaje puede moverse con la entrada del teclado, y eso me queda bien. Así que solo para ser un poco progresista, una cosa que podríamos hacer es agarrar este código y sacarlo a una función diferente, refactorizándolo en una nueva Entonces digamos función actualizar, voltear, y esto requerirá la dirección de orientación. Entonces P frente, vector dos, y luego voy a tomar esto, cortarlo aquí abajo y al enfrentar cambiado realmente voy a llamar actualización flip P enfrentando. Ahora bien, la razón para hacer esto es para que también pueda reutilizarlo listo. Así que listo, solo diremos actualización flip Import dot facing. Entonces, cuando nuestro script se carga por primera vez, queremos establecer la dirección de orientación hacia arriba inmediatamente antes cualquier importación realmente venga nuestro reproductor porque podría ser el caso en el que decidamos, digamos, en la entrada del jugador, exportamos esta dirección de orientación, y luego cambiamos el valor por defecto del punto vectorial derecho al vector dos punto a la izquierda porque por razón que sea queremos nuestro a la izquierda por defecto. Entonces ahora con esto, podemos estar preparados para eso inicializando automáticamente con la dirección correcta de volteo en base a lo que sea que diga la entrada Entonces ahora, esta es una función pública. Podríamos simplemente llamar a esto desde otro script si hubiera un caso no relacionado con Import donde quisiéramos cambiar la dirección de volteo del personaje. Por ejemplo, tal vez durante una escena de corte, quieres cortar toda la entrada del jugador, y quieres llamar a esto manualmente. Entonces tu personaje estaba de cara a la derecha, y en la escena del corte, quieres que mire hacia la izquierda. Así que tendrías la opción de simplemente llamar a Update flip on the flip para enfrentar dos nodos D. Bien, entonces definitivamente abre algunas posibilidades ahí. Y eso es prácticamente todo lo que vamos a necesitar hacer para el movimiento WASD de nuestro jugador Se ve bien. Creo que todas las preocupaciones están separadas bastante 10. Capas de mapas de césped y mosaico de tierra: Bien, entonces ya que nuestros personajes se mueven y animan así que básicamente jugando tanto para Ídolo como para correr, incluyendo la dirección de volteo, creo que ahora es un buen momento para empezar a poner en algún fondo así que el juego se ve un poco más bonito en lugar de solo tener ese fondo gris Gadot predeterminado Así que sigamos adelante y cambiemos a nuestra escena mundial. Si no tienes eso abierto, puedes ir a la parte inferior izquierda aquí. Solo busca mundo, y deberías poder encontrar world dottSCN si ese es el mismo nombre que estabas usando como yo Y luego en la jerarquía mundial, queremos hacer clic derecho y agregar un nuevo nodo, y estamos buscando una capa de mapa de teselas. puede ver, había otro nodo llamado Tilemap, pero eso está en desuso, creo, desde 4.3, y desde 14.41 y a punto de ir a 4.5, definitivamente se recomienda que cambies a las capas de tilemap, lo que divide el tilemap en nodos de capa individuales en lugar de tener cada capa individual Se puede ver, había otro nodo llamado Tilemap, pero eso está en desuso, creo, desde 4.3, y desde 14.41 y a punto de ir a 4.5, definitivamente se recomienda que cambies a las capas de tilemap, lo que divide el tilemap en nodos de capa individuales en lugar de tener cada capa individual. Contenido dentro de un mapa de teselas. Así que agreguemos una capa de mapa de teselas. Y vamos a llamar a esto algo así como tierra, así que le voy a cambiar el nombre a tierra. Y si lo tienes seleccionado en la parte inferior, deberías tener la ventana tilemap Entonces ábrelo si no está abierto ya. Y luego necesitamos encontrar los activos artísticos de nuestro proyecto. Así que voy a entrar en el arte y luego Pixel crawler entornos conjuntos de azulejos, y vamos a estar queriendo trabajar con las baldosas aquí Entonces, para que podamos traer esto, no queremos estar en el tilemap, sino más bien en la pestaña del conjunto de mosaicos Busque en la esquina superior derecha mientras tiene seleccionada la capa de mapa de teselas y verá el conjunto de mosaicos como un recurso que puede asignar aquí. Desea hacer clic izquierdo y hacer un nuevo conjunto de mosaicos, una vez que lo haga en la parte inferior, habrá una nueva pestaña Tilset Entonces, una vez que lo hayas renombrado a suelo, mira la parte superior derecha con él seleccionado, y deberías ver un campo para el conjunto de mosaicos Por lo que queremos hacer clic aquí y declarar un nuevo TilesetrSource Lo haces en la parte inferior, debería haber dos pestañas aquí relacionadas con el mapa de teselas, que es el mapa de teselas para seleccionar y dibujar realmente este conjunto de mosaicos, que es para configurar tus mosaicos, y luego mapa de teselas para dibujar tus mosaicos. Entonces queremos ir a Juego de azulejos. Deberían ver una caja por aquí que podamos arrastrar las baldosas del piso. Así que encuentra baldosas dentro del proyecto. Entonces son pisos subrayado azulejos punto PNG, y sólo vamos a arrastrar y soltar eso aquí Habrá este pequeño pop up, que pregunta si quieres crear automáticamente los mosaicos, nosotros sí. Entonces seguiremos adelante y nos pegaremos aquí. Y luego verás en la ventana de vista previa que todas las fichas se han cortado automáticamente en recursos de fichas reales que podemos usar y pintar en el juego. Entonces, la forma más sencilla de dibujar sería simplemente ir a Tilemap y luego seleccionar esos mosaicos individualmente que quisiéramos colocar Presiona Q para asegurarte de que estás en modo de selección. Y luego aquí abajo en la ventana de tilemap, queremos estar en herramientas de pintura, así que eso es D en el teclado Y luego puedes hacer click izquierdo para dibujar el mosaico. Puede pasar por encima de uno y hacer clic izquierdo y poner otro mosaico hacia abajo. Verás que en este momento, el Tap en realidad se está mostrando frente al jugador. Eso no es lo que queremos. Lo que puedes hacer es simplemente mover el suelo a la cima aquí, y eso lo ordenará automáticamente, así que el suelo está debajo del jugador. Entonces esa es la forma más sencilla de hacerlo. Entonces, si bien seleccionar los mosaicos uno a la vez así funcionará, es muy, muy tedioso Entonces, lo que probablemente queremos hacer en su lugar es crear un conjunto de terrenos basado en estas baldosas de césped y luego usarlo para dibujar automáticamente qué baldosa necesitamos dependiendo de lo que qué baldosa necesitamos dependiendo esté adyacente a esa baldosa, si es que hay algo. Entonces, si expandes el conjunto de mosaicos en la parte superior derecha, puedes bajar a conjuntos de terreno y luego agregar un nuevo elemento. Entonces lo vamos a dejar en partido esquinas y lados y expandes terrenos y agregas un elemento Y podemos simplemente cambiarle el nombre a esto, digamos, terreno de pasto cambia el color a algo un poco más herboso, como un verde Ahora en la parte inferior, vamos al juego de azulejos, y luego vamos a hacer pintura. Vamos a seleccionar de los terrenos del editor de propiedades. Vamos a seleccionar el conjunto de terreno como terreno establecido a cero, y luego el terreno que estamos dibujando es pasto. Entonces debería ser bastante obvio cuáles son las tejas de pasto aquí. Pero para que las baldosas construyan de manera correcta y automática, necesitamos seleccionar las baldosas que se supone que forman parte de este terreno de pasto. Así que en realidad puedes hacer clic izquierdo y mantener presionado y arrastrar una caja alrededor de todas estas baldosas de hierba, algo así. Si está resaltado, entonces eso va a significar que básicamente está marcado como parte de este terreno. Y esto es pasto oscuro aquí. Podríamos configurarlo más tarde. Bien. Y entonces es posible que tengamos que conseguir estos también aquí abajo. Veremos cómo va eso y estos azulejos de luz ahí. Ahora bien, estos de fondo parecen ser más una hierba oscura. Podemos tratar de incluirlos y ver cómo va, pero puede que no lo hagan en el corte final para el terreno que podría ser más de una sombra oscura de pasto. Entonces tendremos que ver cómo eso realmente mosaicos. Bien, así que hemos seleccionado todos estos azulejos como pasto. Ahora queremos ir a la parte superior izquierda, y queremos marcar las esquinas y lados que son pasto o están adyacentes a la hierba. Entonces, la forma más sencilla de pensarlo con este juego de baldosas es solo si el área es transparente, generalmente, no la vas a marcar, y si es pasto sólido o cerca de pasto sólido, entonces vas a marcar como pasto o pasto adyacente. Si acabo de dejar clic aquí y arrastrar por ahí, van a ver que está rellenando el cursor, y queremos que estos ocho cuadrados que no están en la esquina inferior derecha estén marcados como pasto porque esto de aquí en la esquina inferior derecha está diciendo que hay algo más aquí abajo. El azulejo de abajo a la derecha no es pasto y este azulejo lo está reflejando. Así que básicamente usará este azulejo cuando todo abajo a la derecha arriba a la izquierda y estas tres esquinas, sean pasto, pasto adyacente, pero el inferior derecho no lo es. Entonces la idea es que tengas uno para todos estos escenarios. Entonces, en este caso, harías estos seis mosaicos superiores, y esto significa que si no hay pasto debajo de él o hacia abajo a la izquierda o abajo a la derecha, entonces este mosaico se asignaría automáticamente. Así que solo queremos seguir haciendo este tipo de cosas en todos los sentidos. Entonces esta se ve como todas las esquinas y lados excepto la parte inferior izquierda. Y entonces éste es el top cuatro. Este es, creo, igual que éste de aquí arriba otra vez, los ocho primeros a la derecha. Y sí, es posible tener múltiples mosaicos que tengan lo mismo creo que lo llaman un poco máscara aquí. Entonces, si bajamos al fondo, verás que estos son los nueve azulejos cuadrados, seguro, porque todos son pasto y pasto adyacentes. Así que en realidad llenarías todos estos en todo el camino. Y entonces eso llenará todo lo que hay dentro de estas tejas de borde. Bien, así que solo necesitamos seguir haciendo esto. Entonces este de aquí arriba en la parte superior va a ser el medio de arriba a abajo, y el derecho de arriba a abajo. Aquí tenemos los ocho lados y esquinas excepto la parte superior izquierda. Este es el cuatro de abajo a la derecha. Este lo es todo excepto arriba a la izquierda. Los seis azulejos inferiores, todo excepto arriba a la derecha, los cuatro inferiores a la izquierda, todo excepto arriba a la derecha, los seis izquierdos, todo menos abajo y los cuatro superiores izquierdos. Tenemos nuestras piezas de esquina aquí arriba, y tenemos las piezas sólidas de hierba aquí abajo. Entonces para dibujar con él, solo vamos a Tilemap y luego seleccionamos terrenos, pasto Y lo que podemos hacer es agarrar esta herramienta rectangular. Déjame alejar un poco la cámara de aquí. Y vamos a alejar el zoom con rueda del ratón central en el mapa del juego, y podemos simplemente hacer clic izquierdo y arrastrar una caja gigante al fondo. Y ahí está nuestra hierba de fondo. Ahora, verás que estos mosaicos eran, de hecho, más oscuros. Fue un poco difícil de decir en mi pantalla. Entonces tal vez en el juego de azulejos, estos también son pasto oscuro que realmente me pareció igual. Entonces la solución a esto es solo que eliminemos los mosaicos oscuros de los azulejos claros cuando estamos asignando la hierba Entonces, si hago clic derecho en alguna de estas piezas de máscara de bits, entonces eso la va a quitar como parte de la baldosa si retiramos completamente todos los nueve lados, esquinas y centro. Ahora bien, si volvemos a dibujar esto, esas no serán una opción a la hora de rellenar los mosaicos Así que solo dejaré clic y arrastraré otra caja sobre ella, y ahí tenemos la hierba ligera y solo la hierba ligera para toda esta escena. Ahora, en un juego como sobreviviente, tu personaje puede moverse mucho por el mapa. Así que en realidad voy a hacer de esta un área muy grande. Simplemente iremos de aquí a aquí solo para que haya mucho espacio para que el personaje se mueva. Ahora, se puede ver que en realidad lleva un tiempo rellenar eso porque eso es un montón de fichas. Bien, también quiero mostrar si golpeo E, para ir al modo Carrera y luego D para la herramienta de pintura. Entonces podemos dejar clic aquí, y verás que automáticamente asigna las piezas adyacentes en función de la baldosa en el centro Entonces este azulejo no tiene azulejo, por lo que automáticamente reconoció, Oh, necesito las piezas de esquina y laterales que asignamos en el terreno. Y solo puedo seguir usando el cepillo de goma de borrar así. Y verás que está generando automáticamente los lados y esquinas. Puede tener algunas limitaciones como necesitar ir, como, un dos por dos y una línea para que se vea bien. Depende del juego de baldosas, realmente, porque hay diferentes formas de construir las baldosas. Pero por lo menos, esto es mucho, mucho, mucho más rápido que si tuvieras que asignar manualmente todos estos mosaicos laterales y de esquina. El solo hecho de dejar que la computadora lo averiguara por ti basándote en las reglas del terreno que definas, como acabamos de hacer, es un gran ahorro de tiempo. Entonces vamos a rellenar esto. También está la herramienta de cubo de pintura aquí abajo, así que simplemente podemos hacer clic en esta área donde todas las baldosas son iguales. Y oh, bueno, también tenemos que E para quitar el erasuod. Y ahora dejamos click y todo se llena. Como puedes ver, seleccionará cualquier región que estés viendo. Entonces eso podría ser todo esto. Si quieres llenarlo con un terreno de baldosas totalmente diferente, podrías hacerlo definiendo una tierra y cambiando a tierra aquí abajo y declarándola abajo así que una tierra y cambiando a tierra aquí abajo y declarándola abajo esto es un poco más avanzado de lo que realmente pretendía ir, pero definamos otro terreno con esta suciedad por aquí, el tipo de suciedad anaranjada para que la suciedad pueda pasar a pasto. Entonces vamos en la parte superior derecha, declaremos un nuevo tipo de terreno, y voy a llamar a esto tierra. Ese marrón está bien, creo. Es posible que en realidad no quieras usar, como, un marrón sobre azulejos marrones para que sea más fácil ver dónde has definido y dónde no. Pero si te funciona, está bien. Cualquiera que sea el color que quieras asignar está perfectamente bien. Bien, entonces vamos a estar trabajando con suciedad de pintura en la ventana del juego de baldosas, y vamos a hacer exactamente lo mismo con estas baldosas de tierra. Entonces aquí, estamos pintando el ocho superior izquierdo, no el inferior derecho, y luego el seis superior, así. Y voy a seguir dando vueltas así. Este es un poco confuso, pero voy a ir con los cuatro de arriba a la derecha, y ya veremos si funciona correctamente. Si cuando realmente dibujas con tu terreno, no se ve, posible que te hayas perdido una de las partes aquí o allá por, sabes, ya sea encendido o apagado o central o laterales. Así que a veces se necesita un poco de prueba y error para hacerlo bien. Pero definitivamente vale la pena a la larga. Así que sigue dando vueltas, ya sabes, de la misma forma. Consigue las esquinas y los lados donde está la suciedad y márcalo como suciedad, y luego solo continúa hasta que termines todo el camino alrededor en el círculo. Bien, y luego termina con los tres azulejos inferiores aquí abajo. Obtendremos la suciedad ligera y solo saltaremos la suciedad oscura por ahora. Bien, y eso se ve bien. Bien, ¿sabes qué? Mencioné que iba a manejar la transición de la tierra a la hierba. Pero en realidad, con este juego de baldosas, no creo que eso sea necesario porque estas baldosas individualmente, tienen una especie de transparencia en lugar de hierba aquí junto a la tierra. Así que no hay que definir el terreno de pasto individual como parte de la tierra así, donde tomarías estas otras baldosas y dirías: Oh, eso es pasto de ahí, y luego tierra en la parte inferior izquierda. Porque aquí es transparencia, así que eso en realidad no es necesario. Pero en otros juegos de azulejos, es posible que tengas que hacer eso. Donde si sabes que como una esquina se supone que es pasto, entonces lo marcas como pasto ahí. Así que tener dos tipos de terreno para una esquina o lado. Pero aquí, creo que sólo necesitamos uno. Déjame darle una oportunidad a esto y ver cómo va a quedar eso. Entonces iré a Tilemap Haremos tierra, e intentaremos atraparla. Estoy pensando en lo que realmente necesitamos. Bien, entonces sí, aquí podemos ver que está marcando los lados como transparentes. Me equivoco. Entonces intentaré marcar estos lados como pasto, pero no creo que eso realmente nos vaya a dar el resultado esperado. Creo que lo que tenemos que hacer es solo tener dos capas separadas para este conjunto de mosaicos en particular. Bien. Entonces voy a intentar dibujar con eso. Así que el modo de mapa de mosaico y luego dibuja con tierra y vamos a probar eso. Todavía está un poco desordenado. Voy a probar con una caja. Sí, todavía no funciona. Entonces Control Z deshace algunas veces. Y lo que en realidad vamos a querer hacer es simplemente pintar con tierra sobre la hierba, o hierba sobre la tierra depende de qué capa quieras estar encima. Entonces voy a hacer clic derecho sobre la raíz, agregar un nodo hijo. Digamos capa de mapa de teselas. Voy a renombrarlo para que sea digamos suciedad. Voy a mover esto bajo tierra para que por defecto, se muestre por encima del suelo. Entonces, lo que sea que esté en la parte inferior, en realidad está en la parte superior. No estoy seguro de por qué está configurado de esa manera. Yo sólo lo es. Y luego iremos a la tierra. Ah, y queremos reutilizar el mismo juego de baldosas, por cierto. Entonces en suelo, voy a hacer clic derecho sobre el juego de baldosas y guardarlo. Esto está en la parte superior, a la derecha, por cierto. Así que guárdala. Localmente en el proyecto. Así puedo crear una nueva carpeta de conjuntos de mosaicos, y luego solo diré tierra tileset punto TRs guardar Bien, ahora, si hacemos clic en la suciedad y luego vamos al inspector, podemos hacer clic en el desplegable, Quickload, juego de baldosas de tierra Bien, ahora con esta capa tilemap, podemos usar los mismos conjuntos de teselas que ya hemos definido previamente Así es como funcionan los recursos en general. Es muy fácil compartirlos a través múltiples nodos o múltiples escenas, etcétera, compartiendo así los recursos Bien, entonces vamos a dibujar con tierra aquí, y luego voy a dibujar con tierra por aquí, y solo vas a ver que la suciedad simplemente se sienta en la parte superior perfectamente porque estamos pintando en diferentes capas, así que esto solo se nota encima del fondo y porque aquí hay transparencia en estos bordes laterales, la hierba básicamente llena los huecos. El otro método que estaba mostrando donde toda la información de textura como la hierba y la suciedad está todo en un sprite de azulejo sería más donde configuran los múltiples terrenos en una baldosa, lo cual es más complicado, lo cual es más complicado, Así que voy a cambiar el nombre del suelo a pasto. Porque ahí vamos a ser más específicos. Así que tenemos dos capas de mapa de teselas, y es mucho más fácil manipularlas de lo que hubiera sido el mapa de teselas. Bien, veamos dónde estamos. Probablemente queremos más, como, dibujar un camino de tierra. Bien, entonces para que la suciedad se asigne correctamente, queremos dibujar una línea de dos por dos. Entonces quieres estar usando la herramienta rectángulo o el teclado. Si haces solo una línea de un azulejo, va a terminar algo así. Basado en el sitio de teselas, no está seguro cómo caer en la información aquí. No hay azulejo donde tenga transparencia en la parte superior y transparencia en la parte inferior, así que eso no va a funcionar. En realidad necesitas hacer un camino de dos píxeles como este y luego simplemente arrastrar tu caja, y eso funcionará para eso. Así que podríamos simplemente hacer algunos caminos en el nivel, algo así, ya sabes, simplemente dibujando dos caminos anchos de azulejos donde quiera que vayan. Y eso va a hacer que sea un poco más interesante que solo tener baldosas de pasto liso. Aunque depende completamente de ti cómo quieres, como, ya sabes, organizar esto y hacerlo más interesante. Entonces, como, si alguna vez has jugado, digamos, Sim City, eso es exactamente lo que estoy haciendo aquí mismo en este momento, como, crear el sistema de carreteras y básicamente ponerlo donde quiera. No va a llenar ninguna zona residencial en ningún lugar ni nada por el estilo. Pero solo tener algunas fichas más en el mapa es un poco más interesante que literalmente solo pasto. Bien. Entonces ya veremos si eso es bueno. Voy a golpear Play. Y si, nuestro personaje tiene algo por lo que caminar ahora, así que eso es un poco más interesante. 11. Colocar árboles como accesorios en el mapa: Y ahora creo que sería una buena idea agregar algunos accesorios al nivel de juego Así que también tenemos algunos accesorios aquí arriba en la carpeta de medio ambiente Entonces hay algunas animadas y estáticas. Podríamos comenzar con los árboles como el utilería más simple que podemos poner en el nivel del juego. Así que vamos a agarrar uh, no lo sé. Haremos doble clic aquí y podrás ver los modelos de árboles allá arriba. Así que podríamos querer agarrar estos grandes árboles, y podríamos hacerlo con una muestra de Sprite dos nodos D. Y podemos ponerlos en súper simples. Todo lo que necesitamos hacer realmente es ir al archivo PNG y arrastrarlo a la escena del juego. Va a crear automáticamente un Sprite dos D aquí arriba Así que simplemente cámbiele el nombre a Árbol entonces vamos a tomar esta textura, y no vamos a dibujar toda la textura. Vamos a dibujar una región de la misma. Entonces lo que queremos hacer es usar una textura de atlas para que podamos seleccionar la región que estamos dibujando. Entonces haz clic derecho aquí, y voy a copiar esta imagen muy rápido porque vamos a dar click en el menú desplegable, ir a la textura Atlas, que va a desestablecer esa textura temporalmente Expande esto y luego haz clic derecho y pega la textura que acabamos de copiar en el atlas. Y ahí lo tenemos volver a aparecer. Ahora queremos hacer clic en Editar región. Y luego dentro de aquí, iremos al modo Snap, Cid snap, rueda central del mouse para acercarnos, y simplemente agarraremos este árbol así, golpearemos cerrar, y tenemos un árbol en la escena. Bien, ahora, dependiendo de tu estilo de juego, puedes decidir agregar formas de colisión a tu árbol. Lo harías de la misma manera que lo harías con, como, un personaje jugador. Entonces, si miramos al personaje del jugador, puedes verlo aquí como una forma de colisión y puedes hacerlo para que los objetos colisionen con los árboles Sin embargo, para esta demo, en realidad queremos minimizar la cantidad de colisiones que nuestros enemigos van a estar haciendo con cualquier tipo de personaje del juego Si tenemos muchos objetos colisionables dentro del juego y no ponemos algo así como un agente de navegación o usamos cuerpo del personaje dos D para que puedan moverse y deslizarse a lo largo de la forma de colisión, entonces vas a conseguir que los enemigos se queden atascados Mucho más simple que eso sería simplemente saltarse la colisión y simplemente dejar que cualquier personaje camine por el árbol, tenerlo ahí. Estrictamente para visuales. Aquí tenemos el árbol. Voy a hacer click derecho en la escena, y solo crearemos un nuevo nodo para todos los árboles. Entonces voy a decir nodo dos D, crear, y vamos a sacar esto del árbol, así que debería ser el inframundo Y podría simplemente cambiarle el nombre para que sea utilería. Voy a mover el árbol dentro de aquí. Y entonces podemos simplemente duplicar este árbol tantas veces como necesitemos. Entonces primero haré clic derecho y guardaré la rama como escena. Pondremos el árbol en una carpeta nueva, creo. Yo lo llamaré. Vamos con Objetos. Sí, y lo voy a poner dentro de aquí. Entonces árbol punto TSN Podemos presionar Guardar N si queremos editar el árbol, cambiarlo a otro tipo de árbol, entonces simplemente podemos saltar a la escena. Entonces para hacer eso, solo encuentras este pequeño ícono aquí y abres un editor, para que puedas editar este árbol y cambiarlo a lo que necesites si quieres cambiar todas las copias del mismo en el mundo. Déjenme mostrar un ejemplo de ello. Entonces tenemos el árbol. Voy a duplicarlo un montón de veces, y después golpearé W para mover las copias por la escena. Así que selecciona el árbol dos, W, muévelo por la escena. El modo Mover está justo aquí. El modo de selección está aquí. Por lo que es necesario seleccionarlo y luego ir al modo de movimiento. Y ahora quiero cambiar el árbol, todas las copias del árbol a través del juego. Así que solo voy a la escena del árbol, y luego por aquí a la derecha, expandiremos el atlas editaremos la región, y luego seleccionemos esta roja en su lugar. Entonces árbol rojo, golpeó cerca, golpeó salvar, y ahora de vuelta al mundo, todos los árboles son ese tipo de árbol rojo de hojas otoñales. Ahora voy a volver al árbol, y voy a deshacer eso. Entonces, vamos a darle a Control Z un par de veces. Simplemente iremos con el árbol verde estándar. Y si quieres dos tipos de árboles, entonces solo encuentra la escena arbórea en tu jerarquía aquí. Así que solo puedes hacer clic derecho aquí y duplicarlo. Vamos a llamarlo árbol otoño y golpear Bien. Abre el otoño del árbol para que sea un doble clic. Vamos a acercar el árbol, y tomaré la textura y editaré la región, y podemos simplemente agarrar estos árboles rojos de aquí. Y ahora si vamos al mundo, podemos meter los árboles otoñales, o podemos poner el árbol simplemente arrastrando escena directamente a la escena de los padres, el mundo Si te acostumbras a eso, puedes poblar la escena bastante rápido Ahora, una cosa que sí quiero cambiar aquí, y tal vez voy a necesitar demostrar para hacer eso obvio es que cuando se trata de ordenar Y, la posición y la escena del árbol del sprite va a importar porque vamos a ordenar Y desde la posición central Entonces dondequiera que el personaje toque el suelo es generalmente donde vamos a querer posicionar el sprite Así que aquí arriba en este juego de estilo porque lo hice con el jugador, ¿verdad? Así que queremos asegurarnos de que los personajes estén ordenando desde donde están parados. Eso también se aplica a los objetos. Para demostrar por qué eso es un problema, volvamos a los apoyos de la escena principal Voy a ir a ordenar aquí a la derecha. D Y Ordenar habilitado en el mundo, hacer lo mismo. Vaya a ordenar y elija WySort habilitado. Bien. Y ahora si jugamos y movemos a nuestro personaje frente a un árbol, bueno, las cámaras en realidad no nos dejan hacer eso. Así que agreguemos una cámara de seguimiento para que podamos movernos un poco más por el mapa. Voy a tomar el reproductor, clic derecho , agregar un nodo hijo, transformar a distancia dos D, y luego a la derecha, queremos asignarlo a la cámara. Queremos actualizar la posición y no la rotación y no la escala, así que desmarque esas Bien, ahora si le pegamos a play, así que detente y juegue. La cámara va a seguir a nuestro jugador, y esa es una cámara básica de seguimiento en Gudo Bien, entonces llegamos a este objeto. Si estamos aquí arriba, se puede ver que estamos clasificando detrás del árbol, lo que esperaríamos. Pero si voy al punto medio, ahora los personajes parados básicamente en el árbol Visualmente hablando, todavía queremos que ese personaje esté detrás del árbol hasta que el personaje llegue a por aquí. De lo contrario, simplemente se ve raro. Entonces, para arreglar ese salto a la escena del árbol, puedes hacer clic aquí para abrir un editor. Y sí queremos que este sprite esté aquí arriba. Pero creo que si solo mueves el sprite así, porque es el nodo raíz, no va a arreglar nada Así que vamos a volver al mundo, y sí, vamos a golpear play. Ya verás a lo que me refiero. Vamos a ir por aquí, y va a cambiar la posición donde instancia estos árboles, no la posición de donde se ordena, verdad? ¿Ves el problema aún ahí? Así que tenemos que volver a la escena del árbol, y voy a hacer click derecho. Voy a agregar un nodo hijo, un nodo a voy a hacer click derecho sobre esto y convertirlo en la raíz de escena. Entonces este es el verdadero árbol en la raíz, y entonces este es solo el sprite dos D ahora Entonces, cuando instancias un objeto dentro de otra escena, la raíz básicamente en su posición central. Entonces este es el centro del nodo raíz padre dos D, y ahora podemos compensar el sprite Entonces, si tomo este sprite, bueno, en realidad ya está compensado, pero puedes simplemente W y moverlo a donde necesites que esté Solo recuerda que tu posición de transformación es un desplazamiento desde la raíz, y la raíz es donde en realidad va a ser instanciada en el punto 00 aquí mismo Entonces es por eso que esto es necesario para tener una base no dos D y luego te sprite anidado debajo Entonces también queremos hacer lo mismo con el otoño de árboles. Pero podrías notar que debido a que estos objetos son muy similares, en realidad están repitiendo un montón de pasos. Entonces lo que realmente podemos hacer es tener una escena heredada basada en el árbol verde veraniego donde solo reemplazamos la imagen srt, pero todo lo demás es igual para ese árbol Entonces voy a borrar la escena otoñal aquí abajo. Árbol otoñal. Borremos eso. Oh, tengo que borrarlo y cerrar la escena. Así que borra eso y luego aquí arriba, asegúrate de cerrar esto también. Así que no ahorres. Y entonces en el mundo, puede que todavía tenga una copia de la escena porque no la borra por completo. Es solo que ahora no hay una escena de padres a la que vaya esto. Yo también cortaré eso y lo guardaré. Así que hemos movido todas las instancias. Bien. Y ahora en la parte inferior izquierda, queremos hacer click derecho sobre Árbol, hacer nueva escena heredada. Entonces ahora tenemos escena no guardada basada en la escena de los padres. Podemos guardar esto como árbol otoño, y queremos ponerlo en la carpeta de objetos. Así que guarda eso. Y lo único que estamos cambiando aquí es el sprite. Así que golpea Editar región y agarra el sprite para el árbol de verano, golpea de cerca Y si volvemos a la escena principal, ya verás que podremos volver a instancia del árbol otoño. Parece que en realidad me metí la pata. Entonces necesitamos hacer que la textura del atlas sea única. De lo contrario, terminas con esto donde está reemplazando los árboles. Entonces ahora en la escena otoñal del árbol, queremos tomar este brillante dos D, y el primer instinto que tuve fue en realidad solo editar la región y cambiarla a esto aquí abajo Pero eso en realidad es incorrecto. Y déjame explicarte por qué. Entonces, aquí mismo, este es un recurso de textura, y los recursos se comparten entre cualquier escena que lo haga referencia. Y tanto nuestro árbol nuestro árbol otoño están haciendo referencia al mismo recurso Entonces, si cambiamos sus propiedades como la región del atlas, al igual que la región de edición aquí en la escena otoñal, en realidad va a actualizar esas mismas propiedades en la escena del árbol original también, porque están compartiendo el mismo recurso. Entonces no es una nueva copia del recurso de textura. Es literalmente el mismo recurso. Así que queremos hacer click derecho aquí y luego hacerlo único en la escena otoñal. Y ahora podemos cambiar esto a esta textura aquí abajo. Así que selecciona el árbol de verano y golpea cerca. Golpea Guardar. Si vamos al árbol verde, deberías ver que todavía tiene el sprite de árbol verde. Podemos ir al mundo. Parece que un par de estos árboles no fueron referenciados, así que tal vez queramos eliminarlos muy rápido Así que en realidad voy a tomar accesorios y hacer que sea 00. Y luego quiero tomar el nodo de props y quiero bloquearlo. Entonces, si haces clic aquí arriba, puedes bloquearlo, y sí, eso debería evitar que se mueva. Entonces, si le pego a W y trato de mover el nodo de props ahora, no se va a mover Entonces, una cosa importante a tener en cuenta es que tienes un nodo padre dos D aquí, props, toda la posición de sus hijos en realidad se basa en relación con la posición del padre Entonces, si tienes un nodo de agrupación como props, pero aún necesitas que sea un nodo dos, probablemente una buena idea para bloquearlo Entonces aplicaría lo mismo si tienes un nodo de agrupación de enemigos o proyectiles, que probablemente tendremos más adelante Ahora solo podemos agregar nuestros árboles a los accesorios, así que solo voy a hacer estallar algunos ahí dentro Bien, así que si cojo este árbol que acabamos de crear y golpeo W e intento moverlo hacia arriba más allá del punto de encenificación, entonces notarás cuando llegue aquí, simplemente va a desaparecer detrás de la hierba y la tierra Entonces eso es por por qué clasificar. Entonces lo que vamos a necesitar hacer es en la parte superior izquierda para pasto y tierra, vamos a necesitar seleccionarlos. Creo que incluso puedes seleccionarlos a ambos al mismo tiempo. Y luego ir al lado derecho. Buscamos ordenar y tomar su índice Z y ponerlo algo así como digamos diez negativo, cualquier valor que sea negativo. Entonces esto hará que estos estén siempre detrás de cualquier cosa que tenga un índice Z de cero. Entonces si seleccionamos el árbol ahora y vamos a W y lo movemos, ahora está arreglado. Siempre se va a mostrar encima de estos otros objetos. Entonces esto es justo sobre cómo estamos superponiendo nuestra escena. Algunos objetos, se quiere ordenar con otros objetos en el mismo índice Z, como el carácter en el árbol. Pero entonces otros objetos como el mapa de teselas simplemente deberían estar siempre en el fondo para estos mosaicos de tierra porque los personajes están parados en el suelo, por lo que deberías ver los personajes antes de ver el suelo. Bien. Y ahora solo queremos llenar la escena con algunos árboles más. Simplemente puedes seleccionarlos y duplicarlos y moverlos hacia arriba. Asegúrate de ponerlos en el nodo props como padre solo por razones de clasificación Y luego solo seleccionaremos estos y los duplicaremos. Puedes duplicar más de uno a la vez. Entonces, si solo quieres un cierto patrón, entonces podemos hacer un grupo de árboles y luego simplemente copiar todos estos alrededor. Incluso puedes moverlos a su propio subgrupo, como tener como un padre de bloque de árbol, y luego en eso tendremos un montón de árboles diferentes y puedes ocultarlo para que no tengas tantos nodos de árbol poblando apoyos Si eso te ayuda. Bien, así que vamos a mover algunos árboles un poco más, y podría simplemente seleccionar todos estos diez árboles. Y voy a sí, probemos lo del bloqueo que mencioné. Simplemente haré clic derecho y agregaré un nodo hijo. Digamos nodo dos D, bloque de árbol. Voy a agarrar todos los árboles, moverlo debajo del bloque de árboles. Así que solo selecciónalos todos. Y ahora podría guardar esta escena de bloque de árbol en el proyecto, y vamos a querer guardar ese bloque de árbol Objetos. Ahora podemos simplemente duplicar el bloque de árbol, controlar D W, moverlo así y como que simplemente rellenar la escena como necesitamos con árboles donde queramos que estén. En algún momento, probablemente quieras personalizar esto un poco más, pero supongo que esta es una forma rápida crear prototipos de la escena, y ojalá no se vea tan mal cuando golpeamos Play y acercamos el zoom Pero sí, si estuviera haciendo esto árbol por árbol, esto tomaría, ya sabes, probablemente, como, 20 minutos o algo así. Entonces si necesitamos hacer algunas personalizaciones, como aquí mismo, si acercamos el zoom, veo que este árbol ya sabes, poco cerca de la carretera, a mejor quiero editar eso para poder darle a Q y luego click izquierdo sobre esto Podemos ver que es parte del Bloque de árbol tres. Podemos hacer click derecho en la jerarquía y hacer hijos editables Y luego para éste, específicamente, ahora podemos seleccionar los árboles y moverlos. Entonces así, tenemos un poco más de un bloque de árbol personalizado. Bien, y podemos esconder eso. Entonces ahora solo estamos mirando 15 bloques de árboles en lugar de 150 árboles. Podemos jugar, entrar en modo de juego y simplemente caminar por nuestro mundo de juego. Y a partir de esto Acercado, es bastante difícil de decir eso, es solo copiar y pegar la misma configuración de árbol como diez veces, pero es mucho menos aburrido que solo tener pasto, Como, tenemos el camino, tenemos pasto. Si conseguimos algunas flores u otras cosas aquí, en realidad podría parecer casi un nivel de juego legítimo Ah, y aquí hay un árbol que podemos arreglar. Entonces, ya sabes, un poco de pruebas de juego. Puedes encontrar cosas así. Acerquemos y arreglemos eso muy rápido. Entonces esto es parte del Bloque de árbol dos. Si miras en la pantalla, en realidad puedes ver el nombre del nodo sobre el que estamos flotando Entonces este es el nodo padre, el que la escena es Enstus el bloque de árbol, no sus nodos hijos que están contenidos dentro de esa Para que esto sea editable, haga clic derecho sobre Bloque de árbol dos, hijos editables Pulsa Q para ir al Modo Selección, seleccionar este árbol, moverlo, y podemos agarrar este también, sacarlo del camino, y solo hacer esas pequeñas ediciones Y si, de estar alejados, parece que ya ninguno de los árboles está en la carretera. Entonces ese es probablemente el mínimo de lo que necesitamos pasar. 12. Agregar stumps y arreglar la clasificación Y: Así que estaba buscando a través del paquete de rastreadores de píxeles algunas flores que se pudieran poner alrededor la escena para picarlo un poco Realmente no lo vi en la versión gratuita, desafortunadamente. Pero supongo que tenemos estos tocones por aquí. Podemos tratar de usar eso como utilería y simplemente llenar un poco los huecos y hacerlo un poco menos aburrido. Entonces tomaremos esto y crearemos una nueva escena de muñón a partir de ella. Así que básicamente voy a repetir los mismos pasos con el árbol. Arrastraré esto a la escena. Vamos a la textura. Derecha, haz clic en Copiar. Así que copia esa textura. Y luego en el menú desplegable, haz clic en una nueva textura de atlas, y luego vamos a pegar en el atlas aquí. Así. Bien, entonces deberías ver la imagen completa. Ahora queremos editar región y seleccionar el tocón que queremos usar en nuestra escena Entonces Uh, creo que este tiene un tocón un poco menos rojizo, que mira más cerca de nuestro árbol real Entonces hagámoslo. Golpea guardar. Ahora voy a hacer click derecho esto y guardarlo en una nueva escena. Entonces diremos tocón punto TACN. Ahora bien, si recuerdas, queremos compensar este tocón, también Puede que tengamos que hacerlo de todos modos. Creo que en este caso, sí tiene que estar unos pixeles hacia abajo. Entonces eso significa que necesitamos otro nodo dos D en la raíz. Entonces haga clic derecho en Agregar un nodo hijo, el nodo dos D, y luego haga clic derecho y haga de esto la raíz. Bien, entonces ahora esto es solo un Sprite dos D. Bien, entonces la textura del tocón es un Sprite dos D, y luego la raíz Entonces ahora guardaremos la escena del muñón. Toma el sprite, golpea W, muévelo hacia arriba probablemente a la derecha por ahí para propósitos de clasificación Y. Regresa al mundo. Ahora tenemos el tocón Vamos a crear algunos tocones más y crear algunos tocones más alrededor de la escena Si por casualidad seleccionas accidentalmente el pasto o la suciedad, lo que puedes hacer es subir aquí arriba a la izquierda y bloquear así los nodos. Y ahora no deberías poder seleccionarlos, creo. Entonces si golpeamos Q y seleccionamos el tocón o alrededor del tocón, Bien Por lo que ahora estos nodos no deberían poder ser seleccionables haciendo clic en el mapa. Bajemos a los tocones aquí abajo. No están usando esta escena base correcta. En realidad solo voy a seleccionar estos y eliminarlos. Y vamos a deshacernos del nodo dos D, también. Bien, busca tocón en el proyecto. Mueve eso en apoyos como ese. Bien, ahora nos alejamos. Encontramos este sumidero, golpeamos W para moverlo, colóquelo donde lo desee. Te controló para duplicarlo. Bien, ahora tiene el nombre tocón para cuando está criado como apoyos, así que eso es más como lo que estamos buscando Y solo pon algunos tocones alrededor de la escena, ya sabes, solo cosas que puedes encontrar que son más interesantes de ver que solo pasto Por supuesto, la manada tiene otras cosas como edificios para, como, un juego de manualidades No pensé que esos fueran los más apropiados. Y si realmente vas a poner edificios, creo que empezarías a argumentar que realmente necesitas las formas de colisión y posiblemente los agentes de navegación para hacerlo más creíble Pero lo estamos manteniendo lo más simplista posible, porque solo estamos haciendo, como, ya sabes, un juego muy simple como sobreviviente Creo que ya hay suficiente en el curso que, ya sabes, no quiero abrumar a nadie, pero si al final, realmente quieres entender a los agentes de navegación y tocones, avísame Tengo algunos videos en YouTube para ese tipo de cosas. Si buscas el agente de navegación del tutorial de Chris, deberías poder encontrarlos, si quieres empezar con eso. Pero sí, esto parece una escena decente puesta a punto. Bien, juega Vamos a correr por ahí. Nuestra escena. Tenemos los tocones. Ahora, sólo podemos caminar a través de él. Eso está bien. Ahora, aquí, esto está un poco menos bien. Podemos ver que la clasificación en este árbol no es correcta. De hecho, el árbol no está clasificando en absoluto. Creo que sí supongo que aquí tenemos que entrar en la escena del árbol otoñal e intentar arreglarlo. Bien, así que vamos a la vista de escena Local por aquí arriba a la izquierda. Estamos viendo la escena otoñal del árbol. Haga clic en la raíz. Y tal vez lo que necesitamos aquí es comprobar por qué la clasificación habilitada para esta escena, y es posible que tengas que hacer eso en la escena de los padres, también. Entonces ordenando Y sort habilitado. Tenga en cuenta que mis juegos siguen funcionando, así que puedo pestañear y ver de inmediato si funcionó o no. Y actualmente, no lo es. Entonces déjame ver ese árbol en el mundo. ¿En realidad es parte del padre? Oh, ¿sabes lo que debe ser? Son los bloques del Árbol. Bien, entonces tenemos que entrar en los bloques de árbol, dar clic en el bloque Árbol ordenando ySort Enabled Oh, sí, cuando creas un nuevo nivel de la jerarquía, si aún quieres que la clasificación Y esté ahí, tienes que asignar ySordenabled en el nivel padre Entonces props tiene YSort habilitado, pero Tree Block no lo hizo. Ahora Tree Block sí. Entonces, si vuelvo a ficha al juego, es por eso clasificando. Bien, entonces queremos poder caminar sobre los tocones y ver que podemos ordenar delante del muñón y detrás del tocón Y en su mayor parte, eso funciona. Ahora, también me di cuenta de que hay un pequeño problema con los árboles. Ellos hacen la clasificación, o al menos estaba haciendo la clasificación, aguanta. Déjame verificar con el árbol de aquí. Sí, éste está clasificando. Pero la posición en la que está clasificando está bastante apagada. Entonces, lo que realmente quiero hacer es entrar en la escena del árbol base para que se aplique a ambos árboles, y asegúrate de estar en vista local aquí si tienes el juego corriendo en la parte superior izquierda. Seleccione el nodo Sprite dos D porque estamos controlando el desplazamiento del Sprite Golpea W y luego mueve esto hacia abajo probablemente en algún lugar como ahí. Voy a volver al juego ahora mismo. Y entonces intentas caminar así, deberías ver que la clasificación Y es mucho mejor. Entonces aquí estamos parados frente al árbol como cabría esperar. Y entonces aquí estamos parados detrás del árbol. Entonces eso es mucho mejor. Tienes que hacer bien esas compensaciones o las cosas simplemente no se verán bien. Y eso se ve como la mayor parte de lo que necesitamos aquí para los apoyos de nivel Yo podría crear un grupo de tocones, también, así podría simplemente tomar estos 16 tocones, y vamos a darle un padre Entonces hagamos clic derecho y reparemos a un nuevo nodo. Y luego haremos un nodo dos D. Así que ahora todos estos tocones se han agrupado bajo un nodo dos D. Vamos a llamar a eso el tocón Haremos clic derecho aquí, guardaremos el bloque de tocones como su propia escena en la carpeta de objetos Y ahora podemos simplemente duplicar nuestro tocón, golpear W, moverlo por nuestra pantalla, y simplemente como, ya sabes, poner tocones en otros lugares Entonces no es exactamente como la generación de procedimientos aquí, sino una idea similar donde solo estamos tratando de llenar el mapeo con el patrón. De los parámetros, que básicamente son simplemente duplicar las posiciones de los tocones y luego compensarlos Entonces se ve un poco diferente. Y podemos correr alrededor de un juego una vez más. Tenemos la clasificación Weiss funcionando bastante bien aquí. A lo mejor para el tocón, queremos cambiarlo un par de pixeles para poder entrar en la escena del muñón Y luego vamos a la vista Local y movemos el sprite dos D offset hacia abajo un par de pixeles Entonces veamos cómo es eso ahora mismo. Uh, a lo mejor tengo la dirección mezclada. En realidad, tal vez necesitamos hacerlo más así y luego darle a guardar. Entonces estamos moviendo esto hacia arriba. Bien, eso está detrás del muñón Esto es frente al tocón. Bien. Sí, eso se ve un poco correcto. Entonces solo el fondo mismo del tocón debe estar por debajo del punto 00 del padre Y vamos a andar por ahí. Sí, sólo veremos tocones y árboles. En realidad no es necesario que aquí sea muy variado porque el foco está solo en el combate y va a ser subir de nivel y recoger notas y ese tipo de cosas Pero tener algo en el fondo sí lo hace más interesante. Así que solo quería pasar por todo eso. Se puede, por supuesto, mover manualmente algunos de estos tocones fuera del camino si terminaron en la carretera de la misma manera que antes Así que vayamos al mundo encontremos ese muñón que estaba en la carretera, ¿de acuerdo? Le pegaré a Q, la seleccionaremos. Entonces vemos a Stump bloque tres por aquí a la izquierda. Haga clic derecho y haga hijos editables. Después da click en el tocón , sácalo del camino y haz lo mismo con cualquier otro tocón que encuentres Y aquí hay uno. Bien, entonces voy a seleccionar este nodo, Stump bloque dos. Vamos a niños editables Después haga clic en el tocón individual, W para moverlo, sacarlo del camino, y eso está hecho Bien, también podemos hacer eso con este árbol de aquí arriba. Entonces eso es parte del bloque cinco de Tree. Hagámoslo editable. Selecciona el árbol, muévelo. Oh, aquí hay otro. Interesante. Debo haber duplicado realmente un bloque de árbol en el mismo lugar. Sí, bien. Vamos a movernos por aquí. Todo bien. Bien, en realidad no veo ningún otro árbol en la carretera. Hay un muñón por aquí, así que voy a tratar de arreglarlo, también. W para moverlo, sacarlo del camino. Haz que el padre sea editable si es necesario. Y eso probablemente va a estar casi bien. Una última. Niños tan editables. Así que selecciónala. Hacer que el padre sea editable, seleccionar el nodo individual , sacarlo del camino. Y eso es básicamente todo. Así que colapsa todo, para que no esté abarrotando tu jerarquía Esa es una de las razones por las que hice el nodo prop para empezar. Um, si tuvieras, como, texturas de flores u otros doodads, tal vez rocas, probablemente las pondrías en una capa separada de rocas o doodads aquí arriba y solo la colocarías en un índice Z que es más alto que Esa sería una buena manera de empezar con eso. Alternativamente, pueden ser sus objetos individuales vistos. Sin embargo, no estoy seguro de la actuación. Yo asumiría que si es parte del mapa de teselas, probablemente sea mucho mejor que si son, ya sabes, sus propios nodos en la escena del juego. Pero mientras no tengas demasiados locamente, probablemente no sea un Um, probablemente no sea un Um, así que esa va a ser básicamente nuestra porción de mapeo de teselas del curso Y a partir de aquí, podemos pasar a montar armas y enemigos, ganar exp, subir de nivel, HP, todos esos pícaros RPGSh como tipo 13. Proyectiles de efecto spawn con temporizador: El personaje puede moverse. algo así como un mundo de juegos en el que jugar. A continuación, lo que tenemos que hacer es crear un ataque que esté en un temporizador que creará un proyectil donde podamos usarlo para atacar a los enemigos sin necesidad ninguna otra entrada clave del jugador En los juegos de supervivientes, normalmente terminas acumulando un montón de armas diferentes, y simplemente se activan automáticamente para ti Lo único de lo que debes preocuparte es caminar la pantalla y dejar que las armas hagan el trabajo mientras evitas a los enemigos. Y ese es básicamente el bucle de jugabilidad. Así que empieza con eso. Vamos a crear nuestro guión de armas y jugador. Entonces en esta escena de dos D, voy a hacer click derecho sobre la raíz. Vamos a agregar un nuevo nodo hijo D, el nodo dos D aquí. Vamos a cambiar el nombre de esto para que sea arma, y hagamos clic derecho en él y adjuntemos un guión para que sea arma doTGD Y esto puede entrar en la carpeta del reproductor por ahora mismo. Entonces vamos a tener este guión de armas. Podríamos incluso hacerla arma dos D, honestamente. Entonces, si queremos entrar en el sistema de archivos, podemos renombrarlo para que sea arma dos D, si eso tiene más sentido. Bien, entonces lo que va a necesitar este guión de arma dos D para crear los objetos de juego de proyectiles que realidad son la representación dos D del arma en el mundo del juego que puede dañar un enemigo es que vamos a necesitar un temporizador Entonces voy a decir var timer de tipo timer. Ahora, puedes agregarlos directamente en el inspector de escenas de aquí a la derecha, como agregarías otros nodos. Pero no quiero tener que hacer eso por cada guión de arma que creo. Entonces para que eso sea un poco más rápido y más fácil, voy a decir función subrayado listo Entonces, cuando nuestro script esté listo, simplemente tomaremos la variable timer y la configuraremos en un nuevo temporizador. Bueno, agrega el temporizador cuando era niño, así que agrega temporizador infantil. Eso quiere decir que este nuevo temporizador va a existir bajo el arma. Si retiramos el arma, también retiramos el temporizador. Y luego queremos conectarnos a la señal del temporizador. Entonces el temporizador tiene una señal de tiempo de espera, y queremos conectarla a una función, una función llamable, para que podamos decir en tiempo de espera. Y aquí abajo, podemos ir a funcionar en el tiempo de espera del temporizador. Ahora bien, este tiempo de espera de señal en realidad no envía ningún dato, así que no necesitamos ningún paréntesis Y entonces esta función va a tener un tipo de retorno de vacío. Entonces, cuando el temporizador se agota, queremos básicamente lanzar nuestro hechizo. Queremos convocar a los proyectiles. Entonces creo que el elenco está bien nombre para esa función. Entonces solo diremos elenco, y queremos pasar la dirección en la que nuestro proyectil va a ser lanzado Entonces, si estamos de cara hacia arriba, vamos a lanzar hacia arriba. Así podemos obtener una referencia a la dirección de orientación para eso, pero volveremos a eso en un segundo. Entonces tendremos funcion cast, y esto va a tomar una dirección P del vector dos, la dirección en la que estamos lanzando, y podemos regresar void para eso. Entonces, para que la señal de tiempo de espera sea alcanzada, tenemos que iniciar primero el temporizador Entonces diremos temporizador punto inicio. Entonces, el tiempo que queremos configurar por cuánto tiempo hasta que creemos una instancia de proyectil va a depender la definición de cada arma de proyectil Y luego tendremos diferentes niveles de las armas, así que en realidad podemos cambiar el enfriamiento ya que el arma sube de nivel para poder disparar más a menudo sería una forma en que podemos alimentar a nuestro personaje. Para el arma dos D, vamos a querer tener esa definición como un recurso que podamos usar para que nuestra arma sepa operar. Así que vamos a hacer en la exportación VR, y digamos definición de tipo definición de arma, y vamos a necesitar crear eso. Entonces en el sistema de archivos, vamos a expandirnos hacia afuera, y luego voy a crear una nueva carpeta para nuestras armas Así que voy a hacer clic derecho sobre los recursos y hacer Crear nuevas armas de carpeta. Y dentro de esta carpeta, sólo voy a crear un nuevo recurso. Así que haga clic derecho en Nuevo recurso. Y vamos a crearlo como un recurso base por ahora mismo. Diré definición de lanza. Como nuestro personaje es un ragón le daremos una lanza como arma por defecto Así que lo guardaré aquí, Script, necesitamos crear nuestra nueva definición de arma. Entonces vamos a hacer clic derecho sobre las armas, crear un nuevo guión. Digamos definición de arma para ahora mismo, y va a heredar del recurso y crear eso Entonces ahora entramos en definición de arma. Vamos a darle el nombre de clase, definición de arma. Y aquí es donde vamos a definir las estadísticas en los detalles de la interfaz como nombre de cómo se representa nuestra arma en un formato de datos, pero no en el mundo del juego Eso va a ser más de la clase de proyectiles, que se extiende desde el nodo hasta el D. Así que necesitamos bastantes aquí para juntar todo Yo diría que el sistema de armas es probablemente la parte más complicada, así que voy a tratar de atravesarlo a fondo. Entonces, antes que nada, es posible que queramos establecer un nombre. Así que en la exportación var nombre. Entonces los nodos por defecto tienen una propiedad name, pero los recursos no. Así que podemos aprovechar eso definiendo un nombre de cadena personalizado. Entonces ese va a ser el nombre para mostrar, cómo lo representamos en la interfaz de usuario. Y entonces podríamos decir en exportación var icono de tipo textura dos D. Posteriormente agregaremos en bloques de stat personalizados para cada nivel de arma, pero eso es demasiado para este video. Entonces por ahora, lo que sí necesitamos de aquí puede ser algo más como una función get cool down, y podemos pasar en un nivel aquí porque en realidad no sabemos qué nivel es el arma a partir de la definición de arma. Eso se va a establecer en el arma de tiempo de ejecución dos objetos D por aquí. Porque esto sube de nivel en el juego. Y entonces la definición es más una definición de editor. Establece cómo opera el arma en cada nivel. Entonces esas son cosas separadas. El nivel está en el arma a D. Así que queremos pasar el nivel en el que se encuentra actualmente. Entonces podríamos decir, nivel P, y eso va a ser un entero. Devolveremos un flotador el enfriamiento para el arma. Entonces por ahora mismo, voy a hacer esto simple y solo hazlo digamos si giras un punto. Posteriormente, podemos hacerlo más costum resolviendo realmente el enfriamiento basado en el nivel que pasamos Pero solo manteniéndolo simple aquí para que podamos probar que todo el arma dos D realmente funciona. Entonces en arma dos D, queremos iniciar el temporizador en, digamos, definición punto Get Cool Down. Y solo vamos a pasar digamos uno negativo aquí porque queremos cambiarlo. Entonces estoy poniendo un poco para hacer nota aquí para recordarme a mí mismo para obtener el nivel real, solo una nota para que, ya sabes, una vez que probemos esto funciona, podamos seguir adelante desde ahí e implementar completamente el sistema. Bien, también vamos a querer poder obtener la instancia de proyectil que estamos tratando de crear Así que vamos a hacer una función get scene. También podemos pasar en el nivel. Esto va a devolver una escena repleta. Sigamos adelante y creamos esa escena de arma, el proyectil, más específicamente Entonces en dos vista D, sigamos adelante y agreguemos una nueva escena. Aquí vamos a crear una escena de dos D. Voy a renombrar esto para que sea Spear. Hagamos click derecho sobre él, adjuntemos un guión, y esto va a ser proyectil punto GD Probablemente quiera guardar esto y oh, digamos la carpeta de armas. Creo que eso tiene sentido. Y luego abre Crear, eso es cancelar. Create está por aquí, y luego queremos darle el nombre de clase proyectil, y guardaremos el punto de lanza TSCN dentro de las armas para que podamos ver realmente Queremos adjuntarle un Sprite. Haga clic en Lanza, adjunte un nodo Sprite dos D, y luego vamos a agarrar el arma Lo cual va a ser parte de una textura atlas aquí arriba a la derecha. Así que haz una textura de atlas. Y luego vamos a cargar rápidamente de nuestro proyecto. Creo que fue de 16 por 16. Y luego necesitamos obtener nuestra textura. Así que ve al arte en la parte inferior izquierda. Ir a Pixel crawler, ir a armas, madera Y luego word dot PNG, lo dejamos caer en la ranura Atlas. Bien. Y ahora podemos editar región, acercar, y queremos la lanza, que está aquí mismo Así que vamos a arrastrar alrededor de eso y darle a Cerrar. Bien, ahora tenemos el sprite de lanza. Así que al menos podemos ver nuestro proyectil uppear en el juego una vez que básicamente está cargado Queremos cargar en esta escena. Volvamos al jugador, y voy a abrir el guión del arma. Entonces voy a hacer click derecho sobre Definición de arma y símbolo de Loup Y para conseguir la escena, simplemente vamos a hacer algo como retorno de carga. Y ahora queremos cargar esa escena de lanza en. Así escupir punto TSN. Se puede ver que sólo se puede encontrar en los recursos armas escupir punto TSEN y poner eso ahí Entonces, una vez más, esta es una medida temporal solo para que sea simple para que no tengamos que implementarla completamente. Entonces en nuestra arma dos D, cuando lancemos, vamos a conseguir que esa arma se vea desde la definición. Entonces queremos decir var, proyectil va a ser de tipo proyectil, y vamos a poner eso igual a definición Obtener SN y vamos decir negativo uno aquí para el nivel. ¿Sabes qué? En realidad, podríamos empezar a declarar nuestro nivel real del arma Entonces hagamos de eso un nivel uno. Diré a nivel var de exportación. Este será un tipo de tipo entero, y comienza en uno. Bien, así que ahora solo podemos pasar el nivel a estas funciones, enfriarnos y ser vistos. Todavía no hace nada con él , pero al menos lo tenemos ahí. Y, por supuesto, cuando subamos de nivel nuestra arma, sólo vamos a incrementar el nivel aquí en uno, y eso va a cambiar lo que nos devuelven estas funciones si tratamos de refrescarnos o conseguir la escena Bien, entonces conseguimos la escena, y luego queremos hacer una instancia en ella Entonces queremos agregarlo de niño a nuestro grupo de proyectiles y a la escena principal ¿De dónde sacamos el nodo para generar realmente los proyectiles? Vamos a la escena mundial dos D view, y voy a minimizar esto. Vamos a hacer click derecho sobre Mundo y la parte superior izquierda y añadir un nuevo nodo dos D. Sólo voy a renombrar este proyectiles Ahora vamos a la parte superior derecha, y aquí voy a usar grupos. Vamos a asignar un grupo al nodo proyectiles. Entonces agrega un nuevo grupo. Yo solo haré proyectiles, minúsculas, lo haré global, y diré el nodo donde todos los proyectiles Bien, ahora podemos ver en el nodo proyectiles que tiene este grupo, y podemos hacer referencia al nodo haciendo primero en Entonces volvamos al guión. Es el subrayado de los proyectiles. También podríamos declarar eso como una constante si queremos. Entonces yo diría constante grupo de proyectiles, haciendo constante todos los topes la convención estándar Deja claro que este es un valor constante que no va a cambiar y se diferencia de una variable regular como nivel o definición, que puede cambiar durante el juego Así que pongamos esto igual a proyectiles minúsculas, Entonces vamos a querer obtener este nodo y agregarlo a ese nodo. Así que vamos a guardarlo en caché. Como variable local, digamos var proyectiles padre, y esto va a ser un nodo Entonces, para que eso esté listo, hagámoslo antes del temporizador. Subrayar proyectiles padre es igual al nodo G. Pero primero tenemos que conseguir el árbol. Así que get tree dot get first node and group, y queremos que el grupo de proyectiles, que es un nombre de cadena En la mayoría de los casos, las cadenas y los nombres de cadenas se pueden usar indistintamente Convierte entre los tipos automáticamente en muchos casos en la parte posterior. Podemos declararlo como un nombre de cadena aquí porque eso es lo que espera para esto. Entonces obtenemos el primer nodo en el grupo. Si eso no existe, probablemente vamos a obtener un error en la consola, lo cual es algo bueno. Así que solo tenemos que asegurarnos de que nuestros niveles de juego tengan realmente un nodo de proyectiles como Si lo deseas, podrías guardar este nodo en tu proyecto y reutilizarlo, haz clic derecho en Guardar escena de sucursales y luego tal vez crearemos una carpeta de niveles. Para cualquier cosa relacionada con los niveles y poner los proyectiles punto TSC aquí Entonces si sigues reutilizándolo desde aquí, siempre estarán en este grupo de proyectiles, y básicamente no deberías tenerlo desincronado Así que ahora puedes reutilizar la escena de los proyectiles sin preocuparte de que los valores cambien entre los niveles en los que la usas, así que eso podría ser un poco útil Y ahora, una vez que hayamos creado el proyectil, queremos asegurarnos de que eso se agregue como hijo al padre proyectiles Así subrayan proyectiles padre Ad hild proyectil. Así. Ya podemos deshacernos de esto. Y entonces solo queremos asegurarnos de que la posición global sea igual a la posición global del arma dos D. Entonces digamos que la posición global del proyectil es igual a la posición global aquí Entonces estamos tomando la posición del arma dos nodo D. Y entonces tenemos que pasarlo dirección en cast. Así que vamos a hacer vector dos puntos, ¿verdad? Eso son mayúsculas. Un valor constante. Y ahora el script debería poder ejecutarse sin error. Bien, entonces tiene la escena. Sé qué tiempo de enfriamiento establecer. Y sabe crear una copia del proyectil encima del arma dos nodos D cada vez que transcurre el temporizador Así que vamos a correr esto y darle una oportunidad. Podemos ver obtener cooldown y null. Así que en realidad no hemos establecido la definición de arma. Entonces podríamos decir, afirmar que definición no equivale a nulo Entonces, cada arma requiere un conjunto de definición de arma. Entonces tenemos que ir al jugador. Tenemos que encontrar esta arma dos nodo D. Le renombraré arma dos D. Vamos al inspector arriba a la derecha, y luego definamos nuestra definición de arma aquí. Entonces nueva definición de arma, amplía esto. Posiblemente vamos a querer el icono y el nombre. Entonces llamaré a esta lanza. Y vamos a sacar el icono de la escena de la lanza. Así que solo podemos tomar el mismo sprite y copiarlo al icono Entonces voy a hacer clic derecho sobre la textura. Y copia. Ahora vayamos a la escena del jugador donde tenemos el conjunto de definición de arma y simplemente haga clic derecho sobre el icono y péguelo en. Bien, entonces ahí está nuestra representación UI de la lanza. Así que golpeamos Play, y conseguimos la lanza a instancia después de cada 1 segundo Ahora nuestro proyectil aún no se mueve. No tiene código para que se mueva, pero tenemos el tiempo trabajando para poner los proyectiles en el mundo en el momento adecuado basado en nuestra clase de definición de armas Por supuesto, hay mucho más que eso. Aún no nos hemos metido con estadísticas ni nada, pero este es un buen comienzo Así que voy a entrar más en esto en el próximo 14. Mover proyectiles en dirección de lanzamiento: Entonces, en este punto, estamos listos para comenzar a poner enemigos en el juego y luego hacer que nuestros proyectiles capaces de golpearlos moviéndose a lo largo de la pantalla Bien, así que hagámoslo para que nuestros proyectiles puedan moverse ahora en la dirección en la que se lanzan Voy a repasar a la escena de la lanza, y este es el proyectil de lanza, que en realidad instancias en el mundo del juego Vamos a abrir ese guión. Y vamos a querer poner una función de lanzamiento dentro de aquí para que cuando se instancie nuestro proyectil, otro guión pueda decirle en qué dirección se va a mover Entonces voy a poner en lanzamiento de funciones, y vamos a pasar en una dirección. Entonces P subrayan el vector de dirección dos, y esa va a ser la dirección en la que van a moverse los proyectiles Entonces queremos tomar esa dirección de lanzamiento y hacerla local para que podamos usarla en nuestras funciones de proceso, proceso va a actualizarse en cada segundo y traducir nuestro nodo de proyectil a través de la pantalla Entonces var direction va a ser vector dos, y vamos a configurar eso aquí mismo en el lanzamiento. Entonces dirección es igual a dirección P. Ahora, una vez que lancemos un proyectil, también queremos ponerlo en cola para liberarlo después de cierto periodo de tiempo De lo contrario, los proyectiles que nunca alcanzarían un objetivo existirían en tu mundo de juego para siempre y eventualmente causarían problemas de rendimiento Así que sí queremos asegurarnos de que los objetos se liberen eventualmente. Entonces podemos hacer eso esperando una cierta cantidad de tiempo. Diré que espere. Entonces esto básicamente significa que va a volver al resto del código que sigue esta línea después de que se cumpla la condición. Entonces vamos a decir consigue árbol. Entonces estamos obteniendo el árbol de escena actual en el que este nodo de proyectil existe dentro, y luego vamos a hacer crear temporizador Y le damos un tiempo. Entonces, digamos 1.0 segundos. Todo lo demás lo puedes dejar como predeterminado. Entonces todo esto significa que estamos esperando el método de tiempo de espera en el temporizador que creamos usando el árbol de escenas, y esperamos un segundo para que ocurra ese tiempo de espera Y luego una vez hecho eso, podemos apenas lo cuartito sobre el nodo proyectil Eso va a liberar el proyectil sobre cualquier cosa que esté debajo de él. Ahora bien, un proyectil que golpea objetivos, si golpea un objetivo, probablemente se va a quitar antes de esto, pero esto es solo una alternativa para que si simplemente echa de menos por completo a todos los enemigos, eventualmente se libere Bien, y entonces necesitamos que el proyectil se mueva realmente. Entonces digamos que el proceso de subrayado de función o el proceso de física, en realidad, es probablemente un poco más apropiado Hagámoslo. Por lo general, se utiliza el proceso de física para cualquier cosa que implique mover objetos de física a través del juego. Ahora bien, este es un nodo dos D. No estamos agregando nada como física corporal rígida al proyectil, sino solo para que su movimiento se sincronice con todo lo demás en el juego Si el proceso de física se establece 60 veces por segundo o 60 períodos de movimiento por segundo, entonces este se moverá 60 veces por segundo, solo para mantenerlo consistente con todo lo demás en el. Exportar velocidad var aquí en la parte superior del tipo flotador. Lo agregaremos a 100. Así que esa solo será la velocidad predeterminada para el proyectil. Entonces cosas como la velocidad y la duración que dura este proyectil en el mundo del juego son estadísticas que quiero sacar a un guión de estadísticas separado para que podamos definirlo por arma y por nivel de cada arma de una manera mucho más organizada Pero por ahora, ya es suficiente, así que trabajaremos en eso más adelante. Entonces queremos decir traducir aquí. Cualquier nodo TD puede traducirse a través de la pantalla. Es movimiento sin ninguna colisión. Y vamos a decir que nos estamos moviendo en la dirección multiplicada por la velocidad, multiplicada por el Delta. Ahora bien, si quieres saber qué calcula esto cuando estás depurando, golpeando un punto de interrupción, entonces es posible que realmente quieras hacer algo más como Var mover, que es un vector dos va a ser igual a este bit aquí mismo, Control X, pega ese extremo ahí, y luego solo traduces el movimiento. Así que ahora si tuvieras que llegar a un punto de interrupción, aquí mismo, y en realidad podemos hacerlo con solo golpear play porque el proceso de física va a desencadenar tan pronto como ese espíritu se cree, entonces podemos ver en la parte inferior, tenemos el valor de movimiento de 00 e Y es cero, cero, porque no lanzamos el proyectil con esta función, así que en realidad no tiene el por defecto es vector dos punto cero para ahora mismo Bien, entonces voy a deshacer el punto de interrupción. Tú. Bien, así que cierra el juego. En realidad trae a colación un buen punto que quiero tocar, que es que si la dirección es vector 20, entonces eso probablemente represente un problema porque siempre lanzamos en una dirección la dirección a la que se enfrentan los personajes, que nunca debería ser vector dos punto cero. Entonces podríamos esperar que ya se haya llamado a la función de lanzamiento antes de ponerla en escena completamente con Adhild Así que vamos a hacer listo ese subrayado de función. Y vamos a afirmar que dirección no es igual al vector 20 Llame al lanzamiento para establecer dirección o proyectil antes de agregarlo niño Entonces queremos así que queremos exigir que ya hayamos establecido la dirección con la función de lanzamiento y dar una nota que deberíamos llamar a launch antes de llamar a Add hild Entonces la lista ocurre después de bien. Ahora bien, si corro, debemos darle inmediatamente a la aseveración como esperaríamos Así que vamos a saltar al arma dos guión D donde estamos agregando el hijo del padre proyectiles Entonces ahora queremos llamar proyectil punto lanzamiento en la dirección P que pasamos a la función de lanzamiento Para que en realidad lo establezca en algo propio. Ahora, podemos ver que aquí abajo en el tiempo de espera del vector, estamos usando vector dos punto derecho Entonces supongo que sería una buena manera de probar. Siempre se debe mover a la derecha en este caso. Entonces el problema aquí es realmente que nuestro lanzamiento está tratando de hacer dos cosas separadas. Creo que en realidad tiene más sentido sacar este bit a la función ready ya que estamos usando eso ahora. Entonces voy a pegar eso ahí, Control X, esto, control V, pegarlo adentro. Esto tiene sentido. Tan pronto como el proyectil esté listo, tenemos listo para liberarlo después de un período de tiempo establecido Así que esto mantiene el método de lanzamiento solo manejando una cosa, que es básicamente inicializar el objeto una vez que se ha creado Entonces esta es casi certaintly la mejor manera de hacerlo. Bien, ahora vamos a golpear play. Y tenemos nuestro proyectil disparando a la derecha. También se puede ver que solo duran 1 segundo, probablemente no lo suficiente, pero es una buena prueba para asegurarse de que en realidad están liberando. Entonces en este punto, sólo habrá una o dos de las lanzas en la escena en cualquier momento No debería causar ningún problema de rendimiento en absoluto. 15. Configuración de enemigos y casillas de éxito: Nuestros proyectiles se mueven hacia la derecha. Ahora, vamos a crear un enemigo para que nuestros proyectiles puedan conectarse con él y golpearlo Entonces eso va a significar que estamos configurando una caja de impacto y una caja de daño en este video, y nos preocuparemos por las estadísticas más adelante, como HP. Entonces en mi proyecto ahora mismo, veo en la parte inferior, aquí hay algunas advertencias. Estos solo están mencionando que si no estás usando un parámetro, debes subrayarlo. Entonces voy a hacer click en cada uno de estos y solo darle un poco de subrayado ahí Entonces no estoy usando Delta en este proceso de física del jugador. Por lo que subrayo el Delta. Implica que no se está utilizando. Y luego aquí en otro guión, voy a hacer lo mismo. Y solo por cualquiera de esas advertencias que estás recibiendo, solo repite. No estás usando el parámetro, luego subrayarlo para que indique que esperas no usar el parámetro y que eso no es un accidente o un error Y seguiremos adelante y crearemos nuestro primer enemigo. Entonces comencemos con un Oc. Voy a crear una nueva escena aquí arriba en la parte superior, e iremos a la escena dos D a la izquierda. Voy a cambiar el nombre de esto para que sea Oc. Vamos a la derecha, haga clic en él, cambiaremos el tipo a un cuerpo de carácter dos D. Y seleccionaremos eso. Bien, entonces quiero hacer click derecho sobre el orco, agregar un nodo hijo Haremos un sprite TwoD aquí. Además, haz clic con el botón derecho aquí y agrega una forma de colisión infantil. Y a la derecha, vamos a hacer que sea una pequeña forma de círculo, algo así como lo que hiciste con el jugador. Y vamos a controlar, guardar la escena dentro de los personajes. Voy a hacer una nueva carpeta para los enemigos. Entonces enemigos, metan eso ahí, y luego salvan a la orca TAC. Bien, ahora nuestro orco necesita a Bright, claro. Así que vamos a seleccionar este nodo Brit, y bajaremos a la parte inferior izquierda Buscaremos creo que fueron entidades turbas orcos tripulación, y queremos agarrar uno de estos Así que solo estaba usando el orco predeterminado para que podamos agarrar la hoja inactiva Voy a seleccionar este nodo Bright two D, y luego a la derecha, vamos a arrastrar y soltar esa hoja inactiva en aquí. ¿Bien? Ahora, obviamente, tenemos una configuración similar al reproductor donde tenemos una hoja de sprites Necesitamos definir cuántos fotogramas H son de izquierda a derecha, que puedes ver son cuatro. Y queremos hacerlo con un reproductor de animación. Entonces voy a dar click en Ok, agregar un nodo hijo. Jugador de animación. Así que selecciona el reproductor de animación, baja al fondo, haz una nueva animación de Ídolo. Bien, y necesitamos fotogramas clave algunas de las propiedades del sprite Así que agreguemos una pista, pista de propiedad, sprite dos D, y vamos a buscar fotogramas H. Entonces haz doble clic en eso. Bien, y luego repita los pasos para pista de propiedad, sprite dos cuadros D, V, pista de propiedad, sprite dos textura D. Y en la parte inferior derecha, habilite el ajuste aquí mismo y luego cambie el tiempo de captura a 0.1 segundos. Entonces, un fotograma por décima de segundo. Y por último, a la derecha, queremos cambiar esto a 0.4 segundos de duración total y habilitar el looping Bien. En la línea de tiempo aquí, vuelve al inicio de la animación, haz clic derecho en insertar una tecla. Entonces tenemos nuestros marcos H. Queremos tomar eso, y en la parte superior derecha, cambiamos eso a cuatro. Y luego VFrames queremos insertar una clave. Dejamos eso como uno aquí arriba. Haga clic derecho en insertar un marco. Entonces ese va a ser nuestro primer marco. No te preocupes por cómo muestra los cuatro fotogramas a la vez que se arreglarán automáticamente en un segundo. Y luego queremos hacer click derecho e insertar una clave para nuestra textura, que puedes ver en la parte superior derecha ya está por defecto a nuestra animación aquí Así que aún no hemos reproducido la animación, así que sigue mostrando cuatro fotogramas, pero en cuanto juegue, va a mostrar el primer fotograma de la animación inactiva, y la sección de fotogramas de aquí abajo se actualiza automáticamente a lo que esperaríamos. Entonces ahora queremos ir a 0.1 segundos. Debe ajustar intervalos de 2.1 segundos, y luego hacer clic derecho y especie de clave para fotograma y luego cambiarlo en la parte superior derecha a uno aquí arriba. Entonces ese es el segundo fotograma de animación. Luego agregue el valor de fotograma de dos, que es el tercer fotograma aquí arriba y el último fotograma de valor tres, que representa el cuarto fotograma de animación. Bien, ahora, si estamos en juego, deberíamos tener nuestra animación ociosa. Y para el simple superviviente como personaje, sólo vamos a hacerlo de cara a izquierda y derecha. Así que solo necesitamos un nodo volteando en estas animaciones individuales para ya sea hacia la izquierda y hacia la derecha Entonces porque esto es para un simple superviviente como juego, solo lo estamos teniendo cara izquierda y derecha. Entonces solo necesitaremos agregar un nodo volteante más adelante. Y aparte de eso, solo necesitamos nuestras animaciones de ejecución ociosa y muerte. Y eso es prácticamente todo a menos que un personaje necesite una animación de ataque especial. Así que vamos a duplicar la animación inactiva, y vamos a poner en nuestra animación de ejecución. Para la animación de ejecución, queremos tomar la textura aquí abajo y cambiar el valor y la parte superior derecha a la hoja de ejecución. Así que corre y arrastra eso hacia arriba a la derecha. Bien. Y eso son seis fotogramas de animación. Entonces queremos tomar cuadros H aquí y cambiarlo a seis. Y luego queremos agregar en el fotograma cinco y el fotograma seis aquí. Y así la clave cambia este valor y la parte superior derecha a cuatro, inserta una clave, cambia este valor a cinco, y luego toma la duración de la animación de ejecución y hazla 0.6 segundos, presiona play, y deberíamos tener nuestra animación de ejecución. Ahora, creo que está compensado incorrectamente, algo así como lo fue el ídolo a la carrera del jugador. Así que vamos a necesitar hacer ese ajuste de compensación, también. Entonces vamos al ídolo. Vamos a mover a este personaje hacia arriba. Asegúrate de seleccionar el nodo sprite específicamente. Después pulsa W para ir al modo de movimiento y mover el sprite hacia arriba para que el punto 00 quede centrado en sus pies aquí abajo Donde sea que sea centro de gravedad donde toque el suelo debería estar. Y luego ir a transformar a la derecha e insertar un fotograma clave Entonces tengo 14 píxeles negativos como la posición Y. Fotograma clave eso, presiona Crear y solo tienes la pista de reinicio. Eso está bien. Y ahora también necesitamos fotogramas clave de la carrera. Entonces para correr, vamos a ir a la parte superior derecha, y lo haré Probemos 27 píxeles negativos. Intentemos 30 píxeles negativos. Me imaginé que estos están configurados de la misma manera que el jugador era, mismo artista y todo eso. Así que vamos a fotogramas clave esto Y crear. Y tenemos nuestra animación de carrera. Ahora, cambiemos rápidamente a Idol. Bien, entonces ahora tenemos nuestra animación de ejecución jugando. Cambiemos rápidamente a Idle y juegue. Y parece que los píxeles se alinean. Tendremos que probar ese juego final, claro, si realmente vamos a mostrar la animación Idle. En este caso, sin embargo, es posible que en realidad nunca mostremos la animación Idle a menos la animación Idle a menos que el enemigo deje de correr hacia el jugador. Pero idea, al menos con esta configuración va a ser que el enemigo siempre esté corriendo hacia el jugador mientras el jugador exista. Así que tal vez nunca veamos realmente la animación ociosa. Le correspondería a usted. A lo mejor cuando el jugador es derrotado, los personajes apenas empiezan a ralentí en vez de moverse más por la pantalla porque no hay más jugador para pelear Pero eso solo sería como un extra que realmente no se requiere. Sin embargo, lo que sí necesitamos es la animación de la muerte. Así que vamos a correr porque creo que la animación de la muerte es de seis fotogramas, y vamos a duplicar esto para hacer una animación de muerte así que escribe Death Enter. Vamos a apagar el looping para esto. Los personajes solo mueren una vez. Entonces queremos tomar la textura y cambiarla a la hoja de sprite de la muerte en la parte inferior izquierda Arrastra eso al inspector y vamos a darle a play ahí. Y entonces si cambiamos a inactivo, parece que se alineara y corre parece que se alineara. Bien, entonces eso probablemente sea bueno. Supongo que la posición sobre la muerte es negativa 30. En fin, tenemos a nuestro Oc. Podemos simplemente meter a un orco en el mundo del juego. Entonces, llevemos a orco aquí. Y en realidad, probablemente queremos como enemigos jerarquía, así que voy a hacer clic derecho insertar un nodo. Entonces nodo dos D, vamos a hacer enemigos o incluso podríamos ser solo NPCs si queremos A lo mejor los enemigos es mejor. Y voy a dejar caer un orco de abajo a la izquierda. Bajo enemigos. Entonces podemos ver que en realidad aún no está mostrando la animación. Entonces voy a golpear Open y Editor, y vamos a ver qué pasa con eso. Probablemente necesitamos, como, establecer una animación predeterminada. Entonces podría tomar la muerte y cambiar eso a ocioso. Vamos por defecto como inactivo. ¿Bien? Hit play. Volvamos al mundo del juego. ¿Eso arregla esto? Supongo que no. Bien, entonces como eso no está funcionando, deberíamos ir al reset. Animación. Entonces esto es cuando no estás reproduciendo una animación, se restablece a estos valores Y podemos ver que el He enmarca aquí, si miramos en la parte superior derecha en realidad se establece en uno. Entonces si pusimos eso a cuatro, y supongo que ahora pulsamos play en el reset, entonces esto es lo que deberíamos ver si volvemos al mundo del juego. Así que guarda tu escena orca, ve al mundo del juego, y bien, ahora se ve correcta Entonces voy a golpear W y mover la c. Bien, y luego vamos a solo Control D, duplicar unos cs más. Y entonces creo que lo último que queremos hacer aquí es tomar enemigos y habilitar en ordenar y ordenar habilitado. Como esto es evidente para todos los orcos, sí queremos que los orcos se ordenen entre sí, también Eso podría ser necesario. Entonces eso podría ser necesario para establecer ahí. Bien, entonces nuestras lanzas pueden moverse, pero en realidad no pueden golpear nada No hemos configurado una caja de impacto, y nuestros orcos pueden existir, pero no tienen caja de HRT para realmente recibir daños Por lo que las cajas de HRT y las cajas de golpe y Gadot D van a ser el Área dos Ds Si vienes de la unidad, sería más como una zona de activación. Vamos a Spear y crearemos un Área dos D que haremos como nuestro hit box Entonces voy a hacer clic derecho sobre la lanza agregar nodo hijo, Área dos D, y voy a renombrar esto rápidamente para ser golpeado cuadro dos D. Vamos a hacer clic derecho en él, adjuntar un script Ahora bien, esto va a ir probablemente en más como la raíz. Entonces déjame ver. Supongo que ponerlo en la carpeta de armas tiene sentido aquí y vamos a golpear abierto. Entonces vamos a crear el guión en weapon Hit Box two D. Create dale el nombre de clase Hit box two D. Bien, entonces en nuestro script de caja HIT, queremos conectarnos inmediatamente a la señal que ya tiene el área, que es área Porque lo que estamos tratando de verificar es si entramos en el área de una casilla RT. Entonces, si hacemos función subrayado listo, luego en listo, podemos hacer área ingresada punto connect, y vamos a conectarlo a on area ingresada, que es una función que estamos a punto de configurar Así que crea subrayado de función en, área Ingresada. Esto va a recibir y el área dos D es el parámetro. Entonces área P área dos D y retorno tipo de v Bien, entonces un área ingresó a esta área, ¿ qué tipo de áreas nos importan? Nos importan las cajas específicamente lastimadas. Entonces, si el área P es una caja Hurt dos D y el tipo aún no existe, entonces debería ser una época aquí. Entonces por ahora, podríamos decir algo así como impresiones entonces por ahora mismo, podríamos decir algo como Prance, que va a imprimir un mensaje a la consola ¿Por qué no lo intentamos así? Porcentaje s y comillas significa que vamos a reemplazar esto con una cadena. Por ciento de aciertos. Incluso podríamos decir en posición, porcentajes, y luego vamos a reemplazar esas cadenas usando otro signo de porcentaje Y tenemos tres cuerdas que necesitamos reemplazar dentro de esa cadena. Así que vamos a pasar en una matriz de valores que queremos hacer para el reemplazo. Entonces el primero va a ser, digamos yo solo. Entonces vamos a conseguir la caja Hit, que va a golpear la caja de Hurt del área P. Y entonces vamos a decir que la posición es la posición global del punto del área P. Entonces un Área dos D sigue en el nodo dos D, por lo que todavía tiene una posición global. Eso funcionará solo por recoger que nuestro hit box en realidad está golpeando el cuadro de HRT Bien, ahora necesitamos hacer una caja RT en el Oc. Así que vamos al Oc y voy a hacer click derecho aquí y crear un nodo Ágil Área dos D. Vamos a renombrar esto para que sea Hurt Box, y voy a capitalizar la B para caja Dos D. Vamos a darle clic derecho, adjuntar un guión. Vamos a querer lastimar a la Caja dos D. Eso solo puede ir en tal vez personajes por ahora. No vamos a tener realmente ningún objeto destructible, al menos en esta demo Entonces podrías argumentar, Bien, esto pertenece más a la carpeta de objetos, o tal vez estés organizando tus scripts por completo en una carpeta de scripts que contiene específicamente scripts. La organización depende de usted. Así es como estoy haciendo las cosas. Entonces los personajes recortan Hurt Box dos D, nosotros la crearemos ahí Bien, ahora este guión, tenemos que llamarlo nombre de clase Hurt Box dos D. Por ahora mismo, no vamos a cambiar nada más al respecto. Solo queremos esa etiqueta identificadora, Hurt Box two D. Ahora, la caja Hurt, puedes ver que también necesita una forma de colisión. Así que hagamos clic derecho y agreguemos un nodo hijo, forma de colisión. Y luego a la derecha, voy a crear una nueva forma de círculo. Así podremos definir dónde se puede golpear a este personaje. Así que podría golpear W y moverlo hacia arriba. Podemos simplemente hacerlo un poco grande aquí. Entonces, si lo hago más grande, algo así, estaría bien. También podría preferir una forma de cápsula. Entonces, si seleccionamos la forma de la cápsula también podría preferir una forma de cápsula aquí. Entonces, si hacemos una forma de cápsula, que es más como un humanoide, entonces podemos seleccionar la forma de cápsula Y luego por aquí, solo podemos darle a W, moverlo aquí arriba. Esto sería bueno si quieres, todos los píxeles que se muestran en pantalla para que el k sea realmente áreas dañables Entonces podrías hacer ese argumento. Y entonces solo queremos que esto sea un hijo de la caja Hurt tot Y entonces nuestro orco también necesita una forma de colisión. Entonces, ¿dónde pueden chocar los pies por la c? Entonces eso va a tener más sentido como forma de círculo aquí. Y luego nos fijamos en los pies orcos. Vamos a encogerlo aquí abajo, algo así. Entonces, si elegimos tener colisiones entre nuestros orcos y otros orcos u orcos y el jugador, otros apoyos y el objeto, entonces esta es la forma que en realidad estaríamos usando para eso realidad estaríamos Ahora, si quieres que tus enemigos choquen con otros enemigos y jugadores y cosas así cuando se mueven usando move and slide, eso es algo que un cuerpo de personaje dos D puede hacer fuera de la caja Pero va a tener un costo de rendimiento asociado a eso, ya que en realidad se trata de calcular movimiento basado en la física. Si quieres obtener el máximo número de caracteres en pantalla, podrías considerar usar translate en su lugar, igual que hicimos con la lanza, que significa que solo se va a mover independientemente de lo que esté pantalla en la dirección en la que esté tratando de moverse Así que manteniéndolo lo más tonto, simple posible, depende de ti lo que quieras al final del día Y cuántos miles de enemigos necesitas en pantalla a la vez. Bien, entonces antes de que terminemos esto, creo que la lanza también necesita una forma de colisión para el hit box Entonces voy a hacer click derecho aquí, agregar un nodo hijo, colisión forma dos D. Vamos por encima de la parte superior derecha. Hagamos de esto una forma de círculo, y luego tomaremos la forma del círculo y la moveremos hacia arriba hasta la punta de la lanza y la encogeremos, algo así Tal vez prefieras que tenga forma de cápsula. Depende de lo quisquilloso que quieras ser. La cápsula obviamente podría ser más ovalada o menos de un círculo puro. O tal vez incluso sólo un rectángulo. Entonces, si quieres ir con un rectángulo, podrías hacer, digamos, forma de rectángulo aquí arriba, encoger los lados así, derribar esto, y tal vez así. Entonces, usando una especie de la forma primitiva más simple aquí como sea posible para el hit box mientras se sigue tratando mantener la forma real de mantener la forma real del sprite donde tenga sentido Entonces creo que esto sería bastante bueno. No creo que nadie realmente se diera cuenta mucho de que, ya sabes, tal vez esta mitad de la lanza no ha golpeado aquí Si realmente quisieras ser quisquilloso, podrías hacerlo así Y si, tal vez eso sería un poco mejor. Sólo un poco menos de posibilidades de que lo golpee podría deslizarse por el borde de aquí a la izquierda. Una vez más, uno de esos más, pruébalo y obtén una idea de cómo está funcionando tipo de cosas y mira si es adecuado para tu juego o no. adelante y ejecutemos el juego ahora, e intentaremos que los orcos golpeen con esos proyectiles Entonces veamos no se puede instanciar un nulo. Nivel. Bien. Entonces ahora mismo, el proyectil ya no está puesto en el arma dos D. Eso es interesante. Vamos al jugador, y voy a tomar el arma dos D. Podemos ver que la definición de arma se establece aquí. Si explico el arma dos D, saltemos a la definición de arma. Entonces tenemos el símbolo de buscar. A lo mejor me moví el arma. A ver. ¿Dónde está Spear? Accidentalmente moví la lanza de la lanza de armas a esta carpeta diferente Entonces, volvamos eso a las armas. Bien, ahora va a funcionar bien. Vamos a golpear a Load. Bien, y luego tenemos las lanzas. Entonces vamos a la salida. Voy a bajar esto un poco estos orcos en realidad están siendo golpeados por la lanza, lo cual es bueno Podemos ver la posición en la que ocurrió eso. La información del hit box no es muy útil, pero al menos sabemos qué tipo está golpeando a qué tipo. Si fuera un tipo de área completamente diferente, diría el nombre de la clase para ello aquí. Y eso está funcionando más o menos. 16. Infligir daño a enemigos con hits boxes y estadísticas: Las cajas de golpe y las cajas de daño están funcionando lo suficiente como para que podamos recoger el golpe en la caja de HRT, que va a ser el comienzo de infligir daño a nuestros enemigos orcos Entonces en este video, necesitamos configurar las estadísticas para el orco y asegurarnos que estamos pasando un daño golpear al orco que va a recibir Una gran parte de este tutorial va a ser definir las estadísticas de la lanza, las estadísticas del orco, y establecer la interacción entre los dos Entonces, si saltamos al guión del proyectil, queremos que el proyectil responda cuando la caja de impacto golpee la caja Hurt pasando el daño del proyectil sobre la caja herida y Entonces voy a poner un en export var para cajas de aciertos. Esto va a ser una matriz de hit box dos D. Bien. Ahora, los que quiero asignar en la inspección Así que si hago clic en Spear array dos D, la matriz de cajas de hit está por aquí Necesitamos aumentar su tamaño a uno, hacer clic en un signo en el primer elemento y luego elegir Hit box. Por lo que ahora tenemos una referencia a la caja de impactos para el proyectil dentro del guión Está hecho como una matriz porque algunas armas en realidad pueden tener dos o más cajas de impacto. Entonces solo hacemos de eso una opción desde el inicio aquí. Y lo que vamos a hacer es conectarnos a cada señal de caja de impacto impactar para que nuestro proyectil pueda infligir el daño. Así que vamos a hacer clic derecho en la casilla de golpe dos D. Símbolo aquí, hacer símbolo Lou, y esto saltará al guión de hit box. Entonces, en lugar de imprimir que golpeamos, en realidad queremos emitir que golpeamos. Así que vamos a crear una señal golpeada aquí arriba. Siempre que el cuadro de aciertos reconozca un hit, entonces pasaremos en el objetivo que golpeemos o la caja lastimada que golpeemos en este caso. Entonces diremos Hurt box aquí es un tipo de rt box dos D. Bien. Y así, en vez de imprimir aquí, voy a cortar eso, y voy a decir hit dot EMIT, y vamos a pasar eso con el área P como un Hurt Box dos D. Así que ahora si vamos al guión del proyectil, podemos simplemente conectarnos a esa señal en listo Entonces hagámoslo antes de hacer la porción de espera. Primero, diremos afirmar hit booxes dot vacío. Entonces no queremos que eso sea cierto. Entonces podríamos decir igual, igual a falso, y decir que necesita al menos un cuadro de aciertos para golpear un objetivo. Ahora bien, esto depende un poco de cuál sea tu intención. Teóricamente podrías tener un proyectil que no necesita golpear Entonces esta afirmación podría no ser necesaria, pero para nuestro juego, sí queremos que los proyectiles puedan infligir daño a objetivos enemigos Entonces vamos a dejar esa afirmación ahí dentro. Y así después de nuestras aseveraciones, podemos decir cuatro cajas y cajas de golpe Vamos a decir box dot hit dot Connect, y podríamos decir en hit box hit. Así que vamos a conectar esa señal a una nueva función que estamos escribiendo aquí abajo. Entonces función en Hit Box Hit va a tomar una caja P Hurt podría hacer cuadro de subrayado de HRT si queremos ser más consistentes Y eso va a ser de tipo Hurt Box dos D y retorno nulo. Bien, entonces con la caja de HRT, vamos a llamar, digamos, caja P Hurt Digamos punto DL daño, y la cantidad va a estar basada en nuestros cálculos aquí mismo. Entonces, ¿de dónde sacamos los daños a calcular? Bueno, vamos a declarar aquí el daño final. Y pondremos eso en diez por ahora mismo. Y esto será un entero. Por lo que todo el daño y HP en el juego estarán basados en enteros. Sólo para que sea simple, técnicamente, podrías hacer una fracción de una unidad de daño, pero eso es bastante confuso. La mayoría de los juegos solo usarán enteros. Bien, entonces diremos que tratamos con el daño final aquí, y luego nos preocuparemos por el cálculo del daño. Entonces podríamos decir, para hacer Cálculo de Daños. Bien, entonces ahora nuestra caja de daño, queremos agregar ese método de infligir daño. Pasemos a Hurt Box. Entonces voy a decir función infligen daño, y pasaremos el daño de un entero. Oh, podríamos poner un tipo de retorno aquí ahora mismo, solo lo devolveré como nulo porque estamos esperando que el daño que infligamos sea el daño que recibe. Estamos calculando en el guión del proyectil más que en el guión de la caja Hurt, en este caso Vamos a cambiarlo a un tipo de retorno booleano. Entonces voy a decir trata de infligir daño aquí. El motivo de ello es que vamos a hacer una condición de que sea posible que las estadísticas sean imposibles de golpear, así que tendremos eso manejado aquí. Entonces el último punto de falla de si realmente va a recibir el daño será la invencibilidad en las estadísticas Entonces supongo que eso tiene más sentido desde el punto de vista de la caja. Entonces diremos, si no, se puede golpear un punto del controlador de estadísticas, luego devolveremos false. Ahora bien, las estadísticas son donde estamos aplicando el daño. Se va a administrar las estadísticas de tiempo de ejecución para el personaje. Así que vamos a necesitar configurarlo todo en un minuto. Entonces ahora probablemente sería el momento adecuado para configurarlo. Así que aquí arriba en la parte superior, vamos a querer en Export VR, una referencia de controlador de pila. Por lo que este será de tipo controlador de pila. Entonces crearemos un nuevo script con. Pasemos a la escena de la organización en dos vistas D, y vamos a hacer clic derecho en ella y agregar un nodo hijo. Entonces este va a ser un nodo regular. No es un espacio de posición. Este es un gestor de estadísticas, así que es todo base de datos. Por lo tanto, es un nodo, no un nodo TD. Y lo llamaremos Stat Controller. Todo derecho haga clic aquí. Vamos a adjuntar un guión. Entonces el nombre del mismo solo será Sat Controller, y lo pondremos en la carpeta del personaje porque nuestro personaje principal también tendrá un controlador de pila. Vamos a crear el guión. Voy a poner en el nombre de la clase, y voy a controlar el controlador vPasteDN Stat porque copié eso del otro script Esto administra las estadísticas de tiempo de ejecución de un objeto. Así que vamos a tener cosas como VaraHP que es un entero, y podemos establecer eso en una cantidad predeterminada tal vez 100 También tenemos Var Max HP, que puede ser lo mismo. La idea será que el HP nunca se pueda poner por encima del MX HP. Entonces, si solo quieres encargarte de eso ahora mismo, vamos a poner otro cool aquí al final, y voy a decir valor establecido. Entonces HP va a ser igual a los hombres del valor y al MaxHP Bien, entonces esto de aquí solo lo limita para que alguna vez puedas poner el HP por encima del MaxHP También podríamos querer una variable para es el objeto vivo. Entonces vamos a decir lejos en vivo, esto va a ser un booleano. Va a ser por defecto a true. Y entonces necesitamos esa función que estábamos recibiendo un error. Entonces si marco Hitbox, ahí está la función can be hit Tenemos que poner en práctica eso. Entonces vamos a Stat Controller. La función puede ser golpeada, que va a devolver un booleano Para que podamos poner aquí las condiciones que queramos. Por ahora, vamos a decir, volveremos en vivo. Entonces, si el personaje está vivo, puede ser golpeado. De lo contrario, no se puede golpear. Así que de vuelta por aquí, si está vivo, entonces podrá ser golpeado, pero esto está invirtiendo eso con la k Así que si no está vivo, entonces regresamos falso. que si no está vivo, entonces regresamos falso Básicamente. Ahora, aquí abajo, vamos a decir retorno verdadero porque asumimos que en este punto, sí hizo daño porque se cumplieron las condiciones. Ya pasamos la cláusula de Guardia. Entonces queremos tomar el controlador SAP, y queremos tomar su HP y queremos configurarlo al nuevo valor. Tal vez queramos calcular eso justo encima de él. Y como variable local. Entonces nuevo HP va a ser igual a stat controller dot HP menos es igual al daño o simplemente menos, en realidad. Entonces la asignación en realidad está por aquí a la izquierda del nuevo HP. Entonces configuramos el HP del controlador de estadísticas al nuevo HP, y volveremos true. También podemos querer poner aquí como una señal que emite el cuadro Rt, que también sería una señal de acierto Bien, así que quiero probarlo todo hasta el momento. Voy a establecer un punto de quiebre por aquí a la izquierda para que podamos golpear eso en Debug si el arma logra dañar al personaje. Entonces, vamos a presionar Play y veamos si funciona en este punto. Seguro que me faltan un par de cosas. Entonces podemos ver en la parte inferior aquí que infligir daño no existe porque en realidad ahora es daño tri infligir. Entonces cambiamos el nombre y luego volveremos a ejecutar esto. ¿Llegamos al punto de ruptura? Llegamos hasta aquí. Se puede golpear el controlador de pila, pero en realidad no asignamos el controlador de pila a la caja RT. Entonces este podría ser otro caso en el que queremos afirmar en la parte superior que el controlador SAT en realidad se ha configurado Por lo tanto, asert stat controller no es igual a null. La caja de HRT necesita en la referencia del controlador para efectuar el efecto. Por lo que la Caja HRT necesita una referencia al controlador SAT para que pueda cambiar sus estadísticas. Entonces vamos a ver. Si vamos a TD View, modo Local aquí arriba, y luego hacemos clic en el RT Box, simplemente asignaremos a la derecha el controlador de pila de aquí. En caso de que nos olvidemos en algún momento con alguna caja lastimada, tenemos la afirmación de tener un respaldo para atraparnos Así que vamos a correr esto una vez más. Vamos a darle a eso y ya ves que hemos vuelto verdad. También se puede ver en la parte inferior que el nuevo HP se ha establecido en 90. Nuestro HP base para el controlador stat es 100, así que 100 menos diez, obtenemos 90, así que sabemos que eso en realidad se está actualizando correctamente. Y lo siguiente que haremos al inicio de Next video va a ser configurar la máquina de estado orco para que podamos pasar de vivos a muertos una vez el HP baje a cero y luego sacar al orco de la escena 17. Estado de muerte cuando el enemigo alcanza los 0 HP: Ahora queremos montar una máquina estatal para nuestros enemigos. Va a ser increíblemente sencillo. Sólo habrá dos estados del bate, que van a ser el estado de movimiento o el estado de muerte, que lo despeja del juego Así que vamos a hacer clic derecho sobre Oc agregar un nodo hijo. Voy a decir HSM aquí, y vamos a agarrar el Limbo Podríamos renombrar esto para que sea Enemy HSM, y luego voy a hacer click derecho sobre él, adjuntar un guión Entonces esto irá directo a la carpeta de enemigos slash enemyShsm Eso vamos a crear. Establezca la cima aquí. Enemigo HSM. Esta es la máquina estatal para los enemigos dentro del Bien, así que mirando al jugador HSM, aquí va a ser muy similar Creo que porque en realidad cambiamos a Blackboard, ese guión ya no necesita una referencia al reproductor de animación directamente, lo cual sería correcto si miro por aquí en el plan de Blackboard No hace falta la segunda referencia. Así que en realidad puedo cortar eso ahí mismo. Entonces vamos a copiar este código del jugador HSM al guión HSM enemigo Entonces digamos que en lugar de jugador, este va a ser un guión de NPC, que podría tener sus estadísticas establecidas en él Entonces NPC de tipo NPC aseveran que el NPC no es nulo. Entonces, el agente NPC debe estar configurado en el HSM, y lo inicializaremos con el Así que solo un poco cambiando los nombres aquí principalmente. Entonces el guión de NPC, pasemos a la escena orca a D View Y vamos a querer hacer clic en OC, adjuntar un guión. Vamos a decir que esto es NPC, y lo pondremos en personajes no en personaje slash Enemigo, o podría ser en enemigos hasta ti Crearemos este script para el cuerpo del personaje. Y llamemos a esto ClassName NPC. Entonces el NPC solo tendrá una referencia fácil al controlador de pila Para que no necesitemos necesariamente hacer referencia a esas dos cosas por separado. Dentro de la máquina de estado, es bastante conveniente acceder a las propiedades del agente porque siempre sabes que el agente va a estar ahí en cualquier script de máquina de estado una vez que lo hayas inicializado en la máquina de estado Entonces, si exportamos estadísticas VAR aquí, y luego diremos controlador de pila, entonces podemos hacer referencia a eso súper fácil dentro de la máquina de estado, también. Entonces por aquí a la derecha, asignamos el controlador de pila, y ahora dentro del HSM enemigo, los errores deberían desaparecer siempre y cuando hagamos clic en Enemy HSM. Bueno, esto no está bien. Se supone que diga NPC. Entonces solo necesitamos reiniciar el proyecto Cadle, ir a Proyecto, recargar Bien, y eso debería arreglarlo. Entonces ahora asignamos al orco, que es el NPC, y tenemos una referencia tanto al agente como a las estadísticas, y eso debería ser la mayor parte de lo que necesitamos para nuestra máquina estatal Bien, así que hagamos clic derecho sobre el HSM enemigo. Voy a añadir un nodo hijo. Y hagamos un estado de limbo. Podría cambiar el nombre de esto y decir algo así como NPC move state Bueno, haga clic derecho adjuntar un guión. Crear. Bien, entonces a continuación, vamos a crear un estado de Chase para el enemigo. Aquí será donde va a estar la lógica central para que nuestro personaje se mueva hacia el jugador, además de jugar la animación de carrera tan pronto como la tengamos en el estado. Entonces voy a hacer clic derecho sobre el HSM enemigo. Agreguemos un nodo hijo, un estado Limbo. Voy a renombrarlo Chase State. Y voy a hacer click derecho aquí, adjuntar un guión. Entonces Chase estado que probablemente pertenezca a un enemigo. Voy a golpear Crear. Bien. Vamos a darle un nombre de clase en la parte superior , Chase State, y le daremos un comentario. Entonces esto va a terminar corriendo hacia el jugador donde sea que esté en el juego. Por ahora, sólo vamos a hacer que reproduzca la animación. Configuraremos una transición del estado de Chase al estado de muerte y solo nos aseguraremos de que nuestro personaje caiga a cero HP haga que el enemigo viva dentro del juego. Entonces diremos subrayado de función, Enter. Cuando entramos, queremos reproducir la animación de ejecución. Así que incluso podemos hacer la configuración de subrayado de función, y luego vamos a conseguir ese reproductor de animación Hasta el momento, subrayado reproductor de animación de tipo reproductor de animación, y vamos a conseguir eso de la pizarra, tal como hicimos con el Así reproductor de animación es igual a punto de pizarra obtener var. Y estamos buscando el jugador de animación de citas finales, y queremos quejarnos si no lo encontramos Entonces tenemos el reproductor de animación. Cuando entramos al estado, jugamos la animación. Así que vamos a decir guión bajo animación jugador punto play, y queremos reproducir la animación que definimos aquí arriba en la parte superior Hagámoslo en Export var. Digamos animación de Chase. Claro. Y ese será un nombre de cadena. Lo voy a ejecutar por defecto. Y luego copiamos esto hasta aquí abajo. Entonces tocamos la animación correcta cuando entramos al estado. Bien, y nuestro HSM Enemigo, ya lo inicializamos Ya lo activamos. Entonces probablemente va a funcionar. Entonces podemos ver si corre ahora. Vamos a entrar en el modo de juego. Oh, no hemos puesto el reproductor de animación en la Pizarra, claro Entonces nos dice enseguida que hubo un problema. Eso es bueno. Haga clic en Enemy HSM, vaya al plan Blackboard y hagamos Nuevo plan de Blackboard, administrarlo, agregar un reproductor de animación variable Elija el tipo de ruta de nodo. Golpea Bien. Y ahora un reproductor de animación queremos asignarle el reproductor de animación del o y ahora podemos usarlo dentro de nuestros estados. Bien, pulsa Reproducir de nuevo. Y veamos si nuestros orcos están corriendo. Todos lo son. Eso es genial. Entonces necesitamos nuestro estado de muerte, y necesitamos establecer nuestra transición. Entonces voy a hacer click derecho sobre Enemy HSM, agregar un nodo hijo, que va a ser Limbo State Renombrar esto a Estado de la Muerte. Haga clic derecho, adjunte un guión, presione Crear. Lo llamaremos Estado de la Muerte en la cima. Entonces nombre de clase Death State. Bien, ahora en nuestro estado de muerte, también necesitamos reproducir una animación muy similar a la que hicimos en el estado de Chase. Este es un código que vamos a repetir aquí, pero debido a que solo estamos haciendo algunos estados para nuestro juego, creo que hacer cosas como hacer una nueva clase base es un poco demasiado extra en este momento. Así que sólo voy a copiar esto de nuevo. Al estado de la muerte. Bueno, pega eso en. Y solo podría decir que la animación aquí que queremos para el estado de muerte está por defecto a muerte, y conseguimos que la animación se reproduzca de la misma manera Pero entonces queremos reproducir la animación por aquí. Y como no estamos usando un estado base, no tenemos que preocuparnos por cosas como llamar a Super para asegurarnos de que el código de estado de animación realmente se ejecute porque ambos van a usar setup, y ambos van a usar Enter. Si declaras una nueva configuración o función Enter, realidad anula lo que esté en la clase base si olvidas llamar a Super y por cierto, llamarías a Super así Super solo significa que sea cual sea la clase padre, la ejecutas en este momento. Entonces puedes ver que es un poco complicado y confuso usar ese tipo de herencia directa. Si tienes como cinco o diez estados diferentes que todos son estados de animación porque todos juegan en animación exactamente de la misma manera, entonces vale la pena tener eso. Pero literalmente solo vamos a tener Chase y la muerte, así que es exagerado Pero Tay debería mencionar que esa es otra forma de hacer las cosas, también. Entonces en el Inter, básicamente queremos que nuestro personaje sea invencible Por lo tanto, es posible que queramos hacer algo como agent dot stats dot LI, y queremos asegurarnos de que esto esté configurado en false. Así que recuerda que cuando un controlador de estadísticas no está vivo, entonces puede ser golpeado va a devolver falso. Por lo que esto evitará que golpeemos accidentalmente a un personaje que se encuentra en su estado de muerte. También hacen algo así como, digamos, función terminada, y declaramos esta función para que realmente puedas llamarla desde la animación u otros lugares. Y vamos a decir que el agente necesita u libre. Entonces agente Qu libre. Entonces esto básicamente significa la ruta Aosne la org. Vamos a liberarlo y todo lo que hay dentro de él. Cuando llamamos al método terminado. Así que ahora podemos ir a dos D view reproductor de animación aquí abajo en la parte inferior. Vamos a ir a la animación de la muerte. Acercamos la línea de tiempo, vamos al final aquí. Nosotros agregaremos Track, call method track sobre el estado de la muerte. Y luego vamos a hacer click derecho aquí abajo, insertar una clave, y vamos a buscar ese método terminado que acabamos de crear. Entonces, esto quiere decir que cuando termine nuestra animación de muerte, va a llamar terminada terminada en el estado de muerte va a liberar al agente tan pronto como el frame renderizado y todo lo demás se resuelva. Por lo general, llamarías trimestre, no gratis, congelación gratuita de inmediato, y el trimestre espera a que otras operaciones se resuelvan adecuadamente Así que esto en realidad reduciría la cantidad de errores extraños que podrías obtener cuando te cuesta qu. Bien, entonces lo último que tenemos que hacer es saltar al HSM enemigo Vamos a crear una nueva función para las transiciones de configuración, que devolverá void. Entonces queremos agregar una transición de nuestro estado de persecución a estado muerte cuando se emite el evento de muerte. Entonces cuando declaras un evento aquí así, esto es solo una cadena a la que nuestro sistema va a responder podríamos subir aquí y crear un evento de muerte constante. Va a ser un nombre de cadena igual a que solo haremos la muerte en minúsculas, pegaremos eso ahí abajo, y podremos conectarnos a las estadísticas de nuestro agente así Digamos que las estadísticas de puntos de NPC dot Alive cambiaron. No hemos creado esta señal, pero voy a seguir adelante y saltar aquí, así que conéctate. El subrayado en NPC Alive cambió. Bien, así que voy a copiar esto abajo a la función de abajo pegar en NPC live cambiado, y esto va a tener el nuevo valor Así que vivo es un booleano. Podría decir P para parámetro si nos gusta aquí. Normalmente me gusta hacer eso. Y esto va a estar devolviendo una especie de vacío. Entonces, cuando el PNJ ya no esté vivo, entonces quiero emitir el evento de la muerte Entonces si P vivo es igual a falso, entonces vamos a despachar el suceso de muerte. Bien. Y cuando añadimos la transición, eso quiere decir que esta transición va a ocurrir cuando ocurra este suceso de muerte. Ahora, todavía nos está dando un mensaje de error porque no tenemos la referencia del estado Chase o el estado de muerte aquí en la parte superior. Entonces solo podemos decir en export var Chase state, que es un estado limbo, y en export var death state, que es un estado limbo Ahora guarda el guión en el inspector. Podemos asignar el estado de Chase y asignar el estado de muerte. Y ahora, una vez que llamamos transiciones de configuración, va a manejar la gestión de estas transiciones. Creo que queremos llamar a eso antes de inicializar, o tal vez justo después Hagámoslo justo después. Así que subraye las transiciones de configuración A eso lo llamamos. Configuramos nuestras transiciones. No debería haber necesidad de crear un estado de muerte para perseguir estado porque actualmente no tenemos enemigos que vuelvan a la vida, aunque, más tarde puedes agregar ese tipo de cosas. Ciertamente, ese sería un tema común, sobre todo para, como, enemigos no-muertos Bien, entonces lo último para que esto funcione muy rápido, ir a la escena de la lanza, y saltemos a la caja de éxitos, ¿ o es la lanza? Bien, la lanza Y queremos tomar el daño final y establecer esto en 100, por lo que será un golpe igual a un orco derrotado Hit play, y veamos si todo esto se junta. Entonces nos está dando un error. No he creado eventos cambiados en vivo en las estadísticas de NPC Haga clic derecho sobre el símbolo NPC, vaya al símbolo Lou. Haga clic derecho sobre el símbolo, símbolo Lou, haga clic derecho en Stat Controller, símbolo Lou. Bien, y aquí están nuestras estadísticas. Vamos a crear la señal, así podríamos decir que la señal en vivo cambió. Y esto va a pasar en el nuevo valor en vivo como booleano Volveremos aquí y asignaremos más señales, pero por ahora mismo, quiero asegurarme de que esta señal emita cada vez que cambie un valor en vivo Entonces voy a decir valor establecido. Entonces primero, vamos a protegernos contra si el valor es el mismo que el valor que se le establece. Entonces, si un vivo es igual, dos signos iguales al valor simplemente volverán. De lo contrario, un vivo es igual a valor. Y luego finalmente, un punto cambiado en vivo emite con el nuevo valor. Entonces, ¿dónde queremos calcular Alive? Bueno, un buen lugar para hacerlo sería en este setter HP. Entonces cada vez que cambia el HP, queremos comprobar si el personaje sigue vivo. Entonces eso solo va a estar en vivo es igual a HP es mayor que cero. Bien, así que eso se maneja. Ahora tenemos el evento cambiado en vivo. Todo esto debería activarse cuando el personaje alcanza cero HP. Detengamos el juego y volvamos a ejecutarlo y a ver si le pegamos con un arma, así, ¿se quita el personaje? ¿Va al estado de la muerte? Y podemos ver que la respuesta es sí. Por lo que toma 100 de daño. HP llega a cero. Un live se establece en false. La señal se emite. Y entonces eso significa sobre la máquina del estado enemigo que la transición desencadena porque esta señal golpeó. Este parche en el HSM enemigo emite el evento interno. Por lo que estos eventos de máquinas de estado están separados de las señales. Estos son solo para la máquina estatal en señales de IA del limbo en el contexto mayor de Gadot Entonces conseguimos ese evento de muerte interna, y eso nos hace pasar del estado de Chase al estado de la muerte. Dentro del estado de muerte, jugamos la animación muerte en Enter nos aseguramos que esto esté configurado en falso aquí, aunque. En teoría, no necesitarías hacer esto, pero no creo que vaya a doler nada para asegurarnos de que si estamos jugando al estado de muerte, que el personaje ya no esté vivo, creo que está bien. Y luego tenemos el método terminado, que en realidad estamos llamando desde la animación. Como viste antes, la animación de muerte aquí abajo lo llama justo al final de nuestra animación, y así es como hacemos que nuestros enemigos se vuelvan en vivo tan pronto como bajen a cero HP. Entonces sé que hay un montón de piezas que se juntan. Yo recomendaría para esta parte si aún no has estado descargando las instantáneas de las partes individuales que sí tomas la de este video si estás, ya las instantáneas de las partes individuales que sabes, te encuentras con hipo y ves dónde tal vez tu guión está un Entonces, lo que estamos haciendo aquí mismo con señales es el patrón de observador. Es realmente útil cuando quieres que una pieza de código responda a un cambio en una pieza diferente de tu código. Y algo así como C Sharp, esto se llamaría eventos y luego manejo de eventos. Pero en Gadot se llama señales. Esencialmente, son el mismo concepto, sin embargo. Entonces es patrón de observador. Si quieres buscar eso y leer más respecto. Así que eso va a ser un envoltorio para esto 18. Rotación y apuntación de proyectiles con carga de armas: Bien, entonces en este video, vamos a hacerlo para que nuestra lanza gire para mirar en la dirección correcta después instanciar y que podamos lanzar la lanza en la dirección correcta Entonces, cómo vamos a necesitar configurarlo está dentro de nuestro guión de arma dos D aquí. Entonces en nuestro juego como sobreviviente, probablemente queramos hacerlo para que un personaje pueda tener múltiples armas al mismo tiempo. Por lo tanto, en realidad tiene sentido tener algún tipo de gerente para todas estas armas. Entonces podemos crear un guión de carga de armas que sea evidente para esta arma dos D, y podríamos usarlo como una forma de muestra para resolver cosas como la importación del jugador para nuestras armas individualmente Entonces, hagamos clic derecho en el nodo del reproductor y agreguemos un nuevo nodo hijo. Voy a llamar a este nodo dos D, y luego vamos a renombrarlo para que sea carga de armas. inmediato vamos a padre arma dos D a carga de arma aquí, y debería cambiar el nombre del arma dos D para que sea simplemente como arma de lanza dejando claro lo que realmente sostiene Y luego hagamos clic en Carga de armas y agreguemos un guión. Entonces esto va a ser la carga de armas que puede ir en jugador, crear y luego en la parte superior, haremos la carga de armas de nombre de clase Entonces este va a ser un guión de manager para todas las armas que un jugador tenga equipado. Así que aquí podríamos simplemente tomar una referencia rápida a la entrada del jugador. Bien, y ahora podemos ir al guión de las armas de lanza, e vamos a insistir en que cada vez que tengamos un arma de lanza, tenemos la dependencia de que el padre es una carga de armas que será consistente a lo largo Entonces creo que la configuración está bien. Entonces voy a hacer var underscore loadout aquí dentro de nuestras armas dos guión D. Y esto será de tipo armamento de armas. Entonces listo, vamos a querer conseguir esa carga. Entonces digamos, subrayado loadout es igual a get parent, y debemos afirmar que el loadout El padre de un arma debe ser una carga de arma. Bien, y parece que podría haber establecido el nombre de la clase. ¿Son armas con S? Sí. Bien, entonces eso es una carga de armas aquí, no una carga de armas Bien, entonces tenemos una referencia al script de loadout padre Esto sí crea una dependencia, pero también facilita el acceso a las cosas que necesitamos. Entonces, en caso de que alguna vez decidimos que queríamos cambiar este patrón, voy a crear una función aquí abajo en la parte inferior para Obtener dirección. Entonces la función Get direction va a devolver un vector dos. Y en este caso, vamos a usar la carga para conseguirlo Así que devuelva la entrada de punto de carga de guión bajo. Dirección de puntos. Y así es como resolvemos la dirección, pero simplemente siempre podemos usar la función de dirección G para manejar eso. Entonces, si llamamos, digamos, obtener dirección en diez lugares diferentes, pero cambiamos la carga. Así que en realidad ya no usamos un loadout o tal vez el loadout no usa una entrada, entonces solo tenemos que entrar aquí una vez y cambiar Entonces tal vez la carga tenga una referencia directa a la dirección, así que simplemente la cambiamos así, y luego volvería a funcionar Pero en realidad necesito cambiar esto un poco porque no vamos a usar la dirección. Vamos a usar la dirección de orientación porque recuerda, la dirección es la entrada en bruto. Puede ser vector punto cero, pero nunca vamos a lanzar una lanza a los pies del personaje en este estilo de juego Así que en realidad queremos Enfrentar aquí, y lo llevaremos a Importar revestimiento de puntos. Así que realmente vamos a resolver la dirección a la que se enfrenta el personaje y en su lugar. Bien, así que tomemos esto Ponte enfrentando y donde lanzamos, solo haremos elenco para ponernos enfrentados en su lugar. Y movemos a nuestro personaje, ya lo vas a ver, podemos lanzar en la dirección correcta, y esto debería incluir también diagonales, así Bien, entonces esa es la mitad de lo que necesitamos que se haga ahí mismo. Ahora, también necesitamos rotar cualquier proyectil que instemos. Entonces, consigamos ese ángulo de rotación. Entonces, dentro del elenco, bajo donde creamos la escena del pacto para el proyectil, hagamos el ángulo de rotación de VR Y vamos a tomar el vector get facing. Vamos a convertir eso a un ángulo aquí, y creo que eso es en resplandor. Si hago clic derecho y hago símbolo Lou, podemos ver devuelve el ángulo del vector con respecto al eje X positivo en radianes Entonces eso sería cosas como Pi divididas por dos tipos de cosas. Bien, pero queremos girarlo para que la lanza u otros proyectiles estén orientados hacia la derecha por defecto como nuestro Entonces, si está mirando hacia arriba y el sprite, queremos rotar ese Pi dividido por dos o como 90 grados así que vamos a agregar Hi, que es una constante dividida por dos, y eso hará que sea de manera que esté mirando hacia la derecha por defecto Sin decirlo, es realmente más una cosa de prueba y error aquí Pero vamos a conseguir esa rotación. Entonces vamos a después instancia del proyectil y dijimos que es posición global, hagamos proyectil dot Rotate y esta función toma Entonces tenemos nuestro ángulo de rotación. De verdad, debería cambiarle el nombre para que sean anuncios rotados. Así que voy a recopilar dos veces ese Control R, y diremos rotar anuncios para resplandor, reemplazar todos, y eso se ve mucho más limpio ahí Así que guarda y corre, y ahí tenemos nuestras lanzas apuntando en la dirección correcta Y esto también debería funcionar con esencialmente cualquier proyectil Siempre y cuando esos proyectiles estén orientados hacia arriba por defecto, si no lo hacen, entonces puedes rotar este sprite individualmente en la escena de los proyectiles hasta que estén estén Entonces ahí tenemos nuestra puntería y rotaciones para los proyectiles Y para mostrar una cosa más, si dejo ir la dirección, entonces nuestra dirección es ahora vector 20, pero seguimos disparando a la derecha porque frente nunca se establecerá en vector dos punto cero. Y es por eso que usamos el revestimiento en lugar de la entrada de dirección en bruto. Bien, ese es un gran paso hecho ahí mismo. 19. Añadir efectos de sonido y música: Agreguemos algunos efectos de sonido a nuestro juego. Primero, voy a empezar por tener un efecto de sonido de lanzamiento, y luego tal vez cuando los enemigos lleguen a su estado de muerte, tenemos la opción de hacerlos tocar allí también un efecto de sonido. Probablemente me mantendría alejado de los sonidos de hit porque va a haber varios enemigos recibiendo golpes en cada segundo, y eso acabaría siendo, creo, demasiados efectos de sonido a la vez. No querrías abrumar demasiado a tu jugador. Entonces comencemos con esos dos. Entonces para el jugador arma lanza, digamos en el arma a D, agregaremos en un reproductor de sonido Así que en Export var audio player of type or audio stream player two D. Queremos que sean dos D porque estos proyectiles existen dentro del mundo del juego TD, por lo que tiene sentido afectar el audio basado en el posicionamiento espacial de la cámara y el proyectil y todo Entonces tomaremos el reproductor de audio y tendremos que ponerlo debajo aquí. Entonces para agregar nodo reproductor de audio, vamos a acercar aquí y clic derecho en Arma lanza, agregar nodo hijo Entonces queremos que el reproductor de stream dos D, agregue eso en debajo de ahí. Y queremos asignar un stream audio que podamos reproducir aquí. Entonces averiguaremos los efectos de sonido. Voy a colapsar todas las carpetas. Vamos a entrar en el audio. A ver. ¿Qué estaba usando? Creo que teníamos, como, efectos de sonido Blal Bien, déjame ponerme los auriculares aquí para que no salga por el micrófono. Bien, entonces dentro de una, creo que iba con slash 04, así podríamos hacer doble clic en eso, ir a la parte superior derecha y previsualizar Sí, creo que eso es lo que estaba usando en mi proyecto demo. Entonces tomemos el corte y pongamos eso en el arroyo aquí Entonces ahora solo podemos decirle a este reproductor de flujo de audio que reproduzca cada vez que lanzemos un proyectil Así que vamos a entrar en arma corriente. Y cuando tengamos el proyectil lanzado, diremos que si el reproductor de audio no es nulo, entonces le diremos que reproduzca su clip de audio actual Así que aquí abajo, después que nos instancia el proyectil, vamos a decir, yo reproductor de audio entonces vamos a decir reproductor de audio sí reproducir, y eso es básicamente todo lo que tenemos que hacer La razón por la que tenemos esta condición aquí es que para algunas armas, posible que en realidad no quieras que reproduzca ningún audio, así que simplemente nos saltaremos esa opción aquí. Ahora bien, una cosa que quiero señalar aquí es que estamos dando responsabilidades extras a este guión de armas. Por lo que ahora el arma dos D no sólo se encarga de instanciar los proyectiles, sino también decirle al reproductor de audio reproduzca cuando se instancie el proyectil contratando su propia referencia a la carga de armas y creando un Entonces están pasando algunas cosas ahora, no creo que esto sea abrumador y un problema para el juego, pero es algo a tener en cuenta. Si nota que sus scripts asumen demasiada responsabilidad, entonces es posible que desee considerar dividirlos en múltiples nodos con diferentes scripts y hacer que funcionen juntos como piezas individuales en lugar de un mega script gigante. Pero aún no estamos ahí. El guión tiene sólo 50 líneas de largo. No es realmente un problema. Si tuvieras tal vez dos o 300 líneas de código, probablemente llegaría al punto que necesitarías algunos subobjetos, yo pensaría. Pero no te preocupes demasiado por eso. La mayoría de los guiones de este curso son bastante simples. Solo quiero que ustedes sean conscientes de eso en el futuro que un guión puede volverse demasiado monolítico, y eso puede ser problemático a la larga Tenemos un arma de lanza. Necesitamos asignar el reproductor de audio para que realmente reproduzca audio. Así asignar y luego reproductor de flujo de audio. Ahora bien, si tocamos, deberíamos obtener nuestros efectos de sonido. Bien, sí, ahí vamos. Cada vez que instancia un proyectil Bien, ahora queremos tocar un efecto de sonido cuando nuestros orcos mueren Entonces entremos en la escena orca. Bien, da click en el orco, agrega un nuevo reproductor de AudioStream Si queremos, podría cambiarle el nombre a esto para que sea un reproductor de audio de muerte. Podríamos decir. Bien, entonces ahora nos gustaría encontrar un efecto de sonido de muerte adecuado. Jugando un poco con él, creo que creo que el enemigo Death 01 es demasiado. Incluso flash oh dos es un poco demasiado también. El caso es que va a haber enemigos cayendo como moscas en este tipo de juegos. Entonces necesitamos algo muy sutil o tal vez incluso ninguno en absoluto. Creo que estoy buscando algo más como el Step grass 03. Ahora bien, eso puede sonar un poco raro, pero creo que cualquier cosa que sea más larga que eso va a ser demasiado para ver cómo va, puede incluso eliminar esto por completo. Así que asignemos la hierba Step oh tres a la corriente aquí, y para decirle que reproduzca ese efecto de sonido en la muerte, vayamos al reproductor de animación. Abajo en la parte inferior izquierda, seleccionaremos la animación de muerte. Y agregaremos una nueva pista, agregaremos pista aquí, llamaremos al método en el reproductor de audio Death, y haremos clic derecho al inicio de esta animación, insertaremos la tecla, y queremos reproducir. Así que es como que estamos escribiendo un guión cuando estamos definiendo estos fotogramas clave de animación, excepto que tenemos la línea de tiempo, así podemos decir exactamente cuándo queremos que reproduzca esa animación, y es muy fácil moverlo a un punto diferente en el tiempo simplemente arrastrándolo a un fotograma clave diferente Así que podrías escribir todo esto escribiendo código de script GD si quisieras y simplemente saltarte el reproductor de animación Pero obviamente, el jugador de animación hace que sea mucho más fácil hacerlo visualmente. Bien, entonces ahora si tocamos, deberíamos conseguir que toquen ambos efectos de sonido. Para que puedas escuchar cuando los orcos bucean, sí toca ese pequeño efecto de sonido Es un poco tranquilo, pero tal vez esté bien. Si pensamos que las lanzas son demasiado fuertes en comparación, incluso podríamos tomar el reproductor de secuencias de audio spears y bajar un poco el decibelios de volumen aquí Y dale play y ejecutarlo una vez más. Incluso puedes editar esto mientras el juego se está ejecutando. Así que podríamos simplemente dejar esto abajo. Bien. Se puede ver que ya es mucho más silencioso. Mar, una de las cosas buenas de cado es que no tienes que cerrar necesariamente el juego para cambiar tus propiedades. Y vamos a golpear a un enemigo. Bien. Y la diferencia de volumen entre esos es un poco menos pronunciada. Entonces probablemente sea bueno ahora. Como un poco de bono para este video, si quieres agregar música, vamos al mundo, vamos al mundo, y agreguemos en un reproductor de audio strem, reproductor flujo de audio dos D, solo la nota predeterminada Entonces stream player aquí, y luego elige este, reproductor Audiostream Bien, entonces con nuestro reproductor AudioStream, vaya a la derecha, y vamos a querer que esto esté en reproducción automática Y creo que para hacerlo loop, en realidad tenemos que cargarlo desde el audio MP threes primero. Entonces volvamos a cerrar todo en la parte inferior izquierda, vamos a Audio, y tenemos la canción box jump del pack Th Red Hearts. Entonces vamos a llevar eso a la parte superior derecha. En realidad no es P tres. Es un punto OGG, pero ambos formatos para música son compatibles con KDO, por lo que funcionará bien Y luego queremos tomar esto y comprobar Loop on. Pero en realidad tal vez necesitemos hacer eso en la parte inferior izquierda. Así que haz doble clic en el OGG aquí. Bien, y luego revisa el bucle aquí. Y cuando llegue al final, debería hacer un bucle de todo el asunto. Bien, así que eso es bueno. Bien, entonces lo último antes de jugar el juego, voy a tomar el volumen DB y poner esto en negativo 20 porque creo que probablemente va a ser bastante ruidoso, de lo contrario. Entonces, vamos a darle a Play y veamos cómo va. Bien. Para que podamos escuchar la música, y sigue siendo bastante ruidosa. Entonces voy a llevar esto a negativo 30. Tal vez incluso negativo 40. Sí, eso probablemente sea un poco más apropiado. Entonces ahora tenemos el audio. Tenemos la música, y tenemos un efecto de sonido Enemy Death. Así que eso es algo básico ahí para efectos de sonido de audio y música dentro del juego, y podemos seguir adelante a partir de ahí. 20. Sistema de combate Singleton: Bien, entonces el proyectil básico que daña y combate funciona en este momento, pero realmente no sabemos cuánto daño se está infligiendo a los enemigos en el contexto del juego Entonces, una forma en que podríamos hacer eso que también mejoraría visualmente la jugabilidad sería el texto de combate flotante. Así que cada vez que uno de estos personajes recibe daño en la caja de daño, podemos comunicarnos con, digamos, un sistema de combate a instancia, texto de combate flotante en la posición en que recibían daño cada vez que reciben daño. Entonces esto significará que habrá muchos números flotando alrededor de la pantalla, pero creo que eso funciona bastante bien para el estilo de juego. Está muy basado en la acción, y queremos comentarios inmediatos cada vez que estamos dañando a los enemigos. Y también queremos ver los beneficios de subir de nivel nuestras habilidades, así como nuestro personaje se hace más fuerte. Para crear nuestro sistema, vamos a querer hacerlo como un objeto Singleton, es decir, que hay una referencia a esta clase o a este sistema a lo largo del juego Y si lo configuramos como carga automática, siempre estará ahí en segundo plano, y será fácilmente referenciable por También puedes implementar patrón Singleton en el propio script, pero lo haremos a la manera Gada, que es un poco más simple y fácil de entender Entonces en la cima aquí, solo voy a crear una nueva escena. Lo crearemos como otro nodo, y este será un nodo base. Si son dos aquí, puede cambiarle el nombre para que sea Sistema de combate. Entonces hagamos click derecho sobre él, adjuntemos un script, sistema de combate. Podemos guardar eso ya sea en la raíz o podemos crear una carpeta de sistemas en la que guardarla, que probablemente sería mi preferencia, y la crearé ahí dentro. Ahora queremos guardar este sistema de combate en la carpeta de sistemas. Entonces sistema de combate punto TSC guarda eso. Y ahora hagamos que sea una carga automática para que este script de nodo pueda ser referenciado a través de nuestro juego con solo usar el nombre. Entonces iré a la configuración del proyecto del proyecto. Entonces tenemos a Globals aquí. Y queremos agregar un nuevo TSCN como global. Entonces da click aquí, ve a Sistemas y luego haz TSCN. También puedes ver que puedes seleccionar un script de punto GD como sistema de combate, y lo que eso haría es crear una nueva instancia del script de nodo en tu juego tan pronto como se lance el juego Pero si usas el punto TSCN, entonces obtienes la ventaja de poder usar variables de exportación porque esta es una copia muy específica del sistema de combate Si hago doble clic en eso aquí y agrego esto como nombre de nodo del sistema de combate, entonces ahora tenemos este sistema de combate como Singleton global y lado de nuestro juego Y la diferencia entre cargar automáticamente un script punto GD y cargar automáticamente el SEN directamente es que si hacemos algo como Exportar var spawn count, integer igual a diez, entonces podemos establecer esto por aquí, entonces podemos establecer esto por aquí Pero si instancia un script que aún no se ha definido como una escena o un nodo, entonces no tendría ninguna capacidad de personalizar propiedades como esa de antemano. Ahora, estoy seguro de que hay formas de sortear eso, pero esa es una ventaja de usar punto TSE Bien, entonces tenemos nuestro sistema de combate. Vamos a querer algún tipo de función de reporte de daños. Entonces solo voy a sacar eso como un borrador. Aquí. Digamos función. Digamos reportar hit. Creo que eso tiene sentido. Digamos que tenemos un objetivo al que le pegaron, y podemos decir que no hay dos D simplemente podría ser cualquier cosa en el juego que se pudo golpear. Generalmente, eso sería como un cuerpo de personaje o un cuerpo estático. Pero solo usaremos la clase base para mayor flexibilidad. Y entonces tenemos aquí la cantidad de daños. Entonces P daño es un entero. Esto volverá nulo. Y luego en este sistema de combate, vamos a instancia de nuestra escena para el texto de combate flotante. Entonces subamos aquí a la cima y podemos decir en Export var escena de texto de combate flotante. Y esta será de tipo escena repleta. Y aquí abajo en Report Hit por ahora mismo, solo haremos un pase. O si quieres, incluso puedes hacer un error push y decir no implementado. Esto te daría un poco más de retroalimentación si alguna vez te olvidas de implementar un script en lugar de solo que ejecutaría la función y pasaría para que no hubiera ningún error, pero tampoco haría nada. Entonces creo que esto es un poco mejor durante el desarrollo, en realidad. Ahora saltemos a nuestro guión HRT Box two D. Entonces Control P, HRT Caja dos D. Y luego dentro de aquí, podemos hacer referencia al sistema de combate Bien, entonces el informe de puntos del sistema de combate golpeó, y queremos el objeto que el controlador de estadísticas está manejando. Entonces no creo que el controlador de estadísticas en realidad tenga una referencia a eso todavía. Si echamos un vistazo a la escena de los orcos muy rápido, hagamos clic en el Controlador de Estadísticas Podemos ver que no hay nada por aquí en el lado derecho para obtener una referencia al Oc. Podríamos simplemente hacer eso como un tipo de referencia get parent o podemos convertirlo en una variable de exportación. Si quieres asegurarte de que la conexión es más absoluta, entonces yo iría con en la exportación. Porque eso significaría que si por alguna razón mueves el controlador de estadísticas hacia abajo un nivel, como tú lo padre a otra cosa, entonces Get parent ya no devolvería al orco Entonces, si usamos en la exportación, podemos asegurarnos de que devuelve el c. Podríamos decir algo así como cuerpo o carácter, tal vez incluso objeto, manteniéndolo más genérico. Y entonces este solo puede ser el objeto para el que este controlador está administrando las estadísticas, y lo asignaré en la parte superior derecha al orco aquí Ahora bien, si volvemos a la caja Hurt, podemos usar aquí el objeto dot controller stat, y luego podemos pasar en el daño P daño. Bien, así eso le dará al sistema de combate todo lo que necesitamos saber sobre dónde colocar el texto y cuánto daño asignar al texto. 21. Animar texto de combate flotante: Ahora necesitamos el propio texto de combate flotante. Así que vamos a crear una nueva escena por aquí. Haga clic en más y haga la interfaz de usuario. Y vamos a hacer que el nodo base simplemente sea como texto de combate flotante. Pero el texto real lo asignaremos como etiqueta hijo. Y esto nos ayudará cuando estemos usando el reproductor de animación para animar porque no queremos cambiar la posición raíz Solo queremos cambiar la posición de los textos con respecto a la raíz del control de texto flotante Combat. Entonces, haz clic derecho aquí, agrega un nodo hijo, busca etiqueta. Y luego hagamos clic derecho sobre el texto de Combate flotante Reproductor de animación Adhild Bien, creo que eso es lo que necesitamos aquí, así que controlemos a S. Y podemos salvar esto. A lo mejor creamos una carpeta para UI. Esto es una especie de UI todavía. Así que vamos a crear una nueva carpeta. Voy a escribir la interfaz de usuario. Bien. Y luego flotante combate texto punto TSC y puede ir justo ahí Así que golpea a salvo. Bien. Y ahora necesitamos un guión adjunto a nuestra raíz aquí. Haré clic derecho sobre el texto flotante de Combat, adjuntaré un script, y lo crearemos en la carpeta UI, texto de combate flotante punto gD Vamos a querer una referencia a la etiqueta para poder manipularla aquí. Así control var etiqueta etiqueta. Entonces asignaremos la etiqueta aquí. Y queremos crear algún tipo de función inicializada. Si has usado Gado, probablemente sepas que hay una función subrayado y tejer aquí Esa función se utiliza para cuando se está creando un nodo en la escena. Pero en este caso, tenemos que esperar hasta que el objeto ya haya sido creado. Entonces es por eso que necesitamos crear. Entonces, si has usado Gadot por un tiempo, tal vez sepas que hay una función de subrayado y una función de TI Entonces esta es una función anulable donde puede ejecutar código antes de que se hayan establecido todas las propiedades para su Puede usarlo para pasar parámetros opcionales para establecer esas propiedades cuando esté creando un nodo a partir de una llamada a una función en lugar de existir dentro de una escena empaquetada como aquí, que es lo que suele hacer, simplemente configuraría la escena y luego la instancia de una escena a ritmo Entonces eso en realidad no es lo que queremos hacer. No estamos tratando de personalizar la función inicializada. Estamos tratando de hacer correr el texto de combate flotante cuando ya está en escena. Entonces yo solo quería hacer esa distinción ahí. Bien, entonces lo que queremos hacer en el script de texto de combate flotante es tener la opción de poner el texto en la etiqueta, y simplemente lo haremos directamente con una especie de función más delegada aquí con texto conjunto de funciones. Entonces pondremos el texto en la etiqueta, pero lo haremos operando a través del nodo raíz texto de combate flotante. Así que establece el texto, y diremos P text, que es una cadena, volveremos void, y tomaremos texto de punto de etiqueta y lo pondremos igual a texto P. Entonces una razón para hacer esto es que nuestro Bien, así que, por supuesto, vamos a querer establecer esto cada vez que instancia la escena de texto de combate flotante. Entonces puedes dar un nombre de clase aquí arriba para que podamos obtener fácilmente ese método de texto conjunto. Entonces nombre de clase, texto de combate flotante, vamos a golpear Controles ahí. Y ahora en nuestro sistema de combate, cada vez que denunciamos un golpe, queremos ejemplificar nuestra escena de texto de combate flotante. A ver, digamos que el texto Vara es de tipo texto de combate flotante. Y lo conseguimos instanciando la escena de texto de combate flotante Entonces entra y luego crea una instancia. Bien. Y luego queremos agregar eso de niño. Y ahora no queremos agregar realmente el texto como hijo del objetivo P porque cuando el objetivo P se elimina de la escena, como se reproduce la animación de muerte, también eliminaría sus nodos hijos como el texto de combate flotante. Entonces porque tenemos este sistema global, el sistema de combate para manejar el texto, creo que podríamos salirnos con la suya con solo hacer add child en el propio sistema, y luego agregamos el nodo de texto. Ahora necesitamos establecer la posición global a la posición del objetivo P. Entonces texto Posición global es igual a p punto objetivo posición global. Y si este bit no funciona o nos encontramos con otros problemas, entonces podemos obtener una referencia a, como, una capa de lienzo, la interfaz de usuario real y la posición ahí bajo algún tipo de padre similar a lo que estábamos haciendo con un proyectil, así que solo necesitamos un padre para contener todo el texto Pero la posición debería estar donde el enemigo recibió daños es la idea aquí. Ahora queremos tomar el texto y queremos establecer su texto. Así que establece el texto en una cadena de P daño. Entonces P daño es un número entero. Lo convertimos en una cadena diciendo STR y luego envolviendo el daño P entre paréntesis Y luego establecemos el texto a ese valor de cadena. Entonces, si configuramos aquí la escena de texto flotante del sistema de combate, así que ahora estoy mirando la escena Singleton, el sistema de combate, podemos ir por aquí y podemos cargar rápidamente nuestro texto de combate flotante Entonces tenemos esa referencia a la escena repleta de aquí a la derecha, así que debería ser instanciate vamos a darle a Play y darle una Bien, entonces vamos a hacer que se golpee el daño. Bien, sí, eso es lo que esperamos. Y ya ves, muy importante cuando la orca se quita de la escena, el texto no se quita a sí mismo Bien, entonces ahora solo manejamos la animación para el texto de combate flotante. Entonces lo hicimos en el reproductor de animación. Crea una nueva animación en la parte inferior. Nuevo. Y veamos. Podemos llamarlo como queramos. Voy a ir con flotar hacia arriba, y luego necesitamos agregar algunas propiedades para animar. Así que agregue la etiqueta de pista de propiedad de pista, específicamente la etiqueta porque queremos esa posición de desplazamiento. Entonces busquemos posición aquí. Bien. Ahora, no podemos ver nada porque no hay texto predeterminado en la etiqueta, así que voy a hacer clic en la etiqueta, y solo diré DEF por defecto aquí También es posible que queramos asignar un tema con una nueva fuente predeterminada que se ajuste un poco mejor a nuestro juego Pixar Entonces podemos hacerlo haciendo clic en el texto flotante de Combate. Yendo al tema en el lado derecho. Hacer nuevo tema, ampliar esto, seleccionar una fuente por defecto, y voy a elegir lo que ya instalamos al inicio del proyecto cinco X siete, que se puede ver es una buena fuente Pixar Entonces y luego si queremos reutilizar este tema, que probablemente hagamos. Haré clic derecho y guardaré esto en el proyecto, y la interfaz de usuario suena bien. Entonces solo diremos tema del juego. Dot TRS por ahora. Bien, si cerramos eso, puedes ver que ahora está referenciado por el nombre del archivo. Bien, ahora, un par de cosas. En el nodo raíz, el texto de combate flotante, podemos ver que básicamente tiene esta caja gigante. En realidad no necesitamos que sea tan grande. Así que ve a maquetación. Y luego en lugar de Anchors preset full rect, cambiemos eso para Entonces ahora el control es solo este pequeño punto de aquí arriba, y la etiqueta es de su propio tamaño de niño. Entonces otra cosa sobre el texto de combate flotante. Yo quiero tomar el mouse y cambiar el filtro para ignorarlo solo para que clics del mouse sigan atravesando en la pantalla, incluso si están tocando este texto de combate flotante, quiero que se ignoren los clics del mouse. Entonces, si hay alguna interfaz de usuario en la pantalla, esto no interferirá con presionar el botón UI. Eso es bastante importante. Y ahora volvemos a nuestro reproductor de animación, y vamos a fotogramas clave de la posición Entonces voy a hacer zoom en la parte inferior. Hagamos clic con el botón derecho del ratón en el fotograma clave de la posición, y vamos a moverla a donde queramos que esté la posición inicial Entonces el 00 es donde nuestro enemigo recibió daños. Creo que solo quiero asegurarme que comience en algún lugar por encima de eso. Entonces voy a w a mover el texto. Lo voy a mover hasta aquí, y luego fotografiaremos la posición aquí Así que ve al diseño en el lado derecho, y luego ve a transformar y fotograma clave la posición Entonces lo tengo en negativo 15 píxeles en la Y. Y entonces podemos ir a ¿ cuánto tiempo queremos que dure esto? A lo mejor medio segundo. También puede habilitar el ajuste si eso ayuda Bien, entonces 0.5 segundos. Y luego vamos a moverlo aquí arriba. Así que algo así y luego fotografíalo de nuevo en el lado derecho, solo usando el botón de fotograma clave Bien, y ahora se va a animar entre estos dos puntos Entonces, si voy al inicio y juego, se puede ver que va a animar ese movimiento de posición También podemos cambiar la duración completa a 0.5 segundos. Y entonces si nos gusta, podríamos simplemente tenerlo ure al final haciendo add track call method track track on the floating combat text root. Y luego haga clic derecho aquí, inserte y escriba quarre Bien, eso asegurará que el texto se limpie después se haga en esta escena sin tener que personalizar nada más, en realidad Podemos simplemente llamarlo desde la animación. Ahora bien, esto probablemente funcionaría, justo ahora mismo, pero es realmente básico. Vamos a probarlo. Solo asegúrate de que funcione. Bien, sí, yo no toqué la animación. Entonces eso es porque no configuré Autoplay aquí. Así que en la parte inferior derecha del reproductor de animación , Reproducción automática en carga Bien, ahora pulsamos Reproducir de nuevo, y estamos recibiendo nuestra animación. Bien, así que eso funciona a un nivel muy básico. No está nada mal. Pero mientras estamos aquí, ¿por qué no hacerlo más interesante? Entonces puedo agregar una pista en la pista de propiedad de la etiqueta, y vamos a hacer, digamos, escala. Bien, entonces esto nos permitirá hacerlo más grande o más pequeño a medida que avance el tiempo Así que vamos a enmarcarlo como es a la hora 00. Digamos alrededor de 0.15 segundos o supongo que estoy chasqueando a 0.16 67 Aquí realmente no importa. Y puedes cambiar tu ajuste en la parte inferior, derecha, por cierto, si quieres tener un ajuste de fotogramas clave más personalizable Así que vamos a etiquetar y luego transformar la escala. Tomaremos su tamaño y lo subiremos. Entonces tal vez como 1.5 o tal vez incluso dos. Podemos comenzar con eso y escalarlo si es necesario. Entonces voy a fotograma clave esto. Entonces ahora va a pasar de 1.0 a 2.0 tamaño. Y luego cuando se está desvaneciendo, queremos que vaya muy pequeño Así que vamos a llevarlo a, digamos, tamaño 0.1, y luego enmarcarlo clave. Bien. Entonces ahora si jugamos nuestra animación, es algo así. A lo mejor la escala es un poco demasiado grande en este segundo fotograma clave, así que solo la llevaré a digamos 1.5 Creo que eso es correcto. Hit play. Bien, eso funciona bastante bien. Y también podemos tomar la posición y compensarla tal vez a la derecha cuando esté llegando a ese punto de tamaño pico. Entonces tomemos la posición aquí con el modo de movimiento W y lo movemos hacia la derecha o algo así y luego lo enmarquemos con llave. Bien, y ahora volveremos a jugar. Así que ahora podemos ver cómo sale el texto a la derecha y luego de vuelta a la parte superior izquierda. Otra cosa que podríamos hacer sería cambiar el color o el Alfa con el tiempo. Así que agreguemos una pista en la pista de propiedad de la etiqueta, y haremos que este auto modular. Por lo que sólo afecta a esta etiqueta, no a ningún nodo hijo. Entonces voy a auto modular en la etiqueta. Vamos a hacer clic derecho en insertar una clave al inicio. Entonces este será nuestro blanco estándar con Alpha completo. Vayamos a 0.15 o donde sea que nuestros marcos para llaves estén encajando aquí e insertemos una llave 0.0 1667 para mi. Y luego cambiemos el color a rojo o algo así porque esto es por texto dañado. Y luego vamos hasta el final aquí. Haga clic derecho en insertar una clave, y la cambiaremos a digamos cero Alfa. Puede jugar. Entonces ahora es algo así. Creo que podría tener más sentido si intercambiamos el primer fotograma clave y éste Entonces voy a arrastrar esto en la línea de tiempo. Voy a tirar de la izquierda por aquí al punto 0.0 1667. Esto va por aquí. Entonces ahora empezará en rojo y pasará a blanco. Y podríamos hacer que termine con un color blanco también. Entonces voy a dar click aquí, ir al valor y cambiarlo a 255 para el verde y el azul. Por lo que termina blanco aunque totalmente transparente. Si juego algunas veces aquí, se siente muy degradado. Quiero decir, realmente es porque estamos atravesando un color a otro color a lo largo de un periodo de tiempo Entonces el gradiente sería así de izquierda a derecha. Al igual que, va de rojo a blanco a medida que avanza a través de la pantalla, excepto que en cambio lo estamos haciendo con el tiempo ahora Así que depende de ti cómo te gusta estar aquí. Podrías simplemente cambiar esto para que sea rojo, también. Entonces es solo rojo todo el tiempo. Lo único que cambia es la transparencia. Entonces tendrías que establecer el tercer punto clave del marco también, algo así. lo mejor nos gustaría que se oscurezca con el tiempo en su lugar, así podríamos tomar los valores aquí y hacerlo como un rojo oscuro, algo así y ver cómo va eso. Sí, eso se ve bastante bien, supongo. A lo mejor el rojo es un poco demasiado vibrante, así que podría tomar el inicial y hacerlo así como así. Y tal vez pueda ser un poco más brillante en la cima. Intentemos, bien, de más oscuro a brillante, y luego a oscuro otra vez. Entonces, eso parece funcionar bastante bien. A mí me gusta. Esto es puramente una cosa artística de preferencias personales. Así que en serio, lo que quieras, ve con eso. Bien, así que vamos a jugar y probarlo, y vamos a tener nuestro texto de daño cuanto golpeemos a los enemigos. Y me parece que simplemente se mueve demasiado rápido. Entonces tal vez necesitamos duplicar la duración de esta animación. Entonces, si hacemos clic en el reproductor de animación, podemos simplemente mover estos fotogramas clave a lo largo, y esta es una de las enormes ventajas de usar un editor de animación de fotogramas clave en lugar de, ya sabes, codificarlo duro Simplemente es más fácil iterar y hacer pequeños cambios para ajustarlo para que esté donde quieras que esté Entonces tomemos estos fotogramas clave para Kframe. Ponlo al final aquí en 1.0. Esto también debería ir a 1.0. Y puedes arrastrar una caja sobre varios fotogramas clave y moverlos todos a la vez así Así que puedo arrastrar una caja aquí, y movemos esto a, podríamos intentar como 0.5 segundos, lo que sea. Bien. Ahora, eso es bastante lento ahí. Entonces tal vez queremos que esto sea más como carga frontal. Vamos a traer eso por allá. Hit play. Bien. Es decir, no estoy segura. Tendremos que darle una oportunidad y ver cómo se ve realmente en la pantalla. Parece que lleva demasiado tiempo desvanecerse. Entonces tal vez esto sí pertenezca más como ahí. Un poco más adelante. Y tal vez 1.0 segundos es demasiado largo. Sólo voy a arrastrarlo ahí. Entonces, cualquiera que sea este punto de fotograma clave sea 0.8 segundos, esa será la duración del clip A lo mejor el texto también es demasiado pequeño. Entonces creo que una forma en la que podemos hacernos una idea es poner una copia en la escena mundial para que podamos verla aquí mismo como es. Bien, entonces ahí está nuestro texto Daf. Creo que en realidad podemos escribir clic aquí y hacer niños editables, y luego podemos hacer clic en el reproductor de animación y simplemente probarlo y ver aquí Si cambiamos a flotar, ¿funciona eso? Sí, como que lo hace. Bien. Sí, esto ayuda mucho. Para que puedas ver realmente cómo se verá en la jugabilidad real, porque aquí tenemos la escena del mock up. Bien, entonces tal vez tomemos la posición aquí, y voy a bajar esto un poco. Y parece que aquí también podemos fotogramas clave , así que eso es bueno Entonces, ¿esto realmente obtiene el 28 negativo 31? Hagamos que se desvanezca un poco más rápido. Así que nunca lo he probado de esta manera, específicamente. Parece que puedes fotogramas clave en la etiqueta, pero no puedes ajustar el reproductor de animación directamente cuando estás editando desde esta otra escena Así que aquí hay un poco de intercambio. Podría cambiar el auto modular en el primer fotograma. Y fotograma clave ahí. Bien, entonces eso funciona. Eso actualiza el reproductor de animación. Y luego puedo saltar a la escena de texto de combate flotante. Y quiero tomar el color modular y simplemente mover eso hacia la izquierda mucho más Entonces se pondrá rojo más rápido, pero realmente no me gustó cuando estuvo rojo todo el tiempo. Bien, y luego iré aquí y agregaré otro fotograma clave. Y en esto, voy a hacer que sea total transparencia. Por lo que estará visible en la pantalla por más tiempo. No se desvanecerá hasta cerca del final de la animación completa. Juguemos y lo intentaré una vez más. A lo mejor aquí también quiero que su color sea blanco también. Entonces voy a hacer eso. Así que solo tienes un destello de rojo. Una última cosa en la parte inferior derecha, si tomas el modo de interpolación aquí, puedes cambiarlo a cúbico Y voy a hacer eso por la posición, la escala y las propiedades auto moduladas Entonces, si miras muy de cerca aquí, pone un poco de curva en los lados izquierdo y derecho para eso. Entonces, si eso está funcionando como otros editores de línea de tiempo, lo que creo que sí, entonces eso va a significar que va a ser una curva de facilidad de entrada y salida en lugar una transición lineal para la animación aquí. Entonces probemos eso aquí y veamos si ese es el caso. Eso es lo que esperaría viniendo de otras cosas como el editor de video DaventirSolt Y sí parece tener esa flexibilización aquí. Así que lo volveré a cambiar muy rápido solo para comparar. Llevamos eso a lineal. Sí, ahora la velocidad es consistente. Entonces estaba escribiendo mi suposición. Así que eso nos puede dar un poco más de un empujón a la animación porque tiene sus momentos lentos y sus movimientos rápidos ahora Si golpeamos play, vamos a probar eso una vez más aquí, y creo que eso funciona justo por ahora. Entonces voy a golpear play. Lo probaremos. Siento que la animación es un poco larga aquí. Solo necesita tener ese momento de reventar donde podamos leerlo claramente Bien, así que una vez más, voy a acortar la animación solo un poco aquí Tirando todos los fotogramas clave a 0.7 ahí. La animación termina en 0.7. Juguemos una vez más y lo probemos. Creo que lo voy a terminar después de esto. Bien, entonces el desvanecimiento ahora es muy rápido. Bien, y luego para la posición cuando se está desvaneciendo, quiero mover eso también Entonces déjame arrastrar esto por aquí para que pueda verlo. Haga clic en la etiqueta, cerdo tipo de tal vez ahí. Voy a fotograma clave la posición, y luego arrastraré este punto hacia atrás hacia la derecha Creo que esto solo hará que la animación sea un poco más sutil. Bien. Sí, así que ahora cuando se está desvaneciendo, no se mueve tan lejos Y creo que eso es un poco más suave de ver. Así podríamos seguir así por mucho tiempo. Creo que entiendes la idea. Simplemente personaliza la animación a lo que creas que la haría sentir bien en términos de color, escala, transparencia, posicionamiento, etcétera Las cosas principales para este tutorial, aunque, en cuanto a código, son solo asegurarse de que tengas el sistema de combate. Es carga automática. Le dices que reporte el daño, y luego en ese reporte de daño, instancias el texto de combate, y agregas eso no como un hijo del nodo objetivo que recibió el daño, sino como algún nodo de sistemas o simplemente un nodo persistente que nunca va a quitarse. Y eliminas el texto de combate flotante en su animación llamando a Q libre. Y esa es básicamente la esencia todo lo demás es más detalle artístico 22. Movimiento enemigo P21 con seguimiento del jugador en Godot 4: Los proyectiles ya tienen la capacidad dañar y matar a un enemigo, pero nuestros enemigos en realidad no caminan hacia el jugador Entonces, para que los orcos se muevan hacia el jugador, primero, necesitan una referencia para el jugador Sería un poco complicado tener una referencia directa entre el orco y el jugador inicialmente porque no existen en la misma escena cuando comienza el juego Cuando engendramos enemigos en el mundo del juego, vienen de la escena repleta Entonces no existen aquí hasta que en realidad son puestos en escena por el sistema de desove Entonces lo que podríamos hacer en cambio es tener un recurso de referencia, podríamos llamarlo contexto de jugador, donde el jugador se pone en el recurso, y luego cada orco va a hacer referencia a ese recurso para recoger en el objetivo del jugador tan pronto como se genere en el mundo del juego Esto tendría algunos beneficios extra de poder intercambiar, digamos, el objetivo del jugador en todos los enemigos cambiando el recurso una vez. Incluso podríamos hacer que el sistema de combate establezca la referencia tan pronto como generen una copia del orco en la escena del juego Por lo que el sistema de desove podría esencialmente elegir qué jugador va a perseguir cada orco, y eso puede tener algunos beneficios adicionales sobre solo convertirlo en una referencia pura de diez, que ciertamente podrías hacer, en este caso, por el Pero eso también te ataría estrictamente a más de un juego de un solo jugador, lo cual está bien para este curso. Pero voy a tratar de mostrar cómo se puede lograr con el método del recurso. Entonces en la parte inferior izquierda de nuestro sistema de archivos, vamos a colapsar todo. Y vamos a entrar en personajes, y voy a hacer click derecho aquí, crear un nuevo guión. Llamemos a este jugador contexto. Y para heredas, hagámoslo recurso. Bien, cree el nuevo guión y asegúrese de abrirlo en el editor de guiones le dará el contexto del reproductor de nombre de clase. Bien, entonces esto es solo configurado para ser esencialmente una referencia compartida a un jugador específico dentro del juego. Entonces lo que necesitamos aquí va a ser jugador var. Y si tenemos una clase de jugador, vamos a hacer que se extienda eso. Entonces var player es de tipo player, y eso en realidad podría ser todo lo que realmente necesitamos aquí. Para ese recurso. Así que vamos al guión del jugador ahora, y dentro de player, voy a exportar una referencia al contexto. Entonces vamos a hacer un contexto var de exportación, y voy a llamar a esto de tipo player context, controles para guardarlo. Y podemos ver en el momento mismo tenemos un slot para recurso. Así que vamos a crear nuestro nuevo recurso. Y después quiero hacer click derecho sobre él y guardarlo en el proyecto. Lo guardaremos en digamos personajes. Podríamos ponerlo en jugador si queremos, entonces ¿por qué no? Y entonces lo llamaré jugador Contexto aquí punto TRS, que es para recursos También es posible que desee mover el contexto del jugador en GD al directorio del jugador de la diagonal del personaje Bien. Y ahora nuestros orcos necesitan un objetivo Para que podamos ir al orco NPC. Puede hacer clic aquí si es necesario. Diremos en Exportar var target es un contexto de jugador tipo. Si lo necesitabas, también podrías hacerlo como un contexto objetivo si solo necesitas dar un paso más genérico para esto, pero solo van a tener un objetivo. Así que supongo que hacer más específico llamándolo el contexto del jugador podría ser un poco mejor aquí para nuestro caso específico. Pero siéntete libre de convertirlo en un contexto objetivo si quieres que los enemigos vayan tras objetos inanimados o PNJ o algo así Y esto va a sostener la referencia al objetivo del jugador que persigue este NPC Entonces, pongámoslo directamente en el inspector. Entonces haga clic en OC y luego en el lado derecho, necesitamos darle el contexto del jugador. Entonces voy a hacer clic aquí. Carga rápida, contexto del jugador. Y notarás que aunque el orco y el jugador sean dos escenas completamente separadas, podemos hacer que hagan referencia al mismo recurso y a nuestro proyecto El recurso existe en el sistema de archivos, por lo que podemos hacer referencia a eso dentro de nuestras escenas empaquetadas individuales. Entonces, cuando realmente se les agregue a la misma escena mundial del juego, ambos tendrán la misma referencia. Entonces el jugador se va a establecer como el jugador en el contexto del jugador, y luego todo lo demás, los NPC van a leer de eso Y así es como se van a relacionar entre sí a través de este contexto intermediario. Entonces el script de NPC no va a hacer nada directamente aquí mismo Vamos a tener eso instalado en el estado de Chase. Pero lo último que tenemos que hacer antes de llegar al estado de persecución va a ser volver a la escena del jugador y dentro del jugador listo. Primero, queremos afirmar que el contexto no nulo porque es un poco necesario para nuestro juego Así que afirma contexto por lo que el recurso de contexto necesita establecerse aquí para que el jugador pueda hacerse el jugador del contexto Y entonces vamos a tomar contexto punto jugador igual a uno mismo. En realidad, esto va a salir al aire todos modos en cuanto no tengamos contexto porque esto no puede ser nulo. Por lo que esta afirmación puede que ni siquiera sea necesaria. Podemos simplemente cortarlo ahí y reducir la redundancia. Entonces, mientras tengamos esta línea y el jugador cargue primero, se establece el jugador en el contexto, y luego cargamos en todos los demás NPCs, podemos hacer que usen su estado hace para avanzar hacia el jugador ahora Entonces dentro de Ok, vamos a ir al estado de Chase. Entonces, en el estado de Chase, necesitamos obtener esa referencia al jugador. Entonces podemos conseguir eso como una referencia al orco, y entonces el orco tiene el contexto del jugador aquí Entonces hay algunos pasos quitados. Entonces vamos a ver. A lo mejor vamos a decir algo así como VR target, nodo dos D aquí. Entonces tenemos esta variable local. Y luego cada vez que entremos, el estado de Chase obtendremos una referencia a ese objetivo. Incluso puedes hacerlo en configuración si solo quieres que sea una cosa única. Lo pondré en Enter. Así que cada vez que ingresemos al estado, obtendremos el nuevo objetivo del contexto del jugador. Por lo tanto, el objetivo de subrayado es igual al agente punto objetivo jugador de puntos aquí Porque no sabemos cuál es el tipo de agente de NPC, no sabemos que tiene el objetivo y no sabemos que el objetivo tiene un jugador Bien, entonces este bit es un poco frágil porque básicamente hace la suposición de que el agente es un NPC, y hace la suposición de que el objetivo está establecido, y lo convierte en la suposición de que el jugador sigue siendo la propiedad en ese contexto de jugador para obtener el objetivo de Entonces esta línea específicamente podría romperse con bastante facilidad si cambias algunas de tus otras clases alrededor. Es posible que desee simplemente configurar algunas afirmaciones aquí también para ser solo señales de alerta temprana Entonces podríamos decir afirmar el agente punto objetivo y tal vez afirmar agente punto objetivo punto jugador Cambiemos esto de punto de agente Target a punto de agente Target es un NPC Bien, y creo que ya es suficiente. No cubre todos los casos, pero si cambiáramos esta clase por otra cosa completamente diferente, creo que estas dos líneas atraparían eso. Vamos a presionar Play y a ver si seguimos siendo buenos o si tenemos un problema aquí. Por lo que se esperaba que el agente fuera un NPC. A lo mejor lo que quiero es agente Target como NPC. Podría estar usando la palabra clave enlazada allí. Entonces aquí, en realidad quiero comprobar que el agente es un NPC El punto de agente Target es el contexto del jugador. Entonces nos aseguramos de que el agente sea un NPC para que podamos operarlo en él. Y ya no tenemos problemas . Entonces eso es bueno. Y lo último que solo tenemos que hacer es poner en el movimiento hacia esa ubicación objetivo, y lo vamos a hacer en función de actualización de subrayado Entonces vamos a poner en práctica eso. Bien, entonces tenemos que conseguir la posición objetivo. Así var Posición objetivo. Bien, entonces eso va a ser asignado desde subrayado punto objetivo Posición global Y entonces tenemos la posición de nuestro agente. Así var posición de agente. Eso va a ser igual al punto de agente Posición global. Entonces un agente técnicamente puede ser un nodo regular, creo, y por eso no aparece aquí. Posición de agente Savara. La razón por la que no puede inferir el tipo es porque no sabemos con certeza que el agente tiene esta propiedad de posición global Entonces sí necesitamos declararlo ahí como un vector dos. Bien, y luego queremos obtener la dirección entre estas dos ubicaciones. La dirección de Savara va a ser igual a la posición objetivo menos la posición de agente Y luego normalizamos este vector para obtener sólo una dirección. Por lo que normaliza el valor XY a una escala de 1.0. Ya no va a tener nada como la distancia. Simplemente va a ser la dirección del par, que se parecería mucho si estás haciendo input dot get vector para la entrada del teclado. Eso también sería en una escala 0-1 tanto para X como para Y. Bien, ahora que tenemos la dirección, solo tenemos que movernos en la velocidad que estamos asignando Entonces cada uno de nuestros personajes va a tener una velocidad en el juego, y vamos a obtener esta velocidad de nuestro controlador de estadísticas. Entonces creo que una buena forma de configurarlo sería usar el Blackboard Entonces, si hago clic en Enemy HSM, podemos pasar al plan Blackboard, y vamos a administrar, y agregaremos una variable Veamos las estadísticas. Esto puede ser una ruta de nodo, y luego vamos a asignar el controlador de estadísticas. Entonces ahora podemos usar eso en, digamos, nuestro guión de Chase y obtener la velocidad de él. Entonces, en la configuración, queremos obtener ese controlador de estadísticas. Entonces podríamos decir var, underscore stats es un controlador de estadísticas, y diremos que las estadísticas de subrayado sean iguales a Blackboard dot Git var, y estamos buscando la Entonces a partir de ahí, queremos obtener la velocidad. Entonces var velocidad aquí abajo en la parte inferior otra vez, que es un flotador va a ser igual a subrayar estadísticas punto Obtener velocidad O si queremos que eso sea aún más sencillo, solo podríamos decir velocidad de punto. Entonces ahora necesitamos una velocidad de tiempo de ejecución para nuestras estadísticas de personajes. Entonces entramos en el controlador de estadísticas, y vamos a crear una propiedad de velocidad aquí. Entonces para la velocidad, un flotador es igual a 100.0. Entonces esta es básicamente la velocidad de carrera para el personaje en tiempo de ejecución. Todavía no hemos establecido ningún recurso de definición para controlar básicamente cuáles serán las estadísticas iniciales de cada personaje como el orco o dama pondrá en un esqueleto Así que solo estamos construyendo esto paso a paso. Entonces ahora en el Chase State, tenemos nuestra dirección, tenemos nuestra velocidad, tenemos nuestro Delta, así que solo necesitamos mover al personaje una cierta cantidad. Entonces, cuando estás moviendo un cuerpo de personaje dos D, hay al menos dos formas de hacerlo. Una sería llamar a Move y slide, y eso estaría en el NPC Entonces este agente es cosa de NPC aquí arriba, creo que en realidad sería mejor si hiciéramos Var NPC de tipo NPC Y en cambio, decimos, subrayar NPC iguala agente como NPC Y entonces afirmamos que este NPC no es nulo. Entonces esto asegura que el agente sea un NPC, pero también tenemos una referencia al NPC para que podamos usar sus funciones de clase Así que eso hace que sea más fácil bajar aquí y decir cosas como NPC dot MOV y deslizar Puedes usar esto, y esto también tendría la capacidad de deslizarse a lo largo de cualquier colisión que encuentren los enemigos Pero vamos a hacer que nuestros enemigos ignoren colisión para este juego en parte porque te permite apretar más enemigos en la pantalla, y también en parte porque lo hace simple pero en realidad voy a hacer npc dot translate aquí Por lo que esto te permite moverte sin tener en cuenta la colisión. Entonces tiene la desventaja de tus personajes no van a poder deslizarse bordes como el borde del agua o un árbol o cosas así que se están interponiendo en el camino Pero también tiene la ventaja de hacer que el movimiento sea lo más simple posible, lo que significa que puedes meter más enemigos en la pantalla a la vez. Y creo que tal vez esto podría decirse que encaja un poco más al estilo de un vampiro sobreviviente Así que sólo vamos a hacer que nuestros enemigos sean cerebrales muertos simples. Entonces pc dot translate, solo lo estamos moviendo en una dirección por una cantidad. Entonces hacemos tiempos de dirección tiempos de velocidad Delta. Ahora bien, eso funcionaría bien, pero es posible que desee sacar ese bit a una variable más arriba y guardar nuestro movimiento, que es de tipo vector dos, y lo pondremos igual a este bit aquí. Entonces hacemos las matemáticas fuera de la llamada a la función, y luego lo llamamos en movimiento vector dos una vez que tenemos eso. Esto también ayudaría con la depuración porque puedes establecer un punto de interrupción allí y luego te mostraría a qué salió realmente el valor de movimiento antes de llamar a Mientras que, de lo contrario, si solo pones esto ahí, no sabrías lo que está pasando en la llamada de traducción a menos que saltes aquí. Así que un poco más limpio, un poco más fácil. Bien, así que voy a golpear play, y vamos a ver dónde estamos. Tenemos a los orcos corriendo hacia el jugador, y donde quiera que esté el jugador en la pantalla, van a tratar de ir a eso, que es exactamente lo que esperaríamos Ahora bien, sí se mueven bastante rápido, así que podría entrar en Stack Controller y tomar la velocidad predeterminada a algo así como, digamos, 40.0, y en juego Bien, y creo que eso es un poco más apropiado. En la mayoría de los casos, el enemigo debe moverse más lento el jugador para que al menos el jugador tenga la oportunidad de evitarlos. Podemos ver que todos están apilados uno encima del otro. Bien, entonces vamos a golpear play, y veremos que los orcos van a correr hacia el jugador Estos árboles no tienen ninguna configuración de colisión, pero aunque lo hicieran, seguirían corriendo por el cuerpo del jugador. Ahora, el jugador sigue colisionando también con los orcos. Y eso es porque los orcos todavía tienen forma y cuerpo de colisión, y el jugador se mueve usando mover y deslizar Así que nos toca a nosotros a donde queremos ir desde aquí. Podríamos mover a todos los orcos a una capa de colisión diferente usando colisión aquí Y probablemente lo haría ahora mismo. Vamos a configurar algunas capas de colisión. Así que edita los nombres de capa. Diremos que uno es mundo, dos es jugador, tres es enemigo, cuatro es proyectil, y eso debería ser bueno por ahora. Eso lo cerraremos. Así que queremos mover a nuestros enemigos a la capa enemiga, y apagaremos la máscara para que en realidad no estén buscando chocar con nada en este momento Entonces ahora si golpeamos play, nuestro jugador podrá caminar justo a través de los enemigos, pero aún así colisionaría con cualquier otra cosa Entonces, en realidad, no me gusta que se apilen entre sí. Entonces, a pesar de que Translate sería la función más rápida de ejecutar aquí para el estado de Chase. Y este es definitivamente el conjunto de líneas de código que va a ser el bloque de rendimiento para el proyecto porque estás teniendo cientos de potencialmente incluso miles de enemigos tratando de moverse al mismo tiempo usando este script de actualización. Y recuerden, casi todos los enemigos van a estar en el estado de Chase todo el tiempo hasta que sean realmente derrotados, y solo son derrotados por un segundo. Entonces estás hablando todo está en el estado de Chase al mismo tiempo que la actualización se ejecuta en cada fotograma. Entonces esta es la parte donde si necesitas optimizar algo, esta sería la misma. Vamos a agregar la colisión de nuevo para los orcos. Haremos que choquen consigo mismos, y veremos si eso solo nos da un mejor resultado El hecho de que los orcos estén uno encima del otro no es realmente lo ideal Entonces volveremos a poner eso. Entonces, en lugar de hacer NPC dot translate, lo que hacemos es decir subrayar NPC Velocity va a ser igual a este bit sin Entonces me voy a deshacer del Delta y diremos nueva velocidad. Bien. Y luego establecemos la vieja velocidad a la nueva velocidad. Y luego en lugar de llamar a NPC dot translate, llamamos npc dot move and slide Una vez más, quiero iterar esto toma aproximadamente el doble de potencia de procesamiento de mis pruebas Entonces, si pudieras tener 5 mil enemigos en pantalla al mismo tiempo antes de que te pongas muy mal de lag, ahora serán alrededor de 2 mil 500. Pero si puedes tener a los enemigos espaciados, tal vez no necesites 2.500 enemigos en la pantalla al mismo tiempo porque todos ocupan una posición completamente diferente. Entonces tal vez este es el camino a seguir. Entonces vayamos a la orca, y la haremos para que enmascara al enemigo También chocará con el jugador aquí. Entonces está mirando al jugador, al enemigo. Y vamos a convertirlo también en el mundo, pero no en los proyectiles. Bien. Y luego queremos ir al jugador ahora que en realidad estamos trabajando con diferentes capas de colisión, y estableceremos su capa de colisión que está bajo colisión Objeto dos D a jugador. Y entonces queremos que choque con el mundo. Y en realidad, creo que solo eso. Pensándolo de nuevo, los orcos, a lo mejor no quiero que choque con el jugador Quiero que el jugador específicamente pueda atravesar enemigos para que realmente pueda escapar. Entonces los enemigos chocarán con los enemigos y con el mundo, y vamos a golpear play a partir de ahí Incluso podríamos apagar el mundo en algún momento. Depende de lo que queramos. Bien, entonces vamos a ver. Parece que los enemigos no se están apilando uno encima del otro, lo que en realidad probablemente sea bueno. No ocuparán exactamente el mismo espacio. Si queremos que estén aún más espaciados, solo aumentaríamos el tamaño de esa forma de colisión. Aquí, si hago una pausa el juego muy rápido y vamos a Editor formas de colisión visibles, y podemos volver aquí dentro. Oh, tenemos que reiniciar el juego para eso, supongo. Bien, reiniciaremos, y luego podremos ver las formas de colisión. Entonces esta de aquí abajo, esa es la forma de colisión del orco El grande es el radio de golpe, así que podemos golpearlos alto, pero solo pueden chocar a los pies porque así es como definimos las formas de colisión antes Pero sí, con esta configuración, estarán un poco más espaciados entre sí. Y creo que me está gustando. 23. P22: Genera enemigos en una curva de tiempo: Puedes ver a nuestros enemigos trabajar. Van a tener un poco de colisión entre ellos. cual, ya sabes, después de ver esto es definitivamente el camino a seguir, más que el método de traducir. No obstante, todavía solo tenemos cuatro orcos al mismo tiempo. Queremos poder engendrar a un montón más tíos, y si vamos por ese estilo de superviviente, queremos que engendren fuera de la pantalla y luego vayan hacia el jugador Así que casi en círculo, necesitamos que solo aparezcan fuera de la pantalla y luego simplemente enjambre al jugador en el centro de la pantalla Entonces necesitaremos un sistema de desove para poder hacer eso. Vayamos al mundo, y agregaremos aquí un nuevo nodo del sistema. Haré clic derecho en Agregar un nodo hijo como nodo, y luego cambiaré el nombre de este para que sea sistema de desove o SponnorSystem, si Haga clic derecho sobre él, adjunte un guión. Entonces lo llamaremos sponsorsystem punto gD y lo voy a guardar en la carpeta de sistemas Y luego para nuestro sistema spawner, vamos a necesitar declarar un montón de propiedades diferentes que van a ser barras de exportación puedas personalizarlas en el inspector Entonces, antes que nada, necesitamos el margen de spawn, que es un float, y lo tendré por defecto en diez. Olvidé lo lejos que hay. Bien, entonces el margen de generación es la distancia mínima fuera la pantalla que los personajes pueden generar Eso es en píxeles. Me llamarán así para ser personajes en realidad y personajes ahí arriba también. Podríamos tener un mundo en el que engendremos PNJ, no necesariamente solo enemigos Por lo tanto, ayuda ser más genérico cuando no estás seguro del uso final de tu guión porque en realidad podrías querer que sea más flexible que solo hacer enemigos. Bien, a continuación, queremos el engendro Rango Extra. Bien, entonces en Export VR span rango extra, voy a hacer que esto vaya a 100. Bien, entonces esta es la distancia adicional que un enemigo podría generar lejos del borde de la pantalla además del margen de lapso Entonces, si tu margen de generación es diez y tu rango extra es de 100, entonces eso significa que la distancia de píxeles del borde de la cámara va a ser de diez a 110 píxeles Entonces necesitamos las definiciones para nuestros enemigos que vamos a engendrar Entonces esto debería ser básicamente una configuración que diga lo que puede engendrar bajo qué condiciones Así que digamos en la exportación var definiciones aleatorias, que es una matriz de definición de desove Bien, ahora no hemos definido esta clase. Va a ser un tipo de recurso. Es una definición que configuramos en el editor que usamos durante el juego. Entonces un recurso es el tipo perfecto para ese tipo de datos. Bien, entonces eso nos va a dar un error porque no tenemos definido el nombre de clase de definición de desove Hagámoslo. Ahora mismo. Voy a entrar en la raíz de nuestro proyecto y el sistema de archivos. Digamos, tal vez esto pertenezca a los sistemas porque es parte del sistema de desove Voy a hacer clic derecho, crear una carpeta, y diremos desove Y luego dentro de aquí, voy a hacer clic derecho, crear un nuevo script, y voy a decir aquí engendrando definición de subrayado, que es de tipo recurso Bien, crea eso y luego abre ese guión. Bien, y tenemos que dar un nombre de clase, definición de desove aquí en la parte superior, y nos preocuparemos por configurarlo un poco más tarde Entonces, para continuar con el sistema de desove, necesitamos un padre para donde realmente engendramos nuestros objetos Así que en Exportar var spawn parent es un nodo dos D referencia, el padre para cualquier objeto generado por el sistema Y entonces queremos la frecuencia. Entonces voy a hacer de eso una curva para que podamos controlar el temporizador. A medida que avanza el tiempo simplemente usando una curva y luego muestreando desde la curva Entonces, en lugar de establecer como diez períodos de tiempo diferentes, después de 30 segundos, se generan cada 0.5 segundos. Y luego después de 60 segundos, spa cada 0.4 segundos. Sólo podemos tenerlo como una curva. Y luego, no importa cuándo esté desove, solo obtendrá su siguiente cantidad de temporizador de esa curva Entonces, si vas a tener muchos valores, es más fácil definir una curva con una pendiente en lugar de ir uno por uno y ser como si X entonces Y en como un estilo más de diccionario. Entonces voy a decir exportar var span frecuencia, que es de tipo curva. Bien. Volveremos a eso en el inspector. Bien, lo siguiente que vamos a querer es una variable de tiempo de ejecución. Voy a llamarlo var random span stats. Y esto va a ser de tipo diccionario. Quiero dar el tipo de clave de diccionario y un tipo de valor. Y el tipo de valor son las estadísticas de spawn. Entonces esto va a corresponder el tipo de desove con las estadísticas para el desove en una proporción uno a uno en proporción uno a uno Entonces esto es específico del tiempo de ejecución, y esto es específico del editor. Y las estadísticas de spawn van a hacer un seguimiento de cuándo es la última vez que realmente generamos un objeto y cuántas veces hemos generado usando Así que vamos a crear nuestro objeto de estadísticas de generación. Haré clic derecho en desove y crearé un nuevo script. Lo llamaremos estadísticas de desove. En realidad va a tener este extender ref contado. Ahora podemos saltar a span Stats, y aquí arriba, le voy a dar salpicaduras de nombre de clase Y las dos cosas que quiero rastrear aquí son el recuento de engendros, que es un entero que comienza en cero y el último tiempo de generación, que es un flotador, y lo iniciaremos en Enfinit Esta será la última vez que se generara el objeto. Bien, entonces ahora en nuestro sistema de desove, tenemos esta relación Entonces, cuando iniciamos el sistema de desove, queremos tomar las definiciones y queremos crear un nuevo span stats para cada una de las definiciones Entonces esto maneja los datos de tiempo de ejecución. Esto maneja los detalles del editor para nuestra configuración uno a uno aquí. Entonces, si queremos obtener las estadísticas de span, solo podemos hacer referencia a la definición de span, e inmediatamente escupirá las estadísticas de span que corresponden con eso Y así es en pocas palabras como funcionan los diccionarios. Tienes una clave, y te dará un valor, y es muy útil para relacionar dos objetos diferentes entre sí. Así que vamos a configurar nuestra función de sistema listo. Entonces digamos que la función subrayado listo va a devolver void Y queremos decir para definición en definiciones aleatorias, queremos tomar las estadísticas de spawn aleatorias, y queremos asignar la clave de definición a nuestro valor, que va a ser una nueva estadística de spawn Entonces spawn statts punto n Bien. Y ahora tenemos uno de estos objetos para cada definición, y están vinculados en uno a uno de definición de desove como clave y span stats como el valor Entonces ahora se vuelve muy fácil buscar las estadísticas de spawn para la definición Bien, y digamos que el siguiente tiempo de generación va a ser igual a la frecuencia de engendro, que es la curva, y probamos en la curva el tiempo transcurrido desde que comenzó el juego Entonces necesitamos algunas variables más aquí arriba, en realidad. Vamos a necesitar el tiempo transcurrido var, que es el tiempo desde que el sistema de desove ha entrado en el mundo del juego Podemos crear una variable de temporizador. Entonces VarsPawtr es un flotador de tipo cero, cero. Dado que este va a ser un temporizador interno, está bien tener un nodo que administre su propio seguimiento del tiempo. Así que intentaremos hacerlo con un sistema span en lugar crear un objeto temporizador real en el mundo del juego. Entonces el sistema de desove va a manejar su propio tiempo para esta instancia Y entonces el próximo tiempo de desove del spa va a ser básicamente cuánto tiempo estamos esperando para este próximo spa Vamos a configurar la función de temporizador aquí, proceso de subrayado de función, y eso va a ser Delta como parámetro, devuelve void Vamos a tomar el tiempo transcurrido y sumar el Delta, que es el tiempo desde la última llamada de proceso Así que el tiempo transcurrido más equivale a Delta. Y luego queremos tomar el temporizador de spawn y plus es igual al Delta también, ya que estamos haciendo un seguimiento de cuánto tiempo desde que ocurrió el spawn Y diremos que el temporizador de desove es mayor o igual al siguiente tiempo de desove, entonces vamos a hacer un spa aleatorio Entonces lapso aleatorio aquí, y luego después de eso, tomaremos el temporizador de engendro Y en lugar de establecer eso directamente en Zal, voy a menos es igual al siguiente tiempo de desove porque podría haber un poco de tiempo de resto, especialmente si llegamos a intervalos de tiempo de lapso realmente pequeños Entonces creo que es un poco mejor hacerlo más preciso así. Y luego diremos que el próximo tiempo de generación va a ser un muestreo de la curva de frecuencia Así es igual a muestra de punto de frecuencia de desove, y estamos muestreando el tiempo transcurrido. Entonces básicamente en la curva XY, es una gráfica donde X es cuánto tiempo ha transcurrido desde que el sistema entró en escena Y entonces Y es cuánto tiempo esperar para el siguiente lapso. Entonces, sea cual sea el tiempo transcurrido, habrá un nuevo valor que podamos obtener de la curva para establecer nuestro próximo tiempo de generación en Bien, unas pocas líneas más, y hagamos nuestra función de engendro aleatorio, hasta ahora span aleatorio Tipo de devolución de vacío. Entonces, lo que tenemos que hacer es obtener nuestra definición de desove que queremos engendrar Entonces esa va a ser una selección aleatoria basada en una ponderación de cada una de las definiciones para determinar qué objeto va a ser span o no spawn Bien, voy a pasar aquí por ahora mismo porque la lógica para el desove se va a complicar un poco más Yo sólo quiero hacerlo para que por lo menos podamos verlo funcionando en el mundo del juego por ahora mismo. Así que de vuelta en dos vista D, tomemos el sistema spawner y asignaremos este bon parent al nodo enemigo. ¿Bien? Entonces así, deberían ser enemigos. Esta frecuencia de enlace va a ser una nueva curva. Así que vamos a seguir esta curva, y podemos definir valores. Entonces, si puedes acercarte aquí, eso te ayudará. El dominio Min en el dominio Max va a ser básicamente cuántos segundos en el juego lo tenemos. Entonces podrías decir algo como 300 segundos o 120 segundos. Por mucho tiempo que pienses que debería ser el nivel, eso sería lo que te gustaría hacer el dominio máximo. Entonces, si tienes un tiempo final para tu nivel y luego después de eso, el nivel termina, entonces eso sería perfecto para el dominio Max aquí. El valor X Y, lo que queremos obtener siempre que muestremos el valor X. Entonces, ¿cuánto tiempo debe estar entre los engendros? Tal vez dos como el valor máximo sería entonces subimos aquí a la curva y dejamos clic para establecer un punto, y simplemente controlamos eso. Entonces, en general, al inicio de un nivel, querrías menos engendros que al final Entonces, si como que sacamos esto aquí arriba y decimos, tal vez solo cada 1.5 segundos, se genere un personaje, y luego pasamos hacia la derecha y dejamos clic a la izquierda y tiramos hacia abajo este punto de fotograma clave a algo como esto donde podemos decir cada tal vez no 0.2 Oh, quizá alguna vez 0.2 segundos. Así que cada 0.2 segundos, un enemigo puede engendrar. Y como que tenemos esta curva de aquí a aquí. También puedes hacer clic en los puntos, y hay un ajustador de curvas si necesitas ponerte un poco elegante con esto Entonces ahora mismo, si lo muestreamos, digamos a los 75 segundos del nivel de juego, eso significaría que el tiempo de generación sería de aproximadamente 1.2 aquí Podemos ver eso desde donde el XY se cruza en la línea. Entonces de igual manera, si íbamos hasta el 225, entonces sería aproximadamente medio segundo entre la frecuencia de desove enemiga Entonces la dificultad se vuelve más dura a medida que avanza el nivel. Y solo podemos ajustar esto. Incluso puedes establecer un tercer punto en el medio si necesitas así. Tal vez lo necesites para aplanar por un tiempo y luego ponerte muy duro Control E para deshacer. Y creo que puedes hacer click derecho sobre un nodo para eliminarlo de la gráfica. Lo más probable es que dos puntos vayan a ser lo suficientemente buenos porque puedes controlar eso con los mangos si necesitas cambiar esta tasa a cambiar esta tasa a que se vuelve más difícil. Pero podríamos hacer eso. Ahora, personalmente voy a tomar este camino por aquí a la izquierda porque en nuestras pruebas, realmente no quiero probar pasados 2 minutos. Solo quiero que sea de ritmo rápido para que pueda mostrar cómo va a funcionar más adelante Pero en tu juego real, siéntete libre de tener una curva de desove mucho más larga y más dibujada Entonces ahora mismo, después de 120 segundos aquí, sólo va a quedar plano para el resto. Y eso está bien para mí ahora mismo. Bien, ahora vamos a crear una definición de desove. Aquí arriba. Vamos a añadir uno. Necesitamos crear un nuevo recurso para la definición de desove Así que nueva definición de desove, haremos clic derecho y guardaremos eso Vamos a entrar en personajes, enemigos. Y puedo poner esto en la misma carpeta donde está el orco porque vamos a llamarlo desove orco Definición o simplemente desove de orcos. Creo que el desove de orcos está bien. Dot TR, sí, lo guardamos. Pero claro, esto aún no tiene nada asociado con ello. Así que tenemos que agregar en qué escena empaquetada en realidad vamos a instanciar cada vez que engendremos Bien, entonces en la definición de desove, guión. Vamos a agregar exportar la vR la escena, que es un tipo de escena empaquetada. Y también podemos agregar un peso var de exportación, que será un flotador de 1.0. Entonces tenemos la escena para engendrar y la cantidad de preferencia para seleccionar esta escena como la elección aleatoria de spawn Entonces, cuando seleccionamos aleatoriamente, podríamos tener como tres tipos, y cada uno de ellos tiene un peso diferente. Entonces, si uno tiene un peso de tres y el otro tiene un peso de uno, entonces el que tiene un peso de tres tiene tres veces las probabilidades de ser seleccionado como el que tiene un peso de uno. Y esa es solo una forma en que podemos hacerlo un poco más sesgado en la aleatoriedad Entonces no es del todo aleatorio. Es que cada elección tiene un peso para ello, y el peso determina las probabilidades. En el esquema de la selección aleatoria. Por lo que hacemos clic en sistema de desove ahora. Ok el desove ahora va a tener una referencia de escena, así que cargamos rápidamente nuestra escena Ok Bien, ahora eso nos da lo que necesitamos. Entonces, para el spawn aleatorio, voy a hacerlo lo más simple posible ahora mismo obteniendo la primera definición en la lista y luego instanciando Hasta ahora instancia, que será un no dos D es igual a las definiciones aleatorias en la posición cero. Y vamos a conseguir la escena, y vamos a instanciar Bien, entonces ahora tenemos a nuestro Oc. Esa es la posición cero y el desove de orcos. Entonces tomaremos eso y lo agregaremos al padre aleatorio o al padre spawn Así que engendrar punto padre Ad hijo de la instancia, solo vamos a tener la instancia ir a la posición 00 por ahora mismo Nos preocuparemos por su posicionamiento aleatorio más adelante. Y entonces podemos ver que la gestión de span ya está manejada aquí fuera de la función random spawn Entonces, honestamente, eso en realidad podría ser todo lo que necesitamos. Para propósitos de prueba, voy a tomar esto y hacerlo como 10 segundos por aquí, solo para que podamos ver realmente la rampa de desove si funciona, y vamos a golpear play. Entonces veamos. ¿Tenemos algún personaje viniendo a las 00? Oh, sí, sí, puedo verlos ahí mismo. Bien, entonces aquí están nuestros orcos. Se puede ver que está desove cada vez más rápido medida que pasa el tiempo Entonces ya básicamente alcanzamos el pico de desove de orcos, y nuestras lanzas pueden simplemente atravesarlas porque nuestra lanza no tiene conteo máximo de golpes, por lo que es muy fácil ganar Pero puedes ver cómo la curva lo hace para que podamos aumentar fácilmente el desove a medida que pasa el tiempo, y esa es solo una característica genial que realmente me gusta mucho Es mucho mejor trabajar que definir en como a los 10 segundos, ahora la tasa de generación es 1.0, y a los 20 segundos, ahora es 0.9 Así que ahora puedes simplemente todos los valores para todo el tiempo, básicamente ser manejados por esta curva, y simplemente es mucho más fácil editarlos. Pierdes precisión, pero se vuelve mucho más sencillo darte una idea general de lo que necesitas para estos valores. Y aún puedes, ya sabes, dar clic y establecer valores absolutos. Entonces en puntos aquí, puedes ver que puedes establecer las posiciones XY exactas para esos puntos si necesitas ponerte realmente técnico. Pero en la mayoría de los casos, como dije, sólo dos puntos en una curva van a ser lo suficientemente buenos. Entonces todavía hay mucho que agregar al sistema de desove, pero este es un comienzo bastante bueno para lo que necesitamos 24. P23 Aparejo fuera de pantalla con desplazamiento calculado: Bien, entonces ya tenemos nuestro desove funcionando. Pero el problema es que los personajes solo están desove en el punto 00 donde en realidad queremos que se generen fuera la cámara donde quiera que esté mirando nuestra cámara Así que siempre parece que vienen de algún lugar muy lejano, pero en serio, solo vienen de un poco lejos de lo que podemos ver. Y luego van a nadar al jugador lugar de desovar en el punto 00 Así que vamos a trabajar en eso. Bien, entonces en nuestro script de sistema de llave, vamos a volver a entrar en él en un lapso aleatorio Entonces en este momento el engendro aleatorio no es muy aleatorio. Trabajemos en desovar al enemigo fuera de la pantalla. Así que necesitamos obtener una nueva ubicación para donde estamos generando la instancia Entonces aquí abajo, agreguemos en una posición de desove var. Entonces ese va a ser un vector dos. Y vamos a conseguir eso de Obtener posición de engendro fuera de cámara. Entonces queremos generar una posición de span que esté fuera de la cámara. Entonces eso va a involucrar algunas matemáticas y la ventana gráfica actual de la propia cámara Así que vamos a crear nuestra función, Obtener posición span, fuera de cámara. Entonces lo primero que tenemos que hacer es conseguir la cámara TD que está actualmente activa, lo que nuestro verdadero jugador humano está mirando en la pantalla para que podamos quedarnos fuera de eso cuando engendremos Entonces nuestra cámara va a ser igual a Get viewport. Entonces básicamente, estamos viendo lo que el jugador puede ver actualmente, y vamos a conseguir la cámara dos D que el jugador está usando para ver la ventana gráfica Entonces tenemos acceso a esa cámara tal vez incluso tenga sentido marcar esto como una cámara dos D. Así que podríamos tener una revisión de guardia si nos gusta aquí, diciendo que si la cámara es nula, lo que probablemente nunca debería suceder, pero en teoría, si pudiera, entonces queremos empujar un error de que no hay cámara, no hay cámara dos D que se encuentran en viewport Tal vez eso podría ocurrir si por alguna razón estás usando una cámara de tres D y simplemente no hay una cámara dos D. Supongo que eso haría que desencadenara un error. Entonces es posible. Bien, entonces si eso ocurre, entonces hay un problema importante en el juego. Sólo devolvemos vector punto cero. Eso pasa y vamos a empujar el error y dejar que el desarrollador se entere, Oh, por qué no hay cámara en el juego. Bien, pero asumiendo que tenemos una cámara, en realidad podemos hacer las cuentas. Entonces primero, queremos obtener la posición central de la cámara. Vamos a hacer VR camera center es un vector dos, y queremos que la cámara doc posición global para eso. Sí, así como así. Y entonces queremos el tamaño de la cámara. Entonces, qué tan grande es la cámara en la dimensión X y la dimensión Y. Entonces ese debería ser otro vector dos. Entonces diremos que el tamaño de la cámara VR del vector dos va a ser igual al vector dos, y obtenemos el tamaño de la ventana gráfica Así que consigue el tamaño de punto de la ventana gráfica, y luego queremos dividirlo por la cámara Zoom Bien, entonces la razón de eso es que nuestra cámara, especialmente en un juego de dos D Pixar, si hago clic en la cámara dos D aquí arriba, y luego miramos por aquí en el Zoom, entonces puedes ver que nuestro Zoom realidad puede tomar la ventana gráfica y escalarla en cuatro o cinco veces para que podamos ver bien nuestro Pixar Por eso tenemos que asegurarnos que incluso si estamos viendo, como, digamos, 12 80 por 720 píxeles, si acercamos un factor de cinco, entonces el tamaño de nuestra cámara en realidad se reduce a esos nuevos valores basados en el Zoom Entonces es por eso que necesitamos hacer ese ajuste. Entonces, a continuación, tenemos la cámara VR rect, que es una rect dos tipo D o rect dos Y esta es una forma rectangular que representa los límites de nuestra cámara Se basa en el tamaño. Entonces, para las matemáticas aquí, estamos construyendo un nuevo rectángulo haciendo Rectángulo dos y luego paréntesis Y nuestro primer parámetro es el centro de la cámara menos el tamaño de la cámara. Y luego multiplicamos eso por 0.5. Y luego para la segunda dimensión, solo tenemos el tamaño de la cámara. Así que eso nos da la caja rectangular apropiada que representa la cámara en pantalla. A continuación, queremos seleccionar aleatoriamente una arista de la que vamos a usar para generar a los enemigos Entonces nuestra cámara es una caja, así que tiene cuatro bordes, y básicamente podemos engendrar a nuestros enemigos arriba, abajo abajo, a la izquierda o a la derecha Entonces solo queremos elegir uno de esos bordes, y como queremos igualar la distribución, simplemente lo haremos al azar. Y entonces no hay esperas. Entonces, en esencia, solo debería significar que vienen de todas las direcciones de manera bastante consistente. Así que si decimos var edge, y vamos a tener que ser un valor entero, y va a ser igual a Rand I para entero. ¿Le vamos a dar cuatro por ciento? El signo de porcentaje aquí significa resto, entonces es el resto de dividirlo por cuatro, lo que significa que o bien será cero, uno, dos o tres, y esos representan nuestros cuatro bordes. Bien, entonces necesitamos una compensación. ¿Qué tan lejos del borde queremos realmente engendrar a nuestro enemigo No queremos que engendren directamente en el borde porque entonces sería visible en la pantalla cuando se instancie en el mundo del juego, y eso se vería un poco funky Entonces digamos var offset, y eso va a ser un float creo aquí, igual a span underscore margin plus random float Bien, así que básicamente estamos generando un flotador aleatorio aquí y vamos a multiplicar eso por el rango extra span. Entonces F aleatorio puede ser 0-1 0.0. Entonces un valor de cero veces nuestro rango extra de span nos va a dar una distancia extra de desove de cero Y si es 1.0, va a dar 100 porque eso es lo que tenemos establecido la propiedad span extra range. Y si tenemos algo en el medio, entonces vamos a obtener algún valor de píxeles 0-100 Además de nuestro margen de span, dándonos la compensación total. Bien, entonces vamos a decir var spa position, y eso va a ser asignado a un vector 20 aquí. Cero todas las tapas la constante, más bien. Bien. Agrega algunas líneas más. Y diremos si el borde es menor o igual a uno, entonces estamos tratando eso como la parte superior o inferior. Entonces tomemos nuestra ventaja y haremos una declaración de coincidencia con ella para que podamos calcular la posición del hijo en función de qué borde estamos usando realmente. Entonces digamos match edge, y default, vamos a empujar un error manejado. Número de borde, porcentaje s borde porcentual. Entonces tener eso es algo de ayuda si olvidamos, por alguna razón, poner en uno de los casos. Ahora podemos hacer coincidir el entero de borde un valor Enum si queremos ser un poco más descriptivos verbalmente aquí Entonces, si vamos aquí arriba, voy a declarar una enumeración, digamos enum edge, y vamos a tener top como cero, abajo como uno, izquierda como dos, y derecha como tres Bien, entonces ahora, si bajamos aquí y hacemos coincidir el borde con esos valores, podríamos decir edge dot top, si no me equivoco. Aguanta un minuto. Parece que aquí hay un pequeño problema. Aún así, necesito poner signo igual aquí para el rect de la cámara. Bien, así que eso va a funcionar. Ahora podemos bajar aquí a donde estábamos haciendo la coincidencia de Enum, y realmente queremos poner en el código aquí Entonces la posición de generación X para la parte superior va a ser igual a un flotador aleatorio de un rango Entonces decimos Rnf rango de subrayado, y vamos desde el rectángulo de cámara punto posición punto punto X a cámara punto posición punto X más cámara tamaño punto punto X. Así que para un rectángulo tutti, la posición X siempre va a estar Entonces, si le agregas la talla X a eso, entonces llegarías aquí del lado derecho. Entonces, si vamos a ir por la cima, queremos posicionarnos en algún lugar entre aquí y aquí. Entonces por eso tomamos el valor aleatorio de la posición y luego la posición más el tamaño. Así que eso nos permite llegar a algún lugar entre esta línea aquí mismo. Y entonces tenemos que hacer la posición Y, por supuesto. Así que la posición de generación Y va a ser igual a la cámara Rect. Posición de punto, punto, Y. Menos el desplazamiento. Entonces estamos restando el desplazamiento porque cuando restas un valor de Y, realidad estás subiendo en Entonces tenemos la posición Y, que es la parte superior de nuestro rectángulo. Entonces, déjame sacar pintura aquí mismo. La posición Y está aquí arriba, ¿verdad? Más específicamente, sería el valor Y el que nos lleve al punto 00 en el rectángulo. Entonces tomas el offset, que va a ser algún valor aleatorio aquí arriba. Entonces nuestro enemigo va a estar especie de desove en esta zona, en términos generales , y esto se basa en lo que sea que el desplazamiento Y se generó aleatoriamente para ser Entonces tenemos nuestro margen de diez píxeles, y luego tenemos 110 píxeles aquí como nuestro área de margen extra más, y luego nuestros enemigos pueden engendrar en algún lugar dentro de aquí por el valor máximo Bien, ojalá, eso tiene sentido. Y luego simplemente hacemos lo mismo para todos los demás bordes. Así borde punto inferior. Va a ser precisamente esta línea de aquí arriba. Y entonces la posición de span Y va a ser un poco diferente. Así que queremos spawn position punto Y es igual cámara rect punto posición punto Y más la cámara rect dot size punto Y. Así que eso nos lleva la parte inferior del rectángulo Porque ahora estamos agregando el tamaño Y, que nos tira hacia abajo a esta zona inferior. Y luego solo le agregamos el offset a eso. Entonces más offset y nota que estamos sumando el offset porque queremos ir más abajo debajo de la caja de la cámara, pero en la parte superior, restamos el offset Eso es muy importante. Ahora solo hacemos lo mismo con la izquierda y la derecha. Así borde punto a la izquierda, que es nuestra enum de dos Y eso va a ser posición de generación punto X igual, cámara rect punto posición punto y menos el desplazamiento porque vamos a la izquierda en nuestro cuadro, así que queremos desplazar hacia la Eso es todo para la posición de spa X, y es POS de spa, no posición de spa. Yo lo abrevié. Entonces spa post Y ahora va a ser igual a, y tomamos un rango F aleatorio entre el rectángulo o cámara, punto posición punto Y. Así que esa va a ser la parte superior de nuestra caja. Y entonces el otro lado de aleatorio va a ser el fondo de nuestra caja. Así que esa va a ser cámara destrozada punto posición punto Y más cámara naufragio tamaño punto Y. Así que cuando añadimos el tamaño, una vez más, vamos bajando al fondo Entonces nuestra posición de span verticalmente para izquierda y derecha está en algún lugar de esta línea aquí mismo. Y luego finalmente, borde punto derecho todas las tapas. Va a tener la posición span X de cámara Rect punto posición punto X más la cámara dimensionamos punto X más el offset Entonces lo mismo. Tenemos una caja por aquí y una caja por aquí, y queremos compensar a la derecha o a la izquierda si estamos desove a la izquierda o a la derecha Déjame verificarlo dos veces. Bien, posición X más tamaño punto X más desplazamiento. Bien, eso parece correcto. Por supuesto, lo probaremos en juego. Y entonces la posición de span Y debería ser la misma porque todavía estamos lidiando con esa vertical recogiendo un punto aleatorio entre aquí y aquí y aquí y aquí para una para la generación izquierda y derecha. Bien, entonces ese debería ser básicamente nuestro código de posición span. Y luego queremos devolver la posición span. Entonces esta función está bien tal como está. No está tan mal. Si se volviera un poco más grande, probablemente simplemente sacaría esto a otra función. Honestamente, podríamos porque sentí la necesidad de poner este comentario en el código. Entonces si quisiera, podríamos decir función, guión bajo, calcular el engendro final, que volverá en un vector dos Y luego ponemos eso aquí en lugar de ponerle por defecto al vector dos y poner todo esto aquí abajo Y cortamos esto a nuestras nuevas funciones, así que lo estamos refractando. Y entonces obviamente vamos a requerir algunos parámetros para entrar en esta función para que funcione. Entonces primero, necesitamos, digamos, cámara rect, que es un rectángulo dos, y luego necesitamos el tamaño de la cámara, que es un vector dos Control S. Y luego queremos devolver la posición hijo dentro de aquí Entonces la posición de desove var es un tipo de vector dos. Bajamos al fondo y regresamos a la posición de spa fuera de aquí. ¿Bien? Aquí arriba, queremos pasar esos parámetros, así que rect de cámara y tamaño de cámara Y entonces necesitamos esto por aquí. Por último, también necesitamos el offset. Así que pasa en el offset aquí arriba. Bien. Y entonces necesitamos offset como parámetro. Así que offset, y creo que ese fue un vector dos también. ¿Bien? Entonces, ¿Control S en realidad era solo un flujo? Oh, era una carroza. Bien. Entonces un flotador unidireccional. Y una vez que guardes ese, la mayoría de estos errores deberían desaparecer. Así que tenemos que coincidir en el borde, y luego tenemos que regresar. También podríamos poner en ese parámetro de borde. Así borde, que va a ser de tipo. De hecho, podríamos usar la enumeración aquí. Debería funcionar bien porque el entero puede simplemente asignarse automáticamente a una enumeración por lo que sé Entonces si subimos hasta aquí y luego pasamos al borde, Bien, eso va a entrar aquí y va a funcionar como enumeración, que es algo así como con lo que esperamos que la empareje aquí abajo Entonces, para pasar un poco por enumeraciones, una Enum es básicamente una lista de valores con nombre que corresponden con la posición entera dentro de esta Entonces el cero porque esta es la primera es la posición cero. Entonces es como el primer elemento de una matriz. Casi se podría pensar en ello así. Y luego abajo es uno, la izquierda es dos y la derecha es tres. Creo que algunos lenguajes permiten asignar valores enteros personalizados a un Eenum No sé si puedes hacer eso en GdCrip pero esa es básicamente la idea Si no te metes con eso, entonces cero es solo top. Uno es justo abajo, dos está justo a la izquierda, y tres es justo. Pero lo que esto te da la ventaja de hacer es que cuando creas una función como esta, en lugar de decir cero, uno, dos, tres, cual es muy oscuro para lo que eso realmente representa, ¿qué es un cero Simplemente puedes reemplazar eso con edge dot top, que es el valor de cero, pero es mucho más claro para alguien que lee el código lo que realmente se supone que representa eso. Bien, vamos a ver. Así que tenemos nuestra posición Get spawn fuera de cámara, y la teníamos aquí en lapso aleatorio Así que ahora realmente necesitamos establecer la posición para la instancia. Entonces la posición global de instancia va a ser igual a la posición de engendro Esa parte es fácil. Vamos a presionar Play y a ver si realmente funciona. Porque eso era un poco de código. Bien, entonces nuestros personajes no están apareciendo en la pantalla. Los veo venir de fuera de la pantalla. A ver, o cualquiera que venga de abajo y de la derecha. No veo ninguno viniendo de arriba ni de la izquierda, y eso me preocupa un poco. Entonces voy a ver si puedo encontrarlos. Bien. Y pienso lo que debemos hacer para probar eso. Voy a cerrar el juego ahora mismo es bajar aquí y nos faltaban en la parte superior y la izquierda. Entonces agreguemos un punto de interrupción aquí y un punto de interrupción aquí. Entonces, si, de hecho, los personajes están tratando de engendrar desde arriba y por la izquierda, entonces esos deberían golpear Y entonces podemos comprobar los valores que en realidad están pegando. Entonces me olvidé de parar en el juego, así que va a golpear automáticamente este punto de interrupción Pulsa Play y mira si podemos conseguir uno de la izquierda. Bien, ahí sí vi uno viniendo de arriba, en realidad. Bien, y uno viene de la izquierda, supuestamente. Entonces parece que va a ir, ¿verdad? A lo mejor si subo un montón la tasa de desove, será más fácil de ver seguro Entonces vayamos al mundo. ¿Tenemos el sistema de llave? Yo sólo voy a tomar esto aquí mismo. Voy a recordar el valor. Así que fue 0.66 y 1.5, y solo voy a caer de esta manera para que podamos obtener algunos desove muy rápido por ahora mismo Vamos a golpear Play, y voy a probar. Así que solo veremos a un montón de tipos desovar muy rápido o deberíamos Y si, bien, eso se ve mayormente correcto. ¿Podemos conseguir a un tipo del fondo que queda por aquí? Porque yo también quiero que eso ocurra. Bien, sí, sí, finalmente, finalmente. Tenemos a un par de tipos por allá. Bien, entonces creo que está funcionando bien. Si hay un problema, es posible que las matemáticas no fueran una doble verificación para ser correctas, pero creo que va como se supone que debe hacerlo. Si no, es un poco difícil de decir. Pero sí, sí los veo venir de todas direcciones. Entonces creo que estamos bien aquí. esta matemática sería algo muy Sin embargo, esta matemática sería algo muy fácil de equivocarse, así que lo pondré en pantalla una vez más si necesitas verificar dos veces. Entonces tenemos nuestra posición de engendro. Lo estamos obteniendo de la posición de generación G fuera de cámara. Esa es nuestra función aquí mismo. Entonces obtenemos el centro de la cámara desde la posición global de la cámara, el tamaño de la cámara, es desde el tamaño de la ventana gráfica, y luego lo divides por el zoom de la cámara El rectángulo de la cámara se construye desde el centro de las cámaras menos el tamaño de la cámara por 0.5, y luego el valor Y para eso es solo el tamaño de la cámara. El borde es entero aleatorio, y obtienes el resto de cuatro, lo que te dará de cero a tres. El desplazamiento es el margen de span más F aleatorio multiplicado por el rango extra de span. Entonces esto es en algún lugar 0-1 punto con puntos decimales, y luego agregamos el rango extra span como algún porcentaje de eso Calcula el lapso final usando todas esas propiedades que acabamos de configurar el rect de la cámara, el tamaño de la cámara, el desplazamiento y el borde Así que llevamos eso aquí. Coincidimos en el borde. Entonces cero, uno, dos y tres. Y luego para el valor X en la parte superior e inferior, hacemos un rango aleatorio entre el lado izquierdo y el lado derecho. Usando esa matemática. Para la posición Y, tomamos la posición Y en la parte superior y luego restamos el desplazamiento o para la parte inferior, agregamos el tamaño para llegar al fondo, y luego sumamos el desplazamiento Y luego para izquierda y derecha, hacemos lo mismo a la inversa. Entonces para X, hacemos el lado izquierdo menos el offset, dándonos más a la izquierda. Y luego para el lado derecho, agregamos el tamaño a la posición X para obtener el lado derecho, y luego agregamos el offset para ir más a la derecha de eso. Entonces para la posición de span Y, hacemos un rango aleatorio entre la posición, que es la posición cero Y, y luego la posición más tamaño, lo que nos da la posición de esquina inferior en el eje Y. Y así eso hará que el spa izquierdo y derecho quede en algún lugar entre la parte superior de nuestra pantalla verticalmente y la parte inferior de nuestra pantalla verticalmente. Pero la posición está desplazada fuera de la pantalla, así que en realidad no los veremos desovar Y devolvimos la posición span podamos usar eso en esta otra función, y eso es más o menos va a terminar eso. 25. P24: aparejo de un enemigo al azar con condiciones de peso y tiempo: Nuestro desove fuera de la pantalla está funcionando, esencialmente. Hay un par de cosas que quiero limpiar, y luego procederemos a agregar un enemigo esquelético para que podamos seleccionar aleatoriamente qué enemigo vamos a engendrar en función de un sistema de espera Entonces vamos a cerrar el juego. Y antes que nada, podemos ver aquí esta etiqueta, la instancia de texto de combate flotante. no necesitamos eso porque ya terminamos de editar la animación. Entonces voy a borrar ese nodo. Y luego en el sistema de desove, para la demostración, tomé de esta manera más bajo de lo que era antes Entonces por aquí en el primer punto, quería traer eso de vuelta al original, que fue como, creo que fueron 0.66 segundos originalmente, y luego 1.5 Voy a hacer que 0 segundos y luego 1.5 segundos como periodo de desove Así que en realidad podemos simplemente bajar aquí y escribir 1.50. Presiona Enter, si quieres ser preciso con la configuración, y puedes ver que el punto mientras seleccionado muestra 0 segundos, y luego 1.5 segundos como el tiempo de generación 0 segundos es el tiempo transcurrido aquí, si recuerdas. Creo que estos cuatro enemigos de trabajo, solo podríamos sacar de la escena. Entonces voy a borrarlos. Entonces voy a seleccionarlos, golpear golpear Bien. Puedes presionar play solo para probar que todo sigue funcionando, y deberíamos conseguir que los enemigos que se generen fuera de la pantalla viniendo hacia nosotros. No tenemos puedes golpear play si quieres verificar dos veces y solo asegúrate que los enemigos sigan desove Simplemente no necesitamos a esos enemigos iniciales porque los enemigos van a venir después de que comience el juego. Nosotros sí queremos darle al jugador un par de segundos para, ya sabes, conocer los controles y así sucesivamente Bien, entonces para crear al enemigo esqueleto, primero clonemos al orco en mí. Entonces voy a buscar orco y el proyecto. Bajamos al punto orco TCN. Voy a hacer click derecho y clonarlo, así que duplique. Lo llamaré esqueleto punto TCN. Y luego busquemos en el proyecto esa escena de esqueleto que acabamos de crear. Haga doble clic en él. Y luego vamos a acercar aquí. Entonces voy a tomar el sprite aquí y cambiarlo por el sprite esqueleto Así que vamos a cargar rápido a la derecha, y vamos a buscar ídolo, y debería haber uno para el esqueleto. Es posible que necesitemos acercarnos un poco. Debería haber uno aquí para un enemigo esqueleto. Y luego en la parte superior derecha, podemos cargar rápidamente, y es posible que tengas que acercar un poco para encontrarlo, pero escribe inactivo y buscaremos la hoja de sprite esqueleto Puede que sea un poco difícil de ver, pero voy a seleccionar este de aquí mismo. Si no puede encontrarlo, no dude en simplemente navegar por el sistema de archivos y encontrarlo. Probablemente esté en la carpeta base del esqueleto. Bien, ahora cambiemos el nombre del nodo raíz a esqueleto. Y vamos a necesitar configurar el reproductor de animación para asegurarnos de que esté reproduciendo las animaciones del esqueleto inactivo y luego el esqueleto de Ron y la muerte del esqueleto también. Entonces vamos al reproductor de animación. Y luego en la parte inferior derecha, básicamente necesitamos cambiar la textura para cada uno de estos. Entonces la textura de reinicio irá a la parte superior derecha y luego cargará rápidamente la hoja de sprites Idle que acabamos de seleccionar En este momento ya está preseleccionado, así que podemos seleccionarlo. Y es posible que desee jugar y asegurarse de que enciende el reinicio al esqueleto y luego cambiar la textura para las otras animaciones también. Entonces Idle vamos a hacer click en la textura, ir a la parte superior derecha. Carga rápida, elige la hoja de sprites por tercera vez. Bien, y pulsa Play. Y luego asegúrate de que esté jugando correctamente. Se ve bien. Vamos a la animación de la muerte. Selecciona la textura aquí. Y como hay muchos fotogramas en la parte superior derecha, es un poco difícil ver realmente lo que está pasando, incluso más difícil que la animación ociosa. Entonces creo que sería más fácil simplemente navegar hacia el arte y luego encontrar pack libre de rastreadores de píxeles, entidad, mobs, tripulación de esqueleto, muerte base, y luego simplemente arrastrar la hoja de la muerte hacia la parte superior derecha así Bien, pulsa play y asegúrate que está jugando correctamente. Entonces parece que aquí hay ocho fotogramas de animación. Entonces sí necesitamos acercar un poco así y asegurarnos de que los fotogramas H se coloquen en la parte superior derecha en ocho. Bien, entonces pulsa Play. Sí. Bien, eso parece correcto. Y ahora necesitamos agregar en los fotogramas clave séptimo y octavo Así que haga clic derecho sobre el marco a los 0.6 segundos y haga la tecla de inserción, haga clic en él, vaya a la parte superior derecha, cámbielo a seis, haga lo mismo al 0.7. No se puede chasquear ahí porque necesitamos extender la animación. Así que haz la animación de 0.8 segundos de duración. Da click en 0.7, S ese fotograma clave y cambiarlo a siete para la octava posición es lo que queremos. Bien, vamos a golpear Play. Juega una vez más. Ahí está nuestra animación. Ahora mueve el estado de muerte terminado al final en 0.8 segundos así, y ahí está nuestra animación de muerte. Bien, entonces queremos correr. Debería ser más rápido. Haga clic en la textura. Y luego en la parte inferior izquierda, donde dice esqueleto base, elige la carpeta de ejecución, la hoja de ejecución sobre la parte superior derecha. Deja caer eso. Pulsa play, y podemos ver que está reproduciendo nuestra animación de carrera. Tiene los mismos marcos de edad, así que eso es todo lo que necesitamos para cambiar. Bien, eso es lo básico de nuestro esqueleto. Podemos ir al controlador de estadísticas. Aparte de asignar estadísticas, es como velocidad de carrera y HP y así sucesivamente para nuestro esqueleto y unos valores personalizados para nuestros orcos y CD que es la configuración básica allí para nuestros dos personajes Así que volvamos al mundo, y luego vamos a tener el sistema spawner, Así que tenemos nuestras definiciones aleatorias aquí a la derecha. Queremos agregar otra definición aleatoria, y luego vamos a crear una nueva. Así que nueva definición de desove. Digamos que el peso para el esqueleto es 0.5 así que obtendremos la mitad de esqueletos que orcos Y carguemos rápidamente la escena del esqueleto, ¿de acuerdo? Y luego solo revisaremos el script del sistema patrocinador. Entonces ábrelo, y veremos aquí la selección aleatoria. Entonces en estos momentos no está generando la escena de selección aleatoria. Es solo seleccionar el primero de la matriz. Así que o necesitamos un poco de código o una función con el fin elegir qué escena realmente vamos a instancia. Así que vamos a acercar, y voy a decir var scene es una escena repleta, y vamos a querer seleccionar el spawn aleatorio de una lista de definiciones abarcables aleatoriamente. Entonces diremos definiciones aleatorias, salvo eso. Y luego necesitamos crear esta función de spawn aleatoria seleccionada Entonces voy a hacer función, Control V para pegarlo adentro. Y entonces vamos a decir P definiciones es una matriz de vamos a ver cómo lo llaman definición de desove Y vamos a devolver una sola escena repleta. Entonces, si las definiciones P están vacías, entonces podemos devolver null porque no hay nada para seleccionar. De lo contrario, calculemos a partir de todos los pesos totales y luego generemos aleatoriamente un valor entre cero y el peso total para determinar qué escena estamos seleccionando realmente. Entonces eso es selección aleatoria, pero es selección aleatoria ponderada. Entonces digamos que si nuestro peso total es un flotador, comienza en 0.0. Y luego para definición o definiciones D y P, vamos a tomar el peso total, y vamos a aumentarlo por el peso de definición. ¿Bien? Entonces lo hacemos para cada definición. Ahora tenemos el peso total, y necesitamos generar un valor entre cero y el peso total. Hasta el momento, digamos que el valor aleatorio es un flotador. Y vamos a tomar F. al azar Así que esto es de cero a un punto oh, todo incluido, incluyendo decimal, y va a ser veces el peso total. Entonces eso nos dará un valor aleatorio entre cero y el peso total. Y entonces digamos que V comprobó el flujo de peso es de 0.0. Entonces este es el valor de peso que hemos intentado pasar antes de golpear el valor aleatorio. Una vez que alcancemos el valor aleatorio, devolveremos cualquier escena o cualquier definición sne en la que estemos actualmente Entonces, para la definición en las definiciones P, vamos a decir que el peso comprobado más es igual al peso de punto de definición. Y si el peso comprobado está por encima del valor aleatorio, entonces devolveremos la escena. Así devuelvo definición punto CM. Bien. Y luego si llegamos al final y todavía no hemos golpeado nada, eso es un problema, así podemos empujar un error. Bien, entonces aquí estoy empujando un error. No se pudo encontrar una definición en porcentajes de valor ponderal, donde el peso total verificado fue Porcentaje Y luego estoy reemplazando esos porcentajes por el valor aleatorio y el peso comprobado Entonces este tipo de muestra lo estábamos comprobando, a dónde llegamos, y es indicar que en realidad no encontramos una comprobada que estuviera por encima del valor aleatorio, lo que siempre debería suceder porque el valor aleatorio sólo puede subir al peso total. Entonces esto no debería ocurrir, pero si lo hace, tenemos un mensaje de error. Y luego al final aquí, solo podemos decir return null porque no fue capaz de encontrar una definición adecuada. Entonces esto tiene más sentido. Probablemente inmediatamente romperá algo indicando que algo necesita ser arreglado en las matemáticas en esta función. Una vez más, quiero recalcar que esto nunca debería suceder. Si nuestra matemática es correcta. Bien, entonces seleccionamos el spawn aleatorio de nuestra lista de definiciones, y eso maneja el peso y los cálculos aleatorios Entonces, si ejecuto el juego ahora como están las cosas, entonces deberíamos estar recibiendo la mitad de esqueletos de los orcos Pero veamos. ¿Los conseguimos a los dos? Porque deberíamos conseguir los dos. Entonces tenemos algunos orcos desovando. Bien, entonces en realidad resulta que el código funcionaba perfectamente bien para el spawn aleatorio selecto Simplemente me olvidé de usar la escena. Entonces queremos tomar la escena aquí. Y en lugar de la definición aleatoria cero instanciar, simplemente hacemos instanciar enviado Bien, ahora podemos volver al spawn aleatorio y eliminar ese mensaje de depuración de Prince ¿Bien? Y si jugamos, debería funcionar bien. En realidad, debería usar el que seleccionamos aleatoriamente en lugar siempre el primero en la matriz. Entonces deberíamos conseguir la mitad de esqueletos que orcos, pero ahí está Y a medida que pasa el tiempo, verás un montón más orcos luego verás esqueletos por la espera. Bien, así que eso es bueno. Y esa es básicamente la idea ahí. Bien, entonces lo último para esta parte, posible que quieras retrasar cuánto tiempo hasta que una definición de enemigo pueda realmente generar en el juego Por ejemplo, al inicio, tal vez solo tienes orcos, pero luego después de un tiempo, puedes agregar esqueletos Entonces ya tenemos el tiempo transcurrido. Entonces, si decimos una hora de inicio y finalización en términos de tiempo transcurrido cuando se puede generar una definición, entonces podemos controlar cuándo pueden desovar los orcos y cuándo pueden desovar los Entonces, si entro en definición de desove, podemos agregar una var de exportación aquí o tiempo de inicio un float, y esto puede ser 0.0 por defecto Y luego la hora de finalización también por defecto eso será 0.0. Entonces lo que queremos hacer con estos dos es empezar a crear como un método can be spawned Entonces podríamos decir que la función puede ser spawn, que por supuesto va a devolver un verdadero falso booleano Y para ello, en realidad queremos pasar en el tiempo transcurrido porque eso es parte de la condición Tenemos que comprobar qué hora es en el juego o tiempo desde que realmente se ha creado el sistema spawner , Y luego lo usaremos para verificar si el tiempo transcurrido está dentro de la hora de inicio o la hora de finalización Entonces, si P el tiempo transcurrido es anterior al tiempo de mirar fijamente, entonces volveremos falso Si el tiempo de finalización no es igual a 0.0, o mejor dicho, si el tiempo de finalización es mayor que 0.0, creo que es un poco más fácil de leer. Entonces queremos verificar si realmente se ha pasado la hora de finalización. Entonces, si el tiempo de finalización es cero, solo lo estamos ignorando. Entonces y P el tiempo de transcurrir está por encima del tiempo de finalización, luego volveremos falso De lo contrario, hemos pasado todas las condiciones para que podamos volver verdaderas. Entonces eso es básicamente todo lo que necesitamos hacer para un generador basado en el tiempo, y solo verificamos si se puede generar y solo verificamos si se puede Y si no se puede generar, lo eliminamos de la lista que consideramos para la selección aleatoria Harías algo muy parecido. Si también quieres, digamos, tener un número máximo que puedan ser engendrados, simplemente pasarías el número que se ha generado y comprobarás si ese está por encima o igual al número máximo que permitiría la definición de desove Eso sería útil para algo así como un jefe que solo puede engendrar una vez Entonces solo puedes verificar, Oh, puede engendrar una vez. ¿ Cuántas veces engendra? Es uno o mayor que no lo engendrar. veremos si volvemos a eso, pero esto debería ser todo lo que necesitamos para escribir ahora. Así que ahora, de vuelta en el sistema spawner, queremos básicamente filtrar spawnb de Así que voy a crear una función filtro spawnb que va a tomar una matriz de definiciones P definiciones, y eso es arma. Esa es la definición de desove Y luego devolveremos nuestras definiciones filtradas. Así que devuelve una matriz de definición de desove. Así que creamos nuestra lista filtrada aquí. Var filtró matriz de definiciones de desove, y eso va a ser igual a una matriz vacía Y luego para las definiciones DF y P, comprobaremos si se puede generar DEF Supongo que necesitamos el tiempo transcurrido aquí, pero esa es una variable local Entonces solo podemos pasarlo directamente a esto. Así que el tiempo transcurrido, como en no necesitamos ponerlo como parámetro a esta función porque es parte del estado del objeto, que es el sistema de desove Entonces, si se puede generar, entonces lo agregaremos a la lista filtrada Así filtrada definición de pluma de punto. Y luego al final, solo volvemos filtrados así que aquí en span aleatorio, hacemos var spanable y eso va a ser igual a filter spanable, que va a tomar nuestras definiciones aleatorias como parámetro Y luego, en lugar de seleccionar spawn random de definiciones aleatorias, seleccionamos spawn random de nuestra variable expandible filtrada. Bien, ahora eso nos da la habilidad en el sistema de desove, si pasamos a las definiciones de desove, podemos decir hora de inicio, hora Digamos que los orcos siempre están activos. Pero luego para el desove de esqueletos, no podemos desovar esqueletos hasta los 15 segundos, pero luego una vez que podemos desovar esqueletos, tenemos un peso de dos, así que terminamos viendo muchos esqueletos en cuanto son capaces de Entonces podemos jugar. Y si todas las matemáticas se revisan, deberíamos ver nada más que orcos inicialmente Pero luego después de 15 segundos, podría ser útil tener, terminar tiempo de juego o algo para ver veremos si necesitamos eso. Entonces después de 15 segundos, podemos ver que los esqueletos van a comenzar a desovar porque ahora se les permite ser abarcables porque ha transcurrido el tiempo de inicio de 15 Bien, entonces ahora puedes ver que empiezan a entrar los esqueletos. Entonces tenemos nuestra segunda ola de enemigos, y podríamos simplemente hacer los esqueletos Entonces la dificultad avanza a medida que avanza el juego porque agregamos enemigos más duros. Y, por supuesto, en el sistema de desove, aumentamos la tasa de desove, así Entonces se puede ver cómo funcionaría eso. Esa es la naturaleza de controlar básicamente el desove aleatorio de nuestro sistema de desove Eso es la mayor parte de lo que realmente necesitamos aquí. Buen trabajo manteniéndose al día con todo hasta el momento. Bien, entonces podríamos hacer un par de retoques aquí y allá más adelante si es necesario, pero en su mayor parte, ese es nuestro sistema spawner Entonces ahora deberíamos empezar a trabajar en desarrollar un poco más el combate y hacer que nuestros enemigos realmente puedan dañar a nuestros jugadores sería un buen siguiente video. Así que vamos a partir de ahí. 26. Configuración de la caja hurtbox y la caja de éxito enemigo P25: Parte de nuestra mecánica básica de combate va a ser configurar la capacidad para que los enemigos golpeen a nuestro jugador, lo que va a implicar configurar una caja de golpe para los enemigos cuando se encuentren con el jugador, y necesitamos asegurarnos de que el jugador tenga una caja de Hurt, también. Y probablemente agregaremos un tiempo de invencibilidad solo para asegurarnos de que no recibimos demasiados golpes cuando somos acosado por un enemigo como ese. Bien, así que en nuestro jugador, crearemos nuestros nodos Hurt Box. Entonces haré clic derecho en la ruta del jugador, agregaré un nodo hijo, y busquemos HRT Box dos D. Enter, agrégalo Asignaremos el controlador de estadísticas, que aún no hemos agregado a nuestro reproductor, que podamos hacer clic derecho sobre el jugador, agregar un nodo hijo, controlador de estadísticas. Bien. Y luego queremos hacer algunas tareas. Entonces objeto para el controlador SAT va a ser el jugador root. Y luego en cuadro HRT, queremos asignar el controlador stat Entonces nuestra caja HRT, se puede ver por la señal de advertencia, también necesitamos una forma de colisión Así que vamos a hacer clic derecho sobre él y darle un nodo hijo. Forma de colisión dos D. Y luego en la parte superior derecha, haremos esto probablemente como una forma de círculo. Bien, así conseguimos que aparezca esta forma de círculo. Queremos reducir esto al tamaño que queremos para poder recibir daños para nuestros jugadores. Entonces, dependiendo de cómo queramos hacerlo, podríamos hacerlo un poco más pequeño o poco más grande que nuestra forma de colisión. Voy a ir a lo grande por ahora, y luego podemos encogerlo si es necesario para el equilibrio del juego o la sensación de las cosas. Entonces eso ya nos da la posibilidad recibir daño al jugador. Ahora tenemos que darle a los enemigos la capacidad de infligir daño al jugador. Entonces en nuestra escena orco, hagamos clic derecho sobre Orco, agreguemos un nodo hijo, golpeemos la casilla dos D. Y entonces esto va a necesitar una forma de colisión. Entonces haz clic derecho, agrega un nodo hijo, forma de colisión dos D, y luego en la parte superior derecha, lo haremos una forma de círculo, y luego lo reduciremos a donde queremos que el orco pueda golpear objetivos Así que lo haré un poco más grande que la forma de colisión principal para la colisión real. Entonces en nuestro RT Box dos D, si verificamos el guión, podemos ver que obtenemos la señal de hit del hit box golpeando una casilla RT. Entonces, para infligir daño, en realidad necesitamos otro guión para infligir daño en la señal golpeada y siendo emitida. Antes de eso, sin embargo, agreguemos las capas de colisión para nuestra caja de impacto y nuestras cajas de daño. Por lo que el hit box dos D en la capa de colisión va a estar enmascarando para la capa del jugador. Entonces máscara de la capa dos porque esa es la capa del jugador. Para las capas en las que existe esta caja de cadera, solo podemos apagar la capa uno, o podríamos establecer la capa tres para enemigo si queremos. Pero probablemente voy a apagar monitoreable porque esta es una caja de cadera unidireccional Solo necesita detectar. Si encuentra una caja de cadera, no necesita ser monitoreada por otros nodos dentro del juego, al menos actualmente Así que vamos a jugar y voy a hacer lo contrario para su Caja dos D. Por aquí, vamos a apagar el monitoreo, y vamos a tomar la colisión. Vamos a hacer la capa como jugador. Eso es muy importante la capa dos aquí, podemos apagar la máscara. Entonces dentro de aquí, voy a click derecho debajo de Hit Box dos D, y voy a agregar en un nuevo nodo, agregar nodo hijo. Este será un nodo dos D. Y cambiemos el nombre de esto para que sea algo así como ataque de colisión. Entonces, cuando el orco choca con otro enemigo usando este golpe Caja dos D, va a hacer todo el daño como daño de colisión Muchos juegos clásicos tienen este tipo de cosas que un enemigo simplemente se encuentra contigo y recibes daño. Así que tendremos que hacer click derecho aquí y crear un nuevo script. Entonces pongamos ataque de colisión en enemigos. Creo que eso es apropiado. Crear. Voy a renombrarlo Nombre de clase ataque de colisión aquí arriba en la parte superior, Vamos a exportar una referencia a la casilla Hit. Entonces Hit Box es del tipo Hit Box dos D. Y luego en listo, función bajo puntaje listo, regresa nulo. Vamos a tomar Hit box, y vamos a conectarnos a la señal de acierto. Entonces punteó, punto conecta, y vamos a conectarnos al hit. Entonces ahora necesitamos, digamos, el daño var at export aquí, que va a ser un entero. Podemos por defecto a diez. Entonces, consigamos la devolución de llamada para el hit con el guión bajo de la función de golpe al hit Ahora necesitas hacer click derecho sobre Hit y verificar los parámetros de la señal. Entonces tenemos la caja de Hurt dos D aquí. Bien, así que eso también nos dará acceso a las estadísticas. Entonces, dentro del ataque de colisión, saltemos hacia atrás. Entonces tenemos el cuadro P Hurt, que es un tipo Hurt Box dos D. Esto volverá nulo, y luego vamos a golpear al jugador. Bien, entonces al golpear P Hurt Box dos D, queremos tomar la caja P HRT, y queremos tridar daño a la misma, y vamos a pasar el Y entonces eso es más o menos ahí porque ya lo escribimos en la caja del daño. Entonces la caja Hurt ya maneja reportes. Yo ya maneja la configuración del HP, que este emitirá la señal para el HP cambiando si necesitamos eso. Y hace el cálculo. También hace la guardia para asegurarnos de que podamos dar en el blanco. Entonces simplemente tiene sentido que usemos esta lógica donde. Siempre y cuando tengamos ataque de colisión, asignamos la caja de impacto aquí arriba y establecemos nuestro daño. Podemos ver si eso va a funcionar. Entonces solo intentaré encontrarme con un enemigo y ver si nuestro jugador recibe el daño por encima de él. Bien. Solo necesito estar segura Oh, bien, si. Ahí vamos. Nuestro jugador fue golpeado por diez. Sabemos que es el jugador y no el enemigo porque la lanza actualmente hace 100 Ahora, actualmente, parece que hay un problema, que es ese enemigo que ya está muerto parece que todavía puede golpear al jugador. Ya tardó 100. Fui al Estado de la Muerte, y el ataque de colisión aún estaba habilitado. Así que podríamos manejar eso de algunas maneras. Una sería que solo revisemos el controlador de estadísticas y nos aseguremos de que el controlador de pila en el orco el HP esté por encima de cero o el orco siga vivo De lo contrario, simplemente ignoramos por completo este ataque. Esa sería una manera decente. Otra forma sería que lo pusiéramos en estado de muerte, y luego deshabilitamos todas las cajas de aciertos cuanto nuestro orco sea considerado muerto Creo que esa es quizá demasiada responsabilidad para el estado de la muerte. Entonces creo que le pertenece un poco mejor aquí en el ataque de colisión. Entonces, lo que haremos es exportar una referencia a nuestro controlador de estadísticas, exportar V stats stat controller. Entonces lo que vamos a decir en él es, si no las estadísticas puntan en vivo, entonces vamos a regresar. De lo contrario, haremos daño. Entonces básicamente, mientras el personaje no esté vivo, no puede atacar, pero si está vivo, entonces consideraremos válido el daño de colisión si conseguimos esa conexión. Entonces ahora si volvemos a entrar en juego aquí, podremos caminar hacia un enemigo que acababa de ser derrotado y no recibir daño de él. Bien, entonces necesito cronometrar esto bien. Bien, me encuentro con ello y vemos que le pegamos a esto, pero me olvidé de establecer las estadísticas. Entonces podría ser un buen momento para una afirmación. Así que aseveran las estadísticas. Entonces es necesario establecer la estadística para que verifiquemos si el personaje está vivo. Y entonces esto básicamente ya requerirá que tengamos el error de soda de caja de golpe, si olvidamos configurarlo en el inspector. Bien, tan cerca ahí. Haga clic en Ataque de colisión. Vamos a asignar las estadísticas. Vamos a entrar en juego. Haremos esto una vez más. Encuentra un orco Y se puede ver que no recibimos daños si el orco ya había sido derrotado, una vez más Sí, parece estar funcionando bien. 27. Temporizador de invencibilidad de un jugador P26 y definiciones de estadísticas personalizadas: Bien, entonces lo último para este video, queremos configurar un periodo de vulnerabilidad, específicamente para nuestro reproductor. Entonces en Stat Controller, podemos entrar aquí. Así que en el controlador SC, podemos crear un temporizador de invulnerabilidad Entonces digamos aquí abajo V Tiempo invencible y podemos por defecto esto a 0.0 Será tipo flotador. Entonces es el momento después de ser golpeado que el objeto no puede dañarse. Bien, entonces con nuestro tiempo invencible por defecto a cero, eso va a estar bien para Sin embargo, para un jugador de cuatro horas, sí queremos tener nuestro valor personalizado para el tiempo Invencible. Y probablemente también queremos poder personalizar cosas como el HP, la velocidad, Max HP, etcétera Así que realmente estamos llegando al punto en el que necesitamos establecer algún tipo de definición de estadísticas, donde podamos definir cuáles van a ser las estadísticas iniciales para cada personaje. Entonces, si pudiéramos crear un nuevo script para eso, que va a parecerse mucho a nuestra definición de armas, donde solo estamos definiendo propiedades sobre el personaje y su bloque de estadísticas. Entonces, en la foto del personaje, bien, haz clic en Crear un nuevo guión, y lo llamaremos Definición de guión bajo Stat Esto se extenderá desde el recurso y haga clic en Crear, ¿de acuerdo? Y luego busca ese script que acabamos crear Definición de Stat, haz doble clic en él. Y vamos a subir aquí a la cima. Así nombre de clase stat definición. Entonces esto definirá las estadísticas predeterminadas para un tipo de objeto. Entonces, las estadísticas que queremos van a estar básicamente reflejando lo que tenemos en el controlador de estadísticas Así que vamos a entrar en el controlador de estadísticas, y en realidad voy a copiar estos sobre por ahora mismo en nuestra definición de estadísticas. Voy a quitar todo este código setter. Porque solo queremos definir puramente exportar propiedades editables que básicamente no ejecuten ningún código extra Son solo datos puros los que se guardan dentro del GIDOEditor esencialmente Entonces no necesitamos vivos, y vamos a querer un valor predeterminado para los HP y FenciBT HP y MAX HP Así que vamos a exportar todos estos a la exportación para MaxHP en la exportación para HP Por aquí, lo haremos a la exportación por velocidad y a la exportación para el tiempo de invencibilidad También podrías querer darles algunos comentarios. Así MaxHP salud máxima para el objeto, HP, iniciando la salud para el objeto actual Bien, y eso será todo. Entonces ahora necesitamos una forma para nuestra definición de estadísticas se cargue en el controlador de estadísticas. Podrías poner una función de carga en la definición stat, lo que convierte el recurso en un poco más que solo datos de pares. Bueno, podríamos ponerlo en el controlador y algún tipo de método de estadísticas inicializadas donde sepa sobre el tipo de definición stat, y luego puede cargar todos los valores de un objeto de ese tipo Entonces lo voy a hacer de esa manera. Y eso va a significar que vamos a necesitar crear una nueva función aquí abajo en la parte inferior. Dado que el controlador stat va a necesitar llamar a initialize en la definición stat de todos modos, porque este es el nodo que manejará el nodo cuando esté listo para establecerse Entonces, de cualquier manera, habría alguna dependencia menor de la definición stat. Entonces crearé la función, configuraré estadísticas, y esto tomará una definición P, que es una definición stat. Bueno, regresa tipo void y déjame agregar algunas líneas aquí. Entonces, en las estadísticas de configuración, simplemente reflejaremos la definición en este nodo. Max HP va a ser igual a p definición MxHP. HP va a ser igual a p definición punto HP. Veamos qué más velocidad va a ser igual a p definición velocidad de punto, y el tiempo invencible va a ser igual a P definición punto Invencible T. Así que ahora solo tenemos que hacer Entonces, bajo el tiempo invencible, agregaremos el subrayado de función listo, y diremos configurar estadísticas con Entonces necesitamos exportar una definición en el nodo para que podamos realmente hacer eso. Así que arriba en la parte superior, haremos Exportar VR La definición de Stat es una definición de tipo stat. Bien. Y luego solo usamos esto en cuanto estemos listos. Así que configura las estadísticas con la definición de estadísticas. Eso va a cargar todas las estadísticas en nuestro valor de tiempo de ejecución. Y esto nos permite personalizar los valores para las estadísticas base de nuestros personajes usando algo que podamos configurar en el editor. Entonces, si hacemos clic en el controlador Stat, nos dirigimos a la parte superior derecha. Puedo crear una nueva definición de estadísticas aquí para nuestro Oc. Y digamos que el Mx HP debería ser de 40 y 40, y la velocidad es de 25. Entonces guardamos esto ahora en la carpeta donde tenemos los orcos. Da clic en Definición de estadísticas, guarda como, y podemos ponerlo en la carpeta del enemigo. Así que Ok Estadísticas. Suena como un nombre perfecto ahí. Guárdalo. Bien, y así es como Ok Stat definición. Entonces cuando se cargue, se va a cargar con estos valores tan pronto como el personaje esté listo. Bien, entonces eso es básicamente eso para el orco. Ahora, también quiero copiar esta configuración de hit box sobre el esqueleto, también. Entonces voy a Control C, a pasar a esqueleto, Control V, pegarlo adentro. Podría tomar el ataque de colisión, y solo voy a aumentar el daño a, digamos 25. Asignemos las estadísticas al controlador de estadísticas, y la forma de colisión que es la misma funciona bien. Utiliza las mismas capas de colisión. Es piedra en mí tratando de golpear al jugador. Entonces todo lo demás está configurado y simplemente bien. Y luego tenemos que configurar el controlador de estadísticas. Entonces controlador de estadísticas aquí, vaya a la parte superior o derecha. Y crear una nueva definición de estadísticas. Digamos que el esqueleto tiene más como digamos más como 50 de salud, 50 de salud, una velocidad de 40 está bien. Entonces haremos clic derecho en Guardar como, y diremos las estadísticas del esqueleto punto TRS, guardar Ahora tenemos que hacer eso por el jugador. Vaya al jugador, haga clic en el controlador de estadísticas, vaya a la parte superior derecha, haga una nueva definición de estadísticas. Ahora, aquí nos quiero en la época invencible. Digamos que un personaje es invencible por 0.2 segundos después de ser golpeado Le daremos al personaje una velocidad base de digamos 100 y el Max HP tiene 100. Creo que voy a dejar eso como inicio. Así que haga clic derecho sobre la definición stat. Guardar como, y lo guardaremos en la carpeta Reproductor. Playerstt punto TRS, pulsa Guardar. Y ahora los personajes deberían tener cada uno estadísticas diferentes. Lo último que tenemos que hacer es en realidad usar el temporizador de invencibilidad Entonces en St Controller, necesitamos activar Invincible con una llamada al método Así que vamos a crear un conjunto de funciones Invencible aquí, que devolverá el tipo void Y entonces tendremos una variable local para si es invencible o no Entonces variable invencible es un booleano. Esto va a ser default a false. Si es cierto, el objeto no puede recibir daños. Bien, para que pueda ser golpeado, queremos decir que el personaje está vivo y no invencible Entonces estoy usando esto con las palabras clave en lugar del símbolo lógico. Supongo que hace que sea un poco más fácil de leer, en cierto sentido. Entonces, si el personaje está vivo y no invencible, entonces el personaje puede ser golpeado Y queremos invencible es igual a verdad, pero también queremos iniciar un temporizador aquí Y diremos que esto es igual a un nuevo temporizador, igual temporizador punto nuevo. Y luego agregamos eso como hijo a este objeto, temporizador de invencibilidad, y nos conectaremos a su Entonces invencibilidad temporizador punto tiempo de espera punto conectar en Invencible Timeout en Entonces Control mira esto y pégalo aquí abajo. Función sobre el tiempo de espera de invencibilidad. Esta obertura y vacío. Y diremos que invencible es igual a falso. Bien, entonces ahora tenemos que poner en marcha el temporizador. Tiempo de invencibilidad o inicio, y diremos que el tiempo es el tiempo invencible Eso debería manejar la lógica de si podemos o no podemos golpear porque el personaje es invencible o Bien, así que para set invencible, podríamos comprobar cuando HP está configurado que si el HP cayó, entonces queremos activar la Pero creo que lo que podría dejar clara nuestra intención es crear una función de toma de daño en esta definición, también. Entonces podríamos hacer algo así como función, recibir daño, y pasemos un a P daño t aquí. Nos ta y anulamos, y esto va a tomar HP y ponerlo a P daño. Y luego queremos poner al personaje en invencible. Incluso podríamos decir si el tiempo invencible es mayor que 0.0, entonces estableceremos Sobre este objeto. Y el HP en realidad va a igualar menos el daño aquí porque queremos tomar su valor actual y actualizarlo. Entonces esto todavía llamará a los iguales en vivo HP es mayor que cero aquí. Si lo quieres, incluso podrías hacer get live sea solo una función que verifique esto, lo cual también estaría bien, en lugar de hacer esta configuración anterior. Pero ya teníamos eso. Funciona bien. Nosotros iremos con eso. Así que ahora, cada vez que infligimos daño, realmente queremos llamar a take damage en el controlador de pila. Entonces averiguaremos dónde estamos infligiendo daño, como el proyectil podría tenerlo. Bien, así que aquí podemos ver que todo vuelve a la caja de Rt. Entonces hagamos clic derecho y saltemos a esto. Y en lugar de configurar el HP directamente, vamos a decir stat controller dot take damage, and we pass in the P damage. Así que podemos cortar esta línea, y en realidad no necesitamos calcular esto porque ese cálculo se maneja automáticamente en el controlador de estadísticas. Entonces este tipo de más ilustra nuestro punto que si nuestro controlador de estadísticas recibe daño, podría estar haciendo otras cosas como establecer invencible en el personaje porque nuestro personaje recibió Ni siquiera es solo que cambiamos el valor de HP. Es específicamente que tomamos daños de una fuente dañada. Bien, así que vamos a darle a Play y veamos si todo se junta. Tendremos que recibir daño de algunos enemigos, y luego querremos asegurarnos que en realidad solo podamos recibir daño una vez cada cuarto de segundo. Entonces, si disparo por aquí, necesitamos algunos enemigos más para que esto funcione. Incluso podría ser más fácil si inhabilito los proyectiles. Bien, entonces me voy a encontrar con estos tipos. Solo debería ver que los daños ocurren una vez. Bien, 25. Creo que está funcionando. Si paso por todos estos. Sólo veo que los daños surgen de una vez a la vez. A VLC seguro, sin embargo, necesito apagar el proyectil Entonces voy a eliminar temporalmente el arma de lanza de la escena aquí. No hace falta que hagas eso. Sólo estoy demostrando. Bien, entonces sólo voy a ir a caminar sobre los enemigos. Bien, entonces solo nos dañamos una vez. Ahora bien, esta cosa de golpe de colisión sólo se está incurriendo al ingresar al área Entonces, si nos paramos encima del enemigo, todavía solo nos golpean una vez. ¿Bien? Se puede ver a pesar de que hay un montón de tipos pegándonos, sólo nos golpean una vez cada cuarto de segundo más o menos, así. Y nuestros personajes ya están hechos, así que no nos pueden pegar más. 28. P27: Implementación de daño periódico en las cajas de éxito enemigas: Soluciona el problema en el que la caja HIP solo puede dañarse una vez después de otra área. El HipXTD entra en este hit box, pero no cuando persiste dentro de él Podemos establecer un temporizador dentro de nuestra caja de cadera en D para seguir comprobando si la caja HIP todavía está dentro del área, y luego podemos seguir infligiéndole daño periódicamente. Bien, así que una vez que emitamos el hit, también puedo agregarlo a las áreas de tracto y al guión. Entonces digamos var targets, que va a ser una matriz de Hurt box two D, que actualmente no es nada. Y vamos a decir que después de golpear, hacemos objetivos anexar, el área P. Bien, ahora necesitamos conectarnos a la señal del área izquierda. Así que el área salió punto conectar. Y vamos a usar la devolución de llamada en el área salida. Bien. Así que funcionan en el área que salió. Obtenemos el área P. Entonces queremos verificar que si se trata de una casilla HIT dos D. Entonces las áreas de tipo área dos D. Bien, entonces verificamos si el área P es Hurt casilla dos D, entonces continuaremos. Ahora vamos a verificar si el punto de objetivos tiene área P, entonces lo vamos a borrar de los objetivos. Targetst borra el área P. Bien, entonces ahora los objetivos solo van a existir mientras la caja de Herir objetivo persista dentro de nuestra área de caja de impacto Podemos verificar en cada periodo de tiempo si necesitamos volver a dañar al enemigo. Bien, entonces podríamos hacer eso con algo así como, digamos que tenemos temporizador opcional, así que en Export var timer timer timer, y luego nos conectaremos a la señal de tiempo o tiempo de espera Así temporizador punto tiempo de espera punto Knect y vamos a decir en Bien, entonces volveremos a poner esa llamada aquí abajo, funcionar a tiempo o TO. Esto volverá nulo, e intentaremos golpear esa zona. Entonces, en el tiempo o tiempo de espera para Target y objetivos que sí golpeamos punto un Mt Target Entonces, si los objetos siguen en el área después de haber hecho su golpe inicial, entonces después de cada tiempo o periodo, volverán a ser golpeados. Así que vamos a Ok y veamos nuestro hit box dos D. Bien, y tal vez queremos ser un poco más claros sobre para qué sirve este temporizador. Entonces digamos que esto es en realidad un temporizador de daños, y actualizaré la propiedad lista. Bien, entonces ahora para nuestro temporizador de daños, queremos hacer click derecho sobre hipbox dos D, agregar un temporizador Y vamos a decir para esto que hacemos como 0.25 segundos. Esto será autosrt, y luego solo necesitamos hacer referencia a eso en el Hip Box dos D. Voy a renombrarlo para que sea temporizador de daños para que los nombres coincidan también Así que haz clic en Hit Box dos. Asigne el temporizador dañado. Ahora eso se va a conectar a la señal dentro del guión. Y por cada objeto u objetivo que esté en la zona cuando transcurra el temporizador, va a desencadenar eso Y debido a que esto no es un disparo, automáticamente va a hacer bucle. Entonces, cada 0.25 segundos, va a seguir haciendo esto y va a verificar los objetivos cada vez. Entonces eso probablemente sea bueno ahí. Solo necesitamos el esqueleto para tener lo mismo. Voy a controlar C copiar este temporizador al esqueleto. Y vamos a Control V pegarlo en la caja de la cadera dos D. Vamos a asignarlo en el cuadro de Hit dos D y la parte superior derecha, asignar el temporizador dañado, guardar y ejecutar. Bien, y podemos ver que en algunos de los hipbox dos Ds específicamente como el proyectil el proyectil de velocidad, no tiene esto Entonces tenemos que tener claro que decimos, Si el temporizador está dañado, entonces nos conectamos a su señal. Entonces esto es opcional, y escribí un comentario ahí para que quede claro sobre ese temporizador opcional para emitir periódicamente señales de golpe en los objetivos dentro la caja de cadera dos áreas D después de que haya transcurrido un tiempo establecido Bien, volvamos a correr. Y solo veremos si un orco puede realmente dañarnos dos veces. Bueno, eso va a ser un poco duro con las lanzas ahí Desactivemos la lanza, también. Entonces, desactiva el arma lanza o retírela temporalmente. Volvamos a la escena. Bien, y busquemos un orco que nos dañe algunas veces. Bien, entonces aquí tenemos nuestra k. Veamos cuántas veces podemos recibir daños. Sí, definitivamente podemos ser golpeados varias veces por el mismo orco Y eso probablemente sea demasiado rápido, honestamente. Así que vamos a sumarnos a eso abajo. Primero, voy a controlar Z para volver a agregar el arma de lanza Vamos al orco y voy a establecer su tiempo de peso en 0.5 segundos. Y si parece que el jugador recibe demasiado daño ya que múltiples enemigos se agrupan sobre él, aún puedes aumentar el temporizador de invencibilidad, lo que el número máximo de golpes por segundo caería 5-4, dependiendo de si lo logras a 0.2 o 0.25 segundos de temporizador. Sin embargo, desea ajustar 29. Derrota a un jugador P28: personaje se queda sin HP, necesitamos cambiar a un estado de muerte, y parte de eso va a ser evitar que los ataques continúen, también. Y eventualmente, pondremos un juego sobre pantalla, pero vamos a conseguir que llegue al final del estado de muerte por ahora mismo. Entonces, en la escena del jugador, tenemos nuestro estado de movimiento. Queremos poner en estado de muerte, y creo que en realidad podemos ir a la escena org, e incluso podríamos copiar y reutilizar esto. Si miro en el guión del estado de la muerte, no veo nada al respecto, eso realmente sería un problema excepto tal vez el trimestre aquí al final. A lo mejor solo queremos notificar a un sistema de juego que el personaje ha sido derrotado. Así que sólo voy a copiar el guión. Iremos al jugador. Voy a dar click aquí y añadir un nuevo nodo estatal del limbo Digamos jugador derrotó al estado. Entonces jugador derrotó estado, haga clic derecho, adjunte un guión, y luego lo crearemos en la carpeta del jugador. Voy a pegar esto. Cambiaremos el nombre de la clase aquí arriba al estado de jugador derrotado. Bien, comprobemos el nombre de la animación y asegurémonos de que esté en el reproductor de animación. Entonces la muerte del jugador de animación, tenemos eso ahí. Bien, así que está bien. Si entramos en el estado de muerte, entonces vamos a querer agregar una pista llamada Method Track en nuestro estado de jugador derrotado. Y si vamos hasta el final aquí, vamos a habilitar el chasquido en la parte inferior derecha también, si eso ayuda Así que encaje a 0.6, y luego haga clic derecho y ordene una clave, y llamaremos terminado en el guión. Bien, entonces estoy tentado a usar el sistema de combate ya existente y luego hacer algo como reportar derrotado al jugador La derrota del jugador es más de restablecer el juego o anunciar que se acabó el juego Entonces no es realmente una función del sistema de combate. Entonces, en aras de la separación de preocupaciones, en realidad puedo crear un nuevo nodo para manejar la gestión del juego, y eso eventualmente podría incluir guardar y cargar, también. Ya veremos. Entonces, si vamos a la raíz de nuestro proyecto y sistemas, me gustaría crearlo aquí. Voy a hacer clic derecho y crear un nuevo digamos, guión, y lo llamaremos game manager dot gD Creo que eso funciona como un nombre. Bien. Y en game manager, lo dejaremos como nodo porque vamos a hacer de esto un Auto oad Singleton ¿Por qué no solo usamos un juego de reporte de función terminado, así esto podría llamarse desde cualquier lugar siempre y cuando hagamos referencia al administrador del juego Y cuando informemos de juego terminado, vamos a imprimir, que va a imprimir cadenas a la consola, y vamos a decir, juego sobre jugador derrotado. Y luego, reemplazaríamos esto con UI para que podamos cambiar a un nuevo juego o ver el juego por encima de las estadísticas, etcétera Pero esto al menos demostrará que está funcionando. Bien, entonces queremos tomar el manager del juego y crear una escena para que podamos editar las variables de exportación si alguna vez las necesitamos. Entonces voy a escribir haciendo clic en Sistemas, crear una nueva escena. Este será el manager del juego punto TsCN. Voy a hacer click derecho aquí, cambiar su tipo de nodo a un nodo. Arrastraremos el guión del administrador del juego sobre él. Bien. Y luego queremos guardarlo, ir a Configuración del proyecto. Dentro de Globals, queremos cargar automáticamente el anuncio de TCN de punto de administrador de juegos de sistemas, y ahora es un símbolo de administrador de juegos referenciable a nivel mundial referenciable Entonces, si queremos usar eso, solo podemos volver a nuestro jugador y el jugador derrotó estado y terminó. En lugar de hacer cola gratis, dejaremos ahí al personaje. Y diremos que el manager del juego informe de punto sobre el juego, y eso es todo lo que tenemos que hacer. Una razón para no sacar al jugador de la escena es que como están las cosas en estos momentos, todos los enemigos dependen de la existencia del jugador para que puedan seguir moviéndose. Entonces, en cuanto saques al jugador de la escena, entonces todos los guiones enemigos van a empezar a romperse. Ahora bien, si quieres encarnar eso completamente y permitir que el personaje sea removido de la escena del juego, entonces solo necesitarás verificar básicamente cada ejecución de, digamos, la escena c chase aquí. Solo necesitarías asegurarte de que el objetivo sigue siendo válido, y si no es válido, entonces solo regresarías. Entonces eso podría ser algo así como si objetivo de subrayado es igual a nulo, entonces regresas, y entonces eso solo significará que simplemente no se mueve en absoluto Entonces, ya sabes, por diversión, en realidad podríamos ir a jugador y en el estado jugador derrotado. De hecho podemos agregar en el agente punto q gratis, y solo podíamos ver cómo funcionaría eso. Entonces, si solo agrego en ese cheque que Targets Not null para la escena de persecución, ¿ se va a romper o va a funcionar aquí? Entonces vamos a darle una oportunidad. Veamos si nuestros enemigos pueden seguir funcionando sin ningún jugador en la pantalla. Bien, entonces vamos a ser derrotados. Todavía no he configurado la transición para el jugador HSM Entonces en player HSM, vamos a crear otra función, configurar transiciones Bien. Entonces esto va a requerir que agreguemos una transición de estado de movimiento a estado derrotado, y eso va a ser en el evento derrotado. Bien, así que definamos los de aquí arriba para el jugador HSM en export var move state, que es un estado limbo en export var estado derrotado, que es un estado limbo Y luego crearemos una constante para derrotados, que va a ser un nombre de cadena igual a y citas Bien, ahora necesitamos actualizar nuestros nombres de variables aquí para agregar transición. Entonces carcasa de serpiente para esas variables. Y solo deberíamos poder pasar de mover a derrotarlo en realidad porque no tenemos ninguna mecánica de resurrección en el juego. Entonces una vez que derrotamos, se acabaron los juegos, y eso va a estar bien. Siempre podrías agregar una transición regreso si tienes alguna forma de resucitar. Ahora queremos llamar a las transiciones de configuración dentro del HSM de configuración, configurar transiciones allí y podemos manejar la transición conectándonos a la señal de estadísticas del jugador Entonces después de afirmar que los jugadores no son nulos, queremos conectarnos a la señal en el jugador Entonces esa realmente va a ser la señal en el controlador de estadísticas. Podría hacer referencia directamente al controlador SAT o conectarse al controlador de estadísticas a través del reproductor aunque aún no tiene esa configuración. Entonces supongo que en este caso, sería un poco más directo solo hacer referencia a un extra en Exportar estadísticas de realidad virtual del controlador de estadísticas Bien, y luego aquí abajo diremos estadísticas Alive cambió punto Connect, y estará en Alive cambiado. Así que vamos a crear esa función en la parte inferior y callback. Y esto va a tener el valor P, el nuevo valor del vivo. El S de retorno nulo. Entonces, si el valor de P es igual a falso, entonces queremos despachar el evento derrotado. Bien, así que eso manejará desencadenar la transición de mover a estado derrotado si estamos en el estado de movimiento Si terminas sumando un montón de otros estados, también existe la opción de hacer cualquier estado aquí. Entonces esto hará que sea para que si los personajes derrotados, entonces de cualquier estado, solo puedas hacer una transición directa al estado derrotado. Eso en realidad podría ser preferible pensar a largo plazo porque tal vez agregarías algún tipo de estado de ataque donde juegas una animación diferente. Aún querrás poder cambiar inmediatamente a derrotado en lugar de simplemente poder pasar de movimiento a derrotado cuando ocurra este despacho. De lo contrario, si despachas cuando el personaje no está en estado de movimiento, entonces puede que nunca vaya al estado de muerte. Entonces creo que esta sería generalmente la forma preferible de hacerlo. Bien, entonces ahora tenemos que asignarle todo en el inspector. Así que asigne el controlador de estadísticas, asigne el estado de movimiento y asigne el derrotado 30. P29: Prueba y mejora del comportamiento cuando un jugador es derrotado: Para hacerlo más rápido, voy a dar click en Stats Controller. Tomemos el HP y lo pongamos en diez, y voy a golpear play. Entonces, si nuestro personaje es golpeado una vez, cambiaremos inmediatamente al estado de muerte. Bien, entonces busquemos a un orco. Bien, ahí vamos. Bien, entonces golpeamos al estado derrotado. Pero podemos ver que el agente no tiene estadísticas porque no requerimos eso en el personaje. Entonces, si solo queremos ser consistentes, entonces sí, podemos agregar estadísticas al jugador. Creo que está bien hacer referencia a las estadísticas a través del jugador porque generalmente entenderíamos que el jugador va a tener estadísticas, especialmente en un tipo de juego de rol También, podemos deshacernos de esa variable de velocidad aquí mismo. Se puede ver que el jugador sigue usando la velocidad del guión base en lugar de la velocidad de las estadísticas. Entonces sí, vamos a obtener una referencia a en Export var stats, que es un controlador de estadísticas. Bien. Y luego cuando tenemos velocidad, queremos usar estadísticas de velocidad de punto. ¿Bien? Y vamos a copiar esto y reemplazarlo ahí abajo también. Así que consistentemente usándolo en nuestro proceso de física para el jugador. ¿Bien? Si asignamos las estadísticas y el inspector, podemos hacerlo ahí mismo. Y entonces si nos fijamos en el HSM, ya no necesitamos una referencia directa a las estadísticas porque ya la tenemos a través del jugador Entonces podemos hacer player.stats.ai cambiado, y nos conectaremos al vivo cambiado a través de Así que solo siendo un poco más consistente sobre cómo hacemos las cosas a través de nuestros guiones, aunque ambas opciones, por supuesto, funcionan, ya sea que lo hagas directamente al controlador de estadísticas o a través del reproductor. Entonces entremos al modo de juego y hagamos que un personaje sea derrotado aquí. Entonces los personajes eliminados, y lo que va a pasar es cuando se creen nuevos personajes nuevos NPC, afirmamos que el jugador objetivo necesita existir, pero no Bien, entonces, en realidad, solo vamos a eliminar esta afirmación porque podemos tener personajes engendrados en el mundo del juego y no tener un objetivo Entonces, si esto es nulo, creo que esto en realidad podría seguir funcionando. Y entonces no habrá blanco porque el personaje ya está muerto. Y luego entramos aquí. Cuando target es nulo, entonces no hacemos nada por el estado de Chase. Entonces voy a golpear play. Bien, entonces ahí está eso. Los enemigos simplemente se detienen. Sí. Bien, para que veas que dice tratar de asignar instancia previamente liberada Entonces lo que sí necesitamos aquí es una comprobación más. Vamos a decir que agente punto objetivo punto jugador no es igual nulo, entonces vamos a asignarlo. Bien, eso parece estar bien ahora. No más errores. Ahora, los personajes siguen corriendo en su lugar. Así que incluso podemos poner en un estado inactivo para los enemigos si queremos que sea un poco más creíble porque han terminado su trabajo, así que ahora solo están sentados por ahí Entonces, lo que realmente podríamos hacer aquí en Update es despachar un evento. Digamos que este es el evento inactivo. Bien, entonces vamos a despachar a Idol del estado de Chase, ¿verdad? Entonces ahora si vamos a Ok Enemy HSM, queremos agregar una transición del estado Chase a un estado inactivo Entonces digamos agregar transición. Estado de persecución a estado inactivo. Y eso será bajo el evento Idle. Bien, entonces necesitamos un estado inactivo. Entonces lo haré en Exportar var estado inactivo, que es un estado Limbo aquí Vamos a hacer clic derecho en Agregar en un nuevo nodo hijo Estado del limbo. Bien, y esto va a ser muy similar al estado de la muerte. Voy a ir al Estado de la Muerte y copiar todo aquí arriba en el nuevo estado del limbo Entonces este va a ser el estado inactivo aquí. Haga clic derecho, adjunte un guión, Estado ídolo. Y vamos a controlar V pegar eso en sólo renombrar este estado inactivo. Si iba a crear más estados, probablemente comenzaría a pensar en crear un estado de animación base en este punto. Pero en serio, no es tanto código. Estamos duplicando aquí, así que en realidad no es un gran problema. Y esta es la forma más sencilla de manejarlo. Al menos a corto plazo hablando. Bien, entonces con el AlpiPegado para el estado Idol, solo quiero cambiar el nombre de la animación aquí a Ya obtiene la reproducción de animación de la Pizarra. Nosotros sí queremos cortar esta parte sobre poner al agente para que ya no esté vivo porque eso no es cierto. Básicamente solo esto. Tenemos una animación. Obtenemos el juego de animación desde la Pizarra, y cuando entramos, jugamos la animación Y la animación está inactiva por aquí. Entonces ahora en Enemy HSM, solo queremos asignar el estado inactivo Aparte de eso, esto debería manejar la transición. Nosotros sí queremos tomar la transición al estado de muerte y cambiar esto a cualquier estado. Entonces, ya sean los personajes al ralentí o persiguiendo, podemos hacer la transición a la muerte si ocurre el suceso de muerte. Eso es importante. Y luego solo queremos asegurarnos de que copiamos el estado inactivo al esqueleto. Pégalo aquí y asígnalo en el HSM enemigo. Así que asigne a la derecha, estado inactivo. Y aparte de eso, debería ser bueno. Entonces voy a golpear play, y ya veremos si podemos conseguir que nuestro personaje sea derrotado. Bien, entonces aquí vamos. Nuestro personaje cambió al ídolo y eso es todo. Por lo que ya no necesitan un objetivo. Ya no persiguen a un objetivo. Simplemente están al ralentí en su estado inactivo. 31. P30: creación de una escena con una Pickup2D: Ahora vamos a pasar a crear recolecciones EXP para que nuestro jugador pueda ganar puntos de experiencia y subir Entonces van a haber bastantes pasos involucrados con esto. El primero va a ser crear nuestro guión básico de recolección, un guión de recolección de recolección, y luego asegurarnos de que nuestro personaje realmente pueda adquirirlos y luego asignar el impulso de XP a la experiencia actual del jugador. Entonces comencemos por crear el juego real dos D world pickup. Entonces voy a crear una nueva nota aquí. Usaremos dos escenas D, y voy a renombrar esta para que sea pickup dos D. Todo derecho haga clic sobre ella, y vamos a cambiar el tipo para que sea una base de Área dos D. Y ahora si hacemos clic en el botón de script adjunto, entonces obtendremos una pastilla dos D que extiende Área dos D. Digamos carpeta Objetos, y luego voy a crear una nueva carpeta dentro de aquí. Lo llamaremos camionetas. Entonces puedo guardar la camioneta debajo del cuadrado dos d punto GD dentro de aquí, crear el guión Y en la parte superior, vamos a darle el nombre de clase pickup dos D. Vamos a guardar esto en las pastillas de la carpeta Objects Pickup tdt TACN. Así que guarda eso ahí. Entonces este va a ser un nodo físico mundial que represente un objeto general que puede ser recogido y aplicado a un personaje de una forma u otra. Entonces eso podría significar aplicarlo directamente a las estadísticas o en algunas otras circunstancias, podría significar que lo recoges y lo agregas al inventario de un personaje. No vamos a tener un inventario para el juego, pero tendremos la capacidad de agregar niveles a la carga del arma o crear una nueva carga de arma para un nuevo tipo de Para el pickup dos D, queremos crear una función T para que podamos sacar el objeto del mapa del juego y aplicarlo a los personajes. Entonces digamos función Tr tomar, que va a necesitar un objetivo. Entonces P target es un no dos D, y queremos devolver Boolean si esto fue exitoso o Bien, entonces voy a empujar un error aquí el cual dice que es una función virtual, implementar un script extendido. Ahora, en Gudo 4.5, van a tener clases abstractas, lo que hace que la configuración de esto más concreta porque agregan algunas palabras clave adicionales para ello Pero como estamos en Gudo 4.4, que es la versión estable actual, simplemente lo haremos a la antigua manera, que básicamente significa que tenemos que recordar que cuando extendemos nuestra clase pickup dos D necesitamos anular manualmente esto con una nueva versión de la función nosotros mismos Con los mismos parámetros y tipo de retorno. Para TriTek, vamos a devolver false porque estamos tratando de tomar un objeto en esta clase abstracta, que es la camioneta dos D. Así que para las diferentes camionetas en el mundo del juego, queremos que todas tengan su propia forma personalizada de aplicar al jugador o Así que tendremos que implementar un script de extensión personalizado para cada uno de ellos, L uno para EXP y luego uno para una recolección de armas, o podría haber una recolección de actualización. Entonces esos van a funcionar un poco diferente, así que todos necesitan su propio método tritak Bien, entonces tenemos nuestro guión pickup dos D aquí. Hagamos clic derecho y agreguemos un nodo hijo. Necesitamos una forma de colisión. Entonces, para la forma de colisión aquí, iré a esta forma en la parte superior derecha, y hagamos que sea una forma de círculo. Así que probablemente también quieras defecto sprite aquí también. Así que voy a hacer click derecho aquí, Agregar un nodo hijo, y queremos obtener un sprite Entonces, para un objeto que solo va a reproducir una animación una y otra vez, sin cambios ni nada, creo que Sprite animado dos D es una mejor opción ahí Por ejemplo, si una moneda está girando en el mapa una y otra vez y solo quieres que reproduzca esa animación de forma automática, entonces Sprite two D animado es perfecto para Entonces seleccionaremos eso y presionaremos Crear. Ahora, para los íconos del juego, puede que ni siquiera sean realmente una animación. Pero si vamos a hacer de esta la plantilla por defecto, quiero abrirla como posibilidad. Entonces, para nuestro Sprite animado, pasamos a la animación por aquí Crearemos un nuevo recurso de marcos Sprite y lo abriremos Entonces tenemos una ventana de animación diferente en la parte inferior izquierda. Así que podría simplemente cambiarle el nombre a Idol, si quiero. Entremos en el arte. Queremos entrar en los íconos de Raven Fantasy, y la hoja completa de Sprite, veamos esto y veamos si hay algo que queramos Entonces, para acceder a esto correctamente desde esta ventana de animación, hay este icono Marcos de anuncios de Sprite Sheet Así que da click sobre esto. Después ve a Íconos de fantasía artística, hoja de Sprite de otoño, 16 por 16 De verdad, te vendría bien uno más grande si quieres. A lo mejor sólo voy a usar el 32 por 32. Entonces como un poco más de resolución y ábrelo, y solo puedes seleccionar los iconos que quieras. Bien, ahora para que esto se corte correctamente, necesitamos el número correcto de filas y columnas en nuestra hoja de sprites aquí O si sabes el tamaño de cada icono, creo que puedes simplemente ir al tamaño por aquí y solo poner 32 30 Si. Bien, esa es definitivamente la forma más rápida de hacerlo. Cuando cambies uno, calculará automáticamente el otro. Entonces tenemos 16 horizontales. Realmente, esas son las columnas, y luego 128 verticales son las filas. Entonces, en lugar de calcular eso, solo sabemos que cada uno es 32 por 32. ¿Bien? Ahora podemos fácilmente simplemente escoger el icono que queramos de esto. Para que puedas usar lo que quieras como una gema EXP, creo que en el proyecto de plantilla, estaba usando esta de aquí. Así que una especie de gema azul. A eso le agregamos un marco. Y esto se reproduciría automáticamente si solo verificamos la reproducción automática ahí abajo, pero puedes ver que esto ni siquiera necesita jugar realmente Y probablemente sea un poco más performante si desactivamos la reproducción automática. Entonces es solo mostrar este fotograma y no intentar ni siquiera hacer un bucle de nada. Pura suposición de mi parte, pero vamos a tener ese conjunto ahí. Y ese será nuestro pico predeterminado para Pickup two D. Así que para el nodo raíz pickup dos D, probablemente también queremos configurar las capas de colisión. Entonces no creo que tengamos una capa específica para camionetas. Entonces agreguemos una nueva capa de colisión. Solo hazlo la capa cinco y di pastillas. Bien, cerca. Y luego queremos, claro, poner la pastilla en la capa cinco, y apagaremos la máscara. Desactivaremos el monitoreo porque esto va a ser recogido por algo. No es monitoreo para camionetas. Permite que el jugador que está recogiendo el objeto haga la detección. Entonces esto es solo monitorear un tazón con la capa cinco. Y esa es la escena base para nuestra camioneta 32. P31: Implementar un sistema de captación de experiencia con herencia: Lo que podemos hacer en la parte inferior izquierda es buscar de nuevo la recogida. Esto debería mostrar la carpeta de camionetas, y queremos hacer clic derecho en Pickup two D y hacer una escena heredante Entonces eso está en la cima aquí, nueva escena heredada, lo que significa que estamos creando una nueva escena basada en esta escena, por lo que hereda todos los mismos valores predeterminados de nuestro padre Entonces creamos esa nueva escena, y verás que algunos de estos nodos se vuelven naranjas, lo que significa que estos en realidad se basan fuera de la escena padre. Puedes saltar al padre haciendo clic aquí mismo. Para que puedas tener escenas dentro de las escenas. Y queremos renombrar el nodo raíz para digamos EXP pickup dos D. Porque queremos ser específicos sobre lo que estamos haciendo. Y guardemos esto como una nueva escena. Entonces XP pickup tod punto TCN, guárdalo. Y luego hagamos clic derecho sobre el nodo raíz y extendamos este script. Bien, así que esto nos va a dar nuestro guión EXP Pickup two D, que se extiende desde la camioneta dos D. Y luego subiremos aquí a la parte superior y diremos el nombre de la clase EXP Pickup two D. Así que queremos dar una variable por cantidad de EXP que realmente vamos a recoger cada vez que el personaje use Tri take en la camioneta. Así que en Export VR va a ser un entero, y eso lo haremos por defecto a uno. Y ahora, si nos fijamos en el script pickup two D, queremos tomar esta función e implementarla correctamente en nuestro script heredador Así que voy a copiar esto, y vamos a pasar a EXP Pickup dos D. Voy a pegarlo y vamos a escribir nuestro verdadero método tri take. Entonces el pickup EXP va a aplicar la experiencia al objetivo si el objetivo realmente tiene experiencia. Entonces digamos que si ptarget dot stats es igual a null, entonces vamos a devolver false aquí De lo contrario, podemos decir que var stats es igual a ptarget dot stats Y como no sabemos lo que realmente significa esta variable de estadísticas en el contexto de cada script, vamos a asignarle el bombo del controlador de estadísticas directamente Entonces, una vez que se cumple la condición, que este es un objetivo que tiene un bloque de estadísticas, podemos decir estadísticas punto experiencia más igual experiencia, y luego volveremos verdadero. Entonces, después de recoger la experiencia, no queremos que la recolección vuelva a ser utilizable, así que diré monitoreable es igual a false, y luego dejaremos cue free en el objeto Entonces, cuando te pongas libre, va a haber algún periodo de tiempo antes de que finalmente se elimine de la escena. Así que queremos asegurarnos de que nada más entrando en él en ese cuadro singular pueda recoger accidentalmente la camioneta EXP por segunda vez. Entonces me estoy convirtiendo en falso monitoreable aquí para que nada más pueda detectar Apenas como una salvaguardia, y luego retiramos de la escena por completo. Así que esta parte de aquí, probablemente en realidad quiero reutilizar en todas mis camionetas Voy a cortar esto en pickup dos D y luego decir función remove, que devolverá void, y solo voy a hacer este paso de wrap up. Entonces ahora, si vuelvo a la recolección de EXP, solo llamo remove, que se obtiene de la clase base. Entonces esta función ya está escrita en la clase base, y podemos reutilizarla aquí. Entonces, como, si, en cualquier momento implementamos trillado si queremos rehacer eso, solo podemos hacer eliminar aquí Y para que esto funcione, necesitamos agregar las estadísticas experimentadas a nuestro control de estadísticas. Entonces en el controlador set, voy a crear esa propiedad EXP. Bien, entonces vamos a tener experiencia Vara y el suelo por defecto a cero como un entero. Bien, y algo así en línea con la toma de daños, donde llamamos al conjunto invencible por separado de configurar el HP, en realidad podría preferir no hacer un setter Más bien hacer la función de experiencia publicitaria, y le daremos una cantidad. Entonces P cantidad, es un entero y vamos a volver vacío aquí. Por lo que queremos llevar la experiencia más equivale a P cantidad. Y luego como a hacer, verificar para subir de nivel. Y también podemos decir impresiones experiencia aquí. Así que obtendremos la experiencia total a medida que estamos recolectando elementos del mapa en la consola. Y luego para actualizar la recolección EXP para eso, quiero hacer estadísticas punto agregar experiencia experiencia. Bien, entonces estamos siendo un poco más explícitos. Entonces esta función implica cualquier cosa relacionada con experiencia que necesite cambiar al agregar experiencia va a ocurrir, lo que significa que verificaríamos un nivel arriba y así sucesivamente. Y supongo que esto tendría algún beneficio. Como si pudiéramos cambiar el valor de la experiencia sin activarnos automáticamente o verificar si tuviéramos la necesidad de eso más adelante En lugar de hacer siempre eso, pase lo que pase, como hicimos con el setter HP, donde siempre actualiza tu vida Ambas formas de hacer las cosas son válidas hasta cierto punto. Se trata de cómo quieres expresar tu intención aquí. Y ¿quieres ocultar el hecho de que establecer la experiencia también desencadenaría un subir de nivel poniéndola en un setter de experiencias, o quieres ser más explícito con la función add experience 33. P32: Configurar Collector2D y arreglar las animaciones del reproductor: Para obtener la experiencia en nuestro controlador de estadísticas desde el Pickup two D, necesitamos nuestro nodo colector dos D, que va a ir por ahí recolectando pastillas para nuestro jugador Entonces vayamos a la escena del jugador. Voy a hacer clic derecho sobre el jugador. Añadimos un nodo hijo. Busquemos un Área dos D. Así que esta área dos D, voy a renombrarla por aquí para que sea coleccionista dos D. Y luego hagamos click derecho adjuntar un guión. Entonces el guión irá podría ser en caracteres, así que de hecho lo pondré en caracteres. Podría haber un caso en el que realmente hagamos que un enemigo pueda recoger objetos, pero no quiero que sea completamente específico del jugador. Entonces voy a poner ahí el guión. Vamos a crear. Después en la parte superior izquierda, le daremos el nombre de clase colector dos D. Lo que nos importa para el área colectora dos D es cuando una camioneta entra en el espacio. Entonces diremos que la función subrayado listo va a devolver void, y diremos área ingresada punto connect en área ingresada A continuación vamos a crear la función callback guión bajo en el área ingresada va a recibir un área P área dos D como parámetro y retorno void Entonces si el área P es un pickup dos D, entonces haremos P area dot Tri take on our root node. Entonces nuestro nodo raíz es nuestro jugador. Podríamos exportar nuestro nodo raíz aquí en export object root es el nodo dos D, supongo. Y entonces vamos a enviar ese objeto root aquí. Como el objeto TriTek, el que queremos atravesar Ahora, en nuestro inspector, firme aquí al jugador, y eso podría ser realmente todo lo que necesitamos. Así que agreguemos una copia de nuestra camioneta EXP al mundo del juego. Vamos a meter unos cuantos, de verdad. Entonces voy a hacer clic derecho sobre Mundo. Vamos a crear un nodo dos D. Voy a cambiar el nombre de estas pastillas, y luego agregaré un par de pastillas al Entonces uno, dos, tres, y luego pondré todo esto en el padre de las camionetas Podemos ver que estos son bastante grandes. Eso está bien por ahora, pero probablemente los vamos a reducir por el resto de nuestro juego. Entonces antes de que estos vayan a funcionar, solo recuerdo que no hemos montado el colisionador en el jugador Para el colector dos D, haga clic con el botón derecho en un nodo hijo, y queremos la forma de colisión dos D aquí. Entonces, a la derecha, agrega una nueva forma de círculo y encoge eso a tal vez por ahí, un poco más grande que la forma normal de colisión. Ve al colector TD y toma la colisión. Vamos a enmascarar en la capa de pastillas y luego desactivar la capa de máscara un mundo y la capa de colisión un Este debería ser un script solo de monitoreo. Y acabo de notar que debido a que estos fotogramas brillantes son de diferentes tamaños para nuestras animaciones, no están alineando correctamente en el centro. Al igual que, el ídolo se ve bien, pero correr es tal vez un píxel a la derecha, y luego la muerte es un poco incorrecta ahí también. Entonces, una forma en que podemos arreglar esto para asegurarnos de que todos estén correctos es asignar una propiedad position a cada uno de los SprikeFrames, lo que parece que en realidad ya hice aquí para la posición de muerte Así que Idle tiene su propio valor. Déjame ver qué pasa si realmente elimino esas propiedades de posición. Entonces hazlo por la muerte Idol y corre, ¿de acuerdo? Y luego lo eliminaremos para el reinicio también si está ahí. Bien, entonces, sí, parece que necesitamos personalizarlo de nuevo. Bien. Entonces comencemos con la carrera. Lo colocaré aquí mismo en negativo 30 y fotograma clave eso en esa animación Iremos a Idle. Le pegaré a W y lo moveré hacia abajo. Entonces es como justo por ahí, negativo 13 y fotograma clave. Bien, vamos a correr. Vayamos a Idle. Parece que Idle sigue siendo un píxel bajo, así que voy a moverlo hasta 14 negativo, fotograma clave Creo que eso es lo que teníamos antes, pero voy a sacar la carrera y moverla una a la izquierda también y enmarcarla clave. Entonces ahora si cambiamos entre inactivo y correr. Bien, eso en realidad se ve correcto ahora. Vamos a morir y moverlo por aquí a la derecha y enmarcarlo clave. Entonces eso son diez píxeles a la derecha. Y ahora cambiamos a inactivo. Bien, la muerte es demasiado un píxel a la derecha. Entonces eso necesita ir a un nueve negativo, marco clave lo. Entonces tenemos ocioso. Bien, entonces tenemos que ir dos pixeles más a la izquierda para la muerte y enmarcarlo clave. Entonces ese es un ocho, y luego el inactivo es cero para X. Bien, todos estos parecen que están haciendo fila ahora. Bien. Entonces aquí están los valores reales. Ocho negativos 14 por la muerte. Ídolo es cero negativo 14. Ejecutar es negativo uno y negativo 30. Y luego el reset, que debería coincidir con el ídolo, que es cero, negativo 14. Por lo que el reinicio bajará a negativo 14. Negativo 14 está justo ahí, Keyframe it. Bien, y eso debería arreglar cualquier problema de animación que estemos teniendo con esas hojas de sprites Bien, ahora de vuelta al colector dos D. Asegúrate de apagar la capa uno y la máscara para la capa uno, también. Bien, y ahora podemos presionar play y ver si realmente podemos recoger esos pequeños íconos. Entonces sí conseguimos ese. Comprobemos la salida. ¿ Conseguimos la experiencia? Sí, lo hicimos. Tenemos una experiencia ahí. Vamos a ir aquí abajo. Obtenemos experiencia dos. Ahora bien, esta experiencia tres, por lo que podemos confirmar que nuestras recogidas están funcionando en función de la salida de nuestra consola Y nuestro personaje quedó derrotado en el fondo. Pero eso es bueno eso demuestra que ese juego sobre sistema en realidad estaba funcionando, también. 34. P33: crear una mecánica de caída del enemigo y redimensionar las pastillas: Nuestras camionetas. Ahora, queremos asegurarnos de que los enemigos realmente los dejen caer cuando sean derrotados. Probablemente también rápidamente queramos cambiar el tamaño de la camioneta dos D porque es el doble del tamaño de nuestro jugador en este punto Entonces en EXP pickup dos D, puedo o cambiar el sprite animado a la versión 16 por 16, lo cual es conveniente porque ya tenemos eso, o puedo tomar el nodo y escalarlo Entonces puedo hacerlo como 0.50 0.5. Y entonces esa sería una forma de hacer que se encoja. Pero si ya sabemos que el tamaño no va a ser consistente en nuestro juego, podría estar teniendo más sentido entrar en la escena base de pick up dos D, cambiar el sprite animado Y luego agregamos el mismo icono, pero del paquete 16 por 16. Así que entra en los iconos del arte hoja completa de Sprite, 16 por 16. Támalo como 16 por 16 porque esta es la hoja de sprites más pequeña Y luego controlaremos el carrete de ratón de metal, acercaremos el zoom, encontraremos el sprite, lo agregaremos y eliminaremos el grande Entonces selecciona cero y elimina eso, y luego bajará al fotograma cero. Guarde eso. Y luego de vuelta en esta escena, puedes guardarla también, y debería ser buena en la cosmovisión Bien, entonces ahora es el tamaño apropiado. Bien, así que vamos a entrar en la escena de los orcos, y agregaremos la capacidad de soltar objetos Entonces aquí, queremos un guión que vaya a manejar elementos que podamos dejar caer en el juego, y es manejar elementos que podamos dejar caer en el juego, posible que queramos seleccionar aleatoriamente de una lista de elementos, y podemos ponderarlos de la misma manera que lo hicimos con la espera del desove enemigo Entonces voy a hacer clic derecho sobre el estado de muerte ya que esto va a estar directamente ligado al estado de muerte en el sentido de que soltamos artículos al morir, y voy a agregar un nodo hijo. Así que haz aquí un nodo regular. Entonces cambiaremos el nombre de esto para que sea algo así como gotas. Haga clic derecho, agregue un script, y luego por aquí, lo crearemos. Entonces le daremos las gotas de nombre de clase. Entonces le daremos las gotas de nombre de clase. Bien, y en nuestro script de caída, vamos a querer básicamente una lista de elementos que podamos soltar. Entonces, digamos que en Export VR, iremos con las definiciones de caída, y esta será una matriz de definición de caída. Así que tipo de seguir el mismo patrón de antes, donde tenemos un recurso definido por el editor, podemos repetirlo nuevamente así en el sistema de archivos, vamos a querer ir a algún lugar como la carpeta de pastillas de Objetos hacer clic derecho y crear un nuevo script Y voy a llamar a esta definición de caída. Y esto se extenderá desde el recurso. Crea eso. Ahora podemos abrir la definición de caída, darle el nombre de clase drop definition. Y vamos a querer en la escena Export VR, que es una escena repleta. Entonces, ¿qué estamos cayendo en el mundo del juego, la caída real del artículo? Entonces, debido a que es una escena repleta, realmente podría ser cualquier cosa que tenga un nodo en su raíz. Podrías dejar caer enemigos si quisieras. Entonces este empaque solo lo hace flexible. Bien, y luego a continuación queremos un peso. Así que el peso var de exportación es a flote. Eso lo haremos por defecto a 0.1, y ese es un comienzo decente. Entonces volveremos a entrar en el script drop, y tenemos nuestra variedad de definiciones de drop para que podamos hacer clic en drops. Y si no puedes ver la matriz aquí arriba y el inspector por aquí, solo puedes ir a Project y volver a cargar el proyecto Bien, entonces ahora si revisas al inspector, debería aparecer ahí siempre y cuando no tuvieras ningún error. Entonces crearemos nuestra primera definición de caída. Entonces nueva definición de caída, y podemos hacer de este un gimnasio EXP con un peso de uno, si queremos. Carga tan rápida. Y vamos a buscar la camioneta EXP dos D enter, y eso lo configura. Entonces nuestro orco solo va a poder soltar las gemas EXP, y eso está perfectamente bien para nuestro enemigo básico Entonces queremos funcionar podemos llamar a nuestro estado de muerte o nuestra animación que sería capaz de generar las gotas en el mundo del juego. Entonces podríamos decir función drop si quieres, podrías pasar un número de veces aquí, como P veces es un entero, y eso puede por defecto a uno, y esto devolverá void. Entonces podríamos decir cuatro veces en rango cero a P veces incrementando en uno cada vez Entonces esto significa que empezamos en cero, subimos una vez hasta llegar a P veces. Entonces, si P times es uno, esto se ejecutará una vez porque hará cero, y luego golpeará P veces y se detendrá. Entonces vamos a hacer el colon ahí. Bien, y luego después de hacer el loop, necesitamos generar una gota cada vez. Por lo que probablemente sería mejor calcular el peso total una vez y luego lo usamos dentro de aquí. Entonces vamos a generar el peso. Entonces antes de generar las gotas, diremos cuatro definiciones de DF y drop. Acumularemos el peso total, por lo que necesitamos una variable por encima de esto. Hasta el momento, el peso total, hay un flotador comienza en cero, cero, y eso va a ser peso total más igual al peso del punto DF. ¿Bien? Entonces tenemos eso. Ahora, dentro de este bucle de cuatro en la parte inferior, lo estamos pasando cada vez. Queremos obtener nuestro peso seleccionado entre cero y el peso total. Así que es como repetir la misma lógica que otras aleatorización que hemos hecho en este curso Entonces digamos var peso seleccionado va a ser igual al rand F, que es 00-1 0.0, y vamos a multiplicar ese valor por nuestro peso total, lo que nos dará nuestra selección Entonces ahora para cada una de las gotas para definición en las definiciones de caída, agregaremos el peso hasta el momento. Hasta el momento, el peso actual, que es un flotador y comienza en cero, cero, diremos que el peso actual más es igual al peso de definición. Bien, así que eso nos da lo que estamos hasta el momento. Si esto es mayor que el peso seleccionado, entonces queremos devolver este drop o agregarlo a una matriz drops. Entonces, si el peso actual es mayor o igual al peso seleccionado, entonces este es el que queremos agregar a una matriz Así que vamos a crear una matriz aquí arriba del bucle cuatro, y diremos var drops es una matriz de definición de caída. Ahora, cosa clave aquí, esto puede tener múltiples copias de la misma definición de caída. Es una matriz, no algo más como un conjunto hash. Para que podamos tener la misma caída dos o tres veces si es necesario, lo cual es importante. Decir gotas punto añadir la definición, y luego salimos de ese bucle de cuatro, y luego va a ir de nuevo aquí Entonces, una vez que llegamos a donde el peso actual es igual o mayor que el peso seleccionado, elegimos la gota, y volvemos a hacer un bucle por cada vez que necesitemos para esta configuración de caída. Entonces ahora tenemos todos los descensos aquí abajo, así que queremos emplearlos en el mundo del juego. Entonces digamos cuatro gotas en gotas. Vamos a crear una instancia que va a ser igual a drop dot visto punto Instanciate Y luego vamos a agregar eso de niño a algún padre dentro de nuestro mundo de juego. Entonces en el mundo, podríamos simplemente reutilizar este nodo de camionetas si queremos Para que pueda tomar camionetas. Vamos al nodo aquí arriba en la parte superior derecha, y voy a añadir un nuevo grupo. Entonces diremos camionetas. Voy a hacer esto global. Entonces, para cualquier cosa que sea un artículo para ser recogido del mundo, lo agregaremos como su grupo de nodos. Entonces, cuando está en un grupo de nodos, es muy fácil de encontrar dentro de nuestro script Y en realidad podemos obtener ese nodo de pastillas tan pronto como nuestro orco se cargue, así sabremos si hay algún problema Así que vamos a decir var pastillas padre, y eso va a ser el nodo dos D, y vamos a decir función subrayado y eso va a ser el nodo dos D, y vamos a decir función subrayado ya. Déjame acercarme aquí. Pickups parent va a ser igual a Gtree dot Obtener primer Nodo en grupo, y estamos buscando esas recogidas así que en los grupos de nodos de aquí en los grupos de nodos del inspector, puedes ver las recogidas ya hay una, y esto está asignado a este nodo puedes ver las recogidas ya hay una, y esto está asignado a este Entonces, mientras el nodo de pastillas exista en nuestro mundo de juego actual, funcionará bien Podríamos ir un pequeño paso más allá y sacar esto a una variable constante. Entonces vamos a decir grupo de recogida aquí, todas las mayúsculas, y luego grupo de recogida constante es un nombre de cadena igual a, y voy a decir ampersand, Control V, pega la Entonces, siempre y cuando tengas un nodo en el grupo de camionetas para esto y hayas asignado ese nodo al grupo dentro de tu proyecto de juego y exista en la escena, entonces esto funcionará perfectamente bien No hace falta obtener ninguna referencia directa, lo cual sería complicado porque el orco no existe en la escena hasta que se ha engendrado Entonces esta es una manera decente de obtener ese nodo padre al que podamos padre. Si queremos estar seguros incluso podemos decir, como, afirmar las recogidas padre y no es igual a null, y luego diremos que debe haber un padre para que los artículos Bien, eso está bastante claro. Bien, entonces instanciamos cada una de las escenas y luego queremos agregarlas de niño al padre de las camionetas Así camionetas padre Achildestance. Y la ubicación en la que queremos que esté la gota va a estar basada en el nodo dos D. Así que en realidad necesitamos tomar gotas y cambiarlo a un nodo dos tipo D. Entonces aquí abajo, podemos decir que posición global de Instance va a ser igual a la posición global desde el guión. Bien, entonces eso significa de vuelta en nuestra escena org. Entonces ahora queremos cambiar este tipo de nodo, voy a hacer click derecho y cambiar el tipo, buscar gotas, y deberías verlo aquí. Haga doble clic. Bien, da clic en gotas. Asegúrate en el inspector, todavía tienes ahí tu definición de caída para el EXPJM Y probablemente necesitamos sacar esto de los nodos HSM aquí Ya que este es un nodo dos D, queremos que sea hijo de nuestro nodo principal dos D, así que traeré esto aquí arriba como hijo del trabajo. Y eso probablemente debería ser bueno. Así que tenemos el artículo o lo que sea que estemos dejando caer obtener instancia en el mundo del juego. Se convierte en un hijo del nodo del grupo de pastillas, y luego le damos la posición de este nodo de gotas, que cae es solo un desplazamiento, si lo hay, de la posición de los orcos No necesitamos cambiarlo, pero podríamos simplemente tener un default como cero, cero ahí. Eso está bien. Y ahora podemos o bien llamar gotas de la animación de la muerte o del estado de muerte. Entonces si voy al reproductor de animación aquí y abrimos la animación de la muerte, veamos. Estado de muerte. Entonces vamos a ver. Estamos llamando estado de muerte terminada. Podríamos simplemente poner las gotas cuanto el orco empiece a morir Creo que esa podría ser más la forma en que van la mayoría de los juegos, donde se ve el bucle antes de que despunten de la escena Entonces en una pista, método de llamada en el nodo drops. Entonces aquí abajo en el primer fotograma. Vamos a acercarnos. Bien, haz clic en Insertar una llave. Nosotros hacemos gotas. Se puede ver el trabajo de parámetros en el reproductor de animación. Entonces, en la parte superior derecha, tenemos nuestro nombre de método drop. Tener el argumento. Entonces el primer argumento y el único argumento es int value. Entonces, ¿cuántas veces queremos llamar a gotas? Podríamos decir 50 por diversión, y vamos a golpear Play y ver si eso realmente funciona. Entonces esto pondrá muchas de estas gemas EXP en escena si está funcionando, pero al menos definitivamente sabremos si funciona. Entonces veamos qué pasa. Bien, creo que todos simplemente engendran en el mismo lugar Entonces voy a repasar eso. Y si, ya ves que recogimos 50 gemas. 35. P34: generar posiciones aleatorias de caída de artículos: Ly, cuando el orco deja caer 50 de estos artículos, están todos apilados uno encima del otro, si verifico la salida Así que ahí conseguimos 50 XP. Y creo que lo que nos gustaría hacer es que cuando se genera el objeto, o le damos un desplazamiento o hacemos que se aleje del objeto Está bajando de un poquito. Entonces creo que la forma más rápida de hacer esto sería generar una posición de desplazamiento aleatoria, y esta será un cierto número de píxeles lejos del personaje en una dirección aleatoria Así que solo podemos agregar esto para el script drop. El tope, voy a a exportar nuestro drop Max distancia, que será un flotador. Y vamos con diez píxeles por defecto. Esto va a representar qué tan lejos del nodo drops. Ese es este nodo específico en el que estamos trabajando en el que el objeto puede generar, y esta es una cantidad máxima, por lo que puede ser 0-10 píxeles Así que aquí abajo, voy a crear una nueva función. Lo llamaré función, subrayado, get span, offset Y esto pasará en una distancia P max, que es un flotador, y podemos por defecto eso a la distancia máxima de caída. Entonces no tenemos que pasar un parámetro. Simplemente puede ser eso por defecto. Y luego queremos volver al vector dos como el offset. Entonces, para obtener un desplazamiento final, necesitamos la dirección, y luego la magnitud, la magnitud está justo aquí en la distancia P max. Entonces digamos que var direction va a ser un tipo inferido del vector dos, y vamos a crear un nuevo vector dos, así que envuélvalo entre paréntesis aquí, necesitamos una X y una Y. Entonces para conseguirlo, básicamente necesitamos generar una dirección aleatoria entre uno negativo y 1.0 Entonces voy a decir rand F, y creo que necesitamos rango aquí porque queremos ir negativo 1.0, no cero a uno. Así rando rango F en negativo 1.0 a 1.0. Y entonces tenemos que hacer eso por segunda vez para que podamos copiar esta línea para el valor Y hasta aquí abajo. Y luego quiero normalizar el vector para que sea una dirección pura. Bien, entonces ahora conseguimos nuestro offset. Entonces var offset va a ser igual a la dirección multiplicada por la distancia P max. Y luego devolvemos el offset, y eso es básicamente todo. Así que tomamos Get spawn offset aquí, y cuando estemos estableciendo la posición global, vamos a hacer la posición global más GitsPawnOFSET El valor por defecto es drop Max distance, así que solo podemos usar eso como predeterminado aquí. Así que en realidad no necesitas pasar en drop Max distancia, pero podrías. Entonces solo sería el valor anulándose a sí mismo. De cualquier manera, va a ser lo mismo, pero tienes la opción de dejarlo en blanco, y entonces ese valor simplemente quedará por defecto aquí abajo. Creo que eso es todo lo que necesitamos. Así que vayamos al modo de juego y veamos si esos 50 artículos realmente caen en diferentes ubicaciones. Así que vamos a golpear play, y vamos a entrar aquí. Le dispararé una flecha o lanza al orco. Y podemos ver que todos engendran en direcciones aleatorias Pero en realidad cometí un error. Entonces no queremos normalizar el vector porque quiero que el porcentaje de la distancia pueda ir 0-100% Bien, entonces porque normalicé el vector para la dirección, siempre va a darte la distancia máxima completa aquí. Th solo será la dirección pura. Pero lo que en realidad quiero es que cuando tome esa dirección, será algún porcentaje de la distancia. Y en realidad podríamos querer llamar a esto más como un vector aleatorio. Y luego bajaremos para compensar aquí abajo y más allá de eso. Entonces cuando esté tomando la X, estará en algún lugar 0-100% de la distancia en la X multiplicada por la distancia P max y lo mismo para la Y. Así que esto le dará una especie de posición más aleatoria dentro de un círculo imaginario Si tuviera que crear una forma de colisión, se vería así para las posibles ubicaciones de lapso. Así que entremos al modo de juego, y debería ser más correcto ahora cuando bajemos los 50 artículos al mismo tiempo. Entonces ahí tienes. Todos se generan aleatoriamente dentro de ese círculo. Nunca vamos a dejar caer 50 artículos al mismo tiempo. Entonces este tipo de parece un poco funky. Pero si hay como dos o tres gotas, creo que va a funcionar bien. Entonces para demostrar, iré al reproductor de animación, y cuando hagamos la muerte, tomaré aquí la función de gotas y cambiaremos su valor de argumento de cuántas gotas a algo más como tres. Creo que eso es más realista. Vamos a tocar, y luego entraremos aquí. En la mayoría de los casos, creo que la mayoría de los enemigos sólo van a dejar caer un elemento. Pero si decidimos bajar tres, entonces al menos podemos ver que tienen diferentes posiciones, y es obvio al menos ver dónde están. Bien, así que quiero terminar esto simplemente cambiando las gotas a una. Cada uno o solo dejarán caer un EXP hacia arriba. 36. P35: implementa un área de gravedad de una pastilla: Es un poco tedioso si tu jugador tiene caminar sobre todas y cada una de las recogidas que quieras agarrar, sobre todo cuando vas a estar esquivando a todos estos enemigos orcos que atraviesan Entonces, lo que queremos agregar va a ser un área de gravedad de recolección. Entonces, en nuestra escena de jugador, lugar de agregar el área de gravedad a nuestro nodo colector dos D, voy a crear un nodo de dos áreas D separado para la gravedad específicamente. La razón de eso es porque la colisión forma dos D aquí para recoger realmente los artículos va a ser un área diferente a la que está aplicando gravedad. Entonces eso sería un poco confuso con el coleccionista dos D, teniendo aquí dos formas de área. Entonces vamos a crear un nuevo nodo. Voy a hacer click derecho sobre jugador agregar un nodo hijo. Esto sería en el área dos D. Lo agregaremos aquí en la parte inferior, y voy a renombrarlo para ser decir pickup gravedad dos D porque esto es específicamente para artículos en el mapa que se pueden recoger. Bien, así que vamos a hacer clic derecho sobre el jugador agregar un nodo hijo. Vamos a buscar el área dos D, y podría llamarlo algo así como área de gravedad dos D. Pensé en llamarlo pickup gravedad dos D, pero queremos hacer el guión un poco más genérico porque puede haber casos en el camino en los que realmente quieras que la gravedad aplique a algo que no es una camioneta, y manejando la gravedad específica de la camioneta solo es manejado por la forma de colisión. El manejo del hecho de que es para apuntar a camionetas solo es administrado por las capas de colisión Entonces, todo lo que tienes que hacer para que sea destino a las recogidas es elegir la máscara cinco aquí para la capa de pastillas, y apaguemos la capa uno para donde existe encendida y hagamos que solo monitoree Bien, entonces esa es nuestra configuración. Entonces solo necesitamos en el área de gravedad aplicarlo a todos los objetos dentro de aquí que detecte. Entonces, dentro del área de gravedad, haremos clic derecho. Antes de pasar del inspector, sin embargo, si nos fijamos en esta sección de gravedad, es una gravedad construida en el área dos D, pero la cosa es que se aplica al cuerpo rígido dos Ds, que son objetos físicos completos en el juego, y no queremos 1.000 cuerpos rígidos flotando alrededor de la pantalla. Entonces, en lugar de usar la física estándar para controlar la gravedad en nuestras pastillas, solo queremos un guión simple solo vamos a hacer que llegue donde sea que esté el centro del jugador Y no tratar con cuerpo rígido dos Ds en absoluto. Entonces, esencialmente, es una optimización del rendimiento. No necesitamos física completa para cada uno de nuestros artículos de recolección. Simplemente existen para ser recogidos por el jugador. Por lo que chuparlos directamente al jugador está perfectamente bien. Entonces voy a hacer click derecho sobre Gravity Area dos D y adjuntaremos un guión. Por supuesto, voy a llamar a esta zona de gravedad dos D. Vamos a crear ese nombre de clase. Por supuesto, área de gravedad dos D. Bien, entonces mientras un objeto está dentro de la zona, queremos rastrearlo y aplicarlo consistentemente un movimiento, básicamente trasladando otro nodo dos D a través la pantalla hacia el punto central de esta área dos D, el área de gravedad dos D. Así que vamos a tener una variable local Lo llamaré objetivos, y esto será una matriz de nodo dos D está bien. En función lista, queremos conectarnos a la señal de esta área dos D. Así que vamos a decir área ingresada punto conectar, subrayado en área ingresada También nos conectaremos al área de salida del área salió punto connect en el área salida Tenemos que crear esas funciones ahora. Función subrayado en el área ingresada, y esto nos va a dar área dos D como parámetro Entonces área P área dos D, estamos intentando anular aquí. Bien, entonces, ¿qué vamos a hacer con la zona de aquí? Vamos a moverlo hacia el punto central de nuestra área de gravedad dos D. Esto va a funcionar bien con la camioneta porque las áreas de recolección están en su raíz en el área dos D. Así que cualquier cosa debajo de ella va a ser movida automáticamente hacia el centro por lo que sí requerimos que tenga ese tipo de configuración. De lo contrario, necesitarías una referencia al nodo padre de la escena. Cualquiera que sea tu base de tu escena de recogida es el objeto o nodo, más bien, que necesita moverse. Así que ten en cuenta eso. Debido a que estamos haciendo todas las camionetas específicamente así y las pastillas son exclusivas de la capa cinco, funcionará bien tal Si quieres estar extra seguro y quieres limitarlo a solo scripts de recolección, entonces podrías, por supuesto, verificar si el área P es de tipo pickup dos D. No parece ser necesario como lo es ahora mismo, pero eso es algo a tener en cuenta. Entonces voy a poner un pequeño comentario ahí arriba sobre lo que acabo de decir. Bien, y ya que el área P recoge así. Voy a trabajar bien como está. Entonces diré objetivos puntean un bolígrafo, área P. Recuerde, el área P área dos D es de tipo nodo dos D, así que eso funciona bien aquí arriba. No hay necesidad de ser más específico que eso porque solo necesitamos acceder al nodo dos funciones D. Entonces en área salida, función, subrayado en área Área P área dos D, devuelve void, entonces vamos a decir blancos punto borran área P. Ahora, para anotar sobre la función erase, si el objeto que intentas borrar de la matriz no existe en la matriz, entonces esto no hará nada. Si borra, entonces lo eliminará. Así que en realidad no es necesario verificar si ya está en la matriz. Porque si no existe en la matriz, entonces esto ya simplemente no hará nada. Entonces no hay necesidad de verificar dos veces. Derecha. Y entonces necesitamos un proceso de física. Entonces digamos función subrayado proceso de física, y vamos a decir para el objetivo en objetivos, queremos traducirlo a través de la pantalla hacia el punto de área de gravedad central Necesitamos una velocidad en la parte superior a la exportación la velocidad de gravedad lejana es un flotador. Si recuerdo, esto va a salir a píxeles por segundo. Entonces voy a probar algo así como 50.0. Entonces necesitamos calcular la dirección entre el objetivo y nuestro punto central de área de gravedad. Hasta ahora la dirección va a ser igual al punto objetivo posición global punto dirección dos posición global. ¿Bien? Y luego solo necesitamos calcular nuestra cantidad de mudanza. Entonces var mover va a ser igual a dirección tiempos gravedad, velocidad, tiempos Delta. Como estamos usando translate, necesitamos factorizar eso directamente aquí para el vector de movimiento final. Podemos decir que este es un factor dos D, si eso lo deja más claro. Y luego queremos tomar el objetivo y traducirlo a través de la pantalla por el desplazamiento de movimiento. Este es esencialmente nuestro guión de gravedad justo ahí mismo. Lo último que creo que necesitamos es agregar una forma de colisión a nuestra área de gravedad. Entonces haga clic derecho en el área de gravedad a D, agregue una forma de colisión a D. Vaya a la parte superior derecha, una nueva forma de círculo y haga esto bastante grande para que tengamos el área donde realmente va a aplicar gravedad hacia el centro. Bien, para que pueda jugar, y entraremos aquí y podrán ver que nuestros objetos se chupan hacia el centro Entonces ahora mismo, la gravedad es lineal. Es posible que queramos darle una curva para que cuanto más se acerque al punto central, más rápido en realidad va a animar esa traslación hacia el centro Entonces si vamos al área de gravedad dos D, y dentro de aquí, voy a decir en la exportación, digamos curva de efecto de tipo curva. Eso lo guardaremos. Después en el inspector, editemos esta curva de efecto, nueva curva. Y entonces queremos que X o el dominio max aquí sea básicamente la distancia desde el centro. Y entonces el valor aquí va a ser qué porcentaje de la velocidad máxima quieres aplicar en base a esa distancia. Entonces digamos que la distancia es como 100 aquí para el dominio max. Cuanto más cerca esté más cerca queremos llegar a 1.0. Entonces vamos a tomar el primer punto y moverlo aquí arriba a 1.0. Voy a acercar aquí para que puedan ver. Y entonces sólo voy a tirar un segundo punto hacia abajo así. Bien. Entonces, si llega a la distancia 100, va a ser muy débil en ese punto. Y eso se mediría en píxeles, claro. Entonces entonces con esa curva, queremos volver aquí y ajustar el movimiento muestreando esta curva. Así que vamos a obtener el modificador de curva, y eso va a ser igual a la muestra de punto de curva de efecto. Y necesitamos muestrear con la distancia desde nuestro objetivo hasta el centro de gravedad. Así que la distancia vara va a ser punto objetivo Posición global, distancia de punto a la posición global. Bien, entonces simplemente pasamos esa distancia al muestreo del modificador de curva, y luego tomamos el modificador de curva y lo multiplicamos por el Delta. Entonces este será algún valor entre 0.0 y uno. Y eso debería afectar la gravedad basada en esta curva. Cuanto más cerca está, más fuerte es. Y por aquí, se debilita. Siéntase libre de personalizar una curva si necesita cambiar un poco la forma de la animación. Bien, entonces voy a tocar aquí y vamos a probar eso como que fuera. Es un poco difícil de ver porque tal vez hice que la distancia máxima aquí fuera demasiado grande. Entonces lo que puedes hacer es verificar la forma de colisión y ver cuál es su radio. Entonces 27 pixeles. Así que básicamente estamos haciendo una curva de hasta 100 píxeles, pero el máximo de este radio es de 54 píxeles, 27 por aquí. Oh, en serio, no, no, no, 27 pixeles porque es el centro al punto exterior, ¿verdad? No el diámetro, claro. Si, tal vez quiera tomar el radio aquí y solo hacer que sea 30 pixeles, un buen número par, y luego vamos al área de gravedad. Y luego tomemos el punto de la curva aquí y movamos esto a 30 píxeles, también. Bien, así que eso va a ser como nuestra distancia máxima en esta forma de aquí. No hace falta que sean perfectamente 30. Al igual que, aproximadamente aquí para que podamos ver la forma un poco mejor. Bien, ahora si le pego a play y vamos por aquí, debería ser un poco más preciso. Bien, ahora se puede ver que la gravedad aumenta de verdad a medida que se acerca, así que es lenta por fuera, casi demasiado lenta Así que en realidad podría levantar esto un poco, y puedes ajustar la forma de la curva tirando de las asas, lo que necesites hacer. Verás, eso me gusta. Vamos a golpear play una vez más sólo para probar. Y si, creo que eso es lo correcto para la gravedad. Entonces ahí tienes. Escala de gravedad. Cuanto más se acerque a jugar tu objeto, más rápido se mueve y absorberá todos los elementos de recolección o realmente cualquier área que marque en la capa de máscara aquí Que en este caso, ahora mismo son solo camionetas, pero podrías hacerlo con otras áreas 37. P36: cómo crear una interfaz de usuario con barras de progreso HP y EXP: Bien, entonces aunque el combate principal está funcionando en el juego, podemos recoger elementos como camionetas EXP, pero no tenemos ninguna indicación de UI de lo que está pasando No podemos ver el nivel de nuestro personaje, nuestro HP, nuestra barra EXP. Así que vamos a empezar trabajando en barra EXP y añadiendo un contador de niveles a, digamos, la parte superior izquierda de la pantalla. Y vamos a hacer eso en un nuevo nodo. Entonces voy a subir aquí a la sección media, agregar una nueva escena. Y queremos que esta sea una interfaz de usuario. Entonces voy a llamar a este jugador UI. Vamos a guardarlo en la carpeta UI. Y guárdala ahí. Después voy a hacer clic en la interfaz de usuario del reproductor, y agregaremos, digamos, un contenedor de panel. Entonces esto esencialmente va a ser el fondo de nuestra interfaz de usuario de jugador principal. Ahora, dices que la interfaz de usuario del jugador se extiende por toda la pantalla por defecto. Así que queremos entrar en el diseño de la derecha y cambiar el preajuste de Anclajes de completamente destrozado a la parte superior izquierda Bien, ahora, eso va a reducir el tamaño aquí básicamente a nada. Y luego queremos hacer dimensionamiento de contenedores, ampliar en relleno horizontal y vertical. Entonces debajo de nuestro contenedor de panel, queremos hacer clic derecho y agregar en un nuevo, digamos, un contenedor de caja en V. Un contenedor VBox organiza sus hijos verticalmente. Entonces, si pones dos elementos aquí, el que está directamente debajo de él irá encima del otro en cuanto a su disposición visual. Así que vamos a hacer clic derecho sobre el contenedor VBox, y ahora quiero un contenedor HBox Entonces nuestro contenedor HBox, el primero, irá de izquierda a derecha, y este estará encima de cualquier otro contenedor HBox infantil Entonces nos ayuda a diseñar las cosas casi como una grilla, pero no exactamente. Bien, y luego de niño para el contenedor HBox, queremos agregar en una barra de progreso de textura para que puedas buscar Progreso y lo encontrarás aquí mismo Esto le permite, en la parte superior derecha, establecer texturas para la textura inferior, la sobretextura y la textura de progreso. Entonces a medida que los valores se llenen, en realidad mostrará más o menos de la textura de progreso, y luego debajo de ella estará la textura base, que se muestra en el fondo siempre. Bien, y luego además de eso, queremos una etiqueta a la derecha de esto. Entonces voy a hacer clic derecho en contenedor HBox, agregar una etiqueta. Una etiqueta básica debería estar bien aquí. Siempre podemos cambiarlo a una etiqueta de texto enriquecido más adelante. Bien, y ahora para esta barra de progreso de textura, queremos ir a buscar el arte para nuestra barra de progreso. Así que minimicemos todo en la parte inferior derecha y ampliemos la carpeta de arte. Vamos a la GUI de Crimson Fantasy. Y creo que fue bajo GI Sprite aquí. Entonces en la parte superior derecha por debajo, voy a crear una nueva textura de atlas y luego expandirla. Y vamos a arrastrar a GI Sprite al atlas aquí. Así podemos ver el atlas completo, estilo de arte gótico bastante genial pasando aquí. Y podemos seleccionar lo que queremos que sea nuestra subtextura. Entonces el bajo textura va a ser básicamente nuestro bar donde esté completamente sin llenar Entonces, si edito región, puedo acercarme aquí, y seleccionaré esto, pero aquí mismo, así, ese puede ser nuestro bajo textura golpear cerrar. Y luego para la etiqueta digamos que cero de 100 HP por ahora mismo, solo como un simulacro. Entonces ahora tiene sentido cambiar el nombre de este contenedor HBox, algo así como la pantalla HP Y vamos a duplicarlo, y luego voy a cambiar el nombre del segundo para que sea EXP display. Ve a la barra de progreso de textura. Y en texturas, vamos a seleccionar una diferente de Editar región. Entonces veamos qué es lo que nos gusta aquí como barra EXP? Podríamos usar este básico de aquí, pero creo que en realidad podría ser un poco útil si pudiéramos ver diferentes trozos Entonces con este, podríamos ver de siete lo cerca que estamos de subir de nivel realmente. Pero notarás tan pronto como cambie el valor aquí para este, el superior también se actualiza automáticamente porque estamos usando un recurso de textura de atlas compartido. Entonces lo que realmente tenemos que hacer aquí, voy a cerrar es hacer clic derecho sobre esta textura y luego hacer única. Entonces, cuando hagas eso, esta textura será única. Tenemos que volver al primero y arreglarlo, clic derecho y luego hacer Unique, y necesitamos cambiar el HP de nuevo a su textura HP. Entonces por aquí, seleccionaremos esa ganga de HP, y ahora podemos ver que estas son dos cosas separadas. Bien, entonces ahora hagamos también el relleno para el top one. Voy a ir a progresar aquí, nueva textura Atlas, y luego podremos cargar rápidamente desde el menú desplegable, nuestro sprite GUI Y ahora queremos editar región, y queremos agarrar la barra de salud llena aquí. Bien, entonces eso se verá algo así y golpeará Cerrar. Ahora que tenemos esa textura establecida, si vas a, digamos, valoras aquí y escribas 50, verás que parte de la barra de salud ya está llena. Pero también ves que con esta configuración, esto puede deberse en parte a el corazón está ocultando cosas, pero en realidad no parece que esté reflejando con precisión el 50% de tu salud total aquí cuando el valor es 50. Entonces, para sortear eso, lo que estaba haciendo es cambiar el valor de los hombres para que sea algo así como negativo 20 para compensar esto a la derecha. Entonces ahora puedes ver que hay cuatro trozos de salud visibles de ocho De modo que ese valor de 50 mucho más sentido cuando se tiene ese desplazamiento negativo de 20 ahí. Así que tal vez solo necesites personalizar eso. Entonces, obviamente, cuando caracterizas la salud cero, va a mostrar cero es el valor que estará por aquí. Pero lo que realmente importa es como el 50 de cada 100 aquí y el 100 de cada 100 allá. Entonces solo para asegurarnos de que valemos 100 por barra de salud completamente llena , y eso se ve bien. Podemos decir 20. Todavía podemos ver nuestra salud. E incluso a las cinco o diez, bueno, supongo que a las cinco, no tenemos que verlo necesariamente. Pero como a las diez, todavía podemos ver una pequeña astilla. Creo que, como es ahora mismo, es bastante bueno. Así que en realidad podemos simplemente dejar ese defecto como 50. Y trabajemos en la textura de visualización EXP. Simplemente haga clic derecho sobre la base debajo de la textura aquí, copiemos , y luego haga clic derecho sobre el progreso vacío y péguelo. Entonces queremos hacer clic derecho aquí y hacer que esto sea único y cambiarlo al valor que necesitamos. Entonces Editar región, y queremos agarrar esta versión rellena de esa barra. ¿Bien? Y podemos escribir 50 por el valor para las pruebas. Bien, y entonces podemos ver que está a mitad de camino lleno. Entonces eso está bien. No necesitamos hacer un valor mínimo negativo en esta versión de la textura. Aquí hay un pequeño problema donde nuestra barra de progreso para la XP es roja, igual que la de arriba. Entonces, lo que realmente queremos hacer es que esta porción metálica esté teñida de un color diferente Entonces, cómo podemos hacer eso es yendo aquí al tinte del progreso y cambiando eso a más como un verde, algo así. Pero se puede ver que eso en realidad tiñe toda la textura Entonces, lo que queremos hacer es hacer clic derecho en la textura inferior, controlar la copia y luego pegarla en la textura superior. Bien, entonces ahora solo los píxeles que no existen en el bajo y sobre van a verse afectados por el cambio de textura de progreso. Entonces, sea cual sea el color que quieras que sea el progreso, puedes simplemente cambiarlo a eso simplemente manipulando el tinte aquí Puede cambiar la oscuridad, y eso probablemente sea lo suficientemente bueno para tu barra de XP, para ser honesto, como la solución más simple sin usar un shader ni nada Entonces si vamos a la etiqueta ahora, queremos cambiar esto para decir EXP. Así que cero de 100 EXP. Bien, y luego queremos centrar verticalmente estas barras de progreso de textura. Creo que puedes seleccionar ambos al mismo tiempo si mantienes presionado Control y haces clic izquierdo y luego vas al dimensionamiento del contenedor de diseño y lo cambias de relleno vertical a centro de contracción. Sí. Bien. Y entonces eso básicamente toma estos, y se centra con respecto a los otros elementos como esta etiqueta de aquí a la derecha. Así que eso quedará bien. Entonces solo queremos reducir el texto. Entonces, lo que podríamos querer hacer en realidad, es simplemente ir a la interfaz de usuario del jugador en la raíz aquí y cambiar su tema si cargamos rápidamente desde el menú desplegable nuestro tema de juego. Entonces va a tener esa fuente pixel art, que ya es por defecto, un poco más pequeña. Bien, lo último para terminar nuestra maqueta, probablemente queremos un contenedor de margen como aparente para el contenedor de panel Entonces haga clic derecho sobre las raíces, interfaz de usuario del jugador, agregue un contenedor de margen. Entonces, busque el margen, y luego tire del contenedor del panel debajo de eso. Entonces ahora en el contenedor de margen, puedes ir a sobrescrituras de tema en las constantes correctas, y puedes personalizar un Entonces iré con cinco para todos los márgenes de dirección. Bien, algo así. Entonces ese es probablemente un margen suficiente, pero en realidad me equivoqué el pedido. El contenedor del panel pasa por debajo de la interfaz de usuario del reproductor, y luego el contenedor de margen pasa por debajo del contenedor del panel, y luego el contenedor VBox pasa por debajo de eso Bien, entonces el punto es que queremos que el contenedor del panel estire la imagen de fondo hasta los bordes aquí, y luego queremos que todo lo demás quede contenido dentro de eso. Entonces es por eso que el contenedor de margen tiene que estar dentro del contenedor de panel, para que el contenedor de panel pueda estirarse más que el contenedor de margen. Es sólo una cosa de ordenar. Entonces eso va a ser bastante decente. Pongámoslo en nuestro mundo. Entonces, en nuestra escena mundial, vamos a crear una capa de lienzo para poner debajo la interfaz de usuario. Entonces, haga clic derecho en agregar un nodo de capa Canvas ahora. Bien, y la razón por la que tendrías una capa de lienzo aquí es que te da un área de renderizado separada de todo lo demás en la escena. Por lo que la interfaz de usuario se renderizará de manera completamente independiente del mundo del juego Toti Y eso sería importante si tienes, digamos, luces de juego Toti, y no quieres que eso afecte en absoluto a la interfaz Quieres que esos se renderizen por separado. Entonces las luces para el mundo son diferentes a si tienes alguna luz para la interfaz de usuario, eso sería algo aparte. Y solo las administras por separado. Así que ahora voy a querer agregar la interfaz de usuario del reproductor aquí, así que filtra tus archivos, busca Player Underscore UI, si eso es lo que diste como nombre, Dragon suelta la escena en la capa Canvas, y va a aparecer ahí mismo en la parte superior izquierda de nuestra UI Antes de presionar Play, asegúrate interfaz de usuario del jugador esté debajo de la capa Canvas. Eso va a ser importante para que no se renderice también en el mundo del juego, sino como parte de la pantalla. Entonces está ahí en la parte superior izquierda. En realidad es bastante pequeño. Eso es bastante hilarante, si soy honesto. Podemos mejorar la interfaz de usuario aquí o podemos hacerla más grande en la escena base Entonces tal vez lo que solo quiero hacer es tomar la capa de lienzo aquí y simplemente vamos a transformar, aumentar la escala a, como, cuatro X. Se puede alejar. Busca la caja forrada púrpura. Es posible que en realidad tengas que esconder, como, el mundo terrestre para que eso realmente lo vea. Bien, ahí. Entonces tenemos aquí la caja morada. Esta es la zona portuaria de vista completa. Entonces tu UI aquí es algo con respecto a eso. Entonces a escala cuatro veces, creo que eso funciona bastante bien. Ahora volveré a mostrar la tierra y la hierba. Vamos a golpear Play. Y veamos si la interfaz de usuario está ahí muy bien en la parte superior izquierda. Y creo que ese tamaño en realidad es bastante decente. Eso me gusta mucho. Vamos a ir con eso por ahora, y luego trabajaremos en guionarlo. 38. P37: cómo implementar un sistema de UI basado en estadísticas con señales: Entonces, para que esta interfaz de usuario funcione realmente, necesitamos conectarla a señales que se van a relacionar con nuestro bloque Sp de carácter. Entonces eso significa que necesitamos como señal cambiada de EXP o una señal cambiada de HP. Queremos asegurarnos de que actualizamos eso. También tenemos otro problema menor, que es que básicamente esta interfaz de usuario es muy grande en el área de pantalla donde se encuentra actualmente. Así que quiero agregar rápidamente en un script donde solo pueda hacerlo para que la capa Canvas se muestre automáticamente cuando comience el juego, pero opcionalmente podemos simplemente desconectarnos cuando seamos un editor. Por lo que no quiero tener siempre que activar manualmente la visibilidad. Lo que voy a hacer es hacer clic derecho sobre la capa Canvas por aquí, adjuntar un guión. Entonces esto solo sería lienzacapa punto GD. Vamos a guardarlo en la carpeta UI Bin. Crear. Y sólo voy a decir función subrayado listo. Va a volver vacío, y luego diremos visible, es igual a verdad. Y eso es todo lo que necesitamos para eso. Así que ahora podemos ocultarlo cuando estemos mirando nuestra vista de mapa aquí y presionar Reproducir. Y aún así debería aparecer tan pronto como comience el juego. Así que ahora podemos ocultarlo de nuestra vista de mapa aquí, presionar play, y aún así se mostrará tan pronto como comience el juego. Entonces en la esquina superior izquierda, ahí está. Así que eso será útil mientras estamos editando. Otra forma en la que podrías manejar esto sería tener una escena completamente separada para tu interfaz de usuario de Canvas cuando estés editando eso, luego tu escena mundial, y las combinas en una escena padre. Cuando realmente cargues el mundo del juego, eso estaría bien. Y tal vez esa sería la solución a largo plazo. Pero esto es solo una solución realmente agradable, rápida y fácil. Así que trabajemos en conectar nuestra interfaz de usuario de jugador a las estadísticas del jugador. Así que saltemos a la escena de la interfaz de usuario del jugador. Voy a hacer clic derecho en la interfaz de usuario del jugador. Y adjuntar un guión. Entonces el playi dot gD puede extender Control y dentro de aquí Solo vamos a una R de exportación y diremos contexto del contexto del jugador. Como ya creamos ese recurso, es súper fácil de usar. Y el inspector de aquí arriba a la derecha, simplemente carga rápidamente el contexto del jugador. Y si recuerdas desde antes en el curso, el jugador se va a establecer automáticamente ahí, así que podemos simplemente agarrar las estadísticas de puntos del jugador de puntos de contexto, y boom, tenemos una referencia a las estadísticas. Solo necesitamos señales para actualizar la pantalla HP y la pantalla EXP. Bien, para que podamos buscar las estadísticas. Veamos, controlador de estadísticas punto GD. Si saltamos a ese guión, tenemos un vivo cambiado. Vamos a crear algunas señales para HP cambió, Max HP cambió y la experiencia cambió. Bien, entonces la señal Mx HP cambió. Y se puede ver que esto es un montón de estadísticas que vamos a cambiar con un tipo muy similar. Podríamos querer pasar el objeto que se estaba cambiando, el valor antiguo, el nuevo valor y la cantidad de cambio. Así que en realidad podemos crear una clase para encapsular todos para cualquiera de nuestras estadísticas que van a cambiar Y este es un sistema de juego muy basado en estadísticas, como sobreviviente, cierto, porque podrías tener reducción de enfriamiento, podrías tener velocidad de movimiento del jugador, HP, poder de ataque, todo este tipo de cosas extra. Y esas son todas estadísticas que podrían representarse dentro de un objeto que podemos pasar a un evento. También es mucho más fácil si solo tienes un parámetro para que envíes ese parámetro y luego lo reciben como una pieza en lugar de tres o cuatro. Entonces, para mostrar lo que quiero decir, vamos a crear un nuevo script en nuestro sistema de archivos. Así que voy a colapsar todo, y luego entraremos en digamos objetos porque los objetos tienen estadísticas. Entonces voy a hacer clic derecho, crear un nuevo script. Entonces estos van a ser datos que van en una señal para cada vez que una estadística cambió. Así que un nombre bastante claro sería stat cambiado datos punto gD. Nosotros creamos eso. Bien, y abramos ese guión. Entonces stat cambió los datos. Nombre de clase, datos cambiados de estadística. Y esto en realidad va a extenderse desde ref contado, que es un objeto que cuando ya no se le hace referencia, automáticamente se eliminará del juego. Entonces referencias. Y en lugar de extender no, esto en realidad va a extenderse desde ref contado, que es un objeto Gadot que realiza un seguimiento de cuántos objetos lo están haciendo referencia Y cuando ya no hay objetos que lo hagan referencia, básicamente se pondrá en cola para su eliminación, por lo que no es necesario liberarlo manualmente. Simplemente será recogido y eliminado por el motor. Eso, por cierto, también es el valor predeterminado para cuando no extiendes desde ninguna clase, esa también es la clase predeterminada. Bien, entonces nuestra estadística cambió los datos, queremos darle una función de inicialización, así que la función subraya un Y cuando creamos un NIT para un objeto, podemos pasar cualquier parámetro que necesitemos Entonces voy a decir P objeto, el objeto que estamos afectando con nuestro cambio de estadísticas. Entonces no hay TD, el valor P Nu, que supongo que será un entero para ahora mismo. Podría haber una estadística flotante, en cuyo caso, podría cambiar este tipo a una variante para admitir tanto integer como float. Pero no creo que en este momento en realidad vaya a haber carrozas en el juego para estadísticas como experiencia y HP Los hemos convertido en un entero concreto, lo que probablemente sea preferible de todos modos. Entonces, el nuevo valor que estamos pasando, y luego queremos el viejo valor. Y cuando tenemos el nuevo y el viejo valor, podemos calcular automáticamente el cambio. Entonces pongamos en el estado propiedades para este objeto. Voy a decir var objeto va a ser un nodo dos D, el var nuevo va a ser un entero. El var viejo va a ser un entero. El cambio var también es un número entero. Entonces cuando inicializamos la función, simplemente tomamos los parámetros y establecemos las variables locales a esos valores Así que el objeto va a ser igual al objeto P. Un nuevo va a ser igual a P Nu, viejo va a ser igual a P viejo. Ahora que tenemos el nuevo y el viejo set, nuestro cambio va a ser igual al nuevo menos el viejo, creo que es a menos que lo tenga al revés. Bien, entonces si el valor antiguo es 30 y el nuevo valor es 20, entonces el cambio va a ser negativo diez, que es lo que queremos aquí. Entonces sí, nuevo menos viejo. Entonces, esencialmente, lo que estamos haciendo aquí es que estamos pasando estos cuatro parámetros a la señal como un objeto de datos cambiado St. Y luego en el receptor de señal, la función de devolución de llamada, podemos acceder a todo lo que hay dentro de St cambiado a theta simplemente haciendo St cambió el objeto punto de datos, punto nuevo punto punto Cage Y tal vez no necesitemos todo eso, pero lo tenemos accesible. Además, si alguna vez agregamos otra cosa aquí como var Cookie, que es una textura mar o algo así, entonces no necesitamos agregar esto como un parámetro extra. Está contenido dentro de esta clase. Así que puedes modificar este objeto sin tener que cambiar tus devoluciones de llamada o el parámetro de envío de señal porque solo estás enviando un objeto Ojalá, eso tenga sentido. Es más fácil de modificar a medida que avanzas. De todos modos, tenemos nuestros datos de estadística cambiados. Entonces, si volvemos a nuestro script de controlador de estadísticas, ahora podemos crear nuestras señales. Entonces Max HP cambiado va a tener los los datos de la estadística cambiados. Bien, y luego solo hacemos señal para la otra señal, HP cambió datos, datos cambiados de estadísticas, cambió la experiencia de señal. La estadística de datos cambió los datos. Ahora bien, la razón por la que pondría una señal para cada uno de estos es porque en el guión de recepción, podemos elegir qué estadísticas realmente nos importan. Entonces, por ejemplo, la pantalla EXP aquí solo se preocupa por el cambio de experiencia. Entonces solo vamos a conectarnos a la señal de experiencia cambiada y tal vez una señal de cambio de nivel también para actualizar la etiqueta de nivel si eso va en la misma área de visualización. Entonces tenemos esas señales. Sólo tenemos que emitirlos. Entonces lo que estaba haciendo antes con, como, el setter HP aquí, si solo vas a emitir el valor cambiado, creo que ese es el uso aceptable de un conjunto así que emitimos que el valor cambió y simplemente lo convertimos en una propiedad observable Entonces voy a decir aquí, cada vez que configuramos el HP, solo diremos que HP cambió punto am HP. Ahora bien, si nos estamos poniendo HP 100 cuando ya son 100 una y otra vez, podríamos querer saltarnos esa emisión de señal, así podemos decir si HP es igual al valor, entonces simplemente regresamos porque no necesitamos actualizar en vivo aquí. No necesitamos actualizar el HP porque es del mismo valor. Entonces siguiendo ese patrón, básicamente voy a hacer lo mismo con MAX HP. Entonces vamos a hacer colon. Siguiente línea, valor establecido. Si Mx HP es igual al valor, volvemos. De lo contrario, Max HP equivale a valor, y emitimos Max HP cambiado. Oh, pero aquí abajo, olvidé que esto en realidad no es solo el valor de HP aquí, sino que en realidad necesitamos crear el objeto de datos cambiado de estadística. Los datos son iguales a los datos de stat cambiados punto nuevo. Y vamos a pasar en esta referencia de objeto aquí arriba para el controlador stat. Entonces objeto, y luego hacemos el nuevo valor de HP y el valor antiguo, que necesitamos obtener primero. Entonces antes de establecer el nuevo valor en HP, justo antes de eso, hacemos var Viejo es igual a HP, y ahora ponemos el viejo aquí, y pasamos los datos a la emisión de señal. Entonces HP cambió punto MMI con los datos, y eso es todo lo que tenemos que hacer Y ahora va a tener esas cuatro propiedades de datos dentro de ese objeto en lugar de solo una, pero aún así se ve súper limpio porque solo estamos enviando un objeto. Bien, ahora en MX HP, queremos volver a hacerlo. Entonces vamos a decir var Old es igual a Max HP, y luego haremos datos lejanos iguales stat datos cambiados punto u. Así lo hacen el objeto, el Max HP y el viejo, y luego emitimos el HP cambió señal con los datos, y eso es todo. Bien, entonces siguiendo el mismo patrón, una vez más, aquí abajo en la experiencia, valor establecido de dos puntos, todavía podemos protegernos contra si la experiencia es el mismo valor por si acaso. Entonces, si la experiencia es igual al valor, volvemos. De lo contrario, obtenemos lo viejo igual a la experiencia, y luego la experiencia es igual al valor. Y entonces los datos de Vara son iguales a stat datos cambiados punto w. experiencia objeto viejo, y emitimos experiencia cambiada con los datos. ¿Bien? Y podría agregar esto. Oh, sí, bien, olvidé la D ahí en la parte superior para la señal. Control STA, y eso debería ser bueno. 39. P38: Guiones de pantallas dinámicas HP y EXP para la interfaz de usuario del jugador: Entonces tenemos la configuración de la señal, y tenemos nuestro contexto aquí y la interfaz de usuario del jugador, que nos va a permitir tomar esas señales del bloque de estadísticas. Pero realmente no necesitamos hacerlo directamente en la interfaz de usuario del jugador. Tenemos que hacer eso en la pantalla HP y la pantalla EXP. Así que quiero crear scripts para la pantalla HP y la pantalla EXP aquí abajo. Entonces voy a hacer clic derecho sobre la pantalla de HP, adjuntar un script, y podemos poner eso en la interfaz de usuario, así hp display punto GD Genial. Simplemente podemos hacer que esto se extienda desde contenedor. Realmente no nos importa qué tipo de contenedor es porque puedes crear una pantalla usando otros tipos. Tal vez exhibas tu HB verticalmente en lugar de horizontalmente. Por lo tanto, puede usar una clase base diferente, como contenedor en lugar de contenedor HBox, y aún así puede hacer el nodo real en contenedor HBox Así que solo mantener las cosas flexibles es la idea aquí. Y voy a decir nombre de clase HP display. Bien, entonces en nuestra pantalla HP, necesitamos una referencia a las estadísticas del controlador del jugador. Podríamos exportar el contexto del jugador y luego obtenerlo directamente aquí para cada una de las pantallas. Sin embargo, si configuramos cosas así, para cada uno de tus componentes sub UI, si cada uno de ellos tiene una propiedad de exportación que tienes que establecer, entonces se vuelve muy difícil arrastrarla a la escena para reutilizarla porque entonces tienes que, como, clic derecho sobre ella y hacerla editable y asegurarte asignar todas las propiedades individuales como contexto de jugador A cada nodo sub UI directamente. Entonces otra opción, que podría ser preferible, es hacer que la interfaz de usuario del jugador raíz maneje inyectando el contexto del jugador o lo que es relevante de él, el controlador de estadísticas en cada uno de sus nodos sub UI. Y luego solo necesitas asegurarte de que la interfaz de usuario del reproductor conozca sus subcomponentes, como la pantalla HP y la pantalla EXP Pero luego dejas que la interfaz de usuario del jugador se encargue del trabajo pesado. Entonces, cómo se vería eso en el contexto de nuestra pantalla HP, sería que necesitemos nuestro controlador de estadísticas local. Entonces, si nuestro controlador de estadísticas de guión bajo. Entonces hacemos esto local, ¿verdad? Y luego crearemos una función setter para que podamos configurar el controlador de estadísticas desde la interfaz de usuario del jugador Entonces digamos estadísticas de conjunto de funciones, y esto va a tomar un controlador de estadísticas de guión bajo P Cual es el controlador stat tipo. Volveré nulo. Pongo el guión bajo P para parámetro para que quede muy claro que esta variable es un parámetro de la función En caso de que tenga otro controlador de estadísticas aquí, no habrá confusión entre nuestra referencia local al estadísticas y nuestro alcance de función, P controlador de estadísticas de guión bajo Así que vamos a usar esta función set stats para hacer eso. Entonces, las estadísticas de subrayado son iguales a P controlador de estadísticas de guión bajo Bien, entonces tenemos nuestro método de establecer estadísticas. Asigna las estadísticas a las estadísticas, que aquí es privada por el guión bajo Hover, esto es guion GD, así que no es realmente privado Simplemente está marcado que no debes acceder a esto desde fuera de la clase, pero aún así puedes técnicamente. Entonces tenemos a nuestro setter de estadísticas aquí. Queremos conectarnos a la señal ahora. Entonces esta es la pantalla HP. Y quiero decir estadísticas Hp colgó punto Connect, y vamos a decir en HP cambiado Y también podemos decir estadísticas de subrayado MXHPhanged Y esto solo puede estar en el guión bajo en Max HP cambiado. Entonces, técnicamente, ambas señales tienen los mismos parámetros, así que podríamos usar una función de devolución de llamada si quisiéramos Pero para mantenerlo flexible, tal vez habría algún código que nos gustaría hacer de otra manera, dependiendo de si es MaxHP o el HP cambió, solo voy a tener dos callbacks aquí, así que función En Max HP cambió, que va a tener los datos P, la estadística cambió los datos, este vuelco vacío Y lo que queremos hacer es refrescar LUI. Así que voy a crear una función de actualización aquí, y luego vamos a hacer lo mismo para en HP cambiado. Así que podemos simplemente copiar esto aquí abajo y luego quitar el bit Max. Así que borra cuatro veces. Bien, eso es todo. Ahora necesitamos una función de actualización. Entonces diremos función refresh. Y ¿qué queremos hacer en la pantalla HP? ¿Siempre que cambia el HP? Queremos actualizar el valor del deslizador y queremos actualizar la etiqueta de texto. Entonces queremos básicamente obtener el porcentaje saludable para el porcentaje de salud, y eso va a ser un flotador igual a digamos, subrayar estadísticas punto HP, dividido por subrayado estadísticas punto MAX Bien, entonces con el porcentaje de salud, podemos asignarlo a la barra de progreso de textura. Entonces puedes ver ahora necesitamos una referencia a la barra de textura aquí abajo. Así que la única vez que vamos a configurar la referencia a la barra de textura es como la primera vez que estamos creando esta escena de pantalla HP. A lo mejor guardamos esto en una escena separada en nuestro proyecto, y la escena principal que realmente ponemos en el mundo es la escena de la interfaz de usuario del jugador. Pero creo que es perfectamente razonable exportar la barra de textura y la etiqueta aquí. También hay otras formas de agarrarlos. Pero ese es el método que usaré. Entonces voy a decir en export var progress es una barra de progreso de textura. Y luego en la exportación var label es una etiqueta. Entonces, cuando nos refresquemos, podemos tomar el progreso y tomar la etiqueta, y diremos que el valor del punto de progreso es igual al porcentaje de salud. Entonces déjame ver. Eso debería ser en una escala 0-100 Y este cálculo en realidad te va a dar un 0.021 0.0 Entonces queremos multiplicar esto por 100 para obtener un porcentaje real así que por 100. Y no estoy seguro del orden de las operaciones aquí. Entonces solo voy a envolver esta parte para asegurarme de que esto se ejecute antes de esto con certeza Bien, y entonces el valor de progreso va a ser nuestro porcentaje de salud 0-100 como flotador Entonces necesitamos establecer el valor de texto en la etiqueta. Así que el texto del punto de etiqueta va a ser igual a la cadena. Podríamos simplemente decir en cotizaciones HP, porcentajes, fuera de con porcentajes de barra hacia adelante, y luego reemplazamos esos valores con un signo de porcentaje y lo pasamos en una Entonces los valores que vamos a usar van a ser los HP actuales y los HP MX. Entonces, en otras palabras, las estadísticas de subrayado puntean HP y las estadísticas de subrayado puntan MAX Entonces, si quieres que esto sea personalizable, podemos cortarlo con Control X y reemplazarlo con algo así como plantilla de texto de salud. Entonces aquí arriba en la parte superior, podríamos decir en barra de exportación La plantilla de texto de Salud va a ser igual a, y luego Control V pega eso. Esto todavía tiene estos por ciento como símbolos para reemplazar. Así que todavía hacemos el porcentaje de plantilla de texto de Salud, y luego la matriz de los dos valores en orden, que es subrayar estadísticas punto HP, y luego subrayar estadísticas punto máximo Bien, entonces eso actualizará la barra, y nosotros actualizaremos el texto. Entonces también queremos llamar a esto cada vez que establecemos las estadísticas. Entonces voy a decir refrescar aquí para asegurarnos de que después de establecer las estadísticas, actualicemos inmediatamente ese texto, también. Necesitamos dos puntos aquí arriba para terminar esa función, y eso es bastante bueno. Ahora en el lado derecho para el guión, sí necesitamos asignar el progreso y la etiqueta. Así que asigne la barra de progreso de la textura y asigne la etiqueta. Asegúrese de seleccionar los que están debajo de la barra HP. Ahora, eso va a ser bueno para la pantalla HP. Casi queremos el mismo guión para la pantalla EXP, pero hay un par de diferencias. Entonces voy a controlar A, Control C para copiar todo en este guión. Pasaremos a la pantalla EXP. Haga clic derecho, adjunte guión. Exp display dot gD me suena bien. Sin embargo, cambiaremos el tipo heredado aquí a contenedor, y luego solo seleccionaremos todo y lo reemplazaremos con un Control V pegándolo Ahora necesitamos cambiar el nombre de la clase a la pantalla EXP. Nuestra plantilla HealthText. Vamos a seleccionar ese Control R para reemplazarlo con plantilla de texto EXP. Esta plantilla de texto Salud, seleccione el texto. Puedes hacer doble clic sobre él para seleccionar todo. Y luego haz Control R. Aquí abajo, vamos a reemplazar plantilla de texto Salud por la plantilla de texto EXP, reemplazar todas, y luego queremos cambiar este HP aquí mismo a EXP como nuestra plantilla predeterminada. Lo último que tenemos que hacer es cambiar la conexión de la señal a la experiencia cambiada. Podemos deshacernos por completo del cambio Max HP, y luego reemplazar este nombre de función aquí mismo en el cambio de HP para que pueda seleccionarlo, Control R, y luego aquí abajo, queremos reemplazar eso en EXP cambiado o experiencia cambiada, lo que sea que tenga sentido para usted. Vamos a reemplazar eso. Deshágase de los datos cambiados en Max HP aquí para concluir esta parte. No actualicemos todavía la barra de progreso, así que voy a comentarlos. Así que por ahora, vamos a hacer zoom aquí y voy a reemplazar la plantilla de texto de experiencia con underscorestes dot experience, y voy a poner la experiencia por aquí de nuevo, Entonces dirá como uno de uno o dos de dos, pero al menos podemos verlo funcionando. Ahora en la parte superior derecha, asegúrate de asignar el progreso. A la barra de progreso de textura, la etiqueta a la etiqueta. Entonces solo necesitamos la pantalla HP y la pantalla EXP para llamar a su función set stats desde la interfaz de usuario del jugador. Así que dentro del script de la interfaz de usuario del reproductor, vamos a ExportVRHP display de tipo HP display en Export var EXP display de tipo EXP Y luego la función subrayado listo, vamos a llamar a hp display dot set Stats al contexto dot play dot stats, y necesitamos obtenerlo dos veces para que incluso podamos decir var stats de stat Controller, luego configuramos eso igual a este bit Entonces voy a cortar eso, ir por aquí, igual signo, pegarlo. Entonces establecemos estadísticas sobre las estadísticas. Hacemos lo mismo con EXP display XP display dot set Stats. Y luego hacemos estadísticas. Lo último que necesitamos es asignar la pantalla HP y la pantalla EXP y el inspector para que tengamos esa referencia. Así que haga clic en la interfaz de usuario del jugador, vaya a la parte superior derecha, asigne la pantalla HP. Y asignar pantalla EXP. Ahora, realmente, la pantalla HP y la pantalla EXP pueden ser y probablemente deberían ser sus propias escenas independientes de las que instancia una copia en nuestra interfaz de usuario del reproductor. Así que voy a hacer clic derecho en la pantalla de HP, y vamos a guardar la rama como una escena dentro de nuestra interfaz de usuario, y luego hacer clic derecho en la pantalla EXP y hacer lo mismo. Guardar rama una escena dentro de la interfaz de usuario. Así que ahora podemos saltar a estos y personalizar individualmente estas pequeñas pantallas según lo necesitemos en el contexto de nuestra interfaz de usuario de jugador mayor. Entonces tenemos escenas dentro de escenas, y luego tomamos nuestra escena de interfaz de usuario de jugador, y la ponemos en el mundo del juego, que es invisible en este momento porque la interfaz de usuario de Canvas es golpeada. Pero sí, ahí tienes. Y si estamos en juego, veremos si algo se vincula correctamente. Bien, así que establece estadísticas y la pantalla HP es nula porque olvidé asignarlas en el inspector. Se puede ver aquí mismo estos son nulos en listo, lo que significa que se me olvidó eso en la exportación. También porque esto es verificar, no necesitamos ninguna aseveración porque aquí está algo implícito que esto se requiere ahora Así que salta a la escena del jugador, haz clic en la interfaz de usuario del reproductor, asigna la pantalla HP y la pantalla EXP. En fin, ahora podemos jugar, y lo volveremos a probar. Entonces tenemos diez de cada 100 HP. Si recuerdo haber mirado las estadísticas, nuestro Max HP era 100 y nuestro HP base era diez, lo que obviamente nos golpearon aquí. Puedes ver las actualizaciones de HP a cero. La barra de progreso de EXP aún no funciona porque necesitamos configurar nuestros requisitos de experiencia de nivel E, lo que va a crear, como, toda una jerarquía de nivelación. Pero intentemos muy rápido, poniendo el HP en 50 en nuestro reproductor. Entonces iré a la escena de nuestro jugador, y luego miraré dentro del control de estadísticas aquí. Y pondremos los HP en 50. Déjame ver. Si hago eso ahí mismo, ¿ puedo volver a tocar al juego? No, porque los jugadores ya se retiraron, creo. Pero por hit play, deberíamos ver la actualización de la barra HP aquí con el valor de progreso correcto, pero no lo hace. Muestra el valor correcto de HP, pero tenemos que arreglar la pantalla HP muy rápido. Bien, entonces en la pantalla HP, déjame ver qué estaba pasando aquí. El valor de progreso es igual al porcentaje de salud. Déjame establecer un punto de quiebre aquí, y voy a presionar Play, y veremos qué es lo que realmente está configurando eso para que el porcentaje de salud sea 0.0. Ah, claro, porque estoy dividiendo con enteros. Entonces cuando dividimos por dos enteros, vamos a obtener un entero, que va a ir automáticamente al piso de cero. Pero eso no es lo que queremos. En realidad queremos que devuelva un flujo. Entonces, lo que podríamos hacer como una solución rápida aquí es simplemente decir flotar en el Mx HP. Entonces ahora esto va a ser un entero dividiendo por un float, que devolverá un float. Si golpeamos play, entonces deberíamos ver el valor correcto ir ahí. Entonces ahora podemos ver por ciento de salud 50. Si pulsamos play, la barra se muestra correctamente ahí. Menos la compensación para el valor. Entonces déjame ver. ¿He compensado el valor ahí, pantalla HP? Tenemos la barra de progreso de textura, y por alguna razón, es hasta 00 aquí, pero quiero que esto sea negativo 20 para que cuando el valor sea 50, se muestre correctamente en el medio ahí. Se puede ver ahí mismo esto es como cuatro de 8 barras. Y el valor de aquí es 50. Debo haber desestablecido eso en algún momento, pero el tipo de solución hackish para eso es que solo haces el valor mínimo más hacia la izquierda para que 50 termine en el Porque si esto es cero por aquí, entonces 50 en realidad termina como, la tercera barra. Mira, me aseguro de que el valor de tus hombres sea negativo 20 ahí, y eso debería funcionar para la pantalla HP. Bien, entonces prueba final aquí, golpeamos la barra de progreso de juego estableciéndose en 50. Puedo deshacer ese punto de interrupción, golpear play. Y podemos ver que nuestra barra de progreso de salud está correctamente en el medio, ahí mismo. Nuestro HP nos está mostrando 50 de 50. Vamos a ser golpeados. Puedes ver nuestras caídas de HP, la interfaz de usuario refleja eso de inmediato, incluida la barra de progreso. Entonces todas nuestras señales se están conectando correctamente. Estamos configurando la experiencia ahí, y solo necesitamos agregar nuestras definiciones de nivelación que podamos subir de nivel a nuestro personaje. Antes de que terminemos completamente con el video de nuestra función set stats, aquí hay una falla, que es que si alguna vez reiniciamos las estadísticas con estadísticas establecidas, y una ya está configurada aquí, terminaremos con señales duplicadas Entonces queremos decir aquí, si las estadísticas de subrayado no son nulas antes de que llamemos a set Stats, entonces queremos desconectarnos de las señales, así podemos decir estadísticas de subrayado punto MXHphanged punto El subrayado en MAX HP cambió. Y lo mismo para el HP regular. Entonces solo copiamos eso y hacemos SATS HP cambió, y luego en HP cambió Esto es más de solo hacerlo robusto. Nunca pretendo configurar el controlador SATS en algo diferente, pero por si acaso lo haces, esto asegurará que no cause un error horrible donde tengas dos señales conectadas para dos controladores stat diferentes, pero en una pantalla HP Ahora, haz lo mismo un poco más en el EXP uno también. Entonces, si nos fijamos en la pantalla EXP, solo voy a pegar eso y cambiamos el nombre de la señal. Entonces la experiencia sats cambió, y luego en EXP cambió aquí Bien, así es como debería ser eso. Subrayar la experiencia de SAT cambió desconexión en la experiencia Bien, entonces eso debería ser bueno para si alguna vez cambiaste el controlador SATS Solo quería demostrarlo para que fuera un poco más completo. 40. P39: depuración y optimización de UI y scripts de Pickup: Quería aclarar algunas advertencias y errores. Hasta el momento me he estado metiendo en la consola con el proyecto. Entonces, si has estado copiando la palabra clave por palabra, es posible que te hayas topado con estos mismos problemas. Así que recoge dos D donde dice que no puedes usar monitorable es igual a false, normalmente porque está bloqueado y tienes que esperar a que se aplace el set Entonces, si haces doble clic en eso, te señalará que en la función remove, estaba tratando de establecer monitorable a false Bueno, en realidad solo voy a eliminar el monitoreable es igual a false aquí porque cuando Qu libre, se elimina al final del fotograma actual Cuando llamas a set deferred, se elimina al final del marco actual Entonces, hacer que no sea monitoreable al mismo tiempo que liberes no va a ayudar en nada El punto era hacerlo para que si dos objetos trataran de tomarlo al mismo tiempo, que no recogiera dos veces. Sin embargo, lo que podríamos hacer si quieres estar extra seguro. No obstante, si quieres estar extra seguro y recoger dos D, vamos a darle un var recogido. Y esto será un booleano que establece en false por defecto. Entonces solo estoy insinuando que ahí es un booleano. O sea, si quieres declararlo con seguridad, entonces puedes hacerlo. Entonces esto es escogido. Y si tratamos de tomar cuando esto es cierto, entonces lo permitiremos. De lo contrario, volveremos falso. Entonces, lo que voy a hacer con Tr take es que voy a hacer esto realmente guardia, y luego tendremos una función de toma separada, que será lo que realmente implementan las pastillas, como la función virtual, lo que hacen actualmente Entonces quiero hacer función, subrayar T, y esto no va a devolver nada, así que ese es un tipo de retorno de vacío Y tomaré este error de empuje y lo traeré aquí abajo. Entonces voy a volver verdad aquí ahora. Voy a cambiar esto para que sea subrayado T. Así que llamamos a la función virtual, y luego vamos a guardarnos contra recoger una segunda vez aquí arriba Entonces diremos, elegí, devolvemos falso. Bien, entonces ahí está nuestra guardia. Y de lo contrario, llegamos hasta aquí. Después de tomar, lo hacemos escogido es igual a verdad. Y lo estoy poniendo aquí para que no tengamos que preocuparnos por ese booleano y las clases heredadas Solo tenemos que preocuparnos implementar la función take. Entonces creo que esta es una mejor configuración. Funcionará bien con ir quarter, y siempre y cuando nos fijemos escogido a true después de llamar estamos seguros de que no va a recoger por segunda vez porque tenemos esta guardia aquí. Entonces ahora solo necesitamos actualizar nuestros otros scripts de recolección. Así que busca pickup. Creo que hasta ahora solo tenemos pickup EXP. Entonces voy a hacer doble clic en eso. Vamos a renombrar esto para subrayar Toma el tipo de retorno es nulo Y en lugar de devolver falso aquí, si las estadísticas son nulas, empujaremos un error. Entonces error de empuje. El porcentaje no tiene controlador de estadísticas. Ese va a ser el objetivo de porcentaje P. Entonces reemplazamos esto con un nombre de nodo ahí. Y entonces no volvemos al fondo. Nosotros solo llamamos remover. Y tenemos que asegurarnos de que coincidimos con la firma de los padres. Así que probablemente necesite pasar el objetivo P al script padre. Bien, así que subamos. Y si, queremos pasar ese objetivo P. Entonces P target vamos a eliminar el guión bajo ahí porque en realidad lo estamos usando ahora Y entonces aquí hacemos subrayado P target es un nodo dos D. Ahora eso debería limpiar los errores en nuestro EXP Pickup dos D. Y sólo para verificar, entraremos en modo play Bien, entonces las otras advertencias, vamos a eso. En la mayoría de los casos, estos son solo parámetros no utilizados. Entonces, en el caso de algo como pickup dos D, ves que el objetivo P no está usado, así que solo quieres marcarlo con guión bajo para que quede marcado como no utilizado intencionalmente Pasemos al siguiente aquí. Nunca se utilizó el tamaño de la cámara. Así que el tamaño de la cámara se utilizó realmente para crear el rect de la cámara Así que en realidad no es necesario aquí porque en esta función de cálculo final spawn, la usamos para el sistema spawner crea el rect de la cámara, y luego se extrae el tamaño de eso Así que en realidad podemos eliminar tamaño de la cámara como parámetro, cortar eso. Y luego donde lo llamamos aquí arriba, solo quitamos el tamaño de la cámara como parámetro también, y lo simplificamos a tres parámetros. Entonces ese sería un buen caso donde esa advertencia realmente nos ayudó. Y luego, aquí siguiente, si tienes una actualización que no usa el Delta, que sería el caso si haces movimiento y deslizas porque mover y deslizar no necesita hacer el Delta, estableces la velocidad, y luego mover y deslizar automáticamente maneja con el Delta. Entonces subrayamos el Delta y ya está ahí. Y este script drop, el nombre drop aquí está sombreando el nombre de la función Así que podríamos cambiar el nombre aquí a algo así como drop instance. Y luego donde sea que usemos caer debajo de él, como aquí mismo, decimos drop instance en su lugar. Solo quiere asegurarse de que si usa una variable localmente, no tiene esa variable también declarada fuera del alcance en la base de clase, como las variables locales. Y no quieres que tenga el mismo nombre que un nombre de función también. Entonces en cada una de estas señales de estadísticas cambiadas, las callbacks para eso, solo estaba refrescando cada vez que cambia el valor, y en realidad no necesito usar los datos P para estas funciones directamente Así que solo subrayaría ambos una vez más en el script de visualización EXP Haga clic ahí y subraye eso, y eso debería deshacerse de todas las advertencias y errores actuales Y le pegaré a Play. Bien, no hay errores para. 41. Sistema de nivelación P40 con experiencia y progresión de estadísticas: Salud y experiencia ahora, necesitamos agregar algún tipo de mecánica de nivelación, y necesitamos tener una estadística de nivelación en nuestro controlador de estadísticas para poder manejar la subida de nivel de nuestro jugador y posiblemente también de otros personajes, pero definitivamente para el jugador. Así que vamos a entrar en el controlador paso a paso, y voy a añadir aquí una nueva variable. Vamos a decir que va a ser un entero igual a cero, y vamos a tener una configuración similar para experimentar aquí abajo donde solo tendremos un valor de satur donde vamos a decir que el nivel I es igual al valor que vamos a devolver, lo contrario, simplemente repetiremos el mismo patrón emitiendo la señal por nivel cambiado para que podamos responder a eso en nuestra UI Entonces vamos a decir var viejo es igual a nivel, y vamos a decir nivel es igual a valor. Digamos que var data es igual a stat datos cambiados punto u nivel de objeto old, y emitiremos una señal de nivel cambiado. Con los datos. Ahora, necesitamos crear esa señal, por supuesto, así que el nivel de copia cambió hacia arriba en la parte superior. Crearemos datos cambiados de nivel de señal, datos cambiados por estadísticas. Entonces ahora podemos suscribirnos a eso si lo necesitamos. Ahora podemos implementar completamente agregar experiencia. Así que cada vez que añadimos experiencia, también queremos comprobar si estamos listos para el siguiente nivel. Pongo eso aquí en lugar del setter de experiencias porque no quiero demasiados efectos secundarios aleatorios estableciendo la experiencia, así que quiero llamar explícitamente al método ad experience, que sube de nivel si se alcanza el umbral Bien, entonces para hacer eso, vamos a necesitar crear un objeto de definición de nivel. Así que vamos a crear un nuevo script para eso. Todo entrará en digamos personajes. Haga clic derecho aquí, haga un nuevo script, y lo llamaremos definición de nivel. Así definición de nivel punto gD. Se va a extender desde el recurso, crear. Haga doble clic para abrirlo y le daremos una definición de nivel de nombre de clase. Extenderá el recurso, y esto definirá un nivel arriba para un personaje. Entonces, lo que aquí necesitamos va a ser el umbral de la experiencia. Entonces, en Export VR, diremos que se necesita experiencia. Y esto será un entero. Podríamos por defecto a algo así como diez. Y probablemente también queremos algunas estadísticas que vamos a subir de nivel. Entonces, por ahora, solo comenzaremos con HP y lo mantendremos simple, pero harías estadísticas adicionales aquí más adelante mientras trabajas que se convirtieron en mecánicos. Entonces en Export var HP, diremos que es un entero, por defecto a diez Y podríamos decir que este es el HP de bonificación por subir de nivel. Entonces llegaste a este nivel, tu personaje obtiene tanto HP. Ahora bien, ¿cómo aplicamos nuestros cambios de estadísticas al personaje? Podrías hacerlo uno a la vez manualmente, pero una forma más inteligente sería crear un método para hacerlo por ti. Entonces digamos que la función aplique, y vamos a aplicar esto a un controlador de estadísticas, digamos. Entonces P estadísticas de un controlador de estadísticas. Entonces volveremos nulos con esto. Por lo que queremos básicamente actualizar los conjuntos. Entonces P stats dot HP plus equivale a la cantidad de HP. Y antes de eso, también queremos aumentar el MX HP. Entonces p stats dot MX HP plus equivale a HP. Es importante que hagas los HP MAX antes los HP porque los HP actuales están tapados en los HP MAX. Entonces, si un personaje de salud completa aumenta su HP en diez, en realidad no ganará la salud a menos que el MAX HP se actualice primero. Tan importante ordenar ahí. Y esa puede ser nuestra definición básica de nivel por ahora. Entonces en control de estadísticas, sería un lugar digno para definir nuestras definiciones de nivel. Entonces voy a decir en la exportación VR subir de nivel las definiciones. Y esto es una matriz de definición de nivel. Bien, entonces para verificar el nivel arriba, necesitamos obtener el siguiente nivel en la secuencia. Entonces hagamos una función para conseguir nuestro siguiente nivel si hay uno. Entonces aquí abajo en la parte inferior, digamos función, subrayado, obtener el siguiente nivel Que devolverá una definición de nivel o nula. Y esto va a devolver las definiciones de nivel de punto Git, y vamos a llegar a nivel de índice. Entonces, la razón por la que estamos llegando a nivel de índice es porque level es en realidad el segundo lugar en la matriz. Entonces, si nuestro personaje es el nivel uno, actualmente estamos en el índice cero, y queremos mirar el índice más uno, que es nivel porque el nivel comienza en uno. Bien, entonces para manejar nuestra experiencia add subir de nivel, primero necesitamos obtener la siguiente definición de nivel para el siguiente nivel. Entonces, al igual que el nivel más uno, necesitamos subir esa definición de nivel en la parte superior. Así que vamos a en Export, no en cierto modo, sino en realidad un diccionario aquí. Entonces en las definiciones de nivel Export VR, diremos. Y este será un diccionario de enteros que se asignen a definición de nivel Entonces el entero es el nivel que estamos tratando de alcanzar, y la definición de nivel son los cambios de estadísticas que tendrían si existe. Entonces, antes de subir de nivel o tratar de subir de nivel, primero tenemos que ver si realmente hay un nivel definido. Así que en la parte inferior, vamos a crear otra función privada función subrayado obtener siguiente nivel, y esto va a devolver una definición de nivel o null Entonces vamos a devolver nuestras definiciones de nivel punto GET en el nivel más uno. Nuestro nivel actual más uno, queremos conseguir eso y queremos devolver nulo. Si no lo encontramos. Entonces, si devolvemos null, entonces saltaremos la subida de nivel. Entonces en esa experiencia, hagamos VR siguiente va a ser una definición de nivel igual para obtener el siguiente nivel. Entonces si next es nulo, simplemente regresamos o incluso podrías empujar una advertencia. En realidad, sí, vamos a empujar una advertencia. El personaje no puede nivelar hasta por ciento un nivel por ciento más uno porque ese nivel no tiene definición definida. Entonces podríamos decir cadena de nivel más uno por aquí al final y terminarlo con otro paréntesis. Bien, eso va a funcionar. Entonces, tomamos el nivel más uno. Estamos tratando de subir de nivel al nivel dos si estamos en el nivel uno, y estamos señalando que no podemos subir de nivel porque eso no está definido. Entonces tal vez quieras tenerlo como advertencia, o si estás seguro no puedes simplemente comentarlo o eliminarlo. Lo dejaré adentro por ahora para que al menos podamos ver cuándo no conseguimos establecer una definición de nivel. Entonces el siguiente nivel es nulo, así que si next es nulo, entonces volveremos porque no podemos subir de nivel. No hay un siguiente nivel definido. Así que simplemente saltamos por completo. Y luego queremos verificar si el requisito de experiencia de siguiente nivel es menor o igual a nuestra experiencia actual. Entonces podemos poner eso como parte de una función de tres niveles. Así que suba de nivel tri, y diremos en el siguiente Entonces bajamos aquí y vamos a tener nuestra función. Subrayar. Intenta subir de nivel. Subrayar porque es privado, y pasamos en la definición de nivel siguiente O en realidad, ya sabes, siento que esto debería estar contenido dentro de esa función, realmente. Entonces esto va a devolver un booleano, y vamos a tener esto aquí Así que solo obtenemos el siguiente nivel dentro de esta definición. Y entonces no necesitamos pasar un parámetro. Solo intentamos subir de nivel después de sumar XP, ¿ verdad? Es justo así. Entonces, si no podemos subir de nivel, devolvemos falso. Y luego queremos comprobar si la experiencia es mayor o igual a la experiencia siguiente punto necesaria. Si ese es el caso, entonces subiríamos de nivel. Pero voy a revertir eso. Voy a decir si es menos de la experiencia necesaria, entonces volvemos falso. Bien, entonces estamos fuera de la declaración if otra vez. Y entonces si llegamos hasta aquí, hemos pasado los cheques de guardia, así podemos decir nivel más es igual a uno. Vamos a restar la experiencia necesaria de la experiencia actual Entonces la experiencia menos equivale al siguiente nivel. Oh, lo siento, siguiente, se necesita experiencia de punto. Y luego aplicaremos las estadísticas del siguiente nivel a nuestras estadísticas actuales. Entonces, después de restar el XP, hacemos el siguiente punto aplicar a self porque estamos trabajando dentro del script del controlador stat, y luego volveremos true porque subimos de nivel con éxito Ahora déjeme pensar en esto. Creo que en realidad quiero que el nivel aumente después de que se hayan aplicado las estadísticas, así. Entonces, si vamos a decir, tener un personaje subir de nivel, y luego les damos las opciones para las recompensas. Entonces, escogiendo una actualización al subir de nivel, que es una mecánica central y nuestro sobreviviente como, queremos hacerlo después de que se apliquen las estadísticas base para que la interfaz de usuario siga actualizándose básicamente en el mismo fotograma, pero justo antes subir de nivel y emitir nuestra señal de cambio de nivel, haciendo que la interfaz reaccione y nos muestre nuestras opciones de actualización. Creo que ahí es importante ordenar el cambio. Bien, entonces sí, entonces la señal de nivel de cambio va a ser emitida aquí arriba por culpa del setter Y ese es básicamente nuestro subir de nivel. Si por alguna razón, desea obtener la definición de nivel actual, eso podría ser útil fuera del script. Y éste podría incluso ser útil fuera del guión. Entonces tomaré Obtener el siguiente nivel, y eliminaremos el guión bajo para pivting mover ese guión bajo y probaremos Y agreguemos en una función G nivel actual. Definición o tal vez simplemente obtener los niveles actuales lo suficientemente claros. Y luego volveremos definición de nivel. Entonces vamos a devolver las definiciones de nivel punto GIT, y queremos devolver el nivel o null. Bien. Entonces esos podrían ser útiles para otros scripts que quieran investigar lo que está sucediendo con el controlador de estadísticas. Por lo que tiene algún sentido hacerlos públicos. Al no subrayarlo. Por eso. Bien, entonces tenemos esta propiedad stat, y podemos subir de nivel cada vez que nuestro EXP aumente, que debería ser automático porque esta experiencia publicitaria va a ser llamada desde nuestra recolección, nuestra recolección EXP. Entonces todo va a fluir muy bien si está funcionando bien. Excepto que ahora tenemos que asegurarnos de que estamos conectándonos a la estadística de nivel y la señal de subir de nivel o la señal de cambio de nivel, más bien. Y vamos a hacer eso dentro de la pantalla EXP. Entonces tenemos que buscar en un proyecto EXP y desplazarnos hacia abajo, encontrar nuestra escena xp display dot tSCn, abrirla Bien, entonces ahora que nuestra nivelación debería estar funcionando, necesitamos entrar en la pantalla EXP, y tenemos que asegurarnos de que esté mostrando la cantidad de EXP que necesitamos para el siguiente nivel. Así que entremos aquí. Y cuando nos refresquemos, queremos obtener el siguiente nivel XP. Queremos cambiar este bit aquí mismo a la XP Mx de las estadísticas si las estadísticas tienen un siguiente nivel al que realmente podamos acceder. Entonces te deshaces de esa parte y dices que VarnnXT va a ser igual a subrayar las estadísticas punto Entonces obtenemos el siguiente nivel, y si no hay siguiente nivel, entonces diremos que yo siguiente es igual a nulo, entonces queremos cambiar el texto de punto de etiqueta para que sea igual a, digamos, nuestra cadena de nivel máximo. Bien, entonces tenemos que definir eso aquí en exportar var max level string, y eso solo será igual a algo como max level en todas las mayúsculas. Bien, de lo contrario, vamos a establecer el texto a nuestro EXP, nuestro número actual del siguiente número de nivel. Entonces hemos confirmado que siguiente no es nulo, así que podemos reemplazar este bit con la siguiente experiencia de punto Ned. Ahora bien, si ejecuto el juego, probablemente solo dirá nivel Max porque no hemos definido ninguna definición de nivel. Si estamos en el nivel MAX, entonces también quiero tomar la barra de progreso y establecer ese valor en 100. Entonces ahora si ejecutamos el juego, actualmente, eso nos va a dar un error porque no he fijado el progreso, así que hagámoslo. Entonces, en nuestra pantalla XB, vaya a la derecha y asigne la barra de progreso Bien, ahora podemos correr, y deberíamos ver una barra de progreso completa. Estamos en el nivel MAX. Bien, entonces recoger XB ya no importa Todavía puedo tener una buena experiencia, pero ya nunca va a subir de nivel. Porque las definiciones de nivel se asignan en el editor, no durante el juego. Aunque podrías hacer eso, pero eso sería bastante raro, ¿verdad? Como solo definir el final del juego que puedes subir de nivel hasta ahora el nivel 31, donde antes del 30 era el tope, no, eso es algo que haces en el editor. 99.99% del tiempo. Entonces tenemos el valor de progreso que se establece aquí. Vamos a querer obtener un porcentaje entre nuestra experiencia y la siguiente experiencia necesaria, y luego actualizaremos el valor de progreso aquí para cuando podamos subir de nivel. Entonces nuestro progreso está a flote y lo estableceremos igual a la siguiente experiencia de punto necesaria dividida por estadísticas de subrayado experiencia de puntos Ahora recuerda, estamos dividiendo un entero por un entero, pero en realidad queremos que sea un flotador. Entonces tenemos que tomar uno de estos y lanzarlo como un flotador. Así decir flotar. Y luego en estadísticas punto experiencia, terminamos de envolverlo con nuestros paréntesis Entonces hacemos eso, y esto ahora debería darnos algún lugar entre un 0.0 y un 1.0. Pero esto necesita ser básicamente convertido en un porcentaje porque nuestra barra de progreso por defecto tiene un valor máximo de 100, así que estamos viendo porcentajes. O eso, necesitas escalar el valor máximo a uno. Ambos son realmente válidos. Entonces aquí podemos simplemente envolver esto con otros paréntesis y multiplicarlo por 100 y eso debería darnos nuestro progreso real Así que todavía nunca vamos a acertar a esto porque necesitamos definir algunas definiciones de subir de nivel. Así que vamos a entrar en el jugador, y vamos a hacer clic en el controlador de estadísticas. Aquí tenemos nuestras definiciones de nivel. Entonces podemos agregar algunos valores clave de diccionario. Queremos que aquí se defina el siguiente nivel de dos. Entonces agrega dos y una nueva definición de nivel. Dentro de aquí, podemos decir que XB necesitaba diez HP diez. Eso está bien para comenzar. Suma el par de valores clave. Es importante que recuerdes darle a esto. De lo contrario no estará en el diccionario. Entonces tenemos nuestro diccionario con una clave en el nivel dos y una definición de nivel para subir de nivel a nuestro personaje. Bien, un último pequeño retoque que tenemos que hacer es asegurarnos de que nuestro jugador esté por defecto en el nivel Así que vamos a entrar en el controlador de estadísticas y donde tenemos nivel. Tenemos que asegurarnos de que esto es uno. Así que de esa manera, cuando verifiquemos el nivel más uno de dos, encontraremos esa definición de nivel, y debería mostrarse correctamente en la interfaz de usuario. Así que vamos a golpear Play, y vamos a tener nuestro XB necesario aquí. La barra de progreso no se actualizaba, pero veamos cuando obtenemos un EXP, eso sube, y se está mostrando de diez. Y sí, error simple. Olvidé asignar el progreso al valor del punto de progreso. Entonces tal vez realmente tenga sentido cambiar esto a un nombre diferente. Estamos siguiendo una variable. Apuesto que si reviso los errores aquí, se puede ver que sí, me ensombrecí esto con el nombre de la barra de textura de progreso Entonces digamos por ciento nivelado sería un nombre mucho mejor. Y luego diremos que el valor del punto de progreso es igual al porcentaje nivelado. Y ahora estoy bastante seguro de que debería funcionar. Juguemos. Entra ahí. Podemos ver por qué EXP no amaba ahí arriba, y ahora está diciendo uno de cada diez. Eso es interesante. Entonces necesito establecer un punto de interrupción aquí para ver lo que esta mostrando Y entremos en modo de juego. Y podemos ver que está diciendo 0.0 ahora mismo, pero vamos a recoger uno y conseguimos mil. Otro simple error lógico, debería estar haciendo la experiencia dividida por la experiencia necesaria. Entonces invertimos esto. Tomaré la experiencia necesaria y pondré esto por aquí, y luego cortaré la experiencia de puntos de estadísticas y pondré esto aquí a la izquierda. Todavía podríamos hacer que el flotador se funde a la derecha. Eso está bien. Bien, así que volvamos a jugar. Prueba eso? Entonces, bien, ahora está mostrando 0% nivelado. Recogemos un artículo. Ahí conseguimos el 10% , dos, tres, pero debería ir hasta el final. Entonces quiero verificar el valor de stop de progreso aquí y ver por qué está ocurriendo eso. Bien, entonces aquí tenemos un 40% nivelado. Por lo que el porcentaje nivelado es correcto. Así que en realidad podríamos necesitar verificar la interfaz de usuario fuera del juego. Así que vamos a entrar en la pantalla EXP aquí. Voy a probar poniendo el valor a cero. Bien, eso es correcto. 100 es correcto. Va todo el camino hasta la extrema derecha. Digamos 25 50, 75. Bien, eso parece correcto. Entonces llevemos el valor a cero. Bien, juega. Vamos a probar eso un poco. Bien, quita el punto de interrupción. Entra en modo de juego, y hagamos uno, dos, tres. Entonces, ¿eso es el 30%? A lo mejor es correcto, en realidad. Bien, entonces sacamos cuatro de diez y luego cinco de diez. Bien, sí, estaba funcionando bien. Saquemos siete de diez. Vamos en realidad solo al nivel de nuestro personaje para demostrar que funciona. Bien, entonces sacamos nueve de diez, y luego tenemos el esqueleto desove Podemos conseguir uno más, diez de cada diez. Bien, viste que acabamos de conseguir diez HP aquí, luego fuimos a cero de diez para el EXP necesario. Entonces la parte sobre el siguiente nivel debería ser devolver algo, pero no lo hizo. Entonces la razón que ocurrió así es que nuestra experiencia se pone a cero. Emite una señal, y entonces nuestro nivel cambiado no conecta aquí Entonces después de cambiar el nivel, no vuelve a refrescarse. Bien, entonces la solución más simple es solo subrayar estadísticas nivel de punto cambiado, y nos conectamos en el nivel cambiado para refrescar de nuevo Para que podamos copiar esto aquí arriba y desconectarlo. Así que vamos a crear nuestra función de devolución en la función inferior, guión bajo en el nivel cambiado No vamos a usar los datos, así que subrayamos los datos P. Stat cambió los datos, volvemos nulo, y solo nos refrescaremos. Bien, de esa manera, después de que la experiencia se ponga a cero, justo antes de que aumentemos nuestro nivel, eso refrescará la interfaz de usuario, pero luego el nivel cambia y actualizamos nuevamente la IU. Entonces, vamos a mostrar una vez más que todo está funcionando como se pretendía. Así que solo voy a tener suficiente experiencia para subir de nivel aquí. Entonces para y después, cinco, seis, siete, ocho, nueve. Los Skillsins en realidad no dejan caer nada todavía. Lo arreglaremos pronto. Y luego diez. Bien, entonces ahora muestra el nivel máximo, pero también aumentamos nuestro HP. Así que eso refrescó nuestra interfaz de usuario dos veces. Una vez cuando cambiamos nuestras estadísticas, disminuyendo la experiencia y otra vez cuando aumentamos nuestro nivel, que ahora mostrará que el siguiente nivel no existe. Así que mostramos el nivel Max en nuestra barra EXP como esperaríamos. Entonces todo parece estar funcionando. 42. P41: Configuración de umbrales y conexiones de señal para las recompensas por el aumento de nivel: Apunte ahora donde nos gustaría agregar en un sistema de actualización tipo pícaro Así que subimos de nivel a nuestro personaje cuando nuestro personaje alcanza un cierto umbral de XP, y luego llegamos a seleccionar entre una de las tres opciones de cómo queremos actualizar a nuestro personaje. Y esto se elige de una lista aleatoria de opciones disponibles. Entonces, por conveniencia, antes de meternos en esto, quiero cambiar el requisito de XP, ajustando el Nivel dos a uno, solo que podamos activarlo muy rápidamente. Entonces si voy al reproductor SAN, abriremos player dot TCN, y luego vayamos al controlador de estadísticas, creo que fue donde lo estábamos definiendo Y la definición de nivel, tenemos el primer nivel aquí establecido en diez XB necesarios Cambiemos eso a uno muy rápido. Y entonces tal vez voy a añadir en un par de niveles extra. Entonces podemos hacer un Nivel tres aquí como la nueva clave, y luego hagamos una nueva definición. Sólo vamos a hacer que uno necesite diez. Entonces agregaremos ese par de valor clave. Puedes agregar tantos como quieras aquí. Entonces esto es básicamente solo una lista gigante de los niveles que estamos tratando de establecer aquí a la izquierda y la definición de subir de nivel de estadísticas a la derecha. Entonces el nivel cuatro, podemos hacer, yo diría, 20 XP necesarios, y aumenta HP en diez Y solo sigue adelante como quieras. Entonces nivel cinco, digamos 30 X P y L nivel diez. Simplemente voy a desenvolverlo así que no necesito preocuparme por ello mucho más tarde. Hagamos el nivel siete. Así que nueva definición de nivel. Digamos 50 XP, agregaremos par de valor clave, siete, y haremos una nueva definición de nivel a 100 XP y agregaremos eso en. Y creo que eso debería ser bueno sobre todo para nuestro prototipo que tiene siete niveles diferentes. Definitivamente es suficiente como para probar cosas. Entonces tenemos esas definiciones de nivel establecidas al subir de nivel, va a emitir la señal de cambio de nivel desde nuestro controlador de estadísticas. Entonces queremos conectarnos a eso en nuestra nueva interfaz de usuario, que nos va a brindar la opción de elegir uno de tres elementos diferentes o características de subir de nivel. Y queremos que el juego se detenga mientras nuestro jugador está tomando esa decisión. Así que vamos a crear una nueva interfaz de usuario. Voy a agregar un nuevo nodo de control aquí, subir de nivel la selección, creo que es un nombre decente, y a esto le agregaremos un nuevo script. Así nivel Uselección DotGd. Eso lo guardaremos en la carpeta UI, por supuesto. Así UI, y luego abrir y crear. Bien. También, controlar como para guardar la escena junto a donde está el guión. Entonces eso también está en la carpeta UI. Yo sólo lo guardaré ahí. Bien, ahora vamos a empezar a trabajar en el guión. Haré selección de nivel de nombre de clase. Generalmente, a menos que algo vaya a ser muy específicamente un script de uso único que nada más necesite hacer referencia, casi siempre crearé un nombre de clase, si eso no estaba claro en este punto. solo hecho de tener un nombre referenciable hace que trabajar entre scripts sea mucho más fácil Bien, entonces la forma más rápida de obtener la referencia al controlador de estadísticas del jugador va a ser que lo adivinaste. El contexto del jugador. Entonces agreguemos export var, el contexto, que va a ser el contexto del jugador aquí. Control S para guardar eso. Y luego en el inspector, vamos a cargar rápidamente el contexto de un jugador de nuestro juego, y eso básicamente nos da la referencia al jugador y por lo tanto al controlador de estadísticas. Bien, y luego en función subrayado listo, queremos ir al contexto jugador punto estadísticas punto nivel Chang y conectarnos a eso con el nivel del jugador cambiado, que será una nueva función que creamos justo debajo Así que el subrayado de la función en el cambio de nivel de jugador. Y esto va a tener el objeto de datos de cambio de nivel. Entonces P data es cómo lo llaman Estadísticas cambiaron datos. Así que solo queremos proporcionar realmente la interfaz de usuario si los niveles realmente suben. Puede haber algunas circunstancias extrañas en las que decidamos que el nivel podría bajar en el futuro. Entonces, para protegernos de eso, diremos si P data dot change es mayor que cero, que sabemos que está subiendo de nivel. Bien, entonces cuando el nivel cambia, solo queremos responder a ello subiendo de nivel, no bajando de nivel. Entonces vamos a decir, si el cambio de punto pdata es menor o igual a cero, entonces solo vamos a regresar aquí porque no es una condición que queramos manejar De lo contrario, vamos a subir de nivel al jugador. Ahora, por ahora, sólo voy a escribir el código para manejar subir de nivel uno a la vez, porque en el contexto del juego actual, esa es la única forma en que sería posible. Entonces voy a escribir al menos el prototipo del guión para manejar solo subir de nivel una vez a la vez. Si por alguna razón recogiste un objeto de 1,000 EXP, y entonces eso activaría tres o cuatro niveles arriba, esa podría ser una condición que quieras manejar más adelante. Pero creo que eso es un poco innecesario aquí porque de todos modos solo vamos a estar recogiendo un XP a la vez. Pero para este guión por ahora, solo vamos a estar manejando un nivel a la vez. Así que vamos a crear una función aquí. Voy a llamarlo iniciar selección. Y entonces esta función, que voy a poner por encima función iniciar selección nos va a proporcionar unas tres opciones. También va a mostrar la interfaz de usuario. Así que sólo podemos comenzar con un show call aquí. Y luego también queremos hacer una pausa en el juego para que podamos decir obtener puntos de árbol en pausa, es igual a verdad Bien, entonces ya que estamos pausando el juego aquí, eso significa que va a pausar todos los scripts que estén establecidos para solo estén activos cuando el juego no esté en pausa, que es el predeterminado Entonces sobre la derecha aquí bajo proceso de nodo, necesitamos cambiar el modo aquí a Estoy pensando siempre para que siempre pueda activar cosas dentro del juego, independientemente de si está en pausa o no Porque también queremos poder abrir el guión cuando el juego no esté pausado Por lo que será importante poder llamar a la selección de inicio durante un juego unpause Entonces creo que hacer esto siempre tiene sentido. Pero definitivamente queremos que se ejecute mientras el juego está en pausa Posteriormente tendremos que entrar aquí y generar una lista de recompensas que vamos a mostrar al jugador. Primero tendremos que configurar la interfaz de usuario un poco para eso. Y también queremos asegurarnos de que esto se pruebe hasta ahora para que en realidad esté apareciendo. Hagamos clic derecho en la selección de subir de nivel y agregarle un par de componentes de interfaz de usuario. Entonces comenzaré con, digamos, un contenedor de panel, y eso nos permitirá verlo cuando aparezca en la pantalla. También, haga clic en la interfaz de usuario raíz. Y luego vamos a cambiar, veamos, el diseño a la parte superior izquierda y el capreset por aquí. Entonces ahí mismo. También quiero asegurarme de que el mouse no detenga que pasar por los clics , pero en realidad vamos a ignorarlo por ahora mismo. Habrá cosas en las que queramos hacer clic en la interfaz de usuario como botones para hacer la selección, pero no queremos que la raíz de la interfaz bloquee esas señales de mouse y puerto. Entonces veamos si podemos conseguir que esto aparezca al subir de nivel. Vamos a la raíz y voy a sumar en la selección de subir de nivel. Así que suba el nivel de subrayado, y pondremos esto debajo de la capa del lienzo Vamos a mostrar temporalmente la interfaz de usuario. Bien. Y vamos a querer que realidad esté en el centro de la pantalla. Así que sube de nivel la selección y ve al diseño en la parte superior derecha, y vamos a centrarlo por aquí. Entonces centro y si alejamos, entonces esto teóricamente debería estar en el centro de la pantalla Así que vamos a golpear el Nivel dos y al juego, y veremos si eso realmente está funcionando. Así que voy a ir por aquí. El juego hizo una pausa. No lo veo aparecer, pero ese es un buen comienzo. Entonces al menos sabemos que se está disparando en Lavote. Entonces estoy pensando lo que podría estar causando el problema aquí es que la escala de capa Canvas se establece en cuatro. Hagámoslo así. Bien, y luego quiero un niño para la capa Canvas, que en realidad usaré para el escalado. Hagamos clic derecho sobre la capa Canvas y agreguemos en un nodo de control aquí. Entonces voy a tomar los otros nodos, y voy a hacer la raíz. Por lo que este nodo será la UI. Bien, también vamos a necesitar tomar el control de UI, la raíz aquí que acabo de crear. Y vamos a tomar los anclajes preestablecidos y hacer ese rectángulo completo Entonces ahora que se va a estirar al tamaño del punto de vista, queremos asegurarnos de que el mouse esté configurado para ignorar para que esto no bloquee las señales de la interfaz de usuario. Bien, y entonces si tenemos la selección de nivel arriba aquí puesta al centro, en realidad podemos ver que ese es el verdadero centro del punto de vista. Entonces aquí está el nodo de control de interfaz de usuario raíz, y luego esto está en el centro. Entonces si presiono Play ahora y vamos a recoger un XP, entonces esto se mostraría en el centro, aunque estaba mostrando bit default. Entonces tengo que ocultarlo primero. Y ahora vamos a golpear Play. Nosotros vamos aquí, y ves que aparece además de hacer una pausa en el juego Bien, entonces ese guión está funcionando. Tenemos que cambiar el tamaño de nuestra HPUI aquí de nuevo. Así que en realidad voy a hacer clic en la interfaz de usuario aquí y voy a aumentar su escala directamente. Podría ser lo más apropiado escalar los componentes individuales en lugar de aplicar una escala global a todo. Entonces podemos simplemente dimensionar nuestra selección de play up apropiadamente. Entonces otra ventaja de tener la interfaz de usuario aquí es que si queremos aplicar un tema a todo lo que hay debajo es que solo podemos ir al tema en la parte inferior derecha y luego cargar rápidamente el tema del juego. Entonces ahora todo va a estar usando esa fuente Pixar, aunque no la asignemos directamente a la selección de subir de nivel Entonces, a veces sí quieres control de grano fino sobre los temas individuales Si quieres un tema personalizado para, digamos, la selección de subir de nivel, entonces simplemente crearías uno nuevo aquí abajo. Y creo que en los niveles más bajos, anula lo que esté por encima de él. Así que básicamente puedes tener una jerarquía de temas como esa porque no todo necesita anular cada propiedad también. Puedes tener un tema principal, y luego para cosas muy personalizadas, como cómo se ve una barra deslizante, puedes hacer que como un sub 43. P42 Cómo crear el diseño de la interfaz de usuario y el texto animado: Vamos a trabajar en la construcción de nuestra plantilla de interfaz de usuario para la selección de nivel superior. Entonces ya tenemos un contenedor de panel. Creo que deberíamos estirar esto, así que voy a tirar de la esquina inferior derecha y mover esto un poco más grande. Vamos a necesitar una interfaz de usuario mucho más grande para mostrar realmente nuestra selección. Ahora vamos a necesitar un encabezado. A lo mejor mostramos un gráfico. Al igual que, felicitaciones. Subiste de nivel algo así. Entonces necesitamos tres pantallas de columnas. Esos serán contenedores VBox, los cuales mostrarán nuestras opciones Entonces eso probablemente será como un texto de título, un ícono, una descripción y luego un botón de selección. Y una vez que se presiona el botón de selección, entonces la selección de subir de nivel procesará la selección, la aplicará al jugador, cerrará la interfaz de usuario y reanudará el juego. Así que vamos a hacer clic derecho sobre nuestro contenedor de panel, y voy a agregar un contenedor de margen como el siguiente nivel, agregar un nodo hijo. Entonces estamos buscando contenedor de margen. Y luego en las anulaciones de tema a la derecha, voy a tomar estos márgenes y ponerlos cada uno en cinco píxeles por ahora Eso solo hará que se vea un poco más agradable no todo esté tan agrupado. Hagamos clic derecho en el contenedor de margen y ahora agreguemos un contenedor VBox Para que podamos organizar todo lo demás verticalmente. Ya se puede ver el contenedor de margen, tipo de extender los bordes un poco hacia los lados. Queremos agregar a esto probablemente nuestro texto de título. Entonces podemos agregar esto como una etiqueta de texto enriquecido. Bien, haz clic en Agregar una etiqueta secundaria de texto enriquecido. La razón para hacerlo texto enriquecido en lugar de una etiqueta regular es que los textos ricos, puedes hacer cosas como el código BB, lo cual es bueno si quieres aplicar un efecto arcoíris o agitando el texto hacia arriba y hacia abajo Entonces es simplemente más potente que una etiqueta de texto normal. Estoy seguro que técnicamente tiene, como, un costo de recursos asociado a él, pero algunos textos animando en pantalla no te van a quedar rezagados Entonces pongámoslo aquí subir de nivel como el texto. Podemos ver que en realidad no está apareciendo aquí abajo. Por lo tanto, necesitamos retomar el contenido adecuado y verificarlo para que sea verdadero. Ahora nuestro texto va a aparecer ahí en el centro. También queremos centrar este texto, así cambiaremos la alineación horizontal aquí al centro. Bien, ahora está centrada. Pongamos un icono debajo de esto para que podamos mostrar un gráfico de cuatro horas de nivel hacia arriba. Entonces voy a hacer click derecho sobre contenedor vBox, agregar un nodo hijo Digamos textura rack. Agrega eso y podemos seleccionar una textura. Así que cualquier gráfico que queramos utilizar de nuestro proyecto funcionará. A ver si podemos cargar algo rápido. Entonces, si busco, digamos 64 por 64 para obtener la textura de mayor resolución, tomemos de esos íconos, uno que queremos usar y luego escalarlo aún más. Así que en realidad quería usar esto como parte de una textura atlas. Entonces, si lo seleccionaste, haz clic derecho en él y luego ve a Copiar. Y en el desplegable de aquí arriba, haz textura atlas. Haga clic en la textura del atlas, y luego haga clic derecho en pegar el final del atlas. Ahora podemos seleccionar qué icono queremos usar de este. Así que cualquier cosa que creas que se ve bien, hay muchas opciones. Y esta es la hoja de sprites de 64 por 64 texturas del Pack de iconos. Eso fue obvio, así que uno de los tres activos artísticos que tenemos para el proyecto. Así que algo como estas espadas gemelas o la espada brillante podrían funcionar bastante bien Cualquier cosa que sea como una figura humana resplandeciente, como que implica, Oh, subo de nivel Me puse súper fuerte, como, por ejemplo, específicamente así, o en el proyecto base, usé este, que es más un rayo, pero también podría funcionar. Bien, entonces esta vez, iré con aquella en la que parezca un haz de luz gigante en lugar de un rayo. Y voy a acercar. Así que tenemos nuestro icono mostrando en la textura rect El estiramiento no es realmente como lo queremos, así que queremos cambiar el modo stretch para mantener centrado el aspecto, creo que es la mejor opción aquí. Y eso va a funcionar bastante bien, creo, siguiendo nuestro ícono de subir de nivel, agreguemos en un bloque de texto, que le diremos al jugador, queremos hacer una de las pocas selecciones. Entonces, hagamos clic derecho sobre el Contenedor de vBux, agreguemos otra etiqueta de texto enriquecido y luego haremos algo similar Comprobar ajuste al contenido. Y luego para el texto, diremos, elige una de las opciones de subir de nivel a continuación. Como pretendemos que la fuente Pixar aparezca aquí en nuestra pantalla real en lugar de ir al mundo cada vez, para verificar cómo se verá con el tema del juego real, vayamos a la selección de nivel del nodo de interfaz de usuario base, y solo asignemos el tema aquí también Entonces en el inspector, carga rápidamente el tema, y luego eso actualizará nuestro texto. Entonces ahora puedes ver que con esta fuente diferente, el texto realmente encaja en una línea. Esa es una gran diferencia. Vamos a hacer clic en la etiqueta de texto enriquecido dos, y centrémoslo. Bien, a continuación, tomemos este título y hagámoslo un poco más interesante agregando un arcoíris y un efecto de onda con el código BB. Así que revisa el código BB habilitado por aquí y ve al inicio del texto en la parte superior izquierda. Vamos a poner entre corchetes para código BB, arco iris y luego espacio FREQ para frecuencia es igual a 0.5 espacio SAT es igual a uno Esa es la saturación. El valor del espacio es igual a uno, y luego termina los corchetes, y obtendrás un efecto arcoíris aquí a la izquierda. Ahora, para asegurarte de que eso termine, vas al final del texto, y luego haces corchetes Rainbow. Y ahí tenemos nuestro efecto arcoíris animando en la ventanilla Y también podemos cambiar la configuración aquí. Entonces, si quieres que sea menos vibrante, intenta llevar la saturación a 0.5, y ahora tienes un arcoíris más manso apareciendo ahí arriba. A mí me gusta eso, así que me lo quedaré. Ahora, agreguemos también el efecto de onda. Así que vuelve a presionar home para ir al inicio de nuestro cuadro de texto, o simplemente podrías hacer clic ahí arriba en la parte superior izquierda Y luego hacer otros corchetes, y vamos a estar escribiendo WA VE para AMP de espacio de onda para la amplitud es igual a 50. Así de alto va entre olas. Y entonces la frecuencia espacial o FREQ equivale a dos. Esa es la frecuencia con la que va a hacer una ola, y luego terminarla con el corchete derecho. Bien, y entonces quieres ir al final después del arcoíris aquí arriba y hacer onda de corchetes. Eso solo significa que si agregas texto extra después de eso, no va a tener el efecto onda porque terminamos el efecto en nuestro bloque de texto. Entonces Control Z, podemos ver nuestro texto animando ahí. Eso es bastante ordenado. Quizá queramos que la amplitud baje un poco, así que la voy a reducir a 30. Entonces, si vemos nuestra animación, podemos ver que el texto se anima más o menos hasta la parte inferior o superior de nuestra área de etiquetas Creo que si tenemos una amplitud de 50 como lo hicimos antes incluso de que se corte. Entonces eso no es lo ideal. Si va demasiado hacia arriba o hacia abajo, podemos agregar algo de relleno a esta etiqueta específica yendo a las anulaciones de temas Y luego queremos ir a estilos normales y hacer una nueva caja de estilo vacía porque no hay fondo. Expandir eso, ir a los márgenes de contenido, y luego podemos hacer que la parte superior y la inferior, unos pocos píxeles se desplacen. Entonces voy a intentar hacer el top negativo tres y el inferior negativo tres. Y entonces lo que podemos hacer es agregar un margen de contenido aquí a la parte superior e inferior. Entonces lo haré como un dos píxeles en la parte superior y dos en la parte inferior. Bien, y eso básicamente va a estirar nuestra caja para que sea un poco más grande de lo que hubiera sido por defecto. Entonces esa es otra solución si no querías simplemente agregar un montón de líneas nuevas en el cuadro de texto. Supongo que también sería otra opción más rápida. Pero un poco menos preciso, también. Entonces, finalmente, para esto, si queremos que el texto sea más grande, podemos ir a sobrescrituras de temas y personalizar los tamaños de fuente aquí. Entonces creo que queremos un tamaño de fuente normal, y vamos a aumentarlo a 24. Bien, esa en realidad se ve un poco borrosa. Vamos a probar 32, ¿verdad? Bien, entonces creo que para esta fuente específica porque es Pixar hay números de escala muy específicos en los que hay que establecer el tamaño de píxel Entonces si dije que es algo así como 22, supongo que no es como un múltiplo de ocho o 16, así que no va a funcionar. Entonces hagamos 32 en su lugar para tener eso ahí para que se renderice correctamente. Estas anulaciones, por cierto, si lo deseas, también podrías dedicar tiempo y personalizarlo y los temas específicamente Pero si solo va a ser uno como este, podría ser más rápido asignar sus valores personalizados a este encabezado específicamente. Solo si vas a tener mucha interfaz de usuario en todo el juego y quieres personalizarla en un lugar centralizado, entonces tiene sentido hacer mucha tematización En lugar de solo usarlo para fuentes, también puede personalizar los tamaños de fuente o agregar encabezado personalizado 44. P43: diseñar la interfaz de usuario y los ajustes finales de selección de recompensas: Bien, ahora necesitamos crear nuestras cajas de selección verticales Entonces esa va a ser una sub UI. Voy a crear un nuevo nodo aquí arriba. Esto será, digamos, es una interfaz de usuario, pero haré clic derecho aquí y cambiaré su tipo a un contenedor de panel. Simplemente haremos de la raíz aquí un contenedor de panel. Y este será un tamaño completo por defecto, expandiéndose por todas partes. Cambiémosle el nombre para que sea Selección de recompensa. Y voy a guardarlo en la carpeta UI. Bien, ahora vamos a la selección de Lavop, y voy a poner tres de esos en la jerarquía Así que busca recompensa en el proyecto y deja caer una de esas en VBox Lo duplicaré un par de veces más. Y verás que el problema inmediato es que hay tres, pero todos son verticales. Entonces necesitamos otro contenedor HBox para que vayan horizontales Entonces, haga clic derecho en el contenedor VBox y agregue un contenedor HBox de nodo hijo, y coloque las tres selecciones de recompensa debajo del contenedor y coloque las tres selecciones de recompensa HBox Ahora deberías ver si haces clic en el contenedor HBox es que cada uno tiene una posición de desplazamiento el uno del otro Pero ahora mismo no se extienden por la pantalla. Entonces tenemos que ir a la selección de recompensas, y va a ser diseño, dimensionamiento de contenedores. Queremos ampliar en horizontal. Y mientras estamos en ello, vamos a hacer expandir también vertical. Control como para guardar, volver a la selección de subir de nivel. Y ahora podemos ver que están algo así como en un sentido de columna. Cada uno toma un espaciado uniforme del espacio de izquierda a derecha, y se ajusta a nuestro contenedor del panel principal. Entonces eso es más como lo que estamos buscando. En la selección de recompensas, hagamos clic derecho en la parte superior y agreguemos un nodo. Entonces esta va a ser una etiqueta de texto enriquecido en la etiqueta de texto Rch, pongamos el texto Vamos a decir nombre de corchete, y voy a comprobar Fit content. Podemos acercar aquí para verla. Entonces, para la selección de recompensas, haré clic en Selección de recompensa, y tomemos el preset de anclaje y tomemos el preset de anclaje y hagamos arriba a la izquierda, ¿de acuerdo? Y luego aquí abajo, necesitamos un contenedor de margen. Bien. Entonces si miramos aquí, así que si miramos aquí, no hay espaciado entre nuestras etiquetas y el borde de este panel. Entonces agreguemos un contenedor de margen debajo de la selección de recompensa. Haga clic con el botón derecho en Agregar contenedor de margen secundario y, a continuación, convierta la etiqueta de texto enriquecido en un elemento secundario de eso. El contenedor de margen hará constantes de sobrescritura de tema, y digamos que tal vez tres píxeles para los márgenes izquierdo, superior, derecho e inferior de aquí a la derecha Ahora tomemos la selección de recompensa raíz, y voy a cambiar su preset de anclaje a, digamos, arriba a la izquierda. Pero también tomemos la selección de recompensas y la extendamos un poco para que al menos podamos ver con qué estamos trabajando aquí. No lo necesitamos para estirar toda la pantalla porque eso es engañoso, pero sí queremos poder ver nuestro contenido vertical. Y podemos ir a subir de nivel la selección para ver cómo va a quedar eso en cualquier momento después del redimensionamiento y este contenedor de UI. Hasta ahora, se ve bien. Pero queremos centrar ese título. Entonces voy a hacer clic en Etiqueta de texto enriquecido, y vamos a hacer alineación horizontal Centro. Además, para el dimensionamiento vertical del contenedor aquí y el control, quiero hacer que comience el encogimiento. Así que eso asegurará que no se expanda más de lo necesario. Si vamos a subir de nivel a la selección, deberíamos ver nuestras etiquetas centradas aquí. Bien, ahora necesitamos nuestro marcador de posición de icono. Entonces haré clic derecho en Contenedor de margen, agregaré una textura rect, y luego podremos seleccionar un icono de nuestro proyecto Entonces hagamos nueva textura Atlas. Y aquí, voy a Quickload un ícono de atlas del paquete 16 por 16 Vamos a hacer dit región y seleccionar un marcador de posición. Entonces algo para subir de nivel, algo así se ve bastante bien. Y voy a acercar. Ahora tenemos que asegurarnos de que esto esté realmente organizado correctamente, así que vamos a necesitar un contenedor VBox debajo del contenedor de margen Entonces, haga clic derecho en el contenedor de margen, agregue un contenedor VBox clavado hijo y haga que el título y la textura sean hijos de Bien, ahora se organizará correctamente. tenemos que asegurarnos de que esto mantenga su relación de aspecto Sin embargo, tenemos que asegurarnos de que esto mantenga su relación de aspecto, para que no se vea raro. Entonces en el inspector para textuct cambiar el modo stretch para mantener aspecto También se debe mantener centrado en el aspecto. Bien. Ahí. Eso se ve más apropiado. También es posible que queramos ir al diseño y establecer un tamaño mínimo de icono. Entonces aquí, voy a tomar el tamaño mínimo personalizado, y vamos a decir algo así como 48 por 48. Bien, eso va a ampliar eso. 32 por 32 está bien. Entonces eso solo significa que si tu ícono es más pequeño que 32 por 32, automáticamente escalará hasta ese tamaño. Bien, agreguemos un texto de descripción, así puedo controlar C la etiqueta de texto enriquecido y luego hacer clic en contenedor VBox, controlar V, pegarlo Y vamos a poner entre corchetes descripción aquí. Obviamente, podemos ver que eso es bastante grande para esta área, lo que es posible que tengamos que trabajar en nuestros tamaños de fuente más adelante. Y luego, por último, queremos un botón para seleccionar la opción. Entonces voy a dar click en contenedor vBox, agregar un botón. Entonces aquí probablemente solo vamos a querer un botón regular. Lo que sí te permite tener un ícono, así podemos cargar rápidamente un ícono de prueba, misma manera que lo hicimos antes, a menos textura, expandirlo. Carga rápida de la hoja de sprites de 16 por 16. Haga Editar región y elija un icono. Entonces tal vez algo así como la espada con un símbolo de subir de nivel tenga sentido. Bien. Ahora podemos ver nuestro botón como un icono. Y luego en el cuadro de texto, podríamos decir elegir indicando lo que estamos haciendo aquí Ahora bien, si pasamos a nuestra ventana de selección de subir de nivel, podemos ver nuestras tres partes de la interfaz de usuario aparecer aquí abajo, tenemos tres botones que conectaremos para elegir más adelante. Tenemos nuestro título animado. Y así es más o menos como va a quedar nuestra plantilla. Es solo cuestión de proporcionar las opciones de selección, conectarlas a nuestro jugador y luego actualizar a nuestro jugador una vez que hagan una selección. Solo va a ser cuestión de poblar la lista con qué opciones están disponibles y luego aplicarlas al jugador una vez que el jugador haga su selección Bien, entonces podrías notar que hay un pequeño problema en el que a veces el borde de nuestros íconos se superpone con posiblemente los íconos vecinos. Entonces para arreglarlo, podemos ir a Selección de recompensas y verificar clip de filtro. Para el botón. Entonces, cuando haces eso, si vas por aquí y acercas y alejas, eso debería arreglar ese problema ahí mismo para no veas más píxeles superpuestos. También, para el nivel de selección en el mundo, podría estar técnicamente centrado aquí. Pero se puede ver que va hacia abajo y hacia la derecha desde ese punto central. Así que en realidad no va a aparecer centrado en la pantalla. Para editar eso, creo que sería una buena idea tomar nuestra capa Canvas y hacer clic derecho en guardarla como una nueva escena en nuestro proyecto de UI. Entonces diré jugabilidad UI Canvas como nombre, y luego lo abriremos. Bien, ahora, si miramos a Hue, podemos ver mucho más claramente dónde se colocan nuestros objetos en la pantalla y su tamaño relativo al punto de vista, lugar de tener la visión del mundo desordenada Entonces podemos ver, por supuesto, que nuestra selección de jugadores, UI, tenemos que hacer clic en eso y probablemente duplicar el tamaño. Entonces en escala, solo tomaré la báscula y haré que sea un dos. Eso podría incluso necesitar subir a tres. Sí, escojamos tres por defecto. Bien, entonces para manejar este tema donde nuestro contenedor de panel básicamente va hacia la derecha y hacia abajo en lugar de estar centrado aquí. Queremos saltar a la escena de selección de love up y luego ir al contenedor de panel, creo. Y sobre la derecha, tenemos que llevar el modo de diseño a los anclajes y luego centrarlo aquí Sí. Bien, ahí. Ahora tenemos lo que buscamos. Entonces esto básicamente hace que todo lo que sea un subobjeto centrado en ese punto de anclaje, donde si vamos ahora a la interfaz de usuario de Canvas, va a estar centrado correctamente. Bien, muy rápido, saltemos al guión para la selección de Llevo. Y listo, queremos ocultar nuestra selección de subir de nivel. Entonces voy a escribir y esconderme aquí. Y eso asegurará que cuando comencemos el juego, se ocultará por defecto. Vamos a golpear play. Vamos a LeveOp recogiendo EXP Y ahí tenemos nuestro selector LevelUp pop up. Tenemos tres botones para elegir . Todavía no hacen nada. Podemos decidir después que no queremos pausar la música, como lo que acaba de pasar, pero aparte de eso, todo está funcionando. El juego está completamente en pausa y nuestra interfaz de usuario se muestra. 45. P44: creación de un sistema de nivelación de armas para las actualizaciones de juegos: Para que nuestro sistema de subir de nivel funcione, en realidad necesitamos algunas actualizaciones para completar la lista aquí para nuestro menú de nivel superior Entonces, en general, eso va a ser mejoras de armas. Por lo que necesitamos establecer un sistema de nivelación para nuestras armas también. Entonces, si miramos la escena del jugador, tenemos el arma de lanza predeterminada, y eso tiene una definición de arma Así que la definición de arma se mantiene muy simple aquí por ahora, pero vamos a necesitar agregar una mejora de arma. Pero agregaremos aquí una matriz o diccionario de mejoras de armas para que podamos avanzar al siguiente nivel y realmente obtener cuánto daño se supone que debe hacer esta arma en cualquier nivel dado para que cuando lancemos nuestra arma, esté usando los ajustes apropiados. Y eso también puede incluir cosas como el tiempo de enfriamiento o cuántos objetivos puede golpear un arma. Hay muchas propiedades diferentes que puedes configurar para tu sistema de armas. Entonces, si saltamos al guión de las armas de lanza, podemos ir más allá de la definición de armas Puedes ver aquí, ya templé un método get cooldown, que va a regresar en función del nivel, el enfriamiento para el arma Entonces aquí, si definimos nuestra matriz, y luego pasamos en el nivel real del arma, entonces podremos recuperar el conjunto correcto de estadísticas para nuestra arma en su nivel actual. Y luego también necesitaremos generar un método get seen también. Por lo que actualmente, esto solo está cargando la escena de la lanza directamente Pero cuando estamos actualizando nuestra arma, posible que agreguemos la opción de tener escenas de proyectiles completamente diferentes pero no necesariamente queremos hacerlo en todos los niveles, por lo que podremos volver por defecto al proyectil de arma original y simplemente actualizar las estadísticas en su lugar necesariamente queremos hacerlo en todos los niveles, por lo que podremos volver por defecto al proyectil de arma original y simplemente actualizar las y simplemente actualizar las Entonces vamos a llegar a eso creando algo así como un nivel de arma o definición de nivel de arma. Entonces voy a ir al sistema de archivos, y bajaremos a las armas. Vamos a hacer clic derecho y crear un nuevo script aquí. Y entonces lo llamaré algo así como nivel de arma, que en sí mismo será un recurso. Así que vamos a crear eso. Abre el guión de nivel de arma. Iremos a la cima y crearemos el nivel de arma de nombre de clase. Entonces esto define las estadísticas para el arma en este nivel en particular. Así que un arma puede tener tantos niveles como quieras, y progresará en el poder a medida que mejore. Entonces podemos poner aquí algunas estadísticas a las que nos gustaría poder acceder para un nivel diferente del arma. Entonces uno obvio sería el enfriamiento. Entonces podemos decir en la exportación var, enfriar, y esto será un flotador, y podemos por defecto a 1.0. Bien, así que vamos a guardar eso muy rápido. Voy a cerrar todos mis otros guiones aquí, así que haga clic derecho y cierre todos para que podamos ver lo que estamos haciendo. Bien, y luego abre el nivel de arma y la definición de arma aquí. Bien, entonces esos serían los únicos dos con los que estamos trabajando aquí arriba. Entonces queremos, yo diría, un diccionario, si queremos ser consistentes con nuestros niveles de jugador. Y en Export VR, niveles, que será un diccionario de entero y el nivel de arma. Entonces, para el tiempo de reutilización de Git, queremos obtener el nivel, y luego devolveremos el tiempo de reutilización de las estadísticas de nivel Así que el nivel VR va a ser igual a los niveles dot Git y vamos a estar obteniendo el nivel P. Y devuelven null por defecto. Entonces ahora queremos eliminar el guión bajo para el nivel P porque finalmente estamos usando esta variable Ahora bien, no puede inferir el tipo aquí, así que sí tenemos que darle el tipo de nivel de arma concreta, y luego vamos a devolver el enfriamiento de punto de nivel Bien, entonces haz clic derecho en el nivel de arma y haz símbolo de Loup Bien, asegúrate de que en realidad esté ahí. Entonces en obtener enfriamiento, va a encontrar el nivel de arma Si no puede encontrar el nivel de arma, en realidad va a equivocarse aquí. Pude vernos que estamos usando mucho esta línea. Así que en realidad voy a poner también aquí abajo una función Git nivel de arma. Lo cual va a tomar un entero de nivel P, y esto va a devolver un nivel de arma. Así que sólo podemos devolver esto. Y luego en cambio, lo que podemos hacer aquí es decir, conseguir nivel de arma. Pasar el nivel p punto qual hacia abajo. Ahora bien, una buena razón por la que haríamos esto es que si queremos agregar posteriormente algún código, digamos que no hay nivel de arma y queremos por defecto al nivel anterior, o queremos error de porción. Podemos hacer todo eso dentro de esta función función de nivel de arma G. Y luego en todos los demás lugares que llamamos Obtener nivel de arma, todo ese código extra va a ser pre manejado. Entonces esto simplemente lo configura si necesitamos hacer que la función se dañe, función g max hits, etcétera, entonces esto reducirá nuestro código más adelante y lo centralizará en esta Pero por ahora, sobre todo cuando estamos haciendo prototipos, creo que definitivamente quiero saber de inmediato si olvidé configurar un nivel de arma donde esperaríamos que haya un nivel de arma definido en la definición de arma Así que en realidad estoy totalmente de acuerdo con que solo arroje un error tan pronto como intentemos llamar a punto quo abajo en un nivel de arma nula. Entonces por eso lo voy a dejar así por ahora. Bien, ahora saltemos al nivel de arma y configuraremos algunas otras propiedades que queremos modificar por nivel. Otro obvio sería el daño que un arma puede infligir. Entonces en la exportación var daño, y en realidad podríamos hacer daño a los hombres daño MAX si queremos que sea un poco más interesante. Entonces, si decimos en export var men damage, y digamos que eso es un flotador, podemos por defecto que sea 10.0, y luego tenemos en export var Max damage, que será un flotador. Y vamos a establecer eso en 20 por defecto, cualesquiera que sean los números que creas que es un buen punto de partida, vas a ajustar. Prácticamente siempre por cada recurso de nivel de arma. Como he estado mencionando, probablemente también queremos éxitos máximos. Así que en Export V max hits, y eso va a ser un entero. Lo pondré igual a 1.0. Ah, también, los hombres dañan y MAX daño, olvidé que estamos tratando con enteros en el juego, así que voy a cambiar eso a entero Entonces voy a cambiar eso a entero en ambos casos para que sea consistente. Por supuesto, podrías usar flotadores en combinación con enteros Pero creo que en este caso, cuando siempre queremos que el daño no sea decimal, es mejor ser consistente en todos nuestros guiones. Bien. Y entonces, de igual manera, máximo hit dice que el entero no debe tener un punto decimal ahí. Probablemente vamos a querer también una variable de velocidad aquí en alguna parte. Así que exporta var speed, y eso será un flotador. Lo pondré a 100.0 como aproximadamente píxeles por segundo ahí. Entonces un comentario rápido ahí, también. Entonces ahora tenemos un montón de propiedades. Queremos configurar el recurso en nuestra definición de arma de lanza Bien, así que alejemos el zoom, haga clic en el arma de lanza. Por aquí a la derecha, tenemos nuestros niveles de armas, así que los configuramos. Entonces el nivel corresponde no con una posición de matriz, sino con el nivel real del arma. Entonces queremos comenzar en uno aquí. Y entonces queremos hacer un nuevo nivel de arma. Bien, entonces en nuestro nivel de arma, estos podrían ser nuestros conjuntos base. ¿Por qué no solo agregamos el par de valores clave, y ese será el valor predeterminado para nuestra lanza de nivel uno Vamos a sumar en dos y después un nuevo nivel de arma. Y queremos aumentar el daño aquí. Entonces voy a decir 15 a 25, y tal vez la velocidad sea un poco más rápida, así que como 110 para la velocidad. El enfriamiento, podemos lanzar un poco más rápido, así que voy a decir 0.9, y los golpes MAX se fijarán en uno todavía porque agregar un golpe Max extra es un problema bastante importante. Eso podría ser como duplicar tu daño de manera efectiva. Entonces agreguemos eso. Y luego hagamos nivel tres, nuevo nivel de arma. Diremos 20 a 25 daños, la velocidad, tal vez 115, y luego el enfriamiento sti 0.9, pero aumentamos los golpes máximos a dos. Así que, como que puedes hacerte la idea aquí. Casi siempre queremos que algunos de los números suban. Debería sentir que cada nivel es una mejora sobre el anterior. No necesariamente tenemos que cambiar las actualizaciones en un factor lineal. Entonces, por ejemplo, un nivel podría ser un aumento masivo de daño, pero la velocidad del proyectil permanece igual En fin, agrega eso, y seguimos adelante tantos niveles como quieras. Bien, así que para seguir adelante, hagamos cuatro. Pondremos un nuevo nivel de arma aquí, y podría ayudar a expandir el nivel de arma anterior para que sepas lo que necesitas para mejorar. Por lo que empezamos en 20 hombres daños. Hagamos 25 de vez en cuando 30 por el daño MX y la velocidad, 120, el enfriamiento 0.8. El máximo golpea a dos. Agregar un par de valores clave. Sólo sigue adelante. Bien, y acabo de agregar una quinta por diversión. Entonces esa, puedes ver las estadísticas ahí mismo si quieres copiar. Una estadística clave que en realidad olvidé sería el número de proyectiles generados Así que vamos a exportar proyectiles var, y eso va a ser un entero igual a uno Entonces, el número de proyectiles a instancia por lanzamiento es una propiedad muy fuerte Entonces, si quisiéramos que un nivel fuera extremadamente fuerte, entonces podríamos decir, tal vez el nivel cinco. Tenemos dos proyectiles por lanzamiento, y eso hará que el arma inflija mucho más daño Ahora bien, no queremos que los proyectiles aparezcan exactamente al mismo tiempo en la mayoría Una forma sería compensarlos para que puedas ver en dónde van a desovar Otra opción que podrías agregar sería retrasar después de que ocurra un lanzamiento, cuánto tiempo antes de que cada proyectil abarque Entonces se podría decir, en realidad agreguemos ambos como una opción. Entonces podríamos decir en Export var offset o span offset. Va a ser una carroza. Va a ser igual a cero, cero. Y luego en la exportación VR, retraso de spawn es un float, y diremos 0.05 segundos. Así que eso va a verse así. desplazamiento de engendro es el desplazamiento máximo para la posición instantánea del proyectil. Entonces, ¿a qué distancia del punto central puede estar cuando genera Y entonces el lapso de retraso será el tiempo y segundos para esperar entre tramos adicionales de proyectiles, y debería decir, después del primero, ese es el valor clave ahí Bien, entonces en el siguiente video, trabajaremos en tomar estos niveles de armas y hacer para que podamos seleccionarlos para subir de nivel dentro de nuestra interfaz de usuario. 46. Elementos de armas P45 para mejorar la potencia de tus armas: Bien, entonces para la siguiente parte, necesitamos introducir la capacidad de nuestra interfaz de usuario de selección de nivel para obtener el objeto para la mejora del arma para que podamos subir de nivel el arma que está realmente activa en la jugada. Entonces, el primer paso de eso va a ser crear una lista de opciones o recurso dentro de nuestra selección de nivel superior que usaremos para poblar las opciones aquí abajo en función de una selección aleatoria de las opciones viables disponibles Veo aquí en la parte inferior izquierda que proyectiles están en la carpeta de niveles De hecho voy a trasladar eso a armas que simplemente tienen más sentido. Entonces, como no hay nada en la carpeta Niveles, voy a renombrarlo para que sea configuración porque lo que realmente estamos haciendo es configurar una lista de mejoras de armas u otras mejoras que podamos elegir en nuestro nivel de juego. Y en realidad podríamos diferir esto, dependiendo del personaje o podríamos diferir esto dependiendo del nivel que estemos cargando en nuestro juego, pero queremos tener la opción personalizarlo de cualquier manera. Entonces vamos a crear un nuevo script, y voy a llamar a esto opciones de nivelación punto gD Este será un recurso, por lo que podremos editarlo en el GIDOEditor Y luego voy a entrar aquí. Y digamos opciones de nivelación de nombres de clase. Anteriormente en el curso, introdujimos las camionetas. Ahora, esas camionetas solo existen actualmente como escena en el mundo del juego, se recoge e inmediatamente se agrega el EXP a los jugadores Entonces no hemos tenido la necesidad de un artículo específicamente porque ese EXP solo modifica una estadística Pero si queremos algo más complejo, como un impulso de salud o la capacidad de subir de nivel un arma, entonces necesitamos una clase de artículo más concreta dentro de nuestro juego, y prácticamente todos los juegos de tipo RPG lo van a tener en algún momento Así que queremos al exportar una lista de artículos que podamos usar inmediatamente con nuestro jugador. Entonces voy a hacer la exportación de artículos, y esta será una variedad de digamos artículo por ahora mismo. Ahora, no hemos creado una clase de artículo. Así que vamos a crear una carpeta en nuestra parte inferior izquierda para los elementos. Voy a hacer clic derecho, crear una nueva carpeta. Voy a llamar a esto artículos. Y luego dentro de aquí, voy a hacer click derecho, crear un nuevo script. Y este será item dot gD extendiéndose desde Resource. Bien, entonces dentro de aquí, haremos el artículo del nombre de la clase. Específicamente para un juego similar a un sobreviviente, es posible que no necesariamente tengamos artículos que existan en un inventario. Por lo que aún necesitan aplicar de inmediato. Pero cómo se aplican es más complejo que solo el EXBPickup siendo una asignación inmediata de experiencia Entonces para hacerlo para que podamos aplicar nuestros ítems a un jugador o a un target, al menos, voy a crear una función. Vamos a decir función try apply, que va a tomar un objetivo P, no dos D, y va a devolver un Booleano Así que intenta aplicar porque puede haber circunstancias en las que falla, y podría ser útil en algún lugar de nuestro código tener esa retroalimentación de si tuvo éxito o también es posible que queramos una función de can apply para que podamos verificar con anticipación si es realmente viable o no. Entonces voy a decir función puede aplicar, y esto pasará en el objetivo, no dos D y retorno de booleanos Entonces por defecto, voy a decir devolver falso aquí porque este es un elemento base. No podemos aplicarlo, y yo solo diré aquí también que devuelva falso. Entonces solo lo pondré en una advertencia de que no podemos aplicar el objeto base a un objetivo, y luego vamos a crear nuestro artículo de arma porque eso es lo que más nos preocupa primero. Así que voy a hacer clic derecho sobre los elementos, crear un nuevo guión, y este va a ser un elemento de subrayado de arma, va a heredar del ítem como la clase base, así que vamos a Entonces artículo de arma aquí, vamos a ir a la parte superior y hacer nombre de la clase elemento de arma que es un nodo dos D. Esto va a devolver booleano Entonces necesitamos una forma de acceder a la carga de armas del personaje si tiene una Entonces, una forma sencilla que podríamos ponerlo sería lejos la carga es igual a p target dot find child, y vamos a estar buscando carga de armas ¿Bien? Y eso debería devolver un tipo de carga de armas. Así que vamos a mover eso en su propia función. Entonces función obtener carga va a devolver la carga de armas. Y entonces sólo vamos a devolver esto en su lugar, devolver ptarget punto Fine Child armas de carga Entonces tenemos que pasar el Ptarget aquí. Y entonces podemos inferir el tipo. Entonces voy a hacer dos puntos iguales, Obtener loadout en pTarget y luego volvemos si eso existe o no por ahora Y luego queremos comprobar si la carga tiene la definición de armas que actualmente estamos tratando de aplicar Así que podríamos hacer en la exportación VR definición. Y esta es una definición de armas, una definición de arma, más bien. Bien, después de obtener la carga, queremos verificar si el arma existe en un lado de la carga Si lo hace, entonces vamos a ver si hay espacio para subir de nivel o si ya hemos alcanzado el tope de nivel. Entonces, dentro de la carga, necesitamos saber qué armas están realmente debajo de ella dentro de este sistema Entonces listo, podemos obtener todas las cargas preexistentes, y luego agregaremos un método para que podamos agregarle uno nuevo que lo agregará a la matriz, manteniendo la referencia a todos sus hijos de armas Entonces digamos armas var aquí hay una matriz de arma dos D, y en función subrayado listo, que vuelve vacío, queremos conseguir todos los niños que son de tipo armas Entonces, para arma en encontrar hijos, y las citas vacías para la cadena del patrón no coincidían por nombre Pero para el tipo, vamos a hacer arma dos D, y la carcasa importa aquí porque ese es el tipo de nombre de clase. Entonces esto sólo va a devolver a los niños a través de arma tipo dos D. Y entonces podemos decir armas punto Penn arma Y ahora cuando empieza el guión, tenemos todas las armas preexistentes. Podríamos decir que tenemos una función agregar arma función, que tomará un arma P arma P, que es un tipo de arma dos D, más bien, Vitun vacío y diremos armas Penn P Y queremos asegurarnos de que es hijo de esta arma. Entonces lo hacemos en una sola función. Diremos Agregar hijo de arma P. Eso va a ser bueno por ahora mismo. Entonces vamos a entrar en el artículo de armas. Tenemos el loadout para que podamos verificar si ya lo tiene. Entonces después de obtener la carga, queremos que el arma se asocie a esta definición de arma Entonces digamos, nuestra arma va a ser igual al arma LoadoUG, basada en una definición Entonces aquí vamos a decir definición. Ahora, vamos a saltar a la carga de armas y hagamos la función arma G, basada en la definición Entonces P definición. Es una definición de arma. Vamos a devolverle un arma a D. Y digamos por arma en armas, si la definición de arma es igual a la definición P, vamos a devolver esa arma. De lo contrario, devolvemos null. Ya que solo tenemos la necesidad de buscar a través de unas pocas armas, tener un bucle pequeño como este va a estar perfectamente bien, no realmente un problema. Además, si quieres limitar la cantidad de armas que un jugador puede tener, entonces podrías decir algo más como en exportación VR Max armas es un número entero de seis en la parte superior. Y luego podremos verificar si también hay espacio. Entonces podríamos decir que la función tiene espacio, y este será un tipo de retorno booleano, y solo diremos devolver armas punto si es menor que las armas máximas. Bien, entonces eso es solo una simple pequeña fuerza de función auxiliar. Ahora, de vuelta en objeto de arma, si tienen el arma, entonces queremos ver si podemos subir de nivel. Incluso podría tener sentido declarar aquí el arma tipo dos D, aunque ya se infiere de la llamada a la función de arma Bien, entonces primero que nada, si no hay arma, así que si arma es igual a nula, entonces volveremos carga hacia fuera tiene espacio como si podemos aplicar o no. Porque si el arma no existe en el sistema de armas, solo necesitamos ver si hay espacio para agregar una nueva. De lo contrario, si hay un arma, entonces queremos ver si podemos subir de nivel. Entonces entonces diremos arma de retorno. Podría ser algo así como C subir de nivel o tiene siguiente nivel. Creo que tiene siguiente nivel suena como un buen nombre para. Entonces ahora necesitamos esa función dentro de nuestras armas al guión D. Entonces en armas a D, queremos usar el nivel contra la definición y solo verificar si hay un siguiente nivel. Así que abajo en la parte inferior, vamos a crear nuestra función. Entonces la función tiene siguiente nivel. Esto volverá booleano. Entonces digamos función siguiente nivel, y ese será un nivel de arma igual a definición Obtener nivel de arma de nuestro nivel actual más uno, que puede devolver nulo. Por lo que vamos a volver siguiente nivel no es igual a null. Porque si hay un siguiente nivel, entonces podemos llegar al siguiente nivel. Podemos subir de nivel. Si no lo hay, entonces ya sea hemos alcanzado el tope de nivel o nos olvidamos de definir un nivel. Entonces podríamos haber definido el nivel siete, pero ¿definimos el nivel seis cuando estamos en el nivel cinco? Porque cinco pueden ir a seis, pero no podemos simplemente saltar a siete, al menos normalmente. Entonces eso debería manejar nuestras necesidades ahí para verificar si podemos aplicar. Y luego si vamos a aplicar, diremos función, aplique. Y déjame revisar la clase base aquí solo para asegurarme, intentaremos aplicar. De hecho, podría tener sentido copiar esto de nuevo. Bien. Y entonces vamos a anular eso aquí abajo sólo por volver a declarar la misma función Entonces primero, tenemos que conseguir el arma si vamos a aplicar. Entonces el arma Var es un arma dos D, y esto va a ser igual al arma LoadoUG de nuestra definición Entonces, si el arma no está ahí, entonces ya fallamos. Entonces si arma es igual a nulo, volvemos cae. Pero también necesitamos volver a conseguir la carga. Entonces las cargas Var van a ser inferidas tipo de G loadout Así que estamos obteniendo la carga sobre el objetivo al que estamos tratando de aplicar Entonces una vez que tengamos el arma, la queremos lavo arriba. Entonces vamos a decir arma punto tri subir de nivel, y eso volverá ya sea que tengamos éxito o no. Entonces devolveremos ese valor. Ahora necesitamos definir arma punto tri nivel arriba y arma dos D. Así que vamos a ir aquí abajo y la función, función tri nivel arriba, y vamos a devolver un Booleano Bien, entonces miramos hacia arriba en la parte superior de nuestra arma dos guión D. Podemos ver que tenemos el nivel y el nivel de arma existe en la definición de arma para ser un poco más eficientes y simplemente poder acceder a lo que es nuestra información actual. Una vez que ya hayamos nivelado, también podríamos tener una variable local Podríamos decir que nuestro nivel de arma es un nivel de arma. Entonces en lectura, digamos que el nivel de arma es igual a la definición punto nivel de arma Git en nuestro nivel actual. Y luego cada vez que subamos de nivel, también vamos a establecer eso. De esa manera, si necesitamos ver las estadísticas de nuestro nivel de arma actual, entonces simplemente accedemos a este valor aquí mismo. Entonces básicamente encontramos el valor en nuestra definición una vez, y hasta que volvamos a subir de nivel, tenemos acceso a la información en este nivel de arma. Bien, entonces ahora con TreveLu, queremos conseguir el siguiente nivel Entonces nuestras estadísticas de siguiente nivel van a ser iguales a la definición obtener nivel de arma en nuestro nivel más uno. Entonces, si las estadísticas del siguiente nivel son iguales a nulas, entonces devolvemos false. De lo contrario, vamos a decir que nivel de arma es igual a las estadísticas de siguiente nivel, y decimos nivel más uno. Nivel más es igual a uno, y volvemos verdadero. Bien, entonces ahí está nuestra función de subir de nivel. Bien, lo último que vamos a hacer en este video para el artículo de armas es en realidad crearlo. Entonces en artículos, haga clic derecho, cree un nuevo recurso, busque elemento de armas, presione Enter vamos a poner eso en artículos. Entonces diremos artículo de lanza. Y si haces doble clic en el elemento de lanza, puedes ver que tenemos un lugar aquí para la definición Queremos que la definición sea exactamente la misma definición que nuestra definición de armas de lanza Entonces, si haces clic en arma de lanza, puedes ver que tiene la definición de arma Hagamos clic derecho aquí y guardemos esto dentro de las armas. Entonces arriba en la raíz, vamos a las armas, y ahí tenemos definición de lanza Queremos hacer doble clic y anular eso. ¿Bien? Entonces, aquí está nuestra definición real de arma de lanza, y este es ahora un recurso compartido Así que podemos hacer clic en el elemento Spear, y queremos cargar rápidamente esa misma definición de lanza Por lo que ahora el objeto de lanza va a estar vinculado de esa manera con el arma de lanza Para que podamos reutilizar el arma lanza dos D. Vamos a guardar esta rama como escena Haga clic derecho en Guardar sucursal como SN. Y pongámoslo en la carpeta de armas como arma lanza punto TCN Bien, entonces ahora podríamos reutilizar eso en enemigos o en cualquier otro lugar que lo necesitemos. El punto clave es que nos aseguramos estén usando la misma definición de lanza que es muy importante o de lo contrario el objeto de lanza nunca podrá encontrar el arma de lanza a través de la Bien, ahora ya hemos hecho todo el trabajo de base. Entonces, el siguiente video, configuraremos la interfaz de usuario y subiremos de nivel para que funcione para mejorar nuestras armas. 47. P46: Crear un sistema de selección de artículos ponderado para las recompensas de subir de nivel: Entonces, en este punto, necesitamos agregar una lista de elementos de arma a nuestra selección de nivel superior que podamos elegir cuando llenemos la ventana Entonces ahí va a ser donde entra el guión de la opción de nivelación, donde para un mundo de juego determinado o nivel del juego, solo tenemos esta matriz de elementos que podemos asignar en la selección de subir de nivel. Entonces en el script de selección de subir de nivel, necesitamos al exportar una VR para opciones, y esto va a ser de tipo opciones de nivelación. Bien, entonces guardamos este script, y ahora si vamos a mirar el inspector y dos vista D, así que haga clic en Level Up selección, y luego encima a la derecha, podemos crear nuestras nuevas opciones de nivelación. Ahora bien, esto es algo que probablemente sea muy específico de nivel. Entonces es posible que tengas un nivel uno donde tengas muchas opciones, y luego el nivel dos, tal vez sea un poco más difícil, lo que restringes la lista de elementos, o incluso podría ser por clase de personaje si decides ir por esa ruta de restringir elementos a personajes específicos De cualquier manera, este va a ser un recurso en el que quieras hacer clic derecho y luego guardar en el proyecto. Así que vamos a entrar, digamos, en la carpeta de configuración, ya que por eso pongo el script de opciones de nivelación, y luego pondremos en las opciones de nivelación de nivel uno y luego guardaremos, así que eso va a ser un punto TRS Y ahora podemos asignar una matriz de ítems. Entonces voy a aumentar esto a uno, y vamos a cargar rápidamente el objeto de arma del objeto de lanza Y ahora esa es una de las posibilidades que podemos usar dentro de nuestro script de selección de nivel superior. En nuestra jerarquía, queremos que la selección de subir de nivel pase las opciones, digamos abajo a este contenedor HBox, que podríamos decir es más como la selección de recompensas Entonces, en términos de nuestra jerarquía, tenemos la opción establecida en el nivel de selección de nivel arriba. Cuando abramos el menú para subir de nivel a nuestro personaje, nuestras selecciones de recompensas se van a poblar aquí abajo en este contenedor de caja H. Entonces cada una de las recompensas que se les permitió elegir van a aparecer como una opción aquí abajo. Por defecto, eso serían tres. Pero realmente, depende cuántos artículos tengamos disponibles. Entonces podríamos cambiar el nombre de este contenedor HBox para que sea algo así como un contenedor de caja de recompensas, y luego hacer clic derecho y darle un script Entonces voy a adjuntar un script, y lo guardaremos en UI slash Rewards Box Container La razón por la que estoy haciendo esto es porque cuanto más separes las diferentes funciones de tu interfaz de usuario general en scripts separados más pequeños, más reutilizable será cada uno de esos componentes porque estás separando las responsabilidades. Por lo que el contenedor de la caja de recompensas va a ser el puramente responsable de poblar las recompensas que van a pasar por debajo de él Así que vamos a hacer un contenedor de caja de recompensas de nombre de clase, y luego vamos a querer exportar una escena repleta para instancia de cada una de estas selecciones de recompensas de. Entonces esos en realidad no van a estar ahí. Y la base, esos van a ser limpiados y sólo instanciados cuando tengamos una recompensa para Así que vamos a crear una función poblar y esto tomará una lista de opciones Y también queremos saber de cuántos artículos se pueden seleccionar a la vez. Entonces creo que las opciones de nivelación serían un buen lugar para poner esa propiedad en lugar de la propia interfaz de usuario. Así que hagamos clic derecho en Opciones de nivelación, Símbolo de búsqueda. Y voy a decir en export var MAX Underscore Choices, que va a ser un entero, y voy a por defecto eso a tres Y mientras estamos por delante, sí quiero hacer un gran cambio en esta variedad de artículos. De hecho voy a cambiarlo a un diccionario de artículos para que podamos aplicar un peso a cada uno. Y eso hará que si queremos priorizar un elemento como una opción posible, entonces podamos hacerlo aumentando su tasa de caída manera efectiva dándole un valor flotante más alto o un valor de flotación menor para los artículos más raros Ahora, como cambié el tipo de esta variable, eso significa que necesito restablecerla en la selección de nivel. Entonces, si vamos a la selección de niveles y miramos nuestro nuevo diccionario aquí, necesitamos dar el ítem. Tan rápido carga ese artículo de lanza y luego dale un valor. Podríamos decir uno si quisiéramos. Entonces ahora este objeto de lanza tiene una probabilidad de caer de 1.0. Y al igual que las otras instancias en las que hemos hecho aleatoriedad con pesos, ese 1.0 es relativo al peso total de todo lo demás en esta lista Entonces en este momento es 100% porque solo hay uno más de 1.0 peso, así que es uno de uno. Pero si agregamos cuatro elementos más, entonces sería un 20% de probabilidad. Y, claro, porque estamos dando tres opciones, va a rodar tres veces. Una vez que seleccionamos un elemento en nuestra lista desplegable, también se elimina de los pesos generales. Si tuviéramos cinco opciones, estaríamos tomando tres de ellas, tres opciones únicas, debería decir. Así que vamos al contenedor de la caja Rewards. Ahora tenemos cuántos vamos a elegir realmente. Ah, y queremos obtener el peso total. Lista de opciones, asegurándose de que cada una esté disponible para ser utilizada con el objetivo específico. Entonces hagamos otra función para eso. Yo lo llamaré función, generaré elecciones. Y esto tomaremos las opciones P como opciones nivelación y el objetivo P como un nodo dos D. Bien, así que antes que nada, queremos obtener las opciones restantes de la lista de opciones. Entonces, si nuestras opciones restantes van a ser iguales a, digamos, Poptionst peso del artículo o peso de los artículos, y vamos a duplicar Bien, entonces la razón por la que lo estamos duplicando aquí es porque queremos este diccionario de artículos con sus pesos y vamos a duplicar Bien, entonces la razón por la que lo estamos duplicando aquí es porque queremos este diccionario de artículos con Para ser locales de esta función específicamente, no queremos meterse con el diccionario original eliminando elementos de ese diccionario. Todas las opciones de nivelación deben permanecer en las opciones de nivelación básicamente durante el resto del juego porque esa es una definición de tiempo del editor, y estas son nuestras opciones restantes de tiempo de ejecución. Entonces duplicamos la lista, y vamos a estar quitando de ella después de hacer cada selección o después de invalidar una opción potencial Entonces el duplicado aquí es importante para asegurarnos de que no estamos modificando el diccionario original. Efectivamente. Ahora tenemos las opciones restantes. Queremos filtrar todas las opciones que no son válidas. Entonces, para la opción en las opciones restantes teclas de punto, ¿por qué las teclas? Porque las claves de este diccionario son los ítems y los valores son los pesos. Por lo que en realidad podría ser útil declarar el tipo aquí arriba, aunque se infiere del peso de los artículos, es mejor si podemos verlo en pantalla Entonces voy a decir diccionario de ítem, y luego tenemos el peso. Oh, espera, el peso está a flote. Y ahí podemos ver muy claramente que el artículo son las claves. Y el flotador es el valor. Para cada uno de estos artículos, queremos verificar, ¿puede el objetivo aplicarlo? En realidad, podría ser mejor llamar a este ítem por aquí. Para ítem de tipo item en opciones restantes teclas de punto, podemos decir, si item dot puede aplicarse y porque lo escribimos aquí, obtenemos acceso a las funciones en el menú auto poblado Entonces queremos ver si podemos aplicar eso a P target. Entonces, si no podemos aplicarlo al pre target, invertiremos eso. Entonces, si no el ítem Doc puede aplicar al objetivo P, entonces vamos a eliminar el par de valores clave. Entonces cuando hacemos las teclas de punto, esto nos está dando una matriz. Entonces esta matriz está separada del diccionario original así que creo que realmente podemos modificar ese diccionario sin problema porque ya tenemos la matriz separada de claves aquí. Entonces este bucle aquí, si modificamos el diccionario, no va a ser un problema. Normalmente, quieres tener cuidado con eso. Al igual que, no deberías modificar una matriz mientras la estás recorriendo, pero en este caso, esta matriz está separada de este diccionario, por lo que debería estar bien. Sin embargo, veremos con certeza cuándo ejecutamos realmente el código. Entonces, si no podemos aplicar el ítem, entonces queremos eliminarlo de la lista de opciones porque no podemos usarlo. Así que las opciones restantes eliminan puntos o Facilidad, sí. Bien, aquí se llama borrar. Y ahí mismo tenemos la llave. La clave es el ítem. Entonces borramos el ítem de eso, y eso va a eliminar eso como una opción. Entonces después de hacer un bucle de todas las opciones, ya hemos filtrado todas las que no podemos aplicar Entonces ahora solo necesitamos hacer una selección basada en el peso total, y después de elegir cada una, eliminamos de las opciones restantes. Entonces nuestro peso total aquí va a ser un flotador igual a 0.0, y necesitamos recorrer una vez más las opciones restantes. Entonces podríamos decir como cuatro pesos a flote y opciones restantes valores de punto entonces decimos peso total más es igual a ese peso Entonces creo que esa es una forma bastante clara de escribirlo. Entonces ahora hemos sumado el peso. Queremos hacer una selección aleatoria entre cero y el peso total y luego ver cuál escogimos. Por lo que el peso aleatorio VR va a ser inferido tipo de rand F veces el peso total Así que lo hemos hecho algunas veces en el curso hasta el momento. El peso total es nuestro valor máximo. 0.0 es nuestro valor mínimo. Y al tomar básicamente 0.0 a una vez el peso total, vamos a obtener algún valor entre cero y el peso total. Bien, entonces ahora tenemos nuestro peso aleatorio, y queremos elegir un artículo de entre las opciones restantes. Y va a haber un bucle aquí, por cierto, pero podemos simplemente escribirlo para un artículo primero. Bien, entonces ahora aquí cuatro opciones en opciones restantes. Entonces vamos a decir si el peso actual es mayor o igual al peso aleatorio, entonces elegimos esa opción. Entonces ahora necesitamos, en realidad un peso actual aquí también. Entonces nuestro peso actual va a ser un flotador igual a 0.0. Entonces primero, queremos sumar en el peso de la opción. Tan actual va a ser más igual a las opciones restantes en esta opción. Entonces ponemos en la clave del diccionario. Nos da el valor, y en realidad podría ser una forma más segura para eso. Entonces podríamos decir, obtener opción. Y si no hay opción, el valor predeterminado es nulo. W nos daría un error aquí. Y tal vez eso es realmente lo que queremos porque esperamos que esté ahí. Es un gran problema si bloqueamos el par de valores clave, y simplemente no existe. Así que sí, vamos a dejar que eso sea justo como hubiera sido haciendo la opción de corchetes. Efectivamente, es lo mismo excepto que esta función get te permite aplicar una copia de seguridad predeterminada con una coma y luego una variante predeterminada Entonces es un poco más flexible, pero en este caso, sí queremos una falla dura si la opción simplemente no está ahí, porque definitivamente debería ser Bien, entonces agregamos el peso actual. Queremos verificar si el peso actual es mayor que el peso aleatorio. Entonces, si el peso actual es mayor o igual al peso aleatorio, entonces vamos a agregar esto a la lista de opciones seleccionadas. Podríamos simplemente declarar las opciones seleccionadas aquí arriba en la parte superior. Entonces var selected es una matriz de item porque eso es lo que necesitamos devolver al final. Así que vamos a añadir la opción a la matriz seleccionada Así que seleccionamos la opción de anexar, y luego tenemos que eliminarlo de la lista de opciones Y en realidad, creo que cómo voy a hacer esto es que vamos a establecer una variable local aquí arriba. Entonces, si nuestra siguiente selección es el ítem igual a nulo, haremos el siguiente seleccionado. Igual a esa opción y luego romper. Entonces salimos del bucle de cuatro. Ya no necesitamos los cuatro bucles. Después de ese bucle, siguiente seleccionado no es igual a nulo. Entonces vamos a la opción de agregar punto seleccionado. De lo contrario, queremos salir de todo nuestro bucle de cuatro. Entonces necesitamos un bucle cuatro porque lo vamos a hacer varias veces. Entonces veamos. Entonces pienso justo por aquí, 44 veces en Rango, cero, CP, opciones de subrayado puntean Max Choices con incremento de uno Entonces eso básicamente significa que vamos de cero a las opciones máximas, subiendo una cada vez. Cuando alcanzamos las opciones máximas, detenemos el bucle. Entonces, si las opciones máximas son tres, esto va a correr tres veces. Va a ser cero, uno, dos, y cuando llegue a tres, va a ser igual a las opciones máximas. Voy a detener el bucle cuatro. Bien, así que básicamente solo tomamos todo eso y lo tabulamos, y ahora va a hacer un bucle de todo este código, ¿verdad? Entonces como parte de agregar la opción, también queremos tomar el peso total, y queremos menos es igual a cualquiera que sea el peso de las opciones Entonces diremos opciones restantes punto obtener opción. Soy consciente de que esto está llamando de nuevo a esto, pero eso no es realmente un gran problema. Entonces esto va a obtener el valor de flotación del peso. Lo quitamos del peso total, y luego queremos volver a subir aquí. Entonces también existe la otra posibilidad, que es que no haya nada seleccionado, lo que significa que no queda nada por seleccionar. Así que podríamos simplemente hacer ruptura temprana del bucle de cuatro. Entonces estamos hablando de esto for loop aquí mismo. Y eso probablemente me quede bien. Sólo tenemos que devolver el seleccionado. Así que regresa seleccionado. Entonces al final de esto, obtenemos hasta tres artículos. Para cada uno de esos elementos, queremos poblar la interfaz Entonces digamos VR aquí arriba, las opciones van a ser iguales para generar opciones en las opciones P, y pasamos el objetivo P para que podamos verificar cada ítem contra su objetivo para asegurarnos de que sea válido. Entonces tenemos opciones aquí ahora. Y luego queremos crear la escena de selección bbard y asignarle la elección aquí abajo en la parte inferior Dado que este bit está realmente fuera de este bucle de cuatro, queremos agregar el siguiente seleccionado porque establecemos siguiente seleccionado aquí igual a la opción para que podamos usarlo fuera del bucle cuatro Así que queremos decir siguiente seleccionado aquí, y queremos conseguir en el siguiente seleccionado también. Entonces una cosa más que olvidé hacer aquí abajo es que después de ajustar el peso total, también me olvidé de eliminar la siguiente seleccionada de las opciones restantes. Entonces disminuimos el peso total porque estamos eliminando la opción, y luego eliminamos la opción de la lista real de la que estamos seleccionando. Entonces, cuando vuelva a subir aquí ahora para los siguientes cuatro bucles para las opciones restantes, no va a tener esa opción ahí, y simplemente la saltará por completo porque ya no está en ese diccionario, que es lo que queremos. Para las opciones restantes, solo queremos recorrer lo que aún es una selección posible, gluting selecciones que ya se han hecho 48. P47 Selección de recompensa por codificación con propagación de señal: Desde nuestra función Generar opciones, tenemos esta variedad de opciones. De hecho, podría ayudarnos visualmente a declarar el tipo aquí mismo en lugar de inferirlo. Entonces, como tenemos una matriz, queremos recorrer la matriz. Entonces para cada elección, creamos una instancia de nuestra escena de selección de recompensas, y luego vamos a aplicar la elección a esa escena, básicamente establecemos la elección en la escena y tenemos que poblar su sub UI con todo lo que necesitamos Entonces, para elegir opciones, vamos a crear una selección de recompensa, que actualmente es un control, y eso va a ser igual a selección de recompensa punto de escena Instanciar Entonces tenemos que agregarlo de niño a este contenedor HBox. Así que agrega hijo de Selección de recompensa. Y luego diremos la selección de recompensa punto setHoce y pasamos en el Choice en él Nuestra selección de Recompensas, puedes ver por aquí, actualmente no tiene guión. Esta función no existe, así que necesitamos crear una función en el guión, y vamos a hacer eso dentro de la escena empaquetada. Entonces queremos hacer clic en Abrir y Editor. Entonces entramos en la escena empaquetada original para este elemento de la interfaz de usuario en particular. Entonces en Selección de recompensas, queremos dar click en adjuntar un Nuevo Guión, y lo llamaremos Uilashrewardselection Crea eso. Y lado de aquí. Le daremos el nombre de clase Selección de recompensas que hará que sea mucho más fácil rellenar automáticamente sus funciones Y lo que nos importa aquí es la elección del conjunto de funciones, y vamos a pasar en una elección. Y esa elección es un artículo. Recuerdo. Entonces esto volverá nulo. Y a partir de ahí, necesitamos poblar todos estos elementos. Así que voy a tomar la etiqueta de texto enriquecido, y vamos a cambiarle el nombre para que sea etiqueta de nombre. Cambiemos el nombre del texto directo para que sea icono rect. Cambiemos el nombre de la segunda etiqueta de texto enriquecido para que sea etiqueta descripta, y cambiemos el nombre del botón para elegir botón Bien, eso va a dejar mucho más claro lo que en realidad se supone que deben hacer estos. Ahora que ya tenemos esos ajustes, volvamos a entrar en el guión de selección de recompensas el guión de selección de recompensas y obtengamos una referencia a cada uno de ellos. Ahora bien, la forma en que lo he estado haciendo a través del curso, y creo que incluso en este caso, todavía prefiero es hacer una en export var y vamos a decir algo así como etiqueta de nombre. Es un tipo de lo que sea, etiqueta de texto enriquecido. Bien, y entonces solo puedes asignarlo en el inspector. Sabemos cómo hacer eso, ¿verdad? Pero esto significa que cada vez que configuras una copia del script, tienes que establecer manualmente las variables de exportación. Así que sólo para mostrar otra opción, se puede hacer en on ready var, digamos, icono Rec y eso va a ser una textura rect Y luego le das un eco signo y lo colocas en el camino a su nombre. Entonces si digo elegir botón, automáticamente se poblará aquí. Podemos seleccionar eso. Y creo que esto necesita un letrero de $1 al inicio. Así signo de dólar contenedor de margen, barra diagonal VBox contenedor barra Escoja botón Ahora bien, lo que esto significa es que al estar listo, va a obtener automáticamente esta ruta de nodo y asignarla al texto directo. Por lo que no necesitamos configurarlo manualmente en el inspector. No obstante, aquí hay un defecto importante, que es que para ello se requiere el camino hacia ese ítem sea el mismo Entonces, si tu botón de elegir se llama cualquier cosa que no sea botón de elegir, no lo va a encontrar. Entonces esa sería una razón por que podría preferir hacer una en Export porque entonces si por casualidad reordenas tus nodos aquí, siempre y cuando todavía tengas el conjunto de referencia, no va a romper tu script Bien, entonces es por eso que generalmente no uso eso, y voy a volver a cambiar a en Export var icon Rect, que va a ser una textura Rect Y luego queremos en Exportar etiqueta de descripción var, que es una etiqueta de texto enriquecido aquí en Exportar var elegir botón. Es un botón. Bien, y para la elección de conjunto, solo devolvamos el pase por ahora mismo para que el script pueda guardar y haga clic en Selección de recompensa. Ve a la parte superior derecha y asigna cada uno de esos. Entonces nombre etiqueta a etiqueta de nombre, icono Rect a icono Rec, descripción a etiqueta de descripción Y debido a que tenemos dos etiquetas de texto enriquecido, aquí es donde tener nombres informativos como etiqueta de nombre y etiqueta de descripción realmente ayuda en lugar de que ambas se llamen texto enriquecido y etiqueta de texto enriquecido dos. Sólo quiero señalarlo. Y luego finalmente elegir botón que asignamos al botón de elegir. Entonces ahora tenemos una referencia a todos esos, y podemos llenarlos fácilmente con información de nuestro artículo. Bien, entonces ahora para manejar la elección del conjunto, podemos hacer el texto del punto de la etiqueta del nombre, y eso va a ser igual al nombre del elemento. Entonces en este momento nuestra clase de artículo no tiene nombre. La subclase de elemento de arma tiene una definición, y esa definición tiene un nombre, pero es posible que queramos un nombre específico de elemento, y creo que este sería el enfoque más sencillo para crear un nombre de elemento en la clase de elemento Entonces, si subimos a item, podemos hacer en Export VR display name, que va a ser un nombre de cadena, y por defecto lo haré como elemento sin nombre Entonces esto es una especie de distinción entre el objeto y la definición del arma porque un objeto no siempre es necesariamente un arma, por lo que podemos distinguir aquellos con dos propiedades separadas, al menos por ahora Así que ahora volvamos a la selección de recompensas, y elegimos pchoice dot display name Permítanme echar un vistazo a la definición del ítem de lanza, y podemos ver aquí Entonces, la definición aquí está realmente establecida para ser más una definición del arma, cómo sube de nivel y su valor de daño. Entonces la descripción del artículo suena como algo que debería estar separado porque podrías recoger una copia de ese elemento en el mapa del mundo, y diría algo así como, Oh, este es un artículo de lanza Agrega la capacidad de tener el arma a tu jugador, pero no es la definición del arma en sí. Entonces sí queremos distinguirlos. Entonces podemos decir descripción etiqueta punto texto va a ser igual a pchoice dot description Ahora necesitamos artículo para tener una descripción. Copiemos ese nombre, haga clic derecho sobre el ítem, símbolo Lou. Y lo haremos en Exportar var, bueno, y lo haremos en export var paste in description, que es una cadena, y eso va a estar en blanco por defecto. Bien, entonces ahora en la selección de recompensas, eso se maneja. A continuación, queremos hacer el ícono Rect. Entonces podríamos decir icon rect dot texture va a ser igual a pchoic Una vez más, el artículo se distingue de la definición de arma. Debe tener su propio icono que se pueda configurar. Así que voy a hacer en la exportación VR icono textura. Bien, y tenemos el icono de textura, así podemos volver a Selección de recompensas. Ahora bien, quiero tener cuidado aquí porque si intentas poner el ícono pchoicto cuando no hay un ícono de punto pchoico, entonces vas a estar obteniendo una referencia nula en cuanto intentes hacer referencia Entonces puedes verificar manualmente si el ícono existe cada vez, o podrías cambiar esto a pchoic dot Get icon y solo tener esa seguridad incorporada Pero entonces tenemos que agregar esta función a la clase item. Así que vamos a hacer clic derecho en Lo arriba el símbolo, y luego voy a crear nuestra función G icono aquí abajo, función G icono, y esto va a devolver una textura o nada. Entonces si icono, entonces volvemos icono, lo contrario devolvemos nulo. ¿Bien? Creo que es bastante simple. Este método nos da seguridad en caso de que sea nulo, entonces simplemente devolveremos null en lugar de tener un error inmediato. Entonces el último es un poco más complicado aquí. Tenemos el botón de elegir. Cuando se presiona el botón de elegir, queremos hacer la selección con la elección. Entonces queremos que el botón sepa sobre la elección. Y luego pasamos esa señal del botón siendo presionado todo el camino hasta nuestra selección de subir de nivel para que podamos aplicar el efecto al jugador y cerrar el menú. Entonces aquí en el nivel de selección de recompensa, queremos vincular la señal del botón que se está presionando con la elección que pasamos aquí mismo, la elección del artículo, y lo emitiremos como una señal en la selección de recompensa, y luego la selección de nivel arriba se conectará a eso yendo más arriba en la cadena y básicamente podemos saber en el nivel superior cuándo cualquiera de se presionan nuestros botones y luego se aplican los efectos a nuestro reproductor. Entonces vamos a necesitar hacer, digamos, botón de elección. Entonces vamos a necesitar hacer choosebton press dot Connect, y vamos a conectarlo a una nueva función en Pero vamos a atarlo con la elección P. Entonces, cuando lo estamos vinculando, básicamente estamos pasando un parámetro extra a la devolución de llamada que esa función normalmente no tendría Así que la función subrayado sobre recompensa presionada ahora obtiene la opción P, que es un ítem, y va a volver nula, y ahora podemos seguir pasando esta elección por la jerarquía Entonces podemos tener una señal arriba AR en la parte superior, que dirá señal seleccionada, que pasará en una elección del ítem. Ahora solo necesitamos emitir esa señal, así seleccionada. Punto I MIT, y pasamos en la opción P, y ahora puede subir la jerarquía. Entonces sí, normalmente, una pulsación de botón no tiene parámetros cuando la recuperas. Simplemente informa que se presionó el botón. Pero al llamar a bind, agregamos en este parámetro extra cada vez que se presiona eso. Entonces ahora nuestro botón puede darnos esa información muy crítica de qué elección se estaba tomando en realidad. Técnicamente hablando, también podríamos establecer la variable de elección local aquí, y luego presionada, podríamos simplemente pasar la elección local para la elección de artículos. Entonces, si configuro eso cuando fije la elección, eso también funcionaría. Dos formas de hacer lo mismo, pero ahora conoces una forma mucho más genial de usar la encuadernación, por lo que en realidad puedes agregar parámetros adicionales. Además, esto no requiere la selección de recompensa para seguir manteniendo esa elección, aunque definitivamente podría, y no sería problemático aquí. Bien, así que vamos a ir más arriba en la jerarquía. Ahora, en nuestra selección de Lavop, que vamos a ver. Tenemos el contenedor Caja Rewards. Así que aquí es donde realmente estamos creando las selecciones de recompensa. Entonces aquí, necesito propagar de nuevo la señal hacia arriba. Entonces digamos señal seleccionada, que va a pasar en el ítem choice así como así. Así que cada vez que poblamos con nuestro menú de selección de recompensas, y ahora que tenemos un nombre de clase, podemos y debemos cambiar esto para la selección de recompensas Y vamos a conectar eso a las Recompensas seleccionadas. Entonces aquí abajo, en la parte inferior, crearemos este guión bajo de la función de devolución de llamada en Recompensas seleccionadas Obtenemos el P Choice, que es el ítem que devolvemos nulo, y solo vamos a propagar eso hacia arriba Así seleccionado punto EMT. Vamos a emitir con la elección P. Entonces eso va más allá arriba de la jerarquía ahora. Así que eso es a nuestro nivel de contenedor Rewards box. Ahora en la selección de nivel superior, solo necesitamos conectarnos a nuestro contenedor de cajas Rewards. Así que vamos a exportar var nuestro contenedor Rewards, que es un contenedor de caja de recompensas. Y en listo, queremos conectarnos a su señal. Contenedor de recompensas punto seleccionado punto conectar en Recompensa seleccionada. Subrayado de función en Recompensa, seleccionado. Déjame acercarme un poco aquí. Y vamos a tener nuestra opción P, que es el artículo, y volveremos nulos. Así que vamos a pasar por ahora, y vamos a necesitar aplicar el efecto al jugador y cerrar el menú. Volveremos a eso en un segundo. Entonces tuvimos nuestro método de selección de inicio. Lo que queremos hacer es básicamente restablecer el contenedor de la caja de recompensas. Nosotros sí queremos que se complete, pero también queremos que borre cualquier artículo existente Entonces en el contenedor de cajas de recompensas, voy a tomar poblar y hacer ese subrayado y generar elecciones. También haré guión bajo para privado para que no llamemos accidentalmente a eso desde nuestra interfaz de usuario principal Entonces aquí tenemos que subrayar porque estamos haciendo subrayado generar opciones. Ahora vamos a crear la función que realmente vamos a llamar. Así opciones de configuración de funciones. Sí. Bien, eso tiene algún sentido. Y vamos a pasar en nuestras opciones P, que es opciones de nivelación, y vamos a pasar en P target, que es nuestro nodo dos D. Por supuesto, vamos a poblar con esas opciones y nuestro objetivo Pero antes de eso, también quiero despejar este menú. Entonces, cualquiera de los cuadros hijos, necesito eliminarlos antes de poblarlos, o necesito asegurarme de que mi relleno reutilice la interfaz de usuario existente y luego los actualice con las nuevas opciones Entonces, debido a que aquí solo vamos a tener algunas opciones, sería un poco exagerado preocuparse demasiado por reutilizar todos los posibles componentes de la subinterfaz Entonces la opción más fácil a corto plazo definitivamente sería simplemente aclararlo, que va a ser para niño y Niños. Sólo vamos a llamar a niño punto Q gratis. Entonces ahora aquí arriba en la cima, podemos despejar antes de poblar. Ah, y tenemos que terminar un tipo de devolución para las opciones de configuración. Entonces volveremos nulos. Bien. Sí. Así que ahora, setup Choices, podemos llamarlo en nuestro script de selección de niveles. Entonces inicia la selección, vamos a hacer recompensas Contenedor punto Iniciar Selección, y eso va a pasar en las Opciones y el objetivo, que es el jugador de contexto. Y este es el nombre equivocado para el método. En realidad se configuró Choices. Bien, entonces iniciamos la selección. Nosotros establecemos las opciones. Esperamos a que el jugador básicamente elija una opción, y luego vamos a recibir nuestra devolución de llamada Entonces en ese punto, queremos cerrar el menú. Entonces podríamos decir recompensas contenedor punto CE aquí. Y sí hice de eso un método privado. Entonces en el contenedor de la caja de Recompensas, solo eliminaré el guión bajo aquí y aquí Bien, entonces ahora se llama internamente, pero también de otros scripts. Entonces, si necesitas hacer público un método, puedes hacerlo. Técnicamente, una vez más, GD Script no le impide llamar a un método con un guión bajo en él Es solo la mejor práctica para indicar la intención. Así que de vuelta al nivel de selección en Recompensas seleccionadas, queremos aplicar el efecto de ítem al jugador. Diremos p choice dot Intenta aplicar al jugador. Entonces ese va a ser el reproductor de puntos de contexto. Después limpiamos el contenedor y cerramos el menú. Bien, entonces vamos a ver. Aquí sólo haremos un escondite. Y eso podría ser prácticamente todo lo que necesitamos. Así que un poco de limpieza aquí. Vamos al contenedor de la caja de Recompensas, y bueno, déjame mostrar la vista de dos D, en realidad. Aquí puedes ver que tenemos estas tres cajas aquí. Tener esos en la vista aquí está bien siempre y cuando los liberemos antes de comenzar a usar cualquier cosa. Entonces, si vamos a Rewards Box container on ready, voy a querer llamar a Clear. Así función subrayado listo. Llamemos claros a esos elementos de la interfaz de usuario. Entonces eso significará que estos se eliminarán y serán recreados cada vez que el contenedor de la Caja de Recompensas aparece. Queremos que sea lo más óptimo posible, reutilizar cada componente de UI es mejor que tener que recrearlo a partir de una instancia Pero para algo sencillo como esto, solo vas a mostrar una vez cada no sé, 30 segundos de jugabilidad, casi no debería tener impacto, y en realidad no es gran cosa. Bien, entonces todavía tenemos la selección de lanza aquí. Entonces, si realmente tratamos de subir de nivel, deberíamos ver una selección. Definitivamente es hora de seguir adelante y darle una prueba y ver si realmente logramos que salga y funcione en absoluto. Así que vamos a golpear Play. Y ya veremos cómo funciona. Bien, entonces parece que me olvidé de poner el contenedor de recompensas aquí en la selección de nivel arriba. Entonces vamos a subir de nivel la selección. Haga clic en eso. Y en la jerarquía, necesitamos asignar el contenedor de recompensas contenedor caja de recompensas. Entonces esa es realmente la debilidad de las propiedades de exportación, ¿verdad? Si olvidas configurarlo, entonces realmente no hay ninguna indicación ahí, aparte de que vas a golpear errores en algún momento del código. Entonces no necesitamos una afirmación ahí porque la conexión a la señal ya va a arrojar un error en cuanto falle Vamos a cerrar, y volveremos a correr. Bien, entonces vamos a recoger nuestro artículo. Boom, solo tenemos una opción para elegir. Entonces hemos nombrado ítem aquí. Creo que simplemente no puse un icono o descripción, pero se puede ver que el método Get icon, porque manejamos el caso nulo, no nos va a dar un error. Mientras que si hacemos referencia directamente la propiedad del icono de punto porque eso era Nulo, arrojaría un error aquí. Si pegamos a elegir, ¿va a aplicar al jugador? Entonces, vamos a enterarnos de eso. Se debe cerrar el menú. Sí, pero me olvidé de retomar el juego. Así que tenemos que volver aquí y asegurarnos de que después ocultar el menú o tal vez incluso antes de ocultar el menú, diremos Geth punto pausado es igual a falso Guardemos eso y corramos una vez más. Entonces entramos aquí, hacemos nuestra selección, vamos a elegir el artículo. Boom, ya está ahí. Ahora bien, parecía funcionar, pero la verdadera prueba sería que si tuviéramos una exhibición para nuestros niveles de objetos de arma aquí arriba, trabajaremos en eso en un poco. Por ahora, lo mejor que se puede hacer sería acercar, y vayamos a nuestro objeto de lanza Voy a golpear el nivel dos, y vamos a cambiar el tiempo de reutilización a 0.1, porque eso será muy obvio si actualizamos a ese nivel Entonces volvamos a golpear play. Iré a recoger nuestro artículo, presionaré a elegir, y vemos que el tiempo de reutilización no se actualiza Entonces algo está un poco fuera en el código. Entonces creo que en realidad el problema va a estar en el arma misma. Voy a verificar aquí para asegurarme de que en realidad estamos asignando el nivel hacia arriba, así que ahí el punto de interrupción Y déjame ver aquí listo, obtenemos la definición de enfriamiento para el temporizador. Pero puedes ver aquí estamos fijando la hora para el temporizador aquí. Pero te apuesto aquí abajo, en realidad no reiniciamos el temporizador a un nuevo valor. Entonces, sí, ese es un problema muy claro. Tenemos que decir el punto del temporizador. De hecho, digamos que empezar va a ser el nuevo valor. Entonces tenemos que hacer lo del enfriamiento de G. Necesitamos obtener el punto de definición Obtener enfriamiento de un nivel actual Entonces definición, punto Consigue enfriamiento de nuestro nivel. Lo que esto significa es que cada vez que estamos reiniciando el temporizador, estamos obteniendo el enfriamiento actual de nuestro nivel Entonces, si digamos a mitad de camino disparando un proyectil, cambiamos nuestro tiempo de reutilización porque nuestro nivel subió Entonces esto significa que la próxima vez que ese proyectil se lance después de que se lance, vamos a reiniciar el temporizador con nuestro nuevo valor Por lo que ahora utilizará la propiedad Nivel dos. Y creo que ni siquiera necesito tener este punto de ruptura. Estoy bastante seguro de que ese es el problema. Sigamos adelante y golpeemos Play. Voy a seguir adelante y recoger nuestra arma, golpear elige, y ahí tienes. Básicamente tenemos una lanza de ametralladora porque nuestra lanza golpeó el nivel dos, y esto va a ser completamente frenética de juego Entonces yo recomendaría al final, solo cambiamos el frío aquí abajo para nuestro proyectil de lanza de nuevo a 0.9 ahora que sabemos que funciona, y eso va a ser una envoltura para este video 49. P48: aplicación de estadísticas de nivel de armas a instancias y espolvores de proyectiles: demostró que podemos mejorar nuestras armas a través la selección de recompensas al subir de nivel, pero debemos asegurarnos de que cuando subamos de nivel nuestras armas estamos usando todas las estadísticas correctas para el arma, no solo la reducción de enfriamiento. Entonces entremos en el guión para proyectil. Y vamos a ver dentro de aquí que aún no estamos usando las estadísticas del nivel de arma. Estamos usando una velocidad incorporada, y el daño final no se hace por ningún corte de cálculo. Es solo pasar 100 como la variable local. Entonces, si has estado notando en la definición de nivel de arma, aún no está usando esas estadísticas, bueno, por eso Entonces, cuando creamos el proyectil, tenemos que pasar también en el nivel del arma Podríamos tener una función totalmente separada para hacerlo, pero creo que en realidad podría ser más práctico solo poner las estadísticas de nivel de arma en la función de lanzamiento. Por lo que la función de lanzamiento está pensada no solo para establecer la dirección sino también configurar las estadísticas específicas del proyectil, sino que el lanzamiento también está destinado a configurar las estadísticas específicas de lanzamiento para este proyectil en función del nivel actual del arma Entonces como perímetro extra, vamos a querer pasar en el nivel P, que es un nivel de arma. Así que esas serán todas las estadísticas que necesitamos traer aquí. Y en vez de en la cima tener una velocidad aquí, voy a quitar y en cambio vamos a decir var nivel de tipo nivel de arma, y ahí es de donde vamos a sacar todas las estadísticas. Entonces, cuando estamos haciendo el proceso de física y necesitamos multiplicar por la velocidad, haremos nivel. Velocidad de punto. Bien. Vamos a agregar eso en. Y ahora en el lanzamiento, necesitamos establecer el nivel igual al nivel P. Bien, así es como ingresamos las estadísticas, y luego solo necesitamos actualizar nuestras llamadas para lanzar. Pero aquí hay otra información que es relevante. Entonces, antes que nada, cuando el hit box golpea un cuadro rt, necesitamos sacar el daño de las estadísticas de nivel. Entonces aquí necesitamos un cálculo de daño aleatorio entre nuestros hombres el daño por el arma y nuestro daño MAX. Entonces voy a quitar esta línea, y diremos var damage va a ser un entero, y eso va a ser igual a un rango entero aleatorio entre el daño mínimo y el daño máximo. Entonces nivele el punto Min daño, y luego nivele el punto Max daño que maneja la aleatoriedad aquí. Entonces tenemos nuestro daño final. Solo diré que eso es igual al daño en este momento, y luego pasamos nuestro daño final a la caja de Hurt. Entonces ahora tenemos daño aleatorio basado en el nivel y la velocidad que establece el nivel, también. Entonces, si miramos un guión de arma dos D ahora, vamos a obtener un error para lanzamiento de proyectil punto porque necesitamos pasar en el nivel actual del arma dos D, que está convenientemente configurado aquí en el que está convenientemente configurado arma dos D. Así que digamos coma, nivel de arma aquí, y eso solo lo envía desde el nivel de arma a la instancia de proyectil Para que podamos probar esos cambios ejecutando el juego ahora. Así que vamos a ir a buscar nuestro enemigo o a donde quiera que tengan ganas de desovar Bien, ahí hay uno. Y verás que tenemos daños aleatorios entre nuestros hombres y MAX. Actualmente, se puede ver que sigue pasando por el enemigo, ahí está nuestro nivel arriba. Entonces, en teoría, esto debería ir un poco más rápido tanto en el enfriamiento como en el daño. Se pueden ver los daños allá arriba. Entonces, en su mayor parte, eso parece estar funcionando. Pero aún quedan algunas cosas que tenemos que ajustar, como cuántos golpes puede hacer antes de eliminar realmente el proyectil Entonces en el golpe de hipbox, realidad queremos incrementar cuántos golpes hemos hecho, y si los golpes son iguales a nuestros golpes MAX o mayores, entonces queremos liberar nuestro Entonces aquí arriba en la parte superior, vamos a tener un var hits, y esto será un entero. Va a comenzar en cero. Y cada vez que golpeamos el éxito. Voy a ir al inicio aquí y decir var hit iguala P herido Box dot Tri Damage. Y luego diremos, golpeo, luego golpea más es igual a uno. Y entonces también podemos decir, I hits es mayor o igual al nivel Max hits, entonces vamos a liberar sobre nuestro proyectil Entonces ahora esto puede liberarse si el temporizador transcurre por su básicamente persistencia en la escena del juego, que necesitamos reemplazar con la variable aquí, también, por cierto O si los hits golpean sus golpes máximos, entonces se liberará inmediatamente, también. Entonces entonces aquí arriba, también queremos decir que cuando creamos el temporizador, vamos a agarrar la propiedad del nivel. Entonces decimos nivel, y no creo que realmente lo hayamos establecido todavía. Entonces necesitamos, como, una duración. Vamos a crear una estadística de duración cuatro nuestra arma. Bien, entonces nivelar la duración del punto. Eso significa que tenemos que saltar al nivel de arma. Busca el símbolo, y vamos a crear la duración aquí abajo en la parte inferior. Vamos a decir en la exportación var duración va a ser un float igual a digamos 5 segundos por defecto. Entonces ese es el número máximo de tiempo que el proyectil puede persistir en el mundo del juego antes de su eliminación, asumiendo que no se elimina por algo más como golpear o exceder el número máximo de golpes Bien, así que sigamos adelante y volvamos a golpear play . Entonces voy a golpear play. Ahí está nuestro proyectil de lanza, vamos a esperar a que aparezcan algunos enemigos vamos a esperar a que aparezcan algunos enemigos. ¿Bien? Entonces tenemos eso. Y se puede ver, lo que es muy importante, tan pronto como un sujeto es golpeado, la lanza se quita sola Entonces ese es un cambio enorme. Y si subimos de nivel al nivel dos, debería seguir siendo lo mismo, pero nuestro daño sube. Y tratemos de ver este proyectil, y desaparecerá después de 5 segundos. Entonces 45. Bien, ahí se puede ver a los proyectiles desapareándose del mundo del juego Eso es muy importante porque de lo contrario, posible que nunca se eliminen, y solo estarían tomando recursos del sistema sin motivo alguno. Entonces sí queremos que esos eliminen automáticamente con el tiempo. Bien, ahora también hay algunas otras propiedades de nuestro nivel de arma, el retraso de generación, el desplazamiento de lapso y los proyectiles Así que tenemos que asegurarnos de que en nuestra arma a D, realidad estamos generando los proyectiles adicionales, los estamos generando en relación con el desplazamiento y cualquier proyectil adicional, tenga un retraso después de que se lance el primero Y luego con el span delay, cualquier proyectil posterior al primero, tiene un retraso antes de que se genere. Bien, así que vayamos a las armas a D. Así que cada vez que lanzamos, necesitamos los proyectiles para engendrar Entonces necesitamos un bucle de cuatro, digamos, cuatro índice en rango cero a nivel de arma. Puntear proyectiles, y luego incrementaremos en uno. Así que solo hacemos un bucle de esto unas cuantas veces. Después de que se lance cada proyectil, vamos a esperar Kit tree Create timer, y necesitamos ese punto de nivel de arma Span Delay Bien. Y luego vamos a esperar el tiempo de espera. Entonces, después del primer bucle, esperamos que se agote el corto lapso de tiempo antes de crear nuestra segunda instancia de proyectil por lanzamiento, y estamos creando proyectiles en función de cuántos proyectiles nos permita el Después, si quisiéramos, también podríamos mezclarlo con, digamos, un bono del jugador. Entonces, si el jugador tiene más uno proyectiles para todas las armas, entonces tenemos una función para sumar esos dos números juntos para obtener el número total de proyectiles Entonces, finalmente, necesitamos generar un desplazamiento aleatorio basado en la distancia de desplazamiento de nuestro nivel de arma. Entonces para nuestro desplazamiento, va a ser igual a un vector dos, y luego vamos a hacer un rango F aleatorio para la X y la Y. Entonces rango F aleatorio, negativo 1.0 a 1.0, y luego rango F aleatorio, negativo 1.0 a 1.0. Y multiplicamos esto por el nivel de arma. Desplazamiento de puntos. Entonces esto nos va a dar un valor aleatorio entre la distancia máxima negativa en el desplazamiento de span, y luego el desplazamiento máximo positivo aquí para la X, y lo mismo para la Y y la Y. positiva Así que esto técnicamente dará una forma cuadrada porque la X y la Y no se afectan entre sí, por lo que puede ser negativo 1.0 tanto en X como en Y o positivo 1.0. Creo que está bien. Sólo estamos tratando de tener un desplazamiento simple. Realmente no importa demasiado si es un cuadrado o círculo a menos que quieras que importe. Entonces voy a bajar aquí al proyectil y vamos a sumar en el offset Bien. Y entonces eso hará que cada vez que engendremos el proyectil, tenga algún offset si tenemos ese set en el arma Entonces si miro el ítem de lanza, bueno, podemos ver que aquí no tenemos ningún desplazamiento de span Entonces tal vez queramos establecer uno. A ver. ¿Cuál sería el desplazamiento máximo de píxeles que me gustaría hacer? A lo mejor como cinco. Y luego solo haremos cinco por todos ellos. Entonces abre cada nivel de arma, y haremos cinco. Entonces esto puede ser positivo o menos cinco o cualquier cosa intermedia tanto para X como para Y. Y entonces voy a correr, y ya veremos como va esto. Así que vigila dónde están desove las lanzas. Y puedes ver que están un poco compensados el uno del otro, ¿verdad? Entonces no está estrictamente en la misma posición cada vez. Y luego también lo hace un poco más interesante para alguna varianza. Bien, ahora, lo que quiero hacer es tomar el arma nivel uno para probar, y vamos a llegar a tres proyectiles, y voy a hacer este bondlay 0.05 segundos, que ya y voy a hacer este bondlay 0.05 segundos, que Así que vamos a jugar y ejecutarlo, y deberíamos conseguir como una cadena de tres proyectiles Uno, dos, tres, uno, dos, tres, uno, dos, tres. Entonces puedes ver aquí uno, dos, tres. Oh, ahora, un pequeño problema aquí, se puede ver que si giro después del lanzamiento del primer proyectil, los otros proyectiles también rotan cuando son instanciados también rotan cuando son Bien, entonces para esto rotar Rads, quiero calcular eso fuera del bucle cuatro Yo sólo quiero hacerlo una vez. Una vez que se lanza el primer proyectil, todos los demás deben quedar bloqueados en esa dirección Así que sigamos adelante y golpeemos Play. Y ahora si me muevo , pero giro, deberías ver que los tres siempre van a ir en la misma dirección, que suele ser lo que tú quieres, creo. Así que vamos a eliminar los proyectiles adicionales para nuestro primero podemos mantener ese desplazamiento de engendro personalizado para todos estos Si quieres, incluso podríamos establecer que un arma predeterminada tendría un desplazamiento de span, pero eso depende de ti si quieres volver atrás y personalizar esos valores predeterminados de nivel de arma Déjame revisar el guión de nivel de arma una vez más y ver si lo hemos manejado todo. Por lo tanto, daño mínimo, daño máximo, velocidad, proyectiles de enfriamiento, golpes máximos, desplazamiento, retraso y duración Sí, estamos usando todas las variables de nuestro nivel de arma, y eso nos da bastante personalización para cualquiera de las armas que queremos crear. 50. P49 Construir un arma de tira giratoria: En este punto, ya que tenemos un sistema de trabajo de subir de nivel, queremos tomarlo y agregarle opciones adicionales. Entonces ahora sería un momento perfecto para agregar una segunda arma a nuestro juego. Por lo que este será similar al primero. Añadiremos una guadaña, y la guadaña podrá girar alrededor de la pantalla lugar de ir directo como Entonces, si abrimos el punto de lanza TSC y las armas, se puede ver que ya tiene la mayoría de los componentes que vamos a necesitar para nuestro Así que solo voy a duplicar de esta escena en la parte inferior derecha haciendo clic derecho sobre la escena y voy a duplicar. Entonces pongamos en Syth aquí punto TSCN. Bien, entonces ahora puedo buscar Syth en el proyecto y abrirla. Vamos a acercar el centro. Algunas de las cosas obvias que queremos cambiar primero, el nombre del proyectil, entonces lo llamaremos Syth Y luego se debe seleccionar el sprite de la textura del atlas para el sprite de guadaña Entonces voy a hacer click aquí, ampliar el at, y usaremos los mismos sprites de madera Entonces, si recuerdo, hay un buen Syth aquí que podemos usar. Entonces seleccionaremos eso y golpearemos cerrar. Ahora puedes ver que el hit box ya no sentido porque tiene esta curva aquí. Entonces queremos hacer clic en nuestra forma de colisión, y voy a parar aquí y luego expandirla hacia la derecha algo así, o incluso podría hacerla más como un cuadrado rectangular, si quiero cubrir todo el borde de la pala. Entonces hagámoslo. Ahora bien, si nos instancia de este proyectil, todavía va a funcionar casi exactamente como la lanza, donde sólo va a ir Entonces, lo que realmente queríamos hacer es rotar alrededor del punto central. Entonces eso va a significar que necesitamos un desplazamiento, y necesitamos rotar ese desplazamiento alrededor en un círculo y eso nos dará nuestra animación de giro. Así que vamos a hacer clic derecho en el sitio. Voy a añadir un nuevo nodo dos D, y luego este nodo dos D será el padre del Sprite y el hit box Así que vamos a mover los de aquí abajo. Y luego voy a renombrar esto para que sea Rotator dos D, y hagamos clic derecho y adjuntemos un guión a él Entonces armas Rotator dos D está bien. Vamos a crear eso vamos a darle el nombre de clase rotador dos D, y luego queremos poner en un par de propiedades aquí Entonces vamos a darle una velocidad para este nodo rotador. Así que recuerda, este rotador es hijo del objeto base. Entonces el objeto base va a tener su propio movimiento, y entonces este sub objeto va a estar controlando la rotación específicamente. Entonces ambos se mueven al mismo tiempo, pero son independientes el uno del otro. Entonces a la velocidad var de exportación, que es un vector dos, y voy a tener este valor predeterminado a diez píxeles a la derecha y cero en el eje Y. Entonces esto va a afectar el movimiento en la pantalla. Pero también queremos que el nodo gire físicamente también, así que parece que nuestro sitio está girando. Así que a la exportación var grados de velocidad de rotación, eso va a ser un flujo, por defecto lo voy a 360, lo que significaría una rotación por segundo en este caso. Y luego solo necesitamos actualizarlo sobre proceso o proceso de física. Haré proceso de física para ser consistente con otro movimiento en el juego. Entonces digamos si nuestra cantidad va a ser igual a grados a resplandor. Entonces vamos a convertir estos grados de velocidad de rotación una cantidad de resplandor. Entonces necesitamos los grados de velocidad de rotación multiplicados por el Delta para obtener la cantidad de rotación desde la última actualización del fotograma, y luego vamos a rotar por esa cantidad en luminosidad Entonces incluso podemos llamar a esta cantidad RDs si queremos tener claro que eso es una cantidad de resplandor y lo haré un flotador también, solo para darle la mayor claridad posible Bien, entonces necesitamos mover físicamente el nodo, y eso va a estar basado en nuestra velocidad aquí arriba. Entonces voy a decir que nuestra jugada va a ser igual a la velocidad multiplicada por Delta. Y luego llamamos a traducir en movimiento cantidad, y ese es esencialmente nuestro guión rotador Entonces, si necesitas personalizar algún valor, tienes aquí al inspector para asignarlos. Entonces ahora queremos crear un arma dos D que pueda instancia de nuestras miras. Entonces busquemos el arma de lanza si incluso la guardamos para el proyecto Entonces ahora busquemos el arma de lanza. Vamos a abrir eso. Vamos a echar un vistazo aquí. Entonces este es el nodo dos D con un reproductor AudioStream que reproduce el sonido de slash cuando instancia un arma Entonces quiero duplicar esto y luego crear una definición de Syth para nuestra arma Entonces, dupliquemos la escena del arma de lanza como arma Syth. Entonces busquemos de nuevo a Syth. Haga doble clic en Abrir Syth, renombrar arma de lanza a arma Syth Y luego a la derecha, necesitamos crear una nueva definición. Entonces voy a acercarme aquí, nueva definición de arma, y esta va a ser Syth Nuestro icono, solo podemos copiar del proyectil Syth real Entonces voy a ir a la escena de Syth y luego vamos a hacer clic en el sprite y dar clic derecho sobre la textura, copiarla, ir al arma guadaña, y luego pegarlo en el icono con clic derecho Pegar Bien, ahora necesitamos definir algunos niveles de armas aquí. Así que vamos a crear nuestro set. Empezaremos con el nivel de arma uno, nuevo nivel de arma. Entonces, ¿cómo queremos que funcione nuestra guadaña? A lo mejor la guadaña se mueve más lento que un proyectil normal. A lo mejor es enfriarse es más largo, así que podríamos decir como 1.5. Antes de que Max golpee, lo pondré a las cinco, para que la guadaña pueda golpear a muchos objetivos antes de que se Por daños, también vamos a golpearlo a 20 a 30. Y proyectiles uno. Bien, entonces agreguemos ese par de valores clave, y luego haremos el nivel dos con un nuevo nivel de arma. Expande el nivel de arma uno para que pueda comparar. Y luego haré, digamos, de 30 a 40 daños, velocidad de 55, enfriamiento de 1.4. Max hits de seis, y voy a añadir ese par de valor clave. Hagamos el nivel tres, así sucesivamente y así sucesivamente, quiera hacer los números. Bien, así que aquí están los números con los que fui en el nivel de arma tres. Puedes hacer una pausa si quieres copiar. Aquí tenemos arma nivel cuatro, arma nivel cinco. Y arma nivel seis. Y creo que eso debería ser suficiente por ahora mismo. Bien, así que si recuerdo, no he establecido en la definición de arma la capacidad todavía no he establecido en la definición de arma la capacidad de elegir tu escena repleta. Entonces en definición de arma, quiero agregar un G visto opciones. Entonces, por ahora, lo haremos por defecto a una variable de exportación. Entonces voy a decir exportar escena de realidad virtual, y esta será una escena repleta. Bien, y luego en vez de que Getsn cargue la lanza, queremos regresar escena Entonces, debido a que estamos usando un método get seen, tenemos la capacidad más tarde de entrar y cambiar si hay algunas escenas adicionales que queremos considerar pasar en lugar de la base predeterminada. Pero esto debería ser bueno por ahora, pero en realidad no necesitamos una segunda escena por el momento. Bien, entonces ahora solo tenemos que asegurarnos de que en la definición de guadaña, carguadaña rápidamente Y luego en la definición de lanza, así que busca la definición de lanza. Haz doble clic en eso. Y luego necesitamos cargar rápidamente la escena de la lanza. Bien, y ahí debería estar bien. Creo que lo último que necesitamos para nuestro Syth es el artículo Syth Ahora queremos encontrar el elemento Spear en nuestro proyecto, duplicar eso y crear un punto de elemento Syth TRS Así que busca el artículo Syth. Y ese ítem de Syth vamos a asignarle, por supuesto, la definición de guadaña Ahora, para que nuestros Sitios se agreguen como arma a nuestro jugador, vamos a necesitar una referencia al arma dos D. Que podamos agregar a la carga de nuestro jugador porque eso no existe ya en el jugador, por lo que hay que agregarlo Bien, entonces para agregar nuestra referencia a la escena del arma, en realidad no podemos usar la escena del pacto porque si hacemos eso, va a tener una referencia cíclica porque el arma TD ya hace referencia porque el arma TD a este recurso de definición de arma Entonces en este caso, para sortear eso, necesitamos hacer un archivo de exportación, y esto será en comillas, punto estrella TsCN, que significa que podemos filtrarlo por cualquier cosa que tenga la extensión punto TSCN al Y vamos a decir var arma dos D camino, y esto será una cuerda. Este es el camino hacia la escena del arma para agregar dos cargas de armas como el jugador Bien, entonces ahora, si miramos nuestra definición de lanza, podemos asignar al arma dos caminos D, que va a estar en armas, y entonces tenemos arma lanza aquí, Entonces eso es lo que necesitamos. Y entonces tenemos que hacer lo mismo con guadaña Entonces busca guadaña. Y parece que lo llamé arma guadaña, pero eso se suponía que era la definición del sitio aquí abajo. El TRES es la definición. La escena es el arma del sitio. Bien, entonces haz doble clic en la definición del sitio y luego asígnale la ruta. Así que en realidad puedes simplemente arrastrar y soltar de aquí a allá, y eso lo asignará. Entonces en objeto de arma ahora, si la carga no tiene ya el arma, entonces necesitamos agregar realmente la nueva arma en el nivel de arma uno a la carga En lugar de devolver falso aquí y tri apply, en realidad vamos a crear la nueva arma. Entonces podemos decir que el arma va a ser igual a. Veamos nuestra definición arma dos ruta D, queremos instanciar Entonces vamos a decir carga en la ruta, y luego instanciamos Y esa va a ser nuestra arma. Entonces tenemos que agregar eso a la carga. Entonces carga Agrega arma y vamos a agregar el arma. Si eso funciona, queremos devolver la verdad. Entonces, si tenemos nuestro artículo ahora podemos agregarlo a la lista de posibles artículos para que nuestra IU de recompensa genere. Entonces, si hago clic en la escena de selección de subir de nivel y vamos al primer nodo aquí por encima de la derecha, tenemos nuestras opciones de nivelación de nivel uno, y ya agregamos en el ítem Spira Así que agreguemos en el elemento del sitio. Tan rápido carga nuestro artículo del sitio, dale un peso de uno, agrégalo. Bien. Y luego vamos a darle a Play y veamos qué pasa cuando vamos por aquí. Entonces puedes ver que dice artículo sin nombre, y realmente no vemos ningún detalle Si le pego a elegir, en realidad no es lanzar el nuevo proyectil Así que todavía tenemos algo de trabajo por hacer para eso, personalizando los artículos y asegurándonos de que se carguen correctamente, y nos encargaremos de eso en la siguiente parte 51. P50: crea una interfaz de usuario para mostrar armas y el inventario del juego: Proyecto que realmente necesita ahora es la capacidad de ver qué armas hemos equipado en la parte superior izquierda con el indicador UI. Y cuando subimos de nivel para mejorar la primera arma o elegir una nueva arma, y conozco estos nombres y descripciones aquí también. Eso también va a aparecer aquí para que podamos asociar lo que deberíamos estar viendo y lo que realmente estamos viendo. Entonces eso nos ayudará con la depuración, pero también es muy útil para el jugador también Así que vamos a seguir adelante y crear una nueva escena de interfaz de usuario, así que voy a hacer clic en Más aquí arriba. Entonces quiero que se nombre este nodo de control para, digamos, exhibición de armas y también voy a hacer clic derecho y cambiar su tipo a un contenedor de panel. Bien, eso nos dará un trasfondo por defecto. Entonces dentro de aquí, voy a querer un contenedor de margen y luego seguirlo con contenedor HBox para organización Entonces haga clic derecho en Agregar un contenedor de margen, y luego haga clic derecho en Agregar un contenedor HBox Bien, y luego aquí vamos a diseñar básicamente un icono con un indicador de nivel para cada una de nuestras armas de izquierda a derecha. Tomemos la exhibición de armas y encojamos para que quede mucho más así. Y luego lo voy a guardar nuestro proyecto en la carpeta UI, así en la carpeta UI las armas se muestran. Y vamos a poner una copia en nuestra jugabilidad UI Canvas para que podamos ver cómo va a quedar eso más o menos. Entonces busca arma, y luego vamos a agarrar exhibición de armas y colocarla debajo de la interfaz de usuario. Y podemos ver que ahí es bastante grande. Así que puedes hacer clic aquí y saltar a la pantalla de armas, y vamos a encogerlo a tal vez más como el centro de la pantalla. Anote el cuadro azul que indica nuestro tamaño completo de interfaz de usuario. Entonces esto va a necesitar ser un poco más pequeño, de verdad. Y probablemente también quiero compensar desde el centro. Hagamos el centro de diseño por defecto, también. Ahora podemos volver a la jugabilidad UI Canvas. Ahí podemos ver nuestras armas exhibidas. En realidad no está apareciendo como esperábamos. Entonces en exhibición de armas, voy a tomar los anclajes preestablecidos, y vamos con el centro por defecto o el centro superior, más bien. Así que centro superior. Y podemos ver el problema por qué se redujo a Así que voy a tomar el tamaño mínimo personalizado aquí arriba y vamos a establecer un valor por defecto. Voy a decir 200 para la X y luego 50 para la Y. Eso solo será para que podamos verlo y ajustarlo en nuestra interfaz de usuario de juego. Así que voy a repasar a la jugabilidad UI Canvas, y ahora podemos posicionarlo donde lo necesitemos. Entonces voy a posicionarlo, digamos, aquí a la derecha de nuestro bar principal de salud y barra EXB, y lo voy a arrastrar así Bien. Y entonces podremos tener algunos íconos mostrando para nuestros niveles de armas. Entonces, para saber de eso, vamos a querer usar nuestro contexto de jugador para que podamos mostrar qué armas tiene el jugador. Entonces en exhibición de armas, agreguemos un guión islas armas pantalla punto GD Y entonces vamos a querer exportar var el contexto, que es el contexto del reproductor aquí, y podemos asignarlo en el inspector. Tan rápido carga el contexto del jugador. Y luego listo, vamos a querer usar eso para obtener referencia a nuestra carga de armas. Así que la función subrayado listo, va a devolver void, y luego vamos a decir contexto punto jugador punto ¿Tenemos una referencia a la carga? Nosotros no. Entonces, si no queremos que esa otra propiedad incorporada del jugador y que eso se haga referencia directamente en el guión del jugador se ajuste para esto, podríamos decir encontrar hijos, y el patrón va a ser citas vacías. El tipo va a ser la carga de armas. Entonces esto nos va a dar una matriz. Tomaremos el primer resultado de esto haciendo corchetes en un cero, así que eso significa índice de matriz de cero. Y vamos a asignar eso a una carga. Entonces nuestra carga de subrayado va a ser una carga de armas de carga de armas. Y vamos a decir que la carga de subrayado es igual al resultado de eso y sí queremos afirmar que eso no es nulo Así aseverar subrayado loadout no es igual a null. Debe tener una carga sobre el jugador para mostrar para exhibición de armas, nombre porcentual al final para que podamos obtener el nombre de este nodo Y entonces queremos que las armas de nombre de clase se muestren aquí arriba en la parte superior. Esto mostrará las armas y los niveles para el personaje de contexto. Entonces hagamos otro en Export var. Esto será para la UIC. Vamos a instancia para cada una de las armas de nuestra carga. Así que hazlo en Export var. Digamos exhibición de armas, que será de tipo exhibición de armas, pero aún no lo hemos creado. Y para indicar que esta pantalla también hace más que simplemente mostrar los datos, sino que también engancha todo. De hecho voy a cambiar el nombre de esto para ver. Eso ayudará también a diferenciar de la exhibición de armas, el contenedor sub UI. Y luego voy a renombrar tanto la exhibición de armas. Y luego voy a renombrar tanto el despliegue de armas punto GD el TSCN Entonces esto será ahora Weapons View y aquí arriba, armas view dot TSCN Bien. También salta a la escena de vista y renombra el nodo raíz, también. Eso es bastante importante. Entonces las armas ven ahí. Ahora necesitamos crear nuestra exhibición de armas individual para que pueda entrar dentro de la vista de armas. Así que agreguemos una nueva interfaz de usuario a nuestro juego. Esta será una interfaz de usuario al inicio. Y estoy pensando que la raíz aquí, también podemos querer que sea un contenedor de panel. Siempre se puede hacer un panel vacío, pero tener la capacidad de tener el fondo es algo de ayuda. Entonces cambiemos esto a un contenedor de panel. Voy a cambiar el nombre de la raíz para que sea exhibición de armas. Hagamos clic derecho sobre él, agreguemos un contenedor de margen de nodo hijo, si acaso lo necesitamos y luego haga clic derecho en Agregar un wect de textura para mostrar nuestro icono Haremos clic derecho para agregar una etiqueta. Y en realidad estoy pensando que no necesito un contenedor VBox o HBox para esto porque en realidad puede que quiera que la etiqueta escriba sobre la textura Para muchos juegos que tendrían una textura y luego texto al mismo tiempo, realidad escribiría el texto sobre el icono de textura. Se vería que mucho en los sistemas de inventario por el número de artículos en el inventario. Excepto en este caso, estamos hablando del nivel del arma que está equipada para el jugador. Entonces, como texto de prueba, podríamos decir el nivel X aquí. Por supuesto, podemos ver que la pantalla está ocupando ahora la pantalla completa. Así que vamos a reducir eso. Voy a ir a la exhibición de armas base, y tomaremos el diseño a los anclajes preestablecidos arriba a la izquierda Bien, eso debería reducirlo dramáticamente. Entonces ahora podemos ver que sólo está mostrando el texto. Vamos a establecer una textura en esta textura rect. Entonces haré una nueva textura de atlas, y luego cargaremos rápidamente un atlas. Busquemos tal vez el 16 por 16. Hoja de sprites en nuestro juego para todos los iconos, y luego queremos editar región y seleccionar uno Entonces algo que parece un arma. Aquí tenemos una espada que funciona bien, y podemos cerrar. Bien, podemos ver que el icono de la espada está ahí, pero no está respetando la relación de aspecto, así que queremos ir al modo stretch y cambiar esto para mantener centrado el aspecto, creo. Bien, ahí tenemos eso. Y ahora queremos llevar nuestro contenedor principal de exhibición de armas, y queremos que también sea de un tamaño específico. Entonces voy a decir talla mínima personalizada 48 por 48. Eso nos va a dar una plaza aquí. Y voy a querer tomar el texto de la etiqueta, y queremos que esté centrado en la parte inferior. Así que la alineación vertical a abajo por aquí en el verá que en realidad no cambia nada porque necesitamos expandir el tamaño de la etiqueta para que el texto se centre en la parte inferior. Así que ve a maquetación ahora, y vamos a querer que se llene el dimensionamiento del contenedor, creo. Sí. Bien, ahí. Entonces ahora va a mostrar el nivel X ahí en la parte inferior derecha. Y ahora parece que queremos un poco de búfer entre nuestra textura rect y nuestra etiqueta Por ahora, guardemos esto nuestra carpeta UI, nuestra pantalla de armas. Y creo que lo que queremos es un contenedor de segundo margen. Entonces voy a dar click en el primer contenedor de margen, agregar en otro contenedor de margen, y este va a ser el padre del texturect Entonces, volvamos a posicionar eso en la parte superior para que el texto se muestre por encima. Ahora, con este contenedor de margen, vaya a las anulaciones de tema, y queremos que el margen inferior sea algo así como diez píxeles De esa manera, el texto no va a mostrar ya sabes, sobre los pedacitos importantes de nuestro icono. Quizá hasta lo necesitemos más que eso. Entonces probemos 12. A lo mejor incluso lo necesitamos más que eso, en realidad. Para que podamos ver cómo va a quedar más correctamente, vamos a aplicar nuestro tema de juego a la exhibición de armas. Así que haz clic en la pantalla de armas, encuentra el tema y luego carga rápidamente nuestro tema actual. Bien, entonces ahora eso es mucho más pequeño y está en la esquina inferior izquierda. Creo que lo quiero en la parte inferior derecha. Entonces haga clic en la etiqueta, y tomemos la alineación horizontal a la derecha. ¿Bien? Eso se ve bastante bien, pero está un poco demasiado cerca del borde. Entonces quiero tomar el contenedor de margen padre. Ese es el que está justo debajo de la exhibición de armas, y quiero establecer algunos márgenes. Entonces vamos a las anulaciones de temas y tal vez dos píxeles en cada uno de estos Bien, eso se ve bien. Excepto tal vez el margen inferior. A lo mejor no necesitamos eso. Sí. Bien. Eso me gusta más. Bien, ahora, nuestra exhibición de armas va a necesitar una referencia al arma dos nodo D. Y luego siempre que el arma dos nodos D suba de nivel, cambiamos el texto aquí para mostrar el nuevo nivel. Entonces agreguemos un guión a la exhibición de armas. Esto sólo va a ir en pantalla Uilashwapon punto GD. Bien. Y esta será la exhibición de armas con nombre de clase. Y necesitamos una referencia al arma dos D. Yo podría simplemente exportarla por ahora mismo. Entonces esta será una arma var de tipo arma dos D. Diré valor establecido, y esta será arma igual valor. Siempre que pongamos el arma, creo que simplemente llamaré a una función de actualización, y la pondremos aquí. Así función refrescar. Entonces, para poner el texto en la etiqueta y el icono, necesitamos obtener una referencia de exportación a cada uno de esos. Así que en Exportación var textura, texto directo de tipo textura Rc. Y entonces necesitamos en Export var label, que es de tipo label. Y cuando nos refresquemos, queremos decir texrec dot texture va a ser igual a arma dot definition dot icon. Sí, eso funciona Y luego diremos que el texto del punto de etiqueta es igual al punto de arma, si tenemos un nombre aquí, nombre de arma. No, queremos el nombre de definición porque el nombre en el arma es en realidad el nombre del nodo que no tendrá espacios ni nada por el estilo, así que es mejor obtener el nombre del recurso porque esa es una propiedad personalizada que establecemos. Y entonces queremos decir más es igual al espacio más una cadena del nivel de punto del arma. ¿Bien? Entonces eso básicamente mostrará el nombre de las armas y luego a qué nivel se encuentra actualmente. Y por si acaso la definición de arma no tenga un icono, hagamos un método get icon. cual funcionará como lo hicimos con uno de los otros scripts anteriores, que simplemente devolverá null si esa propiedad pasa que no se establece. Así que vamos a hacer clic derecho sobre la definición. Entraremos en eso, clic derecho definición de arma. Vamos a entrar en eso. Y luego vamos a crear nuestra función G icon, que devolverá una textura dos D. Así que si icon no es igual a null, entonces volveremos icon. De lo contrario, devolvemos null, y esto debería evitar que obtengas errores si el icono pasa a ser nulo aquí. Bien, y probablemente también queremos probar refrescar en R así que la función subrayado listo, voy a tratar de hacer una actualización Eso también nos ayudará a confirmar que si no hay arma dos D set, funcionará bien y solo se mostrará en blanco. La idea aquí es que cada vez que configuremos la vista de armas, se va a poblar con exhibiciones de armas Ponemos el arma, y eso se va a refrescar de inmediato. Entonces vamos a la vista Armas. Y dentro de aquí, bueno, ya ves que estaba exportando una exhibición de armas, pero en realidad, lo que quiero hacer es exportar la escena. Entonces esta será una escena repleta que podemos instancia. Y luego cargamos rápidamente a la derecha nuestra pantalla para el arma, así que exhibición de armas. Entonces listo, una vez que tengamos la carga, quiero poblar esto con todas las exhibiciones de armas para cada una de las armas que realmente están en nuestra carga de armas Entonces hice algo similar con el nivel de selección donde solo lo borro y lo restablecí cada vez, generando nuevas escenas para cada una de las sub UI que necesitan ser creadas. Pero aquí, en realidad voy a tratar de reutilizarlo para que ustedes puedan ver ambos enfoques. Esto sería técnicamente el mejor uso de tus nodos al no tener que eliminarlos y recrearlos cada vez Entonces creo que eso va a ser útil saberlo después del curso. Entonces, una de las formas en que podemos acceder fácilmente a todas nuestras exhibiciones de armas activas va a ser tener una variedad de ellas. Así que voy a decir var subrayado muestra, y esto es una matriz Voy a acercar la exhibición de armas. Creemos también nuestra función de actualización. Entonces nuestra función refresh va a devolver void. Y para cada una de las armas en nuestra carga de armas, vamos a crear una pantalla si es necesario crear una De lo contrario, si ya existe en esta matriz de exhibición de armas, entonces la voy a reutilizar simplemente refrescando las propiedades en ella con la nueva arma colocando el arma en el arma para. Bien, entonces para nuestra función de actualización, queremos recorrer todas las armas, y lo haremos usando las posiciones de índice para que podamos hacer coincidir los índice para que podamos hacer coincidir índices de carga de armas con nuestros índices de visualización de armas Entonces, para IN rango cero para subrayar el tamaño de punto de las armas de carga, incrementando Entonces primero vamos a conseguir el arma. Entonces nuestra arma va a ser una arma tipo dos. Igual a subrayar armas de carga en esa posición de índice, y necesitamos obtener o crear la pantalla Entonces voy a decir var display es una exhibición de arma, y vamos a establecer eso igual para obtener o crear display en una posición de índice de I. Y luego en nuestra pantalla, una vez que hayamos adquirido eso, diré que el arma de exhibición va a ser igual al arma misma. Y debido a que la actualización es parte del setter y ese script, se actualizará de inmediato automáticamente Ahora, sí hablé un poco sobre los efectos secundarios y si haces el setter así, no necesariamente está 100% claro que configurar el arma va a refrescar automáticamente la interfaz Pero debido a que eso es tan integral para la exhibición de armas, creo que está bien que aquí mismo solo diga, Oh, colocamos el arma. Por supuesto, el arma va a mostrar el arma actual. Pero como la exhibición de armas es literalmente lo que hace, establecer el arma e insinuar que eso refrescaría qué arma va a mostrar en la interfaz No creo que haya mucho problema con eso como efecto secundario. Pero definitivamente es discutible. Entonces ahora solo necesitamos obtener o crear la pantalla. Así función, get o create display con parámetro index, y eso va a ser un entero, y vamos a devolver una visualización de arma. Entonces digamos var display of type weapon display va a ser igual a displays dot Get at index. Bien, entonces eso podría ser nulo. Entonces, si display no es igual a null, solo devolvemos la pantalla. De lo contrario, necesitamos crear uno aquí mismo y agregarlo al modo que la visualización va a ser igual a la instancia de la escena de visualización del arma Y escribí ese nombre mal. Entonces aquí mismo, Control C, Control V. Y luego queremos agregarlo como hijo a esta UI o más bien va a ir en el contenedor HBox. Entonces, aguanta. Necesito una referencia al contenedor. Así que exporta el contenedor de exhibición V, y ese será cualquier tipo de contenedor. Solo necesitamos exportar eso en la interfaz de usuario. Después tomaremos el contenedor de visualización y agregaremos el display como hijo de eso. Decimos muestra punto apen vi nueva pantalla. Y luego, por último, queremos devolver la pantalla, girar la pantalla. Entonces debería crearse aquí si no existía ya aquí. Así que eso manejará la creación de las nuevas pantallas. Ahora bien, ¿y si quitamos un arma? Luego, después de recorrer las armas y tener todas las pantallas configuradas, queremos verificar si la matriz de armas es realmente más pequeña que nuestra matriz de pantallas y luego eliminar las pantallas adicionales. Entonces digamos que quitamos un arma del juego, y queremos que nuestra pantalla aquí se actualice. Bueno, eso va a ser una referencia nula en la pantalla ahora. Así que podemos decir para visualización y visualización muestro punto arma es nulo, entonces sólo podemos liberar la pantalla. Así que muestra el punto Q gratis, y aguanta aquí. Necesito tener ese subrayado ahí porque esa es una variable privada Así que tenemos nuestro display punto Q gratis. Entonces tenemos nuestro punto de visualización Q gratis, y queremos cambiar el tamaño de eso a nuestro loadout SI. Entonces, vamos a conseguir eso como una variable local del tamaño de nuestras armas. Ahora podemos reutilizar el tamaño de las armas aquí y aquí abajo también. Bien, entonces para volver a recorrer esta función, actualiza y crea pantallas según sea necesario para mostrar todas las armas, elimina cualquier pantalla que tenga armas nulas y redimensiona la matriz de pantallas Entonces obtenemos el número de armas. Para cada una de esas armas, asignamos el arma a su posición de visualización correspondiente. Entonces después de hacer eso, volvemos a mirar todas las pantallas, y técnicamente, podríamos recorrer desde el alcance del arma hasta el final del mismo, pero un poco por encima de la optimización por no mucha ganancia porque aquí solo estamos mostrando como seis elementos. Pero si el arma de visualización es nula, pero aquí si el arma de visualización es nula, lo que podría ser si quitamos un arma, entonces vamos a hacer cola libre en la pantalla y cambiar el tamaño del conjunto de pantallas para que este tamaño vaya a coincidir con las armas En nuestro G o create display, si el display existe en el mismo índice, solo devolverá eso y lo usamos. De lo contrario, creará una nueva copia de la escena, y luego la aplicaremos debajo del contenedor HBox Bien, ahora en el inspector, tenemos que asignar ese contenedor HBox Podríamos cambiarle el nombre para que sea Contenedor de Pantallas si eso ayuda. Así muestra contenedor, manteniendo la nomenclatura consistente. Y ya tenemos las exhibiciones de armas aquí. Entonces esto funcionará en Bien, así que vamos a ejecutarlo y ver si está trabajando en correr ahora mismo. Entonces corremos y no pudimos encontrar la carga de armas porque creo que podría llamarse carga de armas Así se puede ver Fine children es un poco frágil así. Entonces ahí tenemos carga de armas. Entonces intentemos encontrar la carga de armas con la S, y luego la volveremos a ejecutar Bien, entonces llegamos a donde tenemos textre punto textura es igual arma punto definición punto icono Bien, entonces nos pegamos a otro tema. No he puesto el textrect en la etiqueta en la exhibición de armas Entonces entremos en exhibición de armas y rectificemos eso. La parte superior derecha, cuando estés en el arma desplazándote, asigna la textura wrectt doble clic, y luego asigna la etiqueta Bien, y lo ejecutaremos una vez más. A ver si eso resuelve los problemas. Bien, entonces aquí, cuando no hay arma, va a causar un problema. Entonces tal vez realmente queremos que ponga un arma antes de que la refresquemos. Entonces como la actualización ocurre aquí cuando colocamos el arma, voy a quitar la actualización lista. Realmente no es necesario, y en realidad solo causa más dolor de cabeza aquí del que necesitamos. Entonces voy a golpear play. Y bien, ahí vamos. Spear uno allá arriba en la parte superior izquierda Voy a ir por aquí y seleccionaremos el nuevo artículo. Ahora bien, esto no va a funcionar porque no hemos configurado señales. Bien, entonces un error que cometí, cuando llamas a Git en un índice que no existe en una matriz, te va a dar errores fuera de límite. Entonces, lo que realmente deberíamos estar haciendo es asegurarnos de que el índice esté en la matriz. Entonces diremos si displays digamos que el tamaño es mayor que el índice, entonces vamos a devolver este bit aquí, muestra punto Git Index. Claro. Entonces podemos quitar la declaración variable var display weapon display here to when we instanciate the display scene, y eliminaremos esta línea en la parte superior 52. P51: conexión de señales y configuración de la interfaz de usuario de armas para la visualización dinámica: Bien, entonces tenemos algunas señales más para conectar en nuestra vista de armas y visualización de armas para que cuando estemos en el juego, muestre correctamente la configuración de armas correcta después de actualizar la interfaz de usuario. Entonces una muy importante aquí va a ser cuando nuestra carga agregue un arma llamando al método add weapon que vamos a conectar a sus armas cambiaron señal, que no creo que haya creado todavía. Entonces saltemos a las armas loadou. Voy a hacer click derecho aquí, abre el símbolo. Ahora estamos en el guión punto GD de carga de armas. Entonces tenemos el método add weapon, y queremos admitir una señal aquí que nuestra opinión pueda responder a eso. Entonces en la parte superior, vamos a crear nuestro cambio de armas de señal. Si queremos, podemos pasar la serie de armas a la señal. Entonces armas, que es una serie de armas dos D. Y ahora solo tenemos que admitirlo aquí abajo en la parte inferior cuando llamamos agregar arma. Las armas cambiaron punto emiten, y pasamos en las armas. ¿Bien? Ahora de nuevo en nuestro guión de vista, nos suscribimos a así sucesivamente listo, después de obtener la carga, queremos hacer subrayado armas de carga cambiaron Y vamos a decir sobre las armas cambiadas. Haremos ese método aquí abajo en la parte inferior. Entonces la función en las armas cambió. El parámetro son las armas P, que es una matriz de armas dos D, vamos a regresar nulo. Ahora, vamos a llamar a refrescar aquí. Eso es todo lo que tenemos que hacer porque refrescar ya maneja verificar la carga del arma y qué armas tenemos, cuál es el tamaño de la misma Así que en realidad no vamos a usar directamente estas armas P aquí, así que voy a subrayarlo para que no recibamos una advertencia Y ahora antes de golpear play, quiero asegurarme de que nuestros artículos estén realmente definidos correctamente. Entonces en el sistema de archivos inferior derecho, voy a buscar ítem. Tenemos el artículo Syth Entonces veamos si vamos a la parte superior en este momento, este es un artículo sin nombre sin descripción, y también necesita un icono Además, parece que me equivoco también, parece que tengo la definición de ítem equivocada. Eso tiene mucho sentido ahora, por qué no apareció el arma guadaña Entonces vamos a cargar rápidamente aquí la definición de guadaña. Bien, entonces eso está configurado correctamente, pero tenemos que establecer nuestro nombre para mostrar. Guadaña. Entonces para la descripción, voy a poner un proyectil que gira alrededor de la pantalla y puede golpear a muchos enemigos Esa es básicamente su principal diferencia sobre la lanza. Y para el ícono, bueno, saltemos a la definición de guadaña Haré clic derecho sobre el icono aquí y lo copiaré y luego cerraré eso y lo pegaré en el ícono aquí. Bien, ahora tenemos que hacer algo similar en el artículo de lanza. Así que lanza de doble clic Después iremos a la parte superior derecha. El nombre para mostrar será lanza. Entonces la descripción puede ser un proyectil básico que vaya hacia adelante desde la dirección que el personaje, supongo, diré, está mirando Y luego el icono, simplemente copiamos eso de la definición sobre el icono del ítem. Así como así. Y eso básicamente debería manejar mucho de eso. Así que vamos a jugar. Creo que lo único ahora es que no nos hemos conectado a una señal de subir de nivel, pero bien, podemos ver la lanza uno en la parte superior izquierda Vamos a agarrar nuestra guadaña. Entonces la guadaña ya está ahí arriba, y nuestro proyectil guadaña también está lanzando Podemos ver que está rotando. A lo mejor es la velocidad de movimiento no es realmente suficiente porque queremos que realmente dé vueltas en círculo alrededor del jugador. Pero asegurémonos de que pueda golpear. Sí. Bien, así que sí parece estar golpeando a los enemigos. Muy rápido, en las elecciones generadas, hay un aviso sobre el sombreado seleccionado y la señal ya declarada Entonces eso no es genial. Va a tomar la matriz seleccionada y generar opciones. Esto está en el guión de vista de armas. Esto está en el contenedor de la caja de Recompensas aquí. Voy a tomar esto y vamos controlar R. Voy a cambiarle el nombre a elementos seleccionados. Voy a golpear reemplazar no reemplazar todos porque recuerden, no queremos meternos con los nombres de las señales aquí arriba. Así que reemplace dentro de esta función solamente, y queremos bajar hasta aquí. También debería hacer coincidir mayúsculas y minúsculas y palabras enteras que ayudarán a reducir el número de cosas adicionales que se seleccionan. Así que los datapen seleccionados son ahora elementos seleccionados datapen y luego devolvemos Bien. Entonces eso debería manejar esa advertencia. Bien, entonces la escena de nuestro sitio no estaba rotando exactamente de la manera que hubiéramos esperado. Entonces un problema con los guiones de proyectiles es que si trato de decir, ejecuta esta escena sin lanzarla desde un arma dos D primero, que vamos a conseguir este tema donde va a golpear esa afirmación en listo Entonces, lo que podríamos hacer en lugar de eso con fines de prueba, en su mayoría, es tener una dirección predeterminada. Entonces voy a decir que la dirección va a ser igual al vector de dos puntos a la derecha. Entonces solo tiene ese valor por defecto ahí. Vamos a quitar la aseveración. Y así también voy a exportar var el nivel para que tengamos la opción de establecer un nivel de arma en el inspector. No debería ser requerido para nosotros porque mayoría vamos a estar lanzando a través del método de lanzamiento, ¿verdad? Así es como montamos el proyectil. Pero por si acaso queremos probarlo en el editor, podría configurar un nivel de prueba por aquí y el derecho para que podamos definir una velocidad de arma predeterminada. Así que vamos a golpear Play. Bien, entonces ahora con esa configuración, debería poder ejecutar este script, y podemos ver cómo se va a mover por defecto, lo cual es bastante útil para nosotros ahí arriba en la parte superior. Incluso podría crear una escena de prueba donde tengamos una cámara mirando al centro de nuestra así que eso nos ayudará aún más para nuestro propósito de depuración visual, así que no necesitamos ejecutar el juego completo y tenemos que subir de nivel cada vez que queramos probar el elemento guadaña Así que vamos a crear nuestra escena de prueba. Entonces esta va a ser una nueva escena de dos D, y la guardaré en la raíz. Entonces llamémoslo armas de prueba punto TsCN. Guarde eso, y voy a caer en el arma de guadaña. Entonces arma guadaña punto TSN. Simplemente ponemos eso en la raíz ahí. Voy a cambiar el nombre del nodo raíz. Entonces probemos armas, y luego hagamos clic derecho y agreguemos una cámara a D. Así que esto tendrá un Zoom de tres. Creo que es bueno. E intentemos ejecutar la escena haciendo clic en el botón reproducir escena actual. Bien, entonces la razón por la que no vemos nada aquí es en realidad porque no se supone que pongamos aquí el arma guadaña Se supone que debemos poner el proyectil Syth. Entonces mi error. Entonces busquemos forsythe punto Tscn suelta eso en la raíz. Ahora bien, si nos acercamos, deberíamos poder ver eso. Bien, eso es bueno. Y vamos a darle al botón de correr escena actual. Así que ahora podemos ver cómo va a quedar cuando nuestra guadaña dispara a la derecha, y eso hará que sea mucho más fácil y rápido para nosotros depurar esa Así que ahora con nuestra configuración de escena de prueba, podemos ver cómo nuestras armas giran y se mueven en la pantalla, pero eso no es exactamente lo que estamos buscando. Entonces, lo que realmente necesitamos cambiar aquí es volver a la escena de la guadaña, este nodo rotador, si queremos que el arma o el sprite roten alrededor de un punto central, entonces realmente necesitamos mover este desplazamiento de rotador hacia la derecha mientras mantenemos nuestro sprite y caja de golpes en la mientras mantenemos nuestro sprite y caja de golpes Entonces voy a mover temporalmente estos dos fuera del rotador dos D que no se vayan a mover con él, y luego voy a mover el rotador dos D hacia la derecha así Bien, así que eso nos dará un desplazamiento para que todo a su alrededor pueda girar alrededor de ese punto lugar de simplemente rotar por aquí en un círculo. Entonces, vamos a traer esto justo en el hit box de vuelta al rotador dos D. Bien, bien. Y tal vez queramos decir que la velocidad X sube a 25. Corremos la escena y veamos si eso nos da lo que estamos buscando. Entonces, sí, pero eso es un poco demasiado rápido, en realidad. Entonces tal vez solo bajamos eso nuevo al valor por defecto de diez y lo volvemos a ejecutar. Entonces es la rotación la que en realidad está haciendo eso. Entonces, o necesitamos una rotación más lenta o quizás necesitamos que esto esté más lejos a la derecha. No estoy seguro de cuál. Esto es una especie de adivina comprobando por mí aquí. Entonces solo si te sucede que mueves el rotador con este sprite y caja de cadera debajo de él, solo asegúrate de moverlos de regreso al punto central 00 Y luego corramos la escena de prueba y veamos. Supongo que solo 360 grados es demasiado rápido. Bien, entonces voy a volver a la escena sth y bajaremos los grados de rotación. Cortemos eso a la mitad, tal vez 180. Y luego ejecutemos nuestra escena de prueba. Bien, eso probablemente se parece mucho más a lo que queremos, pero ahora también he hecho demasiado lejos la distancia del rotador Bien, entonces voy a sacar el sprite dos D y sacar la caja de cadera, y volvamos a mover el rotador en bastantes Mueva el sprite y la caja de cadera hacia atrás debajo del rotador. Y vamos a probarlo en la escena de las armas de prueba. Bien, así que vamos a correr eso. Uh, casi. Pero a lo mejor la velocidad del proyectil sigue siendo demasiado rápida. No lo sé. Tenemos que probarlo en el juego. Así que vamos a golpear play, y esto en realidad va a ejecutar el juego principal porque esa es la escena principal. Entonces vamos a agarrar la lanza el proyectil guadaña. Y ahí está cómo se ve nuestra arma guadaña en este momento No estoy seguro de estar súper contento con el patrón, pero al menos está haciendo el concepto general. Es sobre todo cuestión de que ahora tenemos que ajustar las variables Déjame intentar que el jugador sea golpeado y destruido. Bien, así que todavía se quita de la escena, pero vamos a tener que crear el juego sobre la pantalla. Como parte del pulido del curso. Entonces voy a correr eso una vez más para que consigamos nuestro proyectil de guadaña Es como subir a la derecha. Prefiero que vaya más, como, centrado a la derecha. Déjame ver si puedo ajustar eso. A lo mejor ese es el resultado de la velocidad X. Intentaré apagarlo, y volvamos a ejecutar la escena. Bien, entonces ahora es un poco así. Volverá al inicio aquí. Porque el rotador no tiene velocidad extra. Y la dirección en la que lanza depende de si estás mirando hacia la izquierda y hacia la derecha. Entonces al menos es igual aplicación a ambos lados. A ti te puede gustar esto. Puede que no. Es sobre todo cuestión de simplemente ajustar las variables para obtener el patrón que desea para el movimiento Entonces al menos por ahora, yo diría que es bastante aceptable. Vamos a subir de nivel el arma lanza aquí. Y eso va a subir de nivel el arma, pero aquí no tenemos una señal de subir de nivel conectada. Bien, entonces donde hacemos eso está en la exhibición de armas. Vamos a saltar a la exhibición de armas. Cuando colocamos el arma aquí, necesitamos conectar las señales. Pero en ese punto, yo diría que esto en realidad es poner demasiadas cosas en un armador para el arma En cierto modo oculta lo que se supone que debe hacer. El repaso estuvo bien. Pero creo que si estamos conectando señales y actualizando la interfaz de usuario, eso es demasiado. Así que vamos a crear un arma de conjunto de funciones. Que pasará en un arma arma dos D. Bien, así que si arma no es igual nula y y vamos a decir arma punto nivel cambiado está conectado, y entonces tendremos una devolución de llamada aquí, guión bajo en nivel de arma Por supuesto, esto nos va a dar un error porque el nivel cambiado aún no existe en el arma. Entonces saltemos al arma, busquemos símbolo. Vamos a crear una señal aquí, nivel de señal cambiado, que pasarás en el nivel, que es un entero. Si eso es todo lo que voy a hacer con este nivel, y creo que lo es, entonces diremos valor establecido. Diremos que si nivel es igual al valor, volvemos sabiamente, nivel es igual al valor, y podemos nivelar punto cambiado un MIT. En los niveles. Así que sólo estamos haciendo observable esta propiedad, y eso es todo lo que voy a cambiar ahí El motivo de esta guardia es que si establecemos el nivel al nivel, no queremos emitir señales de UI innecesarias porque el nivel, de hecho, no cambió. Así que solo necesitamos hacer esta actualización si la estamos configurando en un nuevo valor. Ahora, sí me olvidé un colon aquí arriba en la parte superior, así que eso va a deshacerse de ese error. Ahora en nuestra exhibición de armas, tenemos el nivel cambiado. Tenemos que crear en el nivel de arma función de devolución de llamada cambiada Entonces la función, copiar y pegar en el nivel de arma cambió, y luego tenemos el nivel P, que es un entero. Vamos a devolver void, y queremos refrescar la interfaz de usuario aquí. Pero lo que en realidad estamos haciendo aquí es que nos estamos desconectando de la vieja señal de arma si existe Entonces comprobamos si el arma vieja existe aquí comprobando si no es nula. Entonces, si la señal está conectada, necesitamos desconectarla. nivel de punto del arma cambió desconexión del punto en el nivel del arma cambiado. Sin paréntesis. Y esta parte solo está verificando que la señal está realmente conectada antes desconectar una señal que no está conectada. Entonces solo guardias de seguridad. Bien, entonces hemos preparado el arma vieja para que esté totalmente desconectada, así ya podemos cambiar el arma. Entonces diremos arma igual a arma P, y luego queremos conectarnos a estas señales de cambio de nivel de armas. Pero también podemos poner un guardia comprobando si ya está conectado por cualquier motivo. Esto es un poco excesivamente seguro, pero solo podríamos decir, si el punto de cambio de nivel de arma ya está conectado a esta función aquí abajo, y queremos hacer eso inverso. Entonces estamos diciendo que si no está conectado, entonces necesitamos conectarlo. Entonces el nivel de punto del arma cambió el punto Conectar, el subrayado en el nivel de arma cambió Y también queremos refrescarnos, seguro. Así que vamos a refrescar eso. Entonces, cuando colocamos el arma, nos refrescamos, y cada vez que cambia el nivel, nos refrescamos. Entonces ahora queremos tomar esta propiedad y subrayar y simplemente hacerla privada Entonces esto será más como una variable privada. Y no queremos modificarlo directamente. Queremos animar encarecidamente a cualquiera que use este script a usar el método set weapon en su lugar. Entonces voy a seleccionar aquí, y vamos a controlar y básicamente a buscar y reemplazar. Así que asegúrate de hacer coincidir el caso y las palabras completas, y luego cambiemos esto para subrayar el arma Creo que podemos salirnos con la suya con el reemplazo masivo aquí. Entonces todas las 11 instancias solo reemplazan todas. Eso es Control R para que aparezca ese menú. Ahora, claro, si ejecutamos el juego, entonces obtendríamos un error porque estamos tratando de poner arma, no subrayar arma desde el punto de vista de armas Entonces, si vamos a la vista de armas, ahora en nuestra actualización, queremos llamar a display dot set arma en el arma dos D con el arma arma dos D y quitar esto. Entonces, toda la razón para mover el código de configuración de arma reactiva a este método explícito de arma de conjunto es para que sepamos que aquí están sucediendo más cosas que simplemente establecer el valor del arma. Por cierto, deshazte de esa actualización. E incluso podemos eliminar esto, pero aquí en este punto, básicamente es solo una variable regular. Pero no queremos ocultar el hecho de que está conectando y desconectando señales y actualizando la interfaz Puede ser un poco más explícito. Entonces todo este código podría haber estado con la misma facilidad bajo el setter de variables de arma, pero tener esta función de bloque grande escrita deja más claro cuál es nuestra intención Y sé que eso sí me contradice cuando antes estaba como, Bien, solo puedes hacer el armador y usar la actualización Pero como también estamos haciendo señales, creo que están pasando demasiadas cosas, y no queremos ocultarlo a nadie que esté tratando de configurar la pantalla. Queremos que sepan, Bien, ahí está esta función de arma de gran set. Y eso es manejar todas estas cosas extra. Oh, bien. Entonces sigamos adelante y ejecutemos el juego, y voy a subir de nivel la lanza al Nivel dos Ah, bien, para que veas que hubo otra referencia a la variable de armas , pero la hicimos privada. Entonces queremos tener un getter para obtener el arma en lugar acceder a la variable privada ahí Déjame echar un vistazo a esta función y ver si incluso la necesitamos, sin embargo. Bien, entonces ya que la vista de armas está manejando liberando las pantallas antiguas, necesitamos que el arma de punto de visualización sea reemplazada por el arma display dot Git Así que vamos a crear esa función en la exhibición de armas. Entonces funcionan aquí, arma Git que va a devolver un arma a D. Sólo vamos a decir, si arma de subrayado, devolvemos arma de subrayado, lo contrario devolvemos null Entonces, ¿por qué molestarse en tener esta función de arma Git cuando solo podrías obtener de la variable de arma directamente? Bueno, hicimos esta arma privada porque queremos asegurarnos de que animamos a cualquier desarrollador a usar explícitamente la función set weapon. Y como esa es una variable privada, no deberíamos estar accediendo a ella desde fuera del script. Entonces necesitamos una función pública de arma Get para acceder a eso. Entonces es básicamente encapsulación y evitar que otras personas hagan cosas con el script donde se supone que no deben hacer eso con el guión Ahora bien, una vez más, el guión bajo es solo una práctica de indicar que está destinado a ser privado de manera efectiva, pero GD Script no tiene realmente privado o público como Por lo que en realidad no se puede evitar que nadie acceda a él. Solo puedes indicar tu intención con el guión bajo. Bien, así que vamos a cerrar eso y ejecutar la escena una vez más. Voy a subir de nivel nuestra lanza. Y vamos a conseguir la actualización de lanza. Así se puede ver que Spear fue al nivel dos ahí mismo y a la parte superior izquierda Por supuesto, esa interfaz de usuario es demasiado pequeña, necesito hacerla más grande. Así que vamos a ir a la jugabilidad UI Canvas, y voy a hacer clic aquí. De hecho voy a cambiar el diseño y lo centraremos. Entonces Anchors va a ser centro superior, y luego quiero W compensarlo de ahí, algo así como por aquí También salta a la escena de exhibición de armas. Entonces si voy a transformarme aquí, me veo más como un 400 pixeles por 75. Quiero asegurarme de que el ancla siga centrada, así puedo hacer costumbre aquí y luego volver a la parte superior central que lo volverá a centrar Echemos un vistazo a la jugabilidad UI Canvas. Bien, eso sigue siendo bueno. Voy a saltar de nuevo a la exhibición de armas desde aquí. Y creo que lo principal es que solo tenemos que asegurarnos de que cada una de esas pantallas individuales, el icono esté configurado en un tamaño mínimo. Entonces, si miro la exhibición de armas aquí, tomemos el tamaño mínimo y hagámoslo. Podríamos incluso decir 96, 96. Vamos a hacerlo grande y luego encogerlo si necesitamos. Entonces la etiqueta de texto aquí, ¿necesito que también sea más grande ? A lo mejor yo sí. Vamos a anular el tamaño de la fuente aquí. Y lo haré como, digamos, 16. Bien, eso es lo que está en estos momentos 32. Bien, entonces intentaremos 32. Alejar. Vamos a golpear play. ¿Cómo se ve en la interfaz de usuario en este momento? Bien, eso es mucho mejor. Entonces iré a buscar la otra arma. Tenemos nuestra guadaña. Entonces lanza, guadaña uno Creo que la única otra cosa es tal vez un poco de un contenedor de margen ayudaría. Así que cierra el juego, y en la vista de armas, nuestro contenedor de margen, hagamos anulaciones temáticas Estoy pensando constantes de dos en todos los lados. Vamos a golpear play. Ejecutarlo. Y eso no ayudó tanto. Hagamos cuatro píxeles en todos los lados, supongo, y presionemos play. Bien, eso es al menos más visible. Voy a hacer seis. Entonces seis por todos lados, eso debería ser suficiente. Bien, entonces entramos en modo de juego. Bien, ahora tenemos un poco de barrera entre nuestro contenedor individual y toda la vista de armas. Y eso se ve mucho más sólido. Entonces está mostrando el tipo de arma que tenemos y el nivel del arma, y esa es probablemente la mayor parte de lo que realmente necesitamos que muestre. Entonces estoy pensando que estamos bien para ir aquí. Déjame subir de nivel para funzies. Vamos a conseguir Syth Nivel dos. Sí, Syth también está nivelando correctamente. Entonces eso prácticamente maneja configurar la vista de armas y completa teniendo todas las señales conectadas, corrigiendo los elementos, asegurándose que tengan una descripción e ícono, y solo tener esa interfaz de usuario clara, donde podemos ver lo que realmente está pasando con nuestro jugador. 53. P52: Creación de elementos de mejora de estadísticas para las actualizaciones de jugadores: Entonces, con nuestro sistema de nivelación funcionando la capacidad de elegir un objeto de armas y mejorar nuestra carga de armas con una nueva arma o un nivel mejorado de un arma, ahora sería un momento perfecto para agregar la capacidad de elegir una mejora no relacionada con armas Por ejemplo, un ítem de impulso de pasos, que aumentará permanentemente nuestro HP al subir de nivel. E incluso podríamos convertirlo en un artículo que tiene una rara posibilidad de dejar a los enemigos si queremos. En nuestra carpeta items, abajo a la izquierda, voy a expandir eso y vamos a crear otro tipo de ítem. Voy a hacer click derecho aquí y crear un nuevo script. Y podríamos llamar a esto un ítem de impulso stat DotGD. Esto se extenderá desde el recurso. Entonces es una especie de tipo de definición. Y luego en nuestro ítem Stat boost, lo abriré, le daré el nombre de clase Stat Boost item. Ah, y esto en realidad va a extenderse desde la clase de elemento base, no desde el recurso. Entonces si miramos artículo, tenemos el Trapply y Can apply Entonces, sigamos adelante y tomemos esos porque necesitamos implementarlos en nuestro Stat Boote Así que sólo voy a pegarlos de aquí. Entonces para poder aplicar, queremos verificar si el objetivo tiene, A, un bloque de estadísticas y B. ¿Ese bloque de estadísticas tiene la estadística que estamos tratando de impulsar? Podríamos crear un montón de clases diferentes para, digamos, impulso de HP, artículo de reducción de enfriamiento. Pero en cambio, vamos a simplificar eso al tener un nombre de stat var de exportación, que es un nombre de cadena. Y pondremos eso igual a nada por defecto. Y luego vamos a tener un cambio de valor var de exportación, que es un float. Y pongamos eso igual a 0.0. Entonces lo primero es lo primero, quiero sacar el Spblock del jugador si existe Así que voy a decir var Stats es un controlador de estadísticas, y vamos a obtener eso de ptarget dot get, y vamos a obtener ese nombre stat como una propiedad Entonces esto puede terminar siendo nulo. Entonces, si las estadísticas son nulas, entonces vamos a devolver falso aquí. Otra cosa que queremos verificar es el cambio de valor realmente establecido. Entonces, si el cambio de valor es igual a 0.0, voy a empujar una advertencia. No se puede impulsar la estadística si el cambio de valor se establece en 0.0 o digamos que los porcentajes son un poco más flexibles, y luego el cambio de valor porcentual. Y aquí vamos a devolver falso. Entonces, la razón de eso es que si no hemos configurado el artículo, realmente no va a hacer nada, así que simplemente omitiremos aplicarlo, y pondremos una advertencia ahí afuera para que sepamos que ese es un problema que necesitamos arreglar con solo cambiar la propiedad de cambio de valor a otra cosa. No hay una función lista para verificar estas cosas como si hubiera con un nodo porque los recursos nunca llegan listos. Entonces este parece un buen lugar para ponerlo. Sólo lo comprobaremos antes de aplicar. De lo contrario, creo que podemos devolver la verdad. Creo que esos son los dos constituyentes principales a los que estamos atentos. Entonces, la otra cosa que quería asegurarme, en realidad, era esta parte. Entonces estamos viendo si las estadísticas tienen el nombre de la estadística, así que en realidad configuré esto incorrectamente. Queríamos decir si ptarget dot consigue estadísticas aquí. Entonces primero, estamos obteniendo el controlador de estadísticas, y luego queremos verificar si las estadísticas puntan G stat Name. No es igual a nulo. Si eso es igual a nulo, entonces devolveremos false. Entonces primero, nos aseguramos de que tenga un bloque de estadísticas, luego nos aseguramos de que tenga la estadística, y luego nos aseguramos de que realmente hayamos configurado este elemento correctamente para cambiar el valor. Bien, entonces una vez si pasamos todo eso, entonces podemos aplicarlo. Entonces aquí abajo, en la parte inferior, quiero obtener el controlador de estadísticas una vez más, así que solo estoy copiando pegando eso de aquí arriba a aquí abajo Obtenemos el controlador SAT, y luego queremos obtener el valor actual y luego agregar el cambio a ese valor Entonces nuestro valor actual va a ser igual al punto de estadísticas GET stat name, y luego vamos a tomar eso e incrementarlo. Entonces digamos, nuestro nuevo valor, va a ser igual al valor actual más el cambio de valor. Y luego fijamos ese valor en los Sts. Entonces las estadísticas establecen el nombre de estadística al nuevo valor, y agrego un pequeño error tipográfico allí, así que asegúrate de que esos nombres sean correctos Y entonces queremos volver a la verdad. Así que también podemos consultar aquí, una vez más, solo para asegurarnos de que las estadísticas todavía se encuentran realmente. Entonces, si las estadísticas son nulas, devolveremos false. Y en realidad podríamos querer un error aquí porque se supone que debemos verificar si podemos aplicar justo antes de aplicarlo. Por lo tanto, las estadísticas del controlador de estadísticas de empuje y error no se pudieron encontrar en porcentaje S, porcentaje P objetivo. Entonces eso va a conseguir el nodo y reemplazarlo ahí. Todo bien. Sí, así que para las estadísticas que reciben nombre, básicamente estamos cambiando esto a una carroza por ahora. El nuevo valor es un float, y lo configuramos de nuevo en el valor stat. Ahora, algunas de nuestras estadísticas como HP son un entero. Entonces, cuando ponemos eso de nuevo en el controlador de estadísticas, lo va a arrojar de nuevo a un entero, y va a perder nuestro valor flotante. Entonces, la idea aquí es que si vas a impulsar un número entero, entonces solo asegúrate de usar valores no decimales en el elemento de impulso de estadísticas real. Entonces pierde un poco de claridad en que solo estamos agrupando enteros y flotadores en el cambio de valor, pero nos da la flexibilidad de poder manejar la gran mayoría de nuestras estadísticas a través de una clase en lugar de crear una para el cambio de HP, una para el aumento del porcentaje de daño, etcétera Sólo mucho menos guiones en los que las cosas puedan salir mal. Así que vamos a crear nuestro artículo HP boost. Y la carpeta items, abajo a la izquierda, voy a crear un nuevo recurso, que va a ser un ítem de impulso SAT. Entonces esto irá en la misma carpeta. Lo llamaré HP Boost, subrayaré puntos de ítem, guárdalo. Ahora a la derecha, tenemos nuestro ítem de impulso SAT. Entonces el SAT que queremos cambiar va a ser Max HP, y queremos que eso suba 50. Ahora, sí veo un defecto aquí, que es que si impulsamos el MX HP, no va a impulsar también el HP base Entonces tenemos que tomar una decisión sobre cómo queremos manejar eso. Una forma sería que cada vez que aumentemos el MAX HP, ajustemos el HP automáticamente en nuestro script de controlador de pila por esa cantidad. Entonces esa es una opción. Déjame revisar el controlador SC si eso tiene algún sentido. Entonces busca stack controller dot gD y project, abre eso, y podemos ver que tenemos lo MAX HP. Entonces podemos ver el cambio haciendo el MAXHP menos el y podríamos simplemente decir aquí si el cambio es positivo, entonces afectamos al HP Sin embargo, siento que realmente está empezando a agrupar este setter, y en realidad puede haber algunos elementos que queremos cambiar el Max HP, pero no el HP base Entonces creo que una forma un poco mejor de hacerlo sería en nuestro ítem de impulso de estadísticas, realidad tenemos un diccionario de estadísticas que queremos cambiar, y luego las recorremos. De esa manera, podemos hacer MaxHP y HP al mismo tiempo. Incluso podríamos tener un artículo que aumente, digamos, Max HP, HP, y ataque todo de una vez, y eso solo va a requerir un poco de cuatro bucles Entonces cambiemos esto vamos a convertirlo una var de exportación Cambios de estadísticas. Y este será un diccionario de nombre de cadena con los valores flotantes. ¿Bien? Entonces ya nos desharemos de esto, y eso nos dará algunos errores inmediatos. Así que queremos asegurarnos de que cada uno de estos nombres de cadena exista en el controlador stat. Entonces podríamos decir cuatro claves en stat cambia teclas de punto. Sólo comprobaremos si la clave está realmente en ese controlador. Entonces si stats Git key es nulo, no tiene las estadísticas, no podemos modificarlo, eso es un problema. Y entonces solo podemos hacer aquí abajo. Para el valor en stat cambia los valores de punto. Entonces comprobaremos si el valor es igual a cero, entonces vamos a tener ese problema ahí, así que solo reemplázalo por valor. Bien, entonces técnicamente aquí mismo, estamos haciendo dos bucles, y eso es sub óptimo. Entonces, una mejor manera de hacer esto en realidad sería simplemente obtener el valor de la clave. Entonces voy a decir var valor es igual a stat cambia punto G clave, y luego podemos verificar el valor sin el extra de cuatro bucles. Entonces voy a cortar eso y pegarlo aquí, quitar el segundo bucle de cuatro. Eso debería hacerlo mucho más eficiente y más fácil de leer porque ahora solo estamos lidiando con esto 14 Bien, ahora aquí abajo en la parte inferior, necesitamos hacer algo similar para key in stat cambia teclas de punto. Necesitamos obtener el valor para cada uno de estos. Así que vamos a tabularlo de nuevo, así es parte del bucle de cuatro. Y diremos estadísticas punto Obtener clave. Nos va a dar el valor actual. Tomamos el valor actual más el cambio de valor. Eso nos da el nuevo valor. Entonces, ¿de dónde sacamos el cambio de valor? Bueno, tenemos que decir var el cambio de valor es a flote igual a los cambios de estadísticas punto Obtener clave. Uh, eh. Y luego tenemos el nuevo valor cuando sumamos esos juntos, conjunto de puntos de estadísticas. Sobre el nuevo valor, aguanta. Nombre de conjunto no declarado en el ámbito porque el nombre del conjunto es la clave. Entonces queremos establecer la clave con el nuevo valor en el controlador de estadísticas. Bien. Ahora, busquemos elemento en el proyecto. Voy a abrir el artículo de impulso de HP. Ahora tenemos la capacidad de manejar múltiples cambios de estadísticas de una sola vez. Así que solo haré MaxHP y eso va a ser de 50. Quiero hacer MXHP antes que HP porque quiero aumentar el MX HP antes de intentar impulsar el HP Por lo que el HP también será de 50 aquí. Entonces aumentamos los HP MX, y luego los HP subirán 50. Si estás en FHP, debería ser en FHP por segunda vez. Y luego llamemos aquí al nombre para mostrar, HP boost. La descripción se incrementará el HP máximo en 50. Y luego para el icono, vamos a crear una nueva textura atlas. Voy a ampliar eso. Vamos a cargar rápidamente de nuestro proyecto, y voy a obtener la hoja de sprites 16 por 16 Así que editemos la región y escojamos una. Entonces, acerque, ¿tenemos algo como una poción de salud, algo que tiene sentido para nosotros Hay una gota de sangre que podría ser viable. O aquí hay un corazón. Esa es otra buena opción. Bien, como que me gusta esta harina. Entonces, consigamos esta harina roja sangre carmesí, y la elegiremos para que pueda ser nuestro ícono de ítem Y probemos esto agregándolo como opción en nuestra escena de subir de nivel de jugador. Entonces en la escena de selección de nivel arriba, voy a dar click en nuestra selección LevelUp Y tenemos nuestras opciones de artículos aquí. Voy a cargar rápidamente un nuevo artículo. Entonces este va a ser nuestro artículo de impulso de HP. Vamos a darle una oportunidad de caída de uno y presionar Agregar par de valor clave. Bien, así que ahora podemos golpear play, y entraremos aquí. Voy a subir de nivel, y vamos a seleccionar nuestro impulso de HP. Elige eso, y podrás ver, oh, de repente, tenemos 160 HP, y así es como subir de nivel. Entonces puedes ver desde aquí sería muy fácil aumentar otras estadísticas como daño de ataque, reducción de enfriamiento, ¿qué más? Velocidad de movimiento, etcétera, para tu personaje ya que necesitas dar mejoras 54. P53: implementación de correcciones de UI para una mejor interfaz de usuario y Boost: Termina con nuestro sistema de actualización creando una camioneta que nos permitirá recoger y aplicar inmediatamente uno de estos artículos como nuestro artículo HP boost. Entonces vamos a querer buscar en nuestro proyecto las camionetas Entonces tenemos nuestras pastillas de objetos. Vamos a crear una camioneta HP boost. Comienza duplicando la camioneta XP dos escena D. Entonces haré clic derecho y duplicaré eso y luego esta será la camioneta HP Boost, subrayaré dos D, claro, y haga doble clic en eso Bien, así que lo primero que quiero hacer aquí es cambiar el sprite para que sea el mismo que en mi artículo Entonces voy a dar click Sprite Animated TwoD. Vamos a la animación aquí y creamos un nuevo recurso de marcos de Sprite para que podamos establecer un ícono diferente Voy a añadir marcos de una hoja de sprites. Vamos al arte. No carmesí fanta ver iconos de cuervo, hoja de sprite completa, 16 por 16, acercar Asegúrate de que a la derecha, estableces el tamaño en 16 por 16 aquí para que pueda dividir la hoja de sprites apropiadamente Y si, encontraremos esa flor que estaba usando. Entonces haz clic en eso, agrega el marco. Y boom, ahí está nuestro artículo. Puedo mirar la camioneta XP, pero en realidad esta es solo una camioneta que inmediatamente agrega experiencia. Entonces este script en realidad omite toda la necesidad de tener el ítem Entonces lo que estamos buscando es más de una recolección de elemento dos D. Así que vamos a cambiar el nombre de nuestro nodo base, la recolección de elemento D, y vamos a hacer clic derecho en él, desacoplar el script, hacer clic derecho adjuntar un nuevo script, y esto va a ser un ítem subrayado pickup, dos D, esto va a extenderse de pickup a D. Creamos eso, le damos el nombre de la clase item pickup dos D. Así que esto va a aplicar el artículo de recogida al objeto que lo recogió. Entonces, en la interfaz de usuario de nivel, aplicamos inmediatamente el ítem a nuestro jugador. Aquí es solo un poco diferente. Tenemos que recoger primero el ítem en el mapa del juego, como recogemos el EXB y luego va a aplicar el efecto item directamente al jugador Si agregamos artículos en un inventario, ese método de aplicación sería más como agregar uno de los artículos a la matriz de inventario e ir desde allí, pero nuestro juego no necesita inventarios, así que básicamente estamos saltando Pero nuestro juego realmente no necesita inventarios aparte de nuestra carga de armas, que funciona un poco diferente Entonces realmente no necesitamos meternos en eso para este proyecto. Entonces nuestro artículo Recogida dos D, por supuesto, queremos exportar var un artículo de tipo artículo. ¿Bien? Así que guarda eso, y luego podemos dar click aquí y vamos a asignar si queremos, podemos asignar el ítem por defecto. A lo mejor sólo voy a dejar eso en blanco, aunque. Déjame echar un vistazo al guión base pickup dos D, clic derecho en él. Entonces necesitamos implementar la función take. Así que vamos a copiar eso en la recolección del artículo dos D. Voy a pegar eso en. Lo implementaremos en un segundo. También voy a hacer función subrayado listo, devuelve void Y vamos a afirmar que el ítem no es nulo. Cada recolección de artículo debe tener un artículo asignado para recoger. En realidad, creo que aseverar es un poco demasiado fuerte aquí. Probablemente iría con más como error push. Entonces podemos ver qué está pasando mal en la consola, pero no va a interrumpir el flujo del juego porque cuando instancia la recolección del artículo, probablemente va a estar fuera de una gota, y no necesariamente queremos que eso rompa completamente el flujo de nuestras pruebas de juego. Entonces creo que el error de empuje es un poco más apropiado aquí. Entonces pues vamos a quitar el guión bajo del objetivo P. Entonces primero, voy a decir, yo item dot se puede aplicar a P Target, luego voy a aplicarlo al objetivo P. Entonces item dot intenta aplicar a pTarget. Y si eso sucede, lo sacaré del cuarto de escena. Ahora bien, tal vez sería mejor si la función T también tuviera un booleano para devolver false Entonces aquí, la naturaleza de cambiar esto a un booleano significa que tendría que volver a la clase base y cambiar Y entonces cualquier clase que también anula la función T, tendría que cambiarla. Entonces ese es uno de los defectos de depender demasiado de la herencia para tus clases, lugar de usar un enfoque de composición, como ves en el inspector en este momento, composición sería más como si tuvieras un montón de diferentes scripts pequeños que cada uno tiene su propio propósito único, en lugar de tener un script base extender un montón de otros scripts. Entonces, por ejemplo, el jugador podría tener carácter extendido, y luego podría haber otra clase por encima del jugador como Spearman o dragoon, lo que agrega más Pero entonces, si obtienes muchos scripts directamente dependiendo unos de otros, un pequeño cambio como simplemente cambiar esto a un booleano podría significar que necesitas actualizarlo en varios lugares . Entonces solo algo en lo que pensar. En realidad no es tan problemático aquí. Bien, entonces lo que vamos a hacer con esta recogida de artículos es ponerla en el mapa del juego ahora. Así HP Boost Pickup. Eso lo tenemos. Hemos guardado esto para el proyecto. Oh, en serio, lo que creo que quiero hacer esto es hacer de esto una escena base así que voy a renombrarlo item pickup dos D. Ahora busquemos camionetas aquí abajo Entonces voy a hacer click derecho aquí y voy a hacer una nueva escena heredada. Y luego en esta escena heredada, puedo asignar el ítem. Entonces voy a cargar rápidamente nuestro artículo HP boost y luego volver a guardarlo en la recolección del artículo como camioneta HP Boost. Dos D. Y entonces esa es la escena que ponemos en el mundo del juego. En cierto modo, crear una escena heredada como esta es realmente similar a extender un guión y obtener toda la base en tu nuevo objeto. Pero en ciertas circunstancias como esta, donde solo estamos cambiando qué tipo de elemento esa configuración de escena tiene la camioneta HP boost, teniendo el artículo HP boost, pero por lo demás solo siendo un ítem normal pickup dos D. Creo que en casos como ese, esto en realidad tiene mucho sentido. Así que ahora queremos poner nuestro artículo en el mundo del juego. Voy a buscar TCN punto mundial. Bien, voy a acercarme aquí. Tenemos un jugador ahí, así que voy a buscar la camioneta HP Boost e intentar arrastrar esto al mundo del juego. Podría simplemente ponerlo ahí, pero pongámoslo primero debajo de pastillas para que tenga el padre W adecuado para moverlo Pongámoslo por ahí y tal vez un segundo por aquí solo para asegurarnos de que podamos hacerlo dos veces. Vamos a golpear play, y luego vamos a ir a buscar nuestra camioneta. Entonces voy a caminar por aquí, y boom, tenemos 150 HP. Aquí podemos elegir si queremos lanza o guadaña. Interesante, no está brindando la opción para la tercera camioneta. A lo mejor necesito que me agreguen. Y luego voy a ir aquí y conseguir nuestro próximo impulso de HP. Entonces está nuestro elemento permanente de refuerzo de Sp, y eso funciona un poco diferente a nuestro EXP, que simplemente modifica directamente la puñalada Así que vamos a verificar la selección de subir de nivel, y solo me aseguraré de que el artículo siga ahí. De alguna manera se inició, así que voy a cargar rápidamente el valor del artículo HP boost de uno, agregado en. Entonces ahora vamos a golpear play una vez más. Sólo me aseguraré de que vuelva a funcionar. Obtenga el impulso de HP desde el nivel hacia arriba, selecciónelo. HP sube, seleccionamos aquí y aquí, así conseguimos tres potenciadores HP Eso es trabajar bien. Lo último que quiero ajustar, y esta es una rápida es que para nuestras selecciones de cajas de recompensa, no bajan al mismo tamaño. Cuando uno de ellos tiene una descripción más larga. Entonces quiero saltar a la escena de selección de recompensas. Da click en la raíz, y déjame ver aquí. Uno de estos necesita expandirse hasta el final. Entonces, en realidad, la forma más rápida de depurar esto sería presionar play Y mientras el juego se está ejecutando, voy a ir por aquí y vamos a probar, cambiar el tamaño aquí. Y luego voy a tabular atrás y ver si se actualizó. Bien, entonces nuestra área de impulso HP, déjame revisar la raíz. Esto está configurado para llenar expandir. A lo mejor es la descripción la que hay que hacer y ampliar. Así podemos ver la raíz aquí tiene expandir y llenar conjunto ya. Entonces voy a revisar el contenedor de margen y asegurarme de que también sea así. Entonces haremos el dimensionamiento del contenedor de diseño. Rellenar. Bien, entonces otra cosa podría mirar vista remota para ver las notas que en realidad se están ejecutando actualmente en el juego. Y vamos a expandir la capa World Canvas a la interfaz de usuario. Tenemos el nivel de selección. Tenemos nuestro contenedor de panel debajo de eso, el contenedor de margen, el contenedor de caja V y, el contenedor de caja de recompensas y nuestras tres selecciones. Entonces, ¿por qué estos tienen un tamaño diferente? Entonces podemos ver si miramos a la derecha por aquí que las tallas para la Y, son todas iguales. Eso es lo que esperaríamos al mirar esto. Todos están estirados todo el camino hacia abajo. Entonces encontremos el nivel donde no están. El más pequeño es el tercero. Entonces déjame ampliar eso. Haga clic en Contenedor de Margen. Podemos ver el contenedor de margen. Son los 20 píxeles de tamaño completo, así que no es así. Bajemos al contenedor VBox. El contenedor VBox es 214. Eso es también lo que esperaríamos porque el contenedor de margen tiene un margen. Entonces supongo que en realidad es esta caja de descripción. Puedes hacer clic en los nodos y ver realmente un cuadro cuando se selecciona aquí. Eso es algo genial. Creo que en realidad podría ser nuevo. Entonces solo queremos que la descripción empuje todo hasta el fondo. Bien, entonces sabemos lo que estamos tratando de expandir. Entonces en la vista local ahora arriba aquí arriba en la parte superior izquierda, hagamos clic en la descripción. Ah, y ahí vamos. Ahí vamos. Entonces aquí abajo en dimensionamiento de contenedores, está listo para comenzar a encogerse. Quiero que eso sea realmente llenar y expandir. Ahora bien, si voy a tocar de nuevo al juego, va todo el camino hasta el fondo. Bien, así puedes ver eso, ¿verdad? Estos tres están bajando. También me gustaría que los tamaños de los iconos fueran iguales. Entonces tal vez necesitamos establecer un tamaño absoluto específico para los iconos. Creo que tal vez el icono de la lanza se configuró usando uno más grande, pero quiero asegurarme de que todos vayan al tamaño correcto Entonces, si hacemos clic en el icono Rec aquí, intentemos cambiar el tamaño de keep para ignorar el tamaño. Y creo que eso es hacerlos iguales ahora. Sí, bien. Parece estar alineado. Si tienes algún otro problema, eso sería una especie de proceso de depuración que puedes usar para arreglar tu interfaz de usuario mientras realmente tienes el juego funcionando Entonces es bastante útil porque en realidad puedes ver cómo se va a actualizar de inmediato puedes cambiar tu control dentro de Gado y tu escena local, y se actualizará inmediatamente en la vista remota. Entonces esa es en realidad una de las cosas realmente geniales de Gudo Bien, entonces con eso, creo que nuestro sistema de actualización recoge, todo lo que necesitamos, en ese sentido simplemente está funcionando muy bien ahora Entonces ese es realmente el grueso del curso hasta este punto. Solo vamos a tener algunas cosas pulidas por las que pasar, como guardar y cargar un sistema de puntuación, como cuántos enemigos hemos matado entre sesiones de juego, dorar un juego sobre la pantalla para cuando realmente perdemos Así podremos ir a nuestro menú principal y reiniciar el juego, ese tipo de cosas. Pero la jugabilidad central está prácticamente ahí ahora. Entonces eso va a ser para este video, y luego entraremos en la etapa de wrap up y pulido del curso. 55. P54: Crear una pastilla de poción saludable para las gotas enemigas: Quiero virar un video más sobre hacer camionetas para tus artículos de juego Entonces creé la camioneta para el artículo de impulso de HP, pero quiero crear un artículo que los enemigos dejarían caer . Esto sólo será una simple poción de salud. Entonces voy a buscar nuestro artículo HP boost en el proyecto, y vamos a duplicar la camioneta HP boost. Entonces haz click derecho y baja a duplicar y vamos a llamarlo Poción de Salud TCN de dos puntos d. Ahora queremos abrir esa escena, Salud poción tod punto Entonces nuestro artículo aquí se va a llamar Health Potion two D, solo para indicar que está en el mundo del juego de las dos D. Para el elemento HP Broca a la derecha, hagamos clic en el menú desplegable y luego hagamos que este sea único. Así que esencialmente estamos tomando la base y creando una copia única de la misma, y ahora voy a hacer clic derecho aquí y guardarla como una poción de salud Así que haz clic derecho en Guardar como, y luego ponlo en el proyecto y los artículos, y voy a hacer poción de salud Subrayar elemento TRS. Cambiemos los cambios de estadísticas para que solo aumentemos los HP en 25, y eliminemos el Mx HP de este impulso. Ahora para nuestro nombre para mostrar, diré Poción de salud Y para la descripción, diré restaura 25 HP, punto. Y luego para el ícono, seleccionemos otro ícono de nuestra región y encontremos una poción de Salud Estoy seguro de que hay algunos de ellos aquí. Entonces sí, más cerca de la cima, tenemos más que unos pocos. Realmente elige aquí. Iré con el típico de aspecto. Y vamos a seleccionar eso. Y luego también necesitamos agarrar ese mismo icono para el Sprite animado dos D. Así que haz clic ahí, ve a la animación, haz un nuevo Sprite frames, y luego selectelect de Los íconos de arte, hoja completa de sprites 16 por 16, acercan el tamaño del conjunto superior a 16 por 16 Y luego controla el zoom del carrete del ratón central hacia la parte superior y agarra la misma poción de Salud, que está aquí mismo Debe ser solo uno seleccionado. Pulsa añadir. Bien, y ahí está nuestra poción de Salud Entonces esto ya debería poder funcionar. Déjame tirarlo al mundo del juego como copia. Entonces tenemos nuestra poción de Salud dos D. Solo la pondré aquí por ahora mismo, y luego solo podemos usar la poción de Salud Entonces, en realidad, la salud base comienza a los 50. Entonces si voy por aquí, se puede ver 50 va a 75 de cada 100. Entonces eso está funcionando. Bien, entonces tenemos que entrar en la escena del esqueleto, y tendríamos que modificar nuestro componente de gotas, pero en realidad nunca configuramos gotas para el esqueleto. Entonces vamos a Oc. Sólo voy a seleccionarlo aquí y Control C, copiarlo sobre el esqueleto. Entonces en la parte superior derecha, tenemos nuestras definiciones de caída, que ya va a tener la caída EXP con un peso de 1.0. Así que queremos agregar en la capacidad de a veces caer una poción HP en lugar de la EXP Voy a agregar un elemento, y voy a hacer clic en una nueva definición de caída. Entonces solo para fines de prueba, le daré un peso de cinco gotas, lo que significa que el 86% de las veces va a caer una poción de salud, no un EXP, solo para que lo veas funcionando Y luego carguemos rápidamente nuestra poción de salud dos D. Bien, así que para nuestras gotas que realmente funcionan, también necesitamos agregarla como una llamada a nuestra animación de muerte Entonces, hagamos clic en el reproductor de animación, vayamos a Muerte, y haremos una llamada a las gotas aquí. Entonces, al inicio, agreguemos un método de llamada en las gotas. Y vamos a hacer click derecho inserte una tecla para soltar con una sola vez. Eso está bien. otro error que cometí en la recolección del artículo. Cuando empujamos el error para el artículo no es nulo. Eso debería ser realmente empujador si es nulo porque estamos tratando de verificar que realmente recordamos establecer un artículo de exportación en la recolección del artículo. Eso fue una simple inversión lógica ahí. Bien, ahora sigamos adelante y golpeemos Play e intentaremos derrotar a un esqueleto. Sólo voy a recoger algunos artículos en XP aquí, obtener el sitio. Y sólo vamos a esperar a que salga un esqueleto. Mientras tanto, podemos ver que los orbes siguen simplemente bajando su XP Siempre, esa es la única caída posible, y ahí tenemos un esqueleto. Entonces, si derrotamos a este tipo, 86% de las veces más o menos, debería dejar caer una poción de salud Entonces ese tiempo no lo hizo. Tendremos que derrotar a un par más. Y vamos a ver. ¿Conseguimos la poción de salud para desovar Sí, ahí vamos. Poción de salud Así que en realidad vimos que ambos pueden engendrar. Otra poción de salud vino de ese esqueleto, otra poción de salud Entonces puedes ver que la ponderación definitivamente está funcionando la gran mayoría de las veces estamos obteniendo la poción de salud en lugar del EXP Entonces ahora que sabemos que está funcionando, solo podemos ir al esqueleto. Iremos a las gotas. Tomemos la definición de gota en la poción y hagamos de ella un 0.1 Entonces eso significa que diez de 11 veces la EXP va a caer, y una de cada 11 veces la poción de salud va a caer, y así es como funciona la ponderación Sumas todas las posibilidades más sus pesos, y tus probabilidades son tu peso para ese específico dividido por el peso total de todos ellos juntos. Bien, y así es más o menos como agregas una poción de salud al juego Entonces puedes ver que una vez que tenemos nuestro ítem stat, nuestras pastillas que nos dan un ítem stat, y podemos simplemente aplicarlos al jugador y podemos simplemente establecer como nombre de cadena a qué estadística estamos afectando, se vuelve realmente fácil modificar muchas cosas diferentes en nuestro personaje 56. P55: implementación de la sacudida de cámara para efectos de impacto y muerte del jugador: Ahora estamos pasando a la parte pulida del curso, que va a terminar las cosas sumando algunos bonitos a mitades. Vamos a comenzar con una sacudida de cámara al golpe para que nuestro jugador haga el juego un poco más intenso. Y también haremos cosas como agregar en un juego sobre pantalla y la capacidad de rastrear la puntuación más alta. Entonces comencemos con el movimiento de la cámara. Vayamos al mundo. Y en el mundo, tenemos una cámara dos D aquí. Así que podríamos simplemente adjuntar un guión justo a la cámara dos D. Así que voy a hacer clic aquí, adjuntar un guión, y digamos agitar cámara dos D. Subrayar dos D, debería decir Y vamos a crear y vamos a poner eso en, supongo, la carpeta UI. Así que abre eso y crea. Le voy a dar el nombre de clase shake Camera two D. Y trabajemos en la configuración de esto. Entonces, antes que nada, necesitamos una referencia a nuestro jugador como muchos otros guiones para que cuando el jugador recibe daño, podamos tener el gatillo del efecto shake. Así que vamos a hacer Exportar var context of player context. Así que al igual que antes con otros elementos de la interfaz de usuario, obtenemos acceso a las estadísticas a través del contexto. Y luego agreguemos algunas variables para controlar nuestra fuerza de sacudida. Entonces, antes que nada, exporta var Max shake strength que es un flotador, y voy a establecer eso en 10.0 por defecto. También podemos tener una duración de batido. Así que exporta var shake duration, que es un float, y lo estableceremos 0.3 segundos por defecto. Y luego quiero un conjunto separado de variables para cuando muera el personaje. Entonces esto debería ser una sacudida extra fuerte para dar el impacto de, Oh, perdiste a tu jugador, perdiste el juego. Entonces vamos a hacer Export Var muerte sacudir fuerza, y eso va a ser un float up default a 20.0 Y luego tenemos en la exportación Var duración del batido de muerte, que voy a establecer en un flotador de 0.6 segundos por defecto. Entonces, cuando empiece nuestro guión, quiero obtener las estadísticas del jugador. Así que voy a decir var underscore stats va a ser un controlador de estadísticas aquí, y entonces necesitamos el subrayado de función listo Entonces diremos estadísticas de puntos de jugador de contexto, y vamos a establecer estadísticas de subrayado iguales a eso Afirmemos que eso no es nulo. G stats no es igual a nulo. Debe tener una referencia a las estadísticas del jugador para poder sacudir la cámara. Bien, entonces cuando nuestra cámara está temblando por todas partes, queremos recordar su posición original para que una vez que hayamos terminado, podamos volver a esa posición. Vamos a tener otra variable aquí. Este va a ser un vector dos D, subrayado offset original, que va a ser un vector 20 Bien, recuerda el signo igual ahí. Así que estamos inferyendo que es un vector del vector dos punto cero, y esto lo convierte en un vector 20 también Bien, entonces nuestro offset original on ready va a ser igual a nuestro offset actual. Entonces este es el offset de la cámara porque nuestro guión extiende esta cámara directamente. Y luego necesitamos conectarnos al controlador de estadísticas HP cambió la señal. Así subrayan las estadísticas Hp colgado punto Conectar. Y vamos a conectar que vamos a conectar eso a en HP cambiado. Así que vamos a crear esa función aquí abajo, el subrayado en HP cambió, y eso va a tener los datos de estadísticas Entonces P data y esto es stat datos cambiados. Esta vez cuando tenemos nuestra función de devolución de llamada, en realidad voy a usar los datos P directamente porque aquí es muy útil para determinar si estamos haciendo un batido regular o estamos haciendo un batido de muerte Entonces, si el cambio de HP en el evento es mayor o igual a cero, solo queremos regresar porque no estamos temblando en una curación o si el HP no cambia. Entonces ahora queremos comprobar si el valor del evento punto u es mayor que Zarel Entonces, ¿el personaje sigue vivo, esencialmente? Entonces, si ese es el caso, entonces vamos a usar los valores normales de shake. De lo contrario, vamos a usar el valor del batido de la muerte. Entonces, la fuerza de sacudida de subrayado va a ser igual a nuestra fuerza máxima de sacudida, y luego el tiempo de sacudida de subrayado va a ser igual a nuestro agarre Nuestra duración Shake. Bien, entonces necesitamos esas variables locales aquí arriba. Así que var subraya la fuerza de sacudida es un flotador y Var subraya Shake time también es un Hay por supuesto, va a default a cero. Ah, y cuando puse evento aquí, realidad me refería a Pdta Así cambio de punto pata y pdata punto neu. Bien, así que de lo contrario, aquí hay otro caso, que es que la salud está por debajo cero o igual o por debajo de cero, debería decir. En cuyo caso vamos a poner la fuerza de la sacudida a los valores de la muerte. Por lo que subrayar la fuerza del temblor va a ser igual a la fuerza del temblor de la muerte, y el tiempo de sacudida va a ser igual a la duración del batido de muerte Bien, ahora, hay otra cosa aquí, que es que dependiendo de lo saludable que esté nuestro carácter, es posible que queramos aumentar o disminuir la fuerza. Entonces por eso tuve MX shake strength aquí. Ahora mismo, siempre va a ser ese máximo de 10.0 que configuré ahí. Entonces creo que una buena manera de hacer esto sería verificar cuánto daño infligiste versus cuál es el HP máximo del personaje. Entonces, si un ataque hace la mitad de su salud, quieres que sea un temblor de cámara bastante fuerte. Pero si es solo una garrapata de daño a lo largo del tiempo, como, Oh, hace un daño por segundo, eso es bastante intrascendente Simplemente puedes hacer que sea un batido muy pequeño o eliminar completamente el batido por completo. Entonces var, la relación de daño va a ser igual al valor absoluto F, del evento punto hg. Esta es la cantidad de salud que acabamos de cambiar, y eso va a dividirse por el máximo de cualquiera de los dos puntos oh. Entonces mientras editaba, noté que las matemáticas aquí son incorrectas. Llamar al máximo entre un punto oh y el punto de estadísticas MX HP no tiene mucho sentido aquí porque en realidad queremos que la relación esté entre el cambio y la salud, el valor absoluto de eso de todos modos. Y el MX HP. Entonces realmente lo que queremos hacer es decir var por ciento de cambio. Y lo que realmente queremos que esto diga es el valor absoluto float del p data dot change dividido por guión bajo estadísticas punto MX HP Entonces eso nos da nuestra proporción, que debería ser de 0-100 Pero queremos abrazar eso. Entonces digamos relación sujeta ahora. Voy a cortar esto y digamos sujetar F en el cambio porcentual, y lo vamos a forzar entre 0.0 y 1.0. Entonces, si por alguna razón nuestro valor de cambio en realidad era mayor que nuestro MX HP total, como, digamos que recibimos 9,000 daños y nuestro HP máximo fue de 100, entonces eso sería en realidad un cambio porcentual de 90 Así que en realidad queremos simplemente limitar eso al 100% o si vamos en la otra dirección, no puede estar por debajo del 0% de cambio. Entonces nuestro valor total va a ser 0-100, no importa cuán grande o pequeño sea el cambio Multiplique la fuerza máxima de sacudida por la relación de sujeción. Lo último que tenemos que hacer aquí para asegurarnos de que esto en realidad no regrese como cero es tomar el MX HP y lanzarlo a un flotador. Entonces eso es importante porque de lo contrario, entero dividido por un entero simplemente dejaría caer el punto decimal antes de convertirlo incluso en un cambio porcentual. Ahora podemos seguir adelante y correr y asegurarnos de que siga funcionando como se esperaba, así encontraré a un tipo que nos golpee. Bien, y todavía tenemos ese movimiento de pantalla, ¿verdad? Por supuesto, el de la muerte será mucho más grande. Entonces, debido a que cambiamos las matemáticas, es posible que también quieras ajustar la fuerza de sacudida máxima y hacerlo más fuerte, como 20 o 30. Y recuerda, esto siempre va a ser un porcentaje de la fuerza máxima de batido. Entonces necesitas tener en cuenta eso cuando realmente estás averiguando qué tan fuerte va a ser el batido Entonces, veamos, a los 30, la fuerza máxima es algo así. A lo mejor un poco fuerte. Así que incluso podría bajar eso a 20. Como más de un número final. Bien, ahora, finalmente, en realidad necesitamos el proceso para el batido. Así que vamos a subir a la cima aquí. Después de subrayado listo, voy a decir función subrayado proceso Delta Entonces solo estoy llenando eso automáticamente. Y entonces vamos a decir, si el tiempo de batido es mayor que 0.0, entonces vamos a sacudir realmente la pantalla. Entonces, cómo lo hacemos es con algunas matemáticas. Entonces vamos a decir guión bajo sacudir el tiempo de subrayado es menos igual al Delta Entonces quitamos el tiempo del tiempo que estamos transcurriendo aquí, y luego voy a obtener el valor del batido X y el batido Y y aplicar ese desplazamiento a la cámara Entonces var shake X va a ser igual al rango F aleatorio de 1.0 a 1.0 veces la fuerza de sacudida negativa. Entonces, esencialmente, estamos obteniendo una dirección aleatoria multiplicada por nuestra fuerza de sacudida actual. Y luego var shake Y, claro, te imaginas que eso es lo mismo. Va a ser igual al rango de subrayado F aleatorio, negativo 1.0 a 1.0 veces guiones bajos fuerza de sacudida Tomamos ambos, y lo aplicamos al offset de la cámara. Entonces offset va a ser igual desplazamiento normal más el vector dos, y esto va a ser shake X y shake Y. Así que esencialmente en cada actualización de fotograma, la cámara va a temblar a una nueva posición aleatoria ligeramente fuera del offset original, y lo hará hasta que termine el tiempo de agitación. Entonces, si el tiempo de batido es cero o menos, entonces diremos otra cosa, entonces queremos devolver el desplazamiento de la cámara a sus originales. Entonces offset va a ser igual al offset original. Bien, y si tengo este derecho, ese es más o menos nuestro guión ahí. Lo último que vamos a necesitar hacer es asignar el contexto del jugador y el inspector. Tan rápido por aquí, desplegable, carga rápida, contexto de jugador. Y vamos a ejecutar el juego y dejar que nuestro jugador golpeado y ver si funciona como se esperaba. Bien, entonces aquí hay un orco, y ahí está nuestro movimiento de cámara cada vez que nos golpean Y ahí está nuestro temblor de cámara al morir, que es mucho más fuerte, como puedes ver. Entonces, esencialmente, ese es nuestro efecto de sacudida de cámara completo. A continuación, obviamente, sería un buen momento para poner en la pantalla GameOver para que podamos volver al menú Inicio del juego, que también necesitamos crear 57. P56: cómo crear un juego sobre pantalla con la navegación por el menú principal: Una de las últimas cosas que necesitamos agregar es una pantalla GameOver y una pantalla de menú mínima. Entonces GameOver va a aparecer, por supuesto, cuando nuestro personaje sea derrotado Así que tendremos que volver a acceder al contexto del jugador para que podamos verificar si vivo es falso. Entonces primero, voy a abrir el sistema de archivos e ir a la interfaz de usuario, y vamos a encontrar nuestra jugabilidad principal UI Canvas que hará que sea un poco más fácil trabajar para que podamos ver dónde vamos a poner el juego sobre la pantalla. Entonces, por ahora, creo que voy a subir de nivel la selección y esconder eso. Hará que sea más fácil trabajar en él. Y tomemos la interfaz de usuario. Voy a hacer clic derecho en Agregar un Nodo hijo. Y así queremos un nuevo control este control va a estar centrado. Entonces, en el diseño, hagamos anclajes de posición de diseño y hagamos centro Ahora, te click también ve al mouse y gira el filtro a Ignorar. Y hagamos clic derecho y agreguemos un contenedor de panel a este nodo de control. Así contenedor de panel. Ese será el trasfondo. Tomaremos el contenedor de panel y lo estiraremos. Así que acerque, asegúrese de que el contenedor del panel esté seleccionado por aquí, y expandamos eso. Entonces nuestro contenedor de panel queremos centrado en nuestro control padre. Así que vayamos al diseño ahora y hagamos el centro de anclajes de diseño. Eso debería poner a los padres anclas aquí mismo en el centro, así que eso es bueno Lo hará centrado en la pantalla. Cambiemos el nombre del nodo padre para que sea la pantalla GameOver. Además, haz clic derecho en él y guárdalo como una sucursal en la carpeta UI, pantalla GameOver Así que ahora podemos simplemente saltar a esto y editar esto puramente. Así que nuestra pantalla GameOver, por supuesto vamos a necesitar algo así como una etiqueta de texto enriquecido como título Hagamos clic derecho en Agregar una etiqueta de texto enriquecido. Y solo puedo decir GameOver dentro de ti. Probablemente querremos hacer que el tema basado en raíces también sea nuestro tema principal del juego. Tan rápido carga el tema aquí, tema del juego que nos dará la fuente Pix art. Ahora también podemos tomar la etiqueta de texto enriquecido, y digamos encajar el contenido. También queremos decir texto centrado, y parece ser demasiado grande también. Eso no va a ser un problema, creo, después de que agreguemos el contenedor VBox en así que, derecho, haga clic en el contenedor del panel, agregue un contenedor VBox Mueva la etiqueta de texto enriquecido debajo de ella. Bien, eso arregla el dimensionamiento de eso ya que ahora está controlado por el contenedor. Vamos a hacer click derecho sobre la VBox y agregemos tal vez una rata de textura y luego obtendremos un ícono triste para ahí Y luego obtendremos un ícono de GameOver. Si usamos textura y hacemos textura atlas, la expandimos. Y luego para el atlas, carguemos rápidamente nuestros íconos. Podríamos simplemente usar el 64 64 aquí si vamos a mantener eso en el proyecto. Editar región. Bien, y luego tenemos que alejar zoom y seleccionar algo que sea bueno para, como, un juego terminado. Así que hay muchas opciones para elegir. Estoy pensando en esta calavera que parece que está durmiendo. No es demasiado oscuro, no es demasiado lindo, así que creo que eso podría funcionar. Déjame sacar esto del camino para que pueda ver al editor de región. Podría necesitar cambiar realmente el tamaño aquí. Voy a intentar un paso de cuatro en la X y cuatro Y. De esa manera, puedo estirar esto hacia la derecha, y luego la izquierda y la derecha van a coincidir entre sí. También voy a tirar de abajo hacia arriba un poco. Bien, entonces con el paso 44, eso funcionó un poco bien para que pueda acercarme aquí. Acercamos el zoom en nuestra pantalla GameOver. Voy a querer creo que clip de filtro. Creo que también para el modo stretch, necesitamos mantener el aspecto centrado, y eso me queda bien. Por lo que también agregaremos en un cuadro de descripción. Entonces, haz clic derecho en el VBox, agrega otra etiqueta de texto enriquecido, y podemos decir, has sido derrotado Intentamos volver a intentarlo. Claro, vamos con eso, encajar el contenido. Sí. Y luego solo necesitamos un botón aquí en la parte inferior para ir al menú principal. Entonces, haga clic en VBox, agregue un botón de nodo hijo Este botón dirá menú principal. Le voy a adjuntar un guión. Entonces este será un nuevo botón. Bien, a continuación, tomemos aquí este botón y voy a renombrarlo botón de cambio de escena porque vamos a volver al menú principal. Vamos a adjuntarle un guión. Entonces esto será el botón de cambio de escena punto GD. Crea eso. Y queremos agregar Exportar var una misma ruta. Así que en realidad podemos hacer de esto un archivo de exportación, y esto serían citas punto estrella TSCN Bien, entonces nuestra ruta de escena es una cadena y luego en listo nos conectaremos a su señal presionada, así que presionado punto conectar en botón presionado, y luego función subrayado en botón presionado simplemente cambiará a Así que vamos a hacer Gtree punto cambio de escena a archivo, y ponemos en la ruta de la escena, y luego eso va a cambiar nuestra escena actual a la escena del menú principal Como comprobación importante, probablemente ayudaría si decimos afirmar que la trayectoria de la escena está vacía Es igual a false y decir que debe haber una ruta de visión para cambiar cuando se presiona este botón. Bien. Entonces una cosa más que probablemente quiera es un contenedor de margen. Vamos a hacer clic derecho en la pantalla GameOver, agregar un contenedor de margen Voy a ponerlo directamente debajo del contenedor del panel y luego VBox debajo de eso ¿Bien? Así que ahora podemos establecer valores en el contenedor de margen y sobrescrituras de tema, algo así como cuatro para todos los lados, y eso hará que se vea un poco más agradable, dando un poco de búfer para el texto Y nuestro juego a través de la pantalla, tenemos que asegurarnos de que esto abrirá la interfaz de usuario cuando se pierda el juego. Entonces voy a adjuntar un nuevo guión aquí. Juego de interfaz de usuario sobre pantalla. Crea eso. Podría querer un nombre de clase aquí, juego sobre pantalla. Y vamos a obtener una referencia al jugador a través del contexto. Así que en Export vara Context es de tipo player context. Digamos que el subrayado de la función está listo, y listo, haremos estadísticas de puntos del jugador de puntos de contexto, y obtendremos el cambio de Alive Conectémonos a eso y digamos sobre jugador Alive cambió. Entonces tenemos nuestra función subrayado en jugador Alive cambiado. No recuerdo si eso tenía algún parámetro, así que voy a hacer clic en el símbolo Alive cambiado, y lo comprobaremos, tiene el Boole en vivo así que vuelve al juego sobre guión, y lo necesitamos como parámetro aquí Entonces P Alive es un booleano. Esto volverá nulo. Y si P Live es igual a falso, entonces aquí vamos a mostrar todo nuestro menú de juego. Bien, ahora, nuestro estilo de botón de cambio de escena no va a funcionar porque no tenemos escena de menú principal. Así que vamos a crear un marcador de posición. Agrega una nueva interfaz de usuario de escena, y este será el menú principal. Lo guardaré en el proyecto. Entonces, hagamos eso en la raíz del menú principal del proyecto, guárdalo. Y luego en el juego sobre pantalla, asignemos ese menú principal como un camino a la ruta de escena y el botón de cambio de escena así. Simplemente puedes arrastrar y soltar. Esa es la forma más fácil de hacerlo. Bien, también, antes de que me olvide, vaya a la pantalla Game Over y asigne el contexto del jugador. Así que simplemente carga rápidamente ese recurso de contexto de jugador. Ahora queremos ir al mundo. Podemos ver que el juego sobre la interfaz de usuario está ahí mismo. Entonces veamos si podemos probarlo muy rápido. Y asegúrate de que podamos ir al menú principal a través de él. Así que le pegué a Play. Y está ahí mismo. Voy a golpear el menú principal, y eso nos da una pantalla en blanco porque en realidad no hemos agregado nada a esa escena. Es solo un elemento de interfaz de usuario en blanco, esencialmente. Entonces eso en realidad está funcionando. Creo que la otra cosa que queremos hacer está lista para el juego sobre pantalla. Solo asegurémonos de que se esconda. Entonces diremos esconderse listo. En nuestro juego UI Canvas, posible que también queramos ocultarlo allí, pero no hay necesidad necesariamente significa si ayuda. Pero solo lo dejaré visible por defecto para que podamos probar la altura. Entonces se esconde, y ahora solo tenemos que ir a ser derrotados, y debería aparecer si está funcionando correctamente. Entonces dos hits, tres hits, cuatro hits, cinco hits. Ahí está nuestro juego sobre pop up, menú principal, y el flujo está funcionando. Lo último que creo que necesito aquí es solo cambiar el tamaño de esto. Así que llevaré el juego a través de la pantalla dentro de nuestro juego UI Canvas, y tomemos la forma de diseño y llevemos la escala a tres. Eso debería ser lo suficientemente grande. Así puedo probarlo una vez más muy rápido en el juego. Bien, entonces un hit, dos it, tres, cuatro it, cinco hit, game over. Y obtenemos el botón del menú principal. Y ese es el flujo básico. 58. P57 Seguimiento de puntuación alta y visualización de la interfaz de usuario para las derrotas de los enemigos y el tiempo de supervivencia: Uno agradable tener que a nuestro juego le falta es una puntuación alta, poder rastrear a cuántos enemigos hemos derrotado en un juego, y luego recordar esa puntuación en un archivo seguro para una hoja de puntuación alta que pudimos ver en la pantalla del menú principal. Entonces, para implementar eso, primero tenemos que empezar contando cuántos enemigos hemos derrotado cada vez que un enemigo es derrotado. Así que vamos a necesitar alguna combinación de informar sobre el estado de la muerte a un administrador de estadísticas o gerente de puntaje alto, y luego tomar ese valor después de que termine el juego y guardarlo para actualizar el archivo Safe. Así que antes en el curso, agregamos en un juego manager Singleton y nunca realmente hicimos mucho con él De hecho, la forma en que implementé el juego a través de la pantalla terminó simplemente usando el contexto del jugador en lugar de tener que informar directamente sobre el administrador del juego. Así que, en realidad, vamos a darle al administrador del juego algo de un propósito para que podamos usarlo en el curso. Así que tendremos un objeto dentro de un administrador de juego para las estadísticas del juego, y luego lo rastrearemos durante el juego. Y luego lo establecemos cada vez que iniciamos una nueva. Entonces en sistemas, voy a hacer click derecho y hacer un nuevo script. Digamos que son las estadísticas del juego, que serán un ref contado porque en realidad vamos a convertirlo en un hijo del manager del juego Singleton Entonces abre las estadísticas del juego, y luego digamos si nuestros enemigos derrotaron, que será un entero que por defecto es cero, y necesitaremos un nombre de clase aquí arriba en la parte superior Así que las estadísticas del juego. Y luego en game manager, voy a tener una función de inicio, que volverá nula, y eso va a tomar nuestras estadísticas de juego y restablecerla o configurarla en un nuevo objeto. Entonces, para las estadísticas de las estadísticas del juego. Esto va a ser estadísticas iguales a GameStats dot nu. Vamos con eso por ahora. Y cuando el mundo cargue, voy a querer tomar las estadísticas del juego y restablecerlas. Así que vamos a adjuntar un guión al mundo. Todo derecho haga clic aquí, adjunte un guión. Lo pondremos en la escena base. Así que crea eso y voy a decir función lista, y diremos game manager dot SAT. Bien, así que sea lo que sea que necesitemos que cargue nuestro juego al inicio, solo tendremos eso ahí. Así que mientras estemos usando el script world aquí, entonces podremos manejarlo. También podemos querer darle a esto un nombre de clase. Podría terminar siendo un guión bastante importante si fuéramos a continuar con la serie. Entonces creo que merece el mundo del nombre de clase. Así que ahora, cada vez que iniciamos un nuevo juego, esencialmente va a restablecer las estadísticas. Y entonces tal vez reportar juego terminado. Podríamos considerar entrar aquí un poco más tarde y guardar estadísticas de puntaje alto como hacer. Bien, ahora quiero modificar nuestras estadísticas, y quiero reportar cada vez que se modifiquen nuestras estadísticas. Entonces, en las estadísticas del juego, crearemos una señal para nuestros enemigos derrotados. Así que los enemigos de señal derrotados, cambiados. Tomaremos una cantidad y un entero como parámetro, y seguiremos un patrón similar donde cada vez que actualicemos el valor, y nos protegeremos de si son los mismos valores. Yo enemigos derrotados es igual a valor, solo regresamos. De lo contrario, estamos estableciendo un nuevo valor. Entonces los enemigos derrotaron a igual valor, y luego decimos enemigos derrotados cambiaron punto m con un nuevo valor. Bien, así que justo cuando actualizamos la propiedad, reportamos con una señal para que podamos observar la propiedad. Y creo que eso es todo lo que necesitamos para configurar una interfaz de usuario. Bien, entonces ahora que eso está ahí, siempre que tengamos el estado de la Muerte en, digamos, nuestro orco o nuestro esqueleto, saltemos al guión del estado de muerte Entonces, en nuestro estado de Muerte, estoy pensando en Enter tiene más sentido por decir estadísticas de puntos del manager del juego, EMS derrotado más es igual a uno, y así es como actualizaremos ese contador haciendo un seguimiento de todos los enemigos que hemos derrotado. Ahora lo último que necesitamos es un poco de UI para mostrar a cuántos enemigos hemos derrotado y así dentro de nuestro juego UI Canvas, agreguemos otro vamos a convertirlo en un contenedor de panel. Agrega el contenedor del panel hijo aquí, y pondremos el diseño como los anclajes en la parte superior derecha Lo estiraré un poco así. Desplazarlo. Déjame nombrar esto para que sea la vista de estadísticas del juego. Luego haga clic derecho en guardar una rama como escena y la interfaz de usuario, por supuesto, salte a la escena, y hagamos clic derecho en ella y le demos un guión. Entonces esta será la vista de Gamestts. Puedo darle el nombre de la clase, vista de gamests. Y en la vista de dos D donde la editamos, agreguemos una etiqueta para nuestros verdaderos enemigos derrotados. Así que haga clic derecho en Agregar nodo hijo. Empezaremos con un contenedor HBox, creo, y luego haremos clic derecho en Nodo Achil, etiqueta de texto enriquecido Yo sólo duplicaré eso. Entonces el primero será para mostrar el texto, y luego el segundo será el número. Entonces esta será la etiqueta stat. Y luego la de abajo será la etiqueta de cantidad. Bien. Entonces el sello del SAT va a mostrar consistentemente a los enemigos derrotados, dos puntos, vamos a encajar al contenido. Y luego el segundo, voy a verter corchetes, cero. Entonces eso es solo un marcador de posición. Y creo que necesitamos que estas se estiren para que podamos verlas de verdad. Así que intentemos ir a layout, dimensionamiento de contenedores y expandirnos en la horizontal. Sí. Y luego etiqueta de cantidad, lo mismo. Ir a maquetación. Dimensionamiento del contenedor, expandir en el, expandir en la horizontal. Bien, entonces ahora esto es algo así como lo que tenemos ahora mismo. Bien, entonces ahora toma las estadísticas del juego hit Q para entrar en modo selecto, y lo reduciremos a lo que necesitemos. Un contenedor de margen también estaría bien aquí, así que haré clic derecho y agregaré un contenedor de margen secundario, y pongamos contenedor HBox debajo de eso en el contenedor de margen El tema anula las constantes y tal vez cuatro píxeles en cada lado. Eso se ve mucho mejor. Creo que eso podría ser lo suficientemente funcional por ahora mismo. Volveré al juego UI Canvas y me aseguraré de que esto vuelva a estar en la esquina superior derecha como un ancla, arriba a la derecha, y luego lo compensaré golpeando W para moverlo Entonces sólo tienes que moverlo un poco hacia abajo de la esquina. Bien. Y luego necesito en el guión de GameSTTS view, necesito conectarme realmente a la señal en los Así que la función subrayado ya. Vamos a hacer manager de juego estadísticas de puntos puntos enemigos derrotados cambiaron conectar a enemigos derrotados cambiados. Voy a tomar ese nombre y hacer una nueva función aquí abajo, función sobre enemigo derrotado cambiado, que va a tomar la cantidad P y retorno entero void, y vamos a actualizar el valor ahí. Bien, así que básicamente tomamos la nueva cantidad y ponemos a la etiqueta. Así que en Export VR. Entonces de todos modos, tomamos a nuestros enemigos derrotados etiqueta, y establecemos el texto igual a una cadena de la cantidad y eso es más o menos eso. Sólo necesitamos dos puntos aquí al final. Tal vez en listo, queremos afirmar que existe la etiqueta derrotada del enemigo Debe establecer la etiqueta de enemigos derrotados para mostrar el conteo o el montaje de enemigos derrotados. Seremos un poco más precisos. Ahora, haz clic en la Vista de estadísticas del juego, salta a la escena. Y dentro de aquí, queremos asignar esa etiqueta de cantidad. Así que haz clic en asignar y elige la etiqueta de cantidad. Y si lo tengo bien, eso debería ser todo aquí. Así que vamos a jugar y darle una oportunidad. Todo lo que tenemos que hacer es derrotar un par de enemigos y verlo aparecer en la parte superior derecha. Entonces el problema aquí es que las estadísticas no se inician en nada, así que quiero hacer clic con el botón derecho en el símbolo de Lou supongo que el problema aquí es que las estadísticas podrían no establecerse antes de que se ejecuten listas en la interfaz de usuario, ya que esa es la cima del mundo, supongo que los niños listos primero. Entonces, una mejor manera de hacer esto, supongo, sería decir que las estadísticas son iguales a gamestts dot u Así que esto siempre se creará cuando comience el juego. Así que esto siempre se creará cuando comience el juego Y luego queremos llamar a stats dot reset. Así que solo haremos una nueva función para eso. Esto también significará que no necesitamos reconectar señales porque todavía estamos usando el mismo objeto Entonces en realidad es una mejor manera de hacerlo. Vamos a saltar a las estadísticas del juego y crear nuestra función de reinicio. Entonces restablecer la función. Simplemente llevamos todo de vuelta a sus valores predeterminados. Entonces enemigos derrotados es igual a cero, y eso debería ser todo lo que necesitamos para ahora mismo. Por lo que ahora las estadísticas deben establecerse tan pronto como comience el juego antes de que el mundo esté incluso cargado. Y luego a partir de ahí, deberíamos poder conectarnos a la señal. Bien, intentemos una vez más. Bien, juega. Bien, tenemos un conteo en la parte superior derecha. Por supuesto, es demasiado pequeño, pero al menos podemos ver eso. Así que vamos a derrotar a un orco y asegurarnos de que está funcionando. Y ahí tenemos uno para aparecer si matamos a otro tipo. ¿Bien? Ahí tenemos tres. Entonces sí, el conteo está funcionando seguro. Solo necesito escalar la interfaz de usuario. Entonces en jugabilidad Canvas, simplemente haremos eso aquí. Una escala de transformación simple de tres. Mueva eso a la derecha aquí. Y ahora tenemos que cortar realmente gran parte de este espacio extra. Eso es simplemente tomar demasiado sin motivo alguno. Entonces voy a necesitar un poco de edición ahí. Vamos a saltar a la vista de los juegos. La etiqueta de cantidad, en realidad voy a cambiar eso de nuevo a cero sin los corchetes para que antes de derrotar al primer enemigo, no tenga ninguna exhibición torpe Bien, ahora para que el tamaño sea demasiado grande, creo que mucho de eso es solo que configuro manualmente los gamests view size Así que vamos a reducir eso por aquí a lo que realmente necesitamos. Así que podemos hacerlos mucho más pequeños. Y esta segunda vista no necesita ser casi tan grande como la primera. Entonces no hay razón para que ocupen la misma cantidad de espacio. Creo que lo que en realidad podríamos querer es más un contenedor de flujo. Permítanme cambiar el tipo de contenedor de caja H a un contenedor de flujo H de flujo. Bien, ahora bajaré a la etiqueta de cantidad, y desmarquemos expandir aquí Y luego intentemos tomar el tamaño mínimo personalizado y configurarlo a, como, 40 píxeles, probablemente lo suficientemente grande, para que pueda aguantar hasta los mil dígitos por lo menos. Y entonces el resto del espacio va a ser ocupado por el enemigo derrotado. También cambiemos la vista en la base a nuestro tema predeterminado de Tema de juego de carga rápida. Sí, bien, eso va a tener un gran impacto, también. Entonces ahora, si lo miramos, realidad puedo reducir esto. Debería haberlo hecho al principio, de verdad. Entonces algo así, ese es nuestro espacio para la etiqueta y el número de ahí. Podemos ir al juego jugar UI Canvas y podemos reducir esto drásticamente. Se puede ver que todo lo que no es ese píxel del lado derecho solo es consumido por la etiqueta de texto de la izquierda. Entonces es mejor si ambos elementos no están tratando de ocupar una parte igual del tamaño de la vista, sino que uno es como un tamaño estático, y el resto simplemente se expande. Y luego voy a poner esto un poco más en la esquina de allá. Le pegaremos a Play. Y mira cómo resulta eso. Bien, eso es mucho mejor, talla más apropiada. Entonces, claro, sólo para volver a probar. Simplemente vamos a derrotar a un tipo, y eso se actualiza, así que tenemos a nuestros enemigos derrotados contar. Entonces agreguemos una estadística más, que es cuánto tiempo ha sobrevivido nuestro jugador en el juego, otra estadística útil para tener y buena para nuestro puntaje más alto. Entonces en nuestra vista de Gamests, voy a duplicar este contenedor HBox Ahora vamos a necesitar un contenedor VBox para que puedan superponerse uno encima del otro Haga clic derecho en Contenedor de margen, agregue una VBox. Mueve ambos cuadros H debajo de él, así, y ahora cambia la etiqueta de estadísticas de la izquierda al tiempo sobrevivido colon. Y si entramos en GameStatsVew, va a ser una Simplemente nos conectaremos a las estadísticas de cuánto tiempo hemos vivido y mostraremos que en el tiempo sobrevivió el área. Entonces, hagamos clic derecho en Estadísticas, busquemos el símbolo y abramos eso. Así que vamos a tener var tiempo sobrevivido, que es un flotador igual a 0.0. Vamos a establecer el valor en él. realidad no deberíamos necesitar a este guardia. Es sólo un extra. Así que voy a decir que el tiempo sobrevivió equivale a valor. Y luego, por supuesto, el tiempo sobrevivió, cambió emite, el tiempo sobrevivió. Y entonces tendremos esa señal aquí arriba en la parte superior. El tiempo sobrevivió, cambió. Lo cual va a ser una carroza del tiempo. Bien, entonces toda la razón para tener este guardia es que si por alguna razón, algo en el juego puso el valor al valor que ya está en, como, enemigos derrotados era 50, y ahora son 50 otra vez. Yo activaría una actualización adicional de la interfaz de usuario. Pero honestamente, antes que nada, es poco probable que eso suceda. Y segundo, en realidad no debería hacer un gran problema con nada. Entonces es más de solo por tecnicismo. Solo se cambia si el valor realmente cambió en lugar de realmente un problema para el juego. Entonces solo quería aclarar eso. Bien, ahora, nuestro reinicio también necesita tomar tiempo sobrevivido y establecer eso igual a 0.0 porque estamos reiniciando el tiempo Bien, ¿entonces vamos a ver qué más? En nuestro mundo de juego, estoy pensando que queremos incrementar el tiempo Entonces, cuando el mundo esté funcionando, tendremos un proceso de subrayado de función Va a tomar el manager del juego dot stats dot TV plus iguala al Delta. Pero esto solo puede ocurrir realmente mientras el jugador esté vivo. Así que vamos a hacer Exportar para el contexto en Exportar contexto VR, contexto de jugador. Puedes ver dónde estamos usando este recurso de contexto en todo el juego en diferentes lugares. Por lo que tener eso como un recurso guardado, es sumamente útil para poder difundir la referencia para toda nuestra interfaz de usuario y otros nodos que necesitan hacer referencia al jugador sin tener directamente referencia de escena al jugador. Entonces ojalá, he dejado claro lo útil que puede ser eso. Entonces tenemos el contexto del jugador, y solo queremos incrementar el tiempo sobrevivido si el jugador está vivo. Entonces, si contact dot player dot stats dot Live, entonces incrementaremos el tiempo De lo contrario, sólo vamos a saltarnos eso. Y eso debería ser lo suficientemente bueno por ahora necesito una referencia a la nueva etiqueta de cantidad. Entonces diremos en Export var, Time label es una etiqueta de texto enriquecido, y esta es la vista GameSts, por supuesto Así decir manager del juego estadísticas punto punto Tiempo sobrevivir cambio punto Conectar, en el tiempo sobrevivir sobrevivió, cambiado. Y solo tenemos otra devolución de llamada aquí abajo. La función en el tiempo sobrevivió cambió, obtiene el flotador PT. Vamos a regresar void, y luego colocamos el texto en la etiqueta. Entonces, el texto de punto de etiqueta de tiempo va a ser igual a una cadena del PT, y eso probablemente sea lo suficientemente bueno. Yo solo haré una afirmación en la etiqueta de tiempo también. Asegúrate de que esté listo. Necesita establecer la etiqueta de tiempo para actualizar el tiempo sobrevivido. Bien. Y en nuestra vista de Gamests, asignemos esa otra etiqueta de cantidad Es posible que queramos cambiar el nombre de estos contenedores HBox. Por lo que el primer contenedor fue el contenedor derrotado del enemigo. Y entonces el segundo es el contenedor de tiempo sobrevivido. Entonces solo aclarando cuál es cuál. Asegurémonos de que esté en la interfaz de usuario del juego. Vamos a salir al mundo, a ver que sigue ahí. Golpea play para probar y correr y ver cómo va a quedar eso. Ah, bien, entonces no he establecido el contexto en el mundo, claro. Entonces en el nodo mundo, tenemos que cargar rápidamente el contexto del jugador. ¿Bien? Y ahora, si corremos, el tiempo debería poder incrementarse Y luego tenemos el tiempo allá arriba en la parte superior derecha. Ahora bien, esto está funcionando mayormente. Creo que aquí hay un par de temas. Uno, parece que necesitamos expandir esto un poco más grande verticalmente. Oh, bonito. Cuando el juego es positivo, también se detiene. Eso es importante. Y luego, en segundo lugar, no creo que necesitemos mostrar todos los milisegundos. Creo que reducir esto a un decimal sería un poco menos estresante para los ojos. Se puede ver que el segundo y tercer decimales están volando Ni siquiera lo puedes leer . Entonces no tiene sentido mostrar esa información. Bien, entonces para cambiar nuestra función de configuración de texto, vamos a hacer cotización por ciento uno F. Así que esto nos va a dar el valor flotante con una posición decimal, y luego damos un símbolo de porcentaje para que agreguemos la variable PT para configurar realmente esa cadena. Bien, y ahora podemos golpear play y veremos que el tiempo sólo muestra el primer decimal. Eso es diez veces más legible y menos distrae. Mejoras mayores. Entonces creo que eso se ve genial para nuestras estadísticas de juego. Creo que lo único que podría cambiar es poner el tiempo sobrevivido en la parte superior y el enemigo es derrotado en parte inferior y golpear play una vez más. Creo que eso sólo va a quedar un poco mejor. tiempo sobrevivió. Creo que quiero la más llamativa en la parte superior derecha, y luego las otras estadísticas más menores que muestran debajo de ella, las que van a actualizar menos Sólo una menor preferencia visual ahí. Bien. Y sólo para mostrar, todavía podemos derrotar al orco, y eso contrarresta funcionando Entonces las estadísticas del juego son buenas en la jugabilidad al menos. 59. P58: cómo guardar y cargar notas altas con JSON: Bien, ahora que nuestras estadísticas de juego están funcionando, queremos tomar eso y en la derrota, queremos actualizar las puntuaciones altas y guardarlas en un archivo JSON. Entonces esto sería básicamente el inicio de un sistema de ahorro de carga. Y este tipo de juegos, específicamente, no hay tanto un estado guardado como solo puntuaciones altas, aunque, pero el proceso sería muy similar si necesitabas guardar un archivo de juego. Básicamente, necesitas serializar los datos en un archivo, y una de las formas más convenientes hacerlo es el formato JSON Entonces, para guardar y cargar los datos, quiero tener un objeto save load. Ahora, normalmente, haría de esto un sistema separado, pero la única vez que necesitamos guardar los datos es cuando nuestro personaje es derrotado, y vamos a manejar eso a través del manager del juego. Así que en realidad solo voy a en sistemas, crear un nuevo script, y voy a llamarlo guardar carga. No voy a llamarlo sistema porque esto es más un componente para el propio manager del juego. Y esto será contado ref. Así que voy a crear ese guión. Ampliemos los sistemas. Ábrela. Podríamos darle el nombre de clase save load. Y vamos a necesitar dos funciones aquí función guardar estadísticas, y esto va a tomar las estadísticas actuales del juego como parámetro. Entonces las estadísticas de las estadísticas del juego, y volveremos anuladas aquí. Entonces esto tomará las estadísticas actuales y convertirá en un diccionario de datos, y luego serializaremos esos datos Así que los datos de VR son iguales a y voy a poner en y voy a poner entre llaves aquí en Colón, estadísticas punto dos diccionario. Ahora bien, este método, por supuesto, no existe. Eso lo escribiremos en un minuto. Y una vez que tenemos los datos en un diccionario, este es un diccionario de datos, por cierto, podría dejarlo más claro declarando ahí el tipo Pero siempre que veas estas llaves y guión GD, estás hablando de un diccionario Entonces a continuación convertimos esos datos en una cadena JSON. Entonces eso es muy sencillo de hacer también. Vamos a decir var cadena JSON va a ser igual a JSunnu. Así que tenemos un nuevo objeto JSON que nos permite llamar a esta cadena de método Pi en nuestros datos, y eso lo convierte en un formato de cadena JSON legible JSON. Así que ahora necesitamos abrir la ruta del archivo. Así que vamos a decir var archivo va a ser igual a fileaccess punto OP Entonces esta es otra clase estática en la biblioteca de Godo, y necesitamos darle una ruta y luego acceso al archivo de derecho Entonces diremos Save File path, que aún no hemos definido, y luego queremos acceder aquí. Entonces, ¿de dónde vamos a conseguir la ruta de archivo segura aquí arriba en la parte superior? Vamos a decir var, guardar ruta de archivo es una cadena. Esto será igual al usuario slash LASH gametatt JSON. Bien, entonces lo que básicamente significa este Fópata es que va a guardar en los datos de la aplicación, asumiendo que estás en Windows, para este proyecto de juego específico, en la raíz de esa carpeta, habrá un nuevo archivo llamado gamesatt Entonces cada juego hecho en GADO tiene una carpeta de usuario en Windows, esa es la barra de datos de la app Gdolah el nombre de tu proyecto, creo Y luego va a guardar GameStatst JSON en la raíz. Así que este archivo JSON es efectivamente tu archivo guardado. Para un juego de supervivientes, el archivo say es realmente solo tus estadísticas altas porque cada vez que comienzas un nuevo juego, tienes un nuevo personaje, no guardas y cargas el juego como lo harías con un típico juego de rol. Pero el proceso es más o menos el mismo. Entonces, si el archivo existe y tuvimos que abrirlo para escribir, ¿correcto? Entonces, si no lo encontramos, entonces debe haber habido un error. Pero si lo encontramos, diremos file dot store string porque tenemos una cadena JSON ahí arriba, bien, así que solo almacenamos la cadena JSON en el archivo, y luego hacemos file dot Close. Y así es como escribes al expediente. Y de lo contrario, si la operación correcta está fallando, entonces queremos empujar y error, claro. Así que el error push va a ser fallido al abrir el archivo sa para su escritura, y podría decir en path, por ciento s, y vamos a hacer y las citas Entonces por aquí, por ciento guardar ruta de archivo. Así que dando tanta información como podamos, y luego podemos depurar a partir de ahí si hay algún problema. Por supuesto, hay que deletrear correctamente el error porti. Eso ayudaría, y esa es la función segura. Bien, ahora queremos hacer nuestra función de estadísticas de carga. Así que la función carga las estadísticas, y vamos a tener el objeto stats en el que estamos cargando los datos. Entonces las estadísticas son de tipo estadísticas de juego. Por supuesto, obtenemos esto del manager del juego más tarde. Y primero, queremos abrir el archivo para que R acceda. Entonces el archivo VR es igual a Dios, no puedo escribir en este momento. El archivo VR es igual al punto de acceso al archivo OP en la ruta de guardado del archivo Así que estamos cargando y guardando en la misma ruta de archivo. Y luego tenemos Fleaccess dot RED. Entonces nos vamos. Entonces digamos, si no es archivo, así que no pudimos abrir, entonces podemos decir, error push, falló al abrir archivo para leer en Path porcentajes, porcentaje, guardar ruta de archivo De hecho, podríamos incluso querer hacer de esto un booleano. Entonces si lo hacemos un booleano, entonces podemos devolver falso aquí, como en fallamos la operación Eso podría ser un poco más útil. Posteriormente, puedes cambiar Safsts para hacer lo mismo si quieres Y estamos devolviendo false, no literalmente la palabra clave así que en este punto, nuestros archivos se abren para el acceso de lectura. Así que ahora necesitamos obtener la cadena del archivo JSON. Entonces nuestro JSOText es igual al punto de archivo Obtener como texto. Bien. Y la razón por la que no se muestra es probablemente porque no escribí esto aquí. Entonces podría decir acceso a archivos. Veamos, ahí también hay que subrayar el texto JSON , y podemos seguir adelante Entonces tenemos el texto del archivo, así que terminamos con el archivo. Cerremos el archivo, cierre el filete. Si el archivo está vacío, entonces podemos regresar aquí. Entonces el texto de punto JS está vacío. Entonces puedes devolver verdadero o falso aquí. Depende de lo que quieras. Voy a devolver true, en realidad, para que podamos indicar que la operación tuvo éxito, pero no hubo datos para cargar. Entonces diremos que carga los datos de estadísticas en el objeto de estadísticas del juego. Entonces si el archivo no está vacío, sin embargo, entonces necesitamos convertirlo. Entonces var JSON va a ser igual a Jsunt Nu. Entonces tenemos un nuevo objeto JSON, y luego queremos analizar el texto. Entonces digamos que var error es igual a json punto parse en el texto JSON. Entonces, si hay algún problema con eso, devolverá un error. Entonces si error, entonces queremos empujar error, falló al analizar JSON con porcentajes de error, y diré porcentaje de error Creo que eso podría agregar alguna información extra útil. Y luego devolvemos falso aquí porque, por supuesto, si erró al analizar el archivo, entonces hay un problema importante con nuestro archivo SAI Probablemente no estaba formateado correctamente. Bien, entonces si no hubo error, sabemos que el parse funcionó correctamente, así podemos decir var. Un dato del diccionario es igual a json dot g data. Así que básicamente lo estamos convirtiendo en el formato GidorCognized como diccionario Y entonces diremos Varsats data es un diccionario igual a datos punto Obtener en cotización Estadísticas, creo Y el predeterminado aquí es un diccionario vacío. Para que las estadísticas coincidan con lo que tenemos aquí arriba. Guardamos las estadísticas en el par de valores clave de estadísticas, y necesitamos recuperarlas del par de valores clave de estadísticas. Entonces, una vez que tenemos nuestros datos de estadísticas reales, que es un diccionario, entonces podemos hacer estadísticas punto From dict para diccionario, y vamos a pasar los datos de estadísticas. Y eso es todo lo que tenemos que hacer para nuestra carga, así que volvemos verdad. Bien, creo que eso se ve bastante bien. Entonces lo que necesitamos ahora es un diccionario de dos y del método de diccionario para nuestras estadísticas de juego. Entonces, si abrimos las estadísticas del juego, digamos function to dict devuelve un diccionario, y luego la función de dict va a tomar un diccionario de datos y devolver void. Entonces, para convertir esto en un diccionario, necesitamos un diccionario VR como ese va a ser igual a un nuevo diccionario. Y entonces, en realidad, ya sabes, dentro de aquí, podemos simplemente envolver todo esto en una sola cosa y poner cada nuevo par de valores clave en una nueva línea. Entonces diremos enemigos derrotados es igual a enemigos derrotados. CD de dos puntos para el par de valores clave. A la izquierda, tienes el nombre de la cadena y a la derecha, tienes el valor real. Entonces a la izquierda aquí, tenemos tiempo sobrevivido. Y luego dos puntos, y hacemos tiempo sobrevivido a la variable de la derecha, y luego volvemos el diccionario. Y es realmente así de simple. Entonces siguiente para del diccionario, queremos cargar los valores antiguos en los valores actuales. Entonces vamos a hacer enemigos derrotados, igual a p data dot git, el valor clave par enemigos derrotados. Y luego el valor por defecto, vamos a hacerlo nulo para que si no hay ese valor, en realidad golpeamos un error porque lo contrario lo cargaríamos a algo como cero, y eso anularía permanentemente todos nuestros datos guardados. Algo discutible en qué dirección quieres ir aquí. Al igual que, ¿quieres que falle inmediatamente la carga de guardado, o quieres que tenga éxito pero luego anule los datos reales antiguos, lo que realmente no suena muy deseable, verdad? No quieres anular el progreso del jugador. Entonces tal vez sería más como necesitas lanzar un hot fix o algo así. Si te encuentras con esta circunstancia donde el JSON simplemente no se cargó correctamente, no tienes este campo, le falta el nombre, algo así. Entonces por eso estoy yendo hacia más como, Oh, debería ser nulo. Entonces, cuando intenta establecer el flotador en un nulo o el entero en un nulo, vas a golpear un error, y tiene que ser arreglado o de otra manera va a romper todos los juegos de tus jugadores. Creo que ese es probablemente el camino a seguir aquí. Entonces el tiempo sobrevivido va a ser igual a pdta dot get on time survived as a string, y entonces el valor predeterminado es Bien, entonces tenemos las estadísticas del juego Actualmente, las únicas estadísticas del juego son nuestras estadísticas principales del juego, nuestras estadísticas actuales del juego, pero también queremos tener estadísticas de juego persistentes, nuestras estadísticas de juego de puntuación más alta. Entonces quiero poner una función aquí para tomar el valor más alto al comparar con las estadísticas de un juego actual. Entonces voy a decir función establecida al más alto, digamos, establecer puntajes altos. A la P estadísticas actuales del juego, y esto va a ser turno nulo. Entonces solo vamos a llamar a esto en nuestras estadísticas de juego de puntuaciones altas, pero esto va a ser básicamente tomamos el mayor de los dos valores. Por lo que los enemigos derrotados van a ser iguales al máximo de enemigos derrotados o los P actuales puntos enemigos derrotados. Bien, entonces solo estamos tomando el valor más alto, y lo estamos estableciendo a los enemigos enteros derrotados. Y hacemos lo mismo con el tiempo sobrevivido. El tiempo sobrevivido es igual a máx. El tiempo sobrevivió y el tiempo de punto actual P sobrevivió. Bien, así es como conseguimos los puntajes más altos. Simplemente comparamos las estadísticas actuales al final del juego y vemos si eso es más alto que nuestros puntajes altos actuales. Así que necesitamos el objeto guardar carga, y también necesitamos las estadísticas de juego de puntuación más alta en nuestro gestor de juegos. Entonces abramos ahora al manager del juego. Gestor de juegos punto GD. Entonces también tendremos aquí las estadísticas var high score, que va a ser un GameStnu y también tendremos aquí la var saveoad que va a ser igual a nuestro objeto save Entonces este es solo un componente local de nuestro manager de juegos. Incluso podríamos hacerlo privado. Sí, ¿por qué no? Hazlo privado. Porque realmente la lógica saveoad aquí, solo queremos pertenecer al manager del juego En realidad no es algo que otros guiones deban estar tocando, así que lo hacemos privado. Entonces esta función aquí, digamos función End Game, creo que es un poco de un mejor renombrar. Eso será a su vez nulo. Entonces, al final del juego, queremos tomar nuestras estadísticas de puntaje alto, y queremos establecer puntajes altos con nuestras estadísticas actuales. Y entonces podríamos querer restablecer las estadísticas actuales, pero en realidad no voy a hacer eso porque es posible que queramos mostrar en el menú principal del juego cuáles fueron las puntuaciones de la última sesión, así que en realidad no reiniciaremos hasta que iniciemos correctamente el juego nuevamente. Creo que eso es un poco mejor. Ah, y por supuesto, después de establecer las puntuaciones más altas, queremos llamar a guardar estadísticas de guardar punto de carga. Entonces vamos a guardar las estadísticas de puntuación más alta. Y pienso en listo. Sí, en función Listo. Y recuerda, esto es Auto Load Singleton, así que en cuanto comience el juego, ya se va a cargar Y quiero hacer subrayado guardar las estadísticas de carga de puntos de carga en las estadísticas de puntaje alto Y si, eso en realidad se encarga del resto. Entonces, la cola lógica para guardar y cargar está básicamente oculta dentro de ese objeto de guardar carga o más como encapsulado, realmente. Entonces, toda la carga guardada está dentro de aquí, pero el administrador del juego en realidad maneja cuándo debería guardar y cargar esos datos. Y puedes ver esto hace que el manager del juego sea mucho más fácil de leer porque dividimos sus funciones en diferentes componentes lugar de abarrotar todo en un guión gigante del administrador de juegos Entonces este video va un poco largo, así que haré el siguiente video sobre la construcción de la pantalla del menú principal. Ya tenemos la plantilla para ello porque nuestro juego sobre botón salta hasta aquí, pero aquí no hemos configurado nada. Entonces conectaremos esto a las estadísticas de puntaje alto , tendremos una pantalla, un botón Iniciar juego y un fondo de pantalla de inicio de algún tipo. 60. P59: diseño de un menú principal con pantalla de alta puntuación y funcionalidad de inicio del juego: Va a tomar el diseño en el contenedor High Scores, y vamos a ponerlo en los anclajes de arriba o derecha. Entonces puedo acercar el zoom. Voy a golpear Q para mover esta posición por ahí. Estiremos nuestro contenedor de puntuaciones altas, y luego construiremos algunos otros nodos de control aquí. Entonces voy a hacer clic aquí, agregar un nodo hijo. Digamos Contenedor de Margen. Misma historia con contenedor Margin. Queremos una anulación de tema, cuatro píxeles en todos esos. Y luego para ahorrar algo de tiempo, supongo que podríamos ir a la vista de Gamesets Y voy a copiar pegar ese tiempo sobrevivió y enemigos derrotados. Sólo voy a controlar ver todo y vamos a pegarlo en el menú principal. Entonces dentro de ahí. Y sí me olvidé de un contenedor VBox, así que agrega un contenedor VBox y luego mueve esos dos contenedores de texto debajo de él. Así. Y entonces así es más o menos cómo va a quedar ahora mismo. Guardemos el contenedor de puntuaciones altas en su propia escena, haga clic derecho, digamos escena branchien, así Y luego quiero tomar el layout transform y triplicar la escala, así. Bien, así que cuando hagamos eso, va a meterse un poco con nuestro preset de Anchors, así que solo voy a posicionar esto por ahí No hace falta que sea realmente perfecto. También abramos el contenedor de puntuaciones altas y agreguemos un texto de título. Entonces acercando aquí en el contenedor VBox, haré clic derecho y agregaré una etiqueta de texto enriquecido Y coloquemos esto encima del contenedor VBox. Revisa el contenido de Fit, y digamos puntuaciones altas, pero voy a prefacio eso con, digamos, arcoiris Terminar los corchetes, ir al final Arco iris. Por supuesto, para que esto funcione, necesitamos verificar el código BB habilitado, y ahí obtenemos un arco iris predeterminado. Entonces creo que quiero bajar la frecuencia y hacer que eso sea menos dramático. Entonces digamos que la frecuencia es igual a 0.5. Bueno, vamos al 0.25 par. Sí. Eso es mucho mejor. Y entonces necesitamos SAT para la saturación. Entonces digamos saturación de 0.2, tal vez 0.5. Bien, eso es un poco domador. Entonces eso es bueno. Y haremos centro de alineación horizontal. Bien, eso no está tan mal. Entonces en el menú principal, podemos ver cómo va a quedar eso. De vuelta en el contenedor de puntuaciones altas, vamos a asignar la etiqueta correcta. Entonces Max etiqueta derrotada es la etiqueta de cantidad debajo del contenedor derrotado del enemigo. Y entonces la etiqueta más larga sobrevivida está en el contenedor de tiempo sobrevivido. Bien, guarda eso, y de vuelta en nuestro menú principal, necesitamos un fondo de textura. Entonces voy a hacer click derecho en el menú principal. Agreguemos un acto de textura. Voy a renombrarlo para que quede destrozado de fondo. Volveremos a eso. Además, en la pantalla del menú principal, queremos asegurarnos de que apagamos el filtrado del mouse. Así ratón a la derecha, giramos filtro para ignorar. Eso es importante. De lo contrario, el menú principal bloquearía realmente los botones debajo de él. Así que agreguemos un botón ahora para nuestro juego de Inicio. Entonces agrega un botón. Cambiemos el nombre de eso al botón Iniciar juego. Y si recuerdo, solo tengo un guión que puede cambiar de escena de inmediato. Entonces botón de cambio de escena, voy a arrastrar y soltar esto justo en el botón Iniciar juego. Y entonces tenemos que darle el camino de escena del mundo. Entonces, en la parte superior derecha, ruta de escena, seleccione TCN de punto mundial, y ahora ese botón debería poder abrir el mundo, que es nuestra escena de juego Este botón es realmente pequeño, por supuesto, así que tenemos que ir a maquetación. Y yo triplicaré la escala aquí abajo. También lo coloquemos en anclas y luego digamos fondo central. Podemos acercarnos aquí. Voy a pegarle a W. Vamos a compensarlo hasta aquí. Vamos a darle el texto Iniciar juego, y es posible que también queramos seleccionar un icono. Así que hagamos icono como textura atlas, carga rápida y atlas de nuestro proyecto de juego. Yo haré 64 o 64. Dit región y simplemente elige el ícono que te guste para comenzar el juego. Entonces no lo sé. Ya que se trata de un juego basado en combate, tal vez una de estas espadas sería buena Así que voy a agarrar esto, asegurarme de obtener todos los píxeles. Entonces necesito estirar esto hacia la izquierda, golpear cerca. Por si acaso también revisaré el clip del filtro. No queremos que los píxeles de borde entren ahí. Entonces ese es básicamente nuestro juego de inicio. Botón vamos a W y asegúrate de que esté dentro de los límites de nuestro menú principal Vayamos también a Project, y tomaremos el menú principal y haremos que sea nuestra escena de lanzamiento del juego. Entonces en general Run, en vez de lanzar el mundo ahora, vamos a cargar. El menú principal puntea TSCN. Bien, ahora veamos en qué parte estamos. Voy a golpear play. la puntuación más alta ahí arriba, tenemos Start Game. Vamos a golpear Start Game, que lanza nuestra escena principal de juego. Eso es lo que esperaríamos. Y muy rápido, en realidad, vamos a ser derrotados para que podamos ver la puntuación más alta en nuestro menú principal. Por supuesto, cambié el nombre del Game Manager dot report game over, así que tenemos que cambiar esto a game manager dot end game Eso es sobre el jugador derrotado estado. Bien, ahora vamos a lanzar una vez más. Así que solo me aseguraré de que me derroten una de estas obras, tres hits, cuatro hits, cinco hits. Y veamos. Los jugadores ya fueron liberados. Está en la nota Mundial porque en realidad liberamos al jugador También tenemos que decir aquí por los mundos. Si la función de proceso, donde estamos agregando el tiempo sobrevivido, tendremos que decir si contexto fuera jugador. Y vamos a tener que decir no es igual a nulo. Creo que para referencias previamente liberadas, si solo haces Context Out player, eso seguirá golpeando un error, pero si dices que no es igual a null, entonces eso va a sortear eso Bien, así que básicamente, si el jugador ya no existe, o el jugador ya no está vivo, entonces vamos a agregar tiempo sobrevivido a las estadísticas del juego. Ya que el jugador fue removido, esto manejará esa parte de ella, y deberíamos estar bien para ir. Bien, entonces una jugada de bateo más, asegurándose de que eso realmente funcione. Oh, podemos ver que la puntuación más alta actualizó aquí, sin embargo, así que eso es bueno. Es posible que necesitemos cambiar un poco el tamaño de la interfaz de usuario. Como pueden ver, el problema aquí, está mostrando como 12 decimales, así que vamos a cambiar eso en un minuto. A ver si podemos ser derrotados más rápido que 7 segundos. Bien, vamos. Uno, dos, aguanta. Actualiza este equipo y falló. Bien. Entonces tenemos que encontrar otro enemigo o dos. Ahí vamos. 12 segundos. Menú principal. Puedes ver que nuestra supervivencia más larga ahora es de 12.6 segundos. Enemigos derrotaron a dos. Y vamos a cerrar el juego y darle a play. Eso verificará que la carga desde el archivo esté realmente funcionando. Así que vamos a cerrar y golpear play. Puede que aún no lo haya configurado. Es interesante ver si tiene o no. Bien, entonces sí, cuando se carga el juego, el manager del juego es, como, una de las primeras cosas en cargar, y ya carga en la puntuación más alta lo que guardó la puntuación más alta del archivo es. Bien, así que como un momento genial para mostrar dónde está eso, presentemos los datos de la aplicación en Windows File Explore, y luego queremos encontrar a Godot Y luego creo que son los datos del usuario de App, el último proyecto Script Survivor's GD script Y justo aquí tenemos a ArjSoFle. Bien, así que vamos a editar en el Bloc de notas. Y ahí se puede ver ahí mismo. Nuestras estadísticas reales del juego guardadas en un archivo. Tenemos enemigos derrotados en dos ocasiones que sobrevivieron a las 12.6, y esos son nuestros datos de juego guardados, que se actualizan cada vez que nos derrotan si resulta que somos alguno de esos números Bien, entonces para el contenedor de puntuaciones altas, el texto de supervivencia más largo, simplemente queremos copiar lo que estábamos haciendo en la vista de estadísticas del juego. Entonces voy a saltar a ese guión. Y luego quiero copiar sobre este bit aquí mismo, que toma el flujo y nos da una cadena que sólo tiene un decimal. Ve al contenedor de altas puntuaciones, y voy a reemplazar eso aquí con esto. El PT, por supuesto, en realidad va a ser el manager del juego punto alto scorstts punto El tiempo Ahora si estamos en juego, llegamos al menú del juego, deberíamos ver 12.6 segundos por aquí Eso es mucho más legible como nuestro puntaje más alto. Entonces ahora para nuestros antecedentes, literalmente tomaré una captura de pantalla del juego. Y podrías apagar la interfaz de usuario para esto si quisieras hacer una captura de pantalla. Eso probablemente sería un poco más útil. Bien, así que apaguemos también las formas de colisión antes de tomar la captura de pantalla. Así que las formas de colisión de depuración desactivadas. Bien, así que sigamos adelante y tomemos nuestro sitio como una actualización para que podamos mostrarlo. Dejaré un par de estas camionetas en el mapa del juego. Esperaremos a que el esqueleto genere, y luego veremos si podemos obtener una buena captura de pantalla en el juego Una cosa que consideraría sería subir la tasa de engendros si queremos enfatizar cuántos enemigos hay en el juego Bien, así que hagamos una captura de pantalla aquí. Esa no me gusta tanto. Vamos a hacer una captura de pantalla ahí. Entonces, imprima la pantalla para tomar una captura de pantalla si eso no fuera obvio. Y voy a abrir Gap. Así Gap es un editor de imágenes gratuito. Es algo así como Photoshop. Pero libre. Entonces vamos a hacer Archivo Nuevo, y voy a hacer 1920 por 1080 píxeles. Ábrela. Control V para pegar en nuestra captura de pantalla, y vamos a agarrar algo así. No es realmente un tutorial de edición de imágenes aquí, pero realmente rápido, voy a pegar una barra superior ahí dentro. Entonces usando un relleno negro, entonces podemos darle el texto si así lo deseamos. Voy a elegir una fuente. Así que vamos con pixel regular. Tendrías que instalar esa fuente si quieres usarla. Bien, así que solo pasé un poco de tiempo creando algo así como una miniatura personalizada, excepto que vamos a estar usando eso en el proyecto final del juego Entonces solo abofeteando un fondo negro en la parte superior, algún texto Pixar, mencionando que es un curso de GD, mencionando que es un curso de Do, y luego el Esta probablemente no será la miniatura final del curso, pero podemos usarla para la pantalla del menú del juego por ahora al menos Y voy a abrir esto. Lo exporté al proyecto, claro. Entonces donde tengas eso guardado, puedes ver que tengo la pantalla del menú principal aquí. Entonces, lo que quiero hacer y la interfaz de usuario, esta es en realidad la pantalla equivocada. Queremos el menú principal. Pasamos a fondo Rec. Voy a carga rápida, y buscaré la pantalla del menú principal. Pop eso ahí dentro. Puede que tenga que aumentar el tamaño aquí, así que vayamos al modo de diseño, anclas y hagamos naufragio completo Bien, entonces con esto y completamente destrozado ahora queremos asegurarnos de que nada esté bloqueado por esto Entonces creo que tenemos que mover esto a la parte superior de la izquierda. Bien, ahí los puntajes más altos muestran que podemos tocar. Bien, y podemos jugar, y deberíamos verlo ahí. Guión Sobrevivientes alta puntuación aquí arriba. Es un curso de Gado. Tenemos el botón Iniciar juego y el icono de Gado, lo que quiero decir, bastante sólido para como cinco, 10 minutos de trabajo, creo que, por supuesto, se puede mejorar. Bien, entonces ahora en este punto, prácticamente el juego está a punto de terminar. Tenemos nuestra pantalla de inicio ahí. Podemos iniciar el juego, las puntuaciones altas, mostrando durante el juego las puntuaciones actuales y en la pantalla del menú principal para las puntuaciones más altas de todos los tiempos. Podemos derrotar a los enemigos. Podemos perder el juego. Podemos actualizar tal vez queramos hacer alguna limpieza, como eliminar estas actualizaciones iniciales del mapa del juego Eso es un poco raro ahí. Pero eso solo estaba ahí para fines de prueba. Quizás queremos aumentar la dificultad, sumar nuevos enemigos en. Podríamos tener a nuestro personaje principal, ya sabes, mostrando la lanza si queremos que eso esté ahí en lugar de algo sin brazos Pero, quiero decir, funciona para lo que es ahora. Y podemos subir de nivel varias veces. No está listo para su lanzamiento completo, claro. Todavía habría mucho trabajo por hacer ahí, pero básicamente todo está funcionando como se pretendía. Se acabó el juego. Ahí está nuestro puntaje más alto. Quizás al menú principal vendría bien una banda sonora, ese tipo de así que podría hacer un video más pulido para simplemente limpiar el curso, pero eso va a ser más o menos. Entonces espero que todos ustedes hayan aprendido mucho siguiendo hasta el final. Sé que este fue un curso bastante largo, 11 horas más tiempo de ejecución total editado. Entonces, quiero decir, si llegaste aquí y seguiste todo lo largo y tu juego está funcionando como está, quiero decir, buen trabajo porque en realidad eso fue bastante. Bien, así que muchas gracias chicos por mirar a grandes rasgos, el final de mi curso de guion sobrevivientes, guión GD en Gadot 4.4 61. Supervivientes de la caligrafía P60: mejoras en el juego y depuración: Entonces, en este video, vamos a tratar de agregar algo de pulido al prototipo de nuestro guion sobreviviente. Entonces antes que nada, al final del último video, tengo siete errores en la consola. Entonces eso es lo primero de lo que vamos a encargarnos. Cada vez que veas un error, es un buen momento para resolverlo, depurarlo, averiguar qué iba mal. Entonces tenemos recolecciones de artículos que no tienen un artículo realmente asignado a él Entonces creo que lo que sería realmente útil aquí sería decir por ciento Sur, y luego lo pusimos aquí como porcentajes Bien, para que veas que el mensaje de error aquí no es tan claro como podría ser. recolección de un artículo debe tener un artículo, pero no sabemos qué recolección de artículo realmente falló en eso. Entonces, ¿cómo se puede hacer eso en el ítem pickup dos D script es al final de asignado a pickup, hacer un porcentaje y luego hacer un seguimiento de la cadena con un porcentaje de auto Entonces eso reemplazará los porcentajes con el nodo, que va a resolver a un nombre de nodo o en otras palabras, qué nodo en realidad no tenía el ítem asignado Bien, vamos a correr eso una vez más. Solo jugaré un poco, ver si pegamos algún número nuevo. Bien, entonces ya que esas recolecciones de artículos y la porción de salud, dice que el artículo no está listo, lo cual es raro porque el en la exportación definitivamente debería estar haciendo eso Entonces, si el ítem es igual a nulo, entonces reportamos un error. Oh, bien, bien, bien. Entonces cometí un error aquí. Si eso fuera una afirmación, eso funcionaría bien. Pero lo que realmente queremos hacer es decir, yo ítem es igual a null, luego empujamos el error. Yo todavía estaba ahí en la lógica de afirmar . Así que vamos a tabularlo. Si el artículo es nulo, empujamos un error. Ahora bien, si jugamos, debería funcionar, claro. De lo contrario, siempre iba a empujar un error. Así se puede ver en el debugri aquí abajo, ya no hay problemas Voy a recoger algunos artículos. Consigamos que los enemigos los dejen caer, y eso debería funcionar bien para eso. Hasta ahora, no parece que haya otros errores nuevos. Noté un poco de un problema de diseño de interfaz de usuario aquí. Entonces creo que si llevo la guadaña aquí, podría como que reposicione esta interfaz de usuario de alguna manera rara Oh, bien, eso es lo que pasó. La caja HB en realidad se estaba expandiendo para hacerse más grande. Entonces para arreglar eso, o necesito bloquear el tamaño en su lugar. Chico, debería hacerlo más grande y luego mover esto hacia la derecha. Creo que eso sería mejor. Bien, entonces para esta interfaz de usuario de jugador, necesitamos expandirla un poco para que tenga espacio para asar. Entonces entraré en la interfaz de usuario del jugador. Y luego tomemos el contenedor del panel raíz, estiremos esto hacia la derecha para que tenga espacio extra. Iré a la interfaz de usuario de Game Play. Vamos a mover esto hacia la derecha. Ahora bien, si presiono Play y por casualidad actualizamos nuestra salud, y redimensiona esto en realidad ya no debería empujarlo más hacia la derecha porque ya tiene espacio para caber esa etiqueta de texto completo Y sí necesito redimensionar un poco el diseño de las armas. Lo compensé un poco incorrectamente ahí, así que solo alinearé esto hasta la cima ahí, vamos a golpear play, iniciar juego. Bien, y eso se ve bastante sólido. En el mundo, sí quiero eliminar todas estas camionetas por defecto Esos eran solo para pruebas. Esos no deberían estar en el prototipo final, así que voy a cortarlos con Control X, tenerlos todos seleccionados. Y sí creo que quiero hacer que el juego estándar juegue un poco más difícil. Entonces voy a ir al sistema spawner, y vamos a aumentar la tasa de span Así que voy a tirar esto al inicio a una mayor tasa de desove También agrega un punto extra aquí, algo así. Ajusta el manillar, algo así. Yo solo quiero hacer una curva más pronunciada para que consigamos que más enemigos engendren más rápido para que pueda presumir de una jugabilidad más intensa En la demo. ¿Bien? Y todos juegan. Vamos a probarlo un poco y ver cómo va eso. Entonces voy a empezar el juego. Queremos que nuestros enemigos suban al centro. A lo mejor los orcos son un poco demasiado lentos. Podría aumentar la velocidad de movimiento tanto de los orcos como del esqueleto Así que realmente no hay necesidad de hacerlo fácil aquí. Bien. Entonces ahí tenemos nuestros esqueletos y los orcos Entonces voy a aumentar la velocidad de movimiento de ambos. Buscaré el controlador de estadísticas orco. Cambiemos las estadísticas de orcos. La velocidad puede ser, digamos, 35, y luego vamos al esqueleto. Velocidad del controlador sat de 60. Yo solo lo voy a hacer un poco difícil aquí, y entonces el MX HP puede ser como 100. Todo bien. Y el orco HP es de 40. Eso está bien. Juguemos. Comienza el juego. Una cosa que podrías agregar, no lo voy a hacer aquí, pero tener, como, una explosión de engendro enemigo al inicio haría que el juego inicial se jugara un poco más intenso si comienzas el juego engendrando instantáneamente a diez tipos para que se acerquen a Eso podría ayudar. Pero creo que eso es un poco exagerado solo por el prototipo Entonces las obras sí se mueven un poco más rápido, y los esqueletos son bastante rápidos ahora Entonces esto definitivamente será mucho más difícil. Sí necesito tomar los HP actuales y ponerlos en 100 al inicio. Bien, a lo mejor los esqueletos son incluso un poco demasiado rápidos, Bien, así que arreglemos a los jugadores iniciando HP, jugador, controlador de estadísticas, estadísticas de jugadores, HP a 100. Y voy a poner a nervios un poco los esqueletos. Digamos 50 velocidades. Creo que eso es bastante justo. Bien, en las definiciones a nivel de jugador, también voy a hacer que el nivel suba bastante fácil. Entonces tomaré el nivel tres y pondré eso en cinco. nivel cuatro será diez XP, el nivel cinco, puede ser 15, el nivel seis, puede ser 20 y el nivel siete puede ser de 25 HP. Y luego sólo voy a añadir uno más por 100. Y eso va a ser como el que en realidad no llegas a llegar. De hecho, solo agreguemos uno más. Digamos 1,000 nueva definición de nivel. La razón por la que me cuesta ir es solo que realmente no suceda. Como que lo estropeé. Eso fue Nivel 1,000 toma diez XB. Eso no es lo que quiero. Lo que quería, y eliminemos eso es el nivel nueve va a ser una definición de nivel con mil EXP necesarios, agrega eso. Entonces esto solo lo hace para que no tenga que planear esa cantidad de escalado en la demo del prototipo. Simplemente sería una especie de exageración por ahora mismo. Así que vamos a golpear Play, y voy a ver cómo va el juego. Comienza el juego, y esperaremos a que los primeros enemigos engendren Bien, creo que es un poco demasiado fácil al principio. Quiero que sea intenso rápidamente. Entonces creo que lo que voy a hacer en realidad es poner en ese engendro instantáneo de diez tíos Entonces en el mundo, digamos en la exportación V engendros iniciales, y voy a establecer eso como N igual a diez El mundo tendrá una referencia al spawner, así que el sistema spawner Y luego listo, voy a decir, I Los vanos iniciales están por encima de cero Entonces diremos sistema spawner. Déjame ver. ¿Cómo se llamaban las funciones? Engendro aleatorio. ¿Y a eso lo llamo diez veces? Agárrate. Bien. Sí, y parece que necesito llamar a eso diez veces o el número de tramos iniciales Así que por un tiempo en los engendros iniciales, vamos a llamar a spaorsystem dot Entonces diez engendros iniciales, esto debería hacernos engendrar diez tíos al inicio del Bien, no olvides establecer el sistema sponnor en el mundo Así que asigne ese sistema sponnor. Referencia directa del nodo, vamos a presionar Play. Y si esto funciona, tendremos diez tíos al inicio del juego, lo que debería hacerlo mucho más difícil. Bien, sí, eso es un montón de chicos para el inicio del juego. Entonces solo tenemos que evitarlos a todos. Eso en realidad podría ser demasiado duro, honestamente. Voy a poner eso a cinco, y voy a cambiar eso a cinco en el guión, también. Creo que diez tipos al principio cuando ni siquiera has ascendido de nivel es solo que es mucho lidiar con una sola Bien, entonces tenemos a nuestros cinco chicos empezando ahora. Consigamos un XP. Voy a mejorar con el Syth así que eso nos dará una forma extra de golpear a los enemigos. Mucho más fácil ahora. Y yo sólo voy a seguir aquí. Vamos a obtener algunas actualizaciones ya que tenemos la curva EXP mucho más fácil, entonces deberíamos poder subir de nivel con bastante facilidad. Pero tengo que decir, aumentar la velocidad sobre los enemigos definitivamente hace que sea mucho más difícil esquivarlos, así que eso es algo a tener en cuenta. Sigamos mejorando la lanza. Entonces creo que a cierto nivel, la lanza golpea a dos tipos a la vez. Ya está ahí. Lanza de nivel tres puede golpear a dos tipos. Lo cual definitivamente es una mejora enorme. Solo estoy pasando por el juego aquí. Los esqueletos a 50 velocidades son bastante duros. 60 velocidades para los esqueletos definitivamente serían demasiado. Sigamos con la lanza. Con base en los ajustes actuales, realidad no tengo idea si la lanza o la guadaña es mejor Probablemente con grupos grandes como este, la guadaña sería mejor porque, ya sabes, puede golpearlos a todos a la vez. Pero a veces un solo objetivo también es importante. Quiero decir, solo nos estamos metiendo en, como, cómo jugar el juego ahora en este momento. Entonces eso es un montón de esqueletos, y en algún momento, van a atraparme como que me van a atrapar Podemos ver un poco de un problema, que es ese tipo de agrupamiento demasiado juntos Entonces sí quiero que no se apilen entre sí, pero creo que sus formas de colisión probablemente sean demasiado grandes en este momento. Esto es una especie de hacerlos incapaces de moverse. Así que en realidad nos metimos en un buen problema que podemos arreglar. Hagamos una pausa en el juego, y luego voy a tomar los esqueletos En todas las escenas, tomemos la forma de colisión, y voy a encogerlo mucho. Hagamos eso como un dos y luego iremos al orco. Tomaremos su forma de colisión. Esta es la forma de colisión del cuerpo del personaje base, y tomemos esa forma de colisión, expandirla y establecerla en dos también. Si deshacemos el juego, si eso está funcionando correctamente, y creo que es como que lo es No puedo decir al 100%. Entonces, debido a que su forma de colisión es más pequeña, se agruparán menos Pero, sí, sigue siendo bastante difícil cuando hay tantos tipos viniendo hacia ti. Si hubo como, proyectiles también, entonces definitivamente tienes un juego bastante difícil en este punto Así puedo conseguir un par de cosas más. Actualicemos la guadaña esta vez. Y vamos a ir por el juego a través de la pantalla. Probablemente podría correr por un tiempo, pero solo queremos verificar todo siga funcionando con el juego polaco, afrutado, prototipo sólido ahí dentro. Y vamos al menú principal. Tenemos nuestro tiempo sobrevivido. Creo que sí necesito sacar eso a la izquierda un poco solo para que haya espacio para el punto decimal en este caso. Aparte de eso, creo que nos vemos bastante bien. Entonces en el menú principal, así que solo voy a expandir esto a la izquierda un poco, obtener todo en una línea. Eso se verá mejor. Y tal vez también me puse la música en el menú principal. Entonces voy a hacer clic derecho en un nodo. Hagamos reproductor de AudioStream no dos D, porque, quiero decir, no hay dos mundo D ahora Sólo estamos mirando el menú del juego. Carguemos rápidamente nuestro AudioStream, así.p3 porque necesito ir a buscarlo en Bien, así que vamos a agregarlo en el audio ahora desde la carpeta de audio. Tenemos tres saltos de Caja Corazones Rojos. Solo usaremos eso para el menú principal también. Voy a ponerme los auriculares para que pueda probar esto por mí mismo. Vamos a jugar. Oh, en realidad no toqué audio. Bien, entonces hagamos reproducción automática. Sí. Y luego jugar. Bien, en realidad, quiero comprobar el mundo del juego principal, y quiero ver qué tan fuerte es eso. Son -40 decibelios. Bien, así que hasta quiero que eso sea un poco más tranquilo en el menú principal Entonces hagamos eso -45 decibelios. Voy a golpear Play. Pruebalo. Bien, y luego vamos a Empezar Juego. Aquí es un poco más fuerte. A lo mejor la música del final hago un poco más fuerte que eso, también Bien. Entonces el mundo del final del juego, voy a tomar eso y ponerlo en negativo 35 Creo que lo hice súper tranquilo durante el curso porque simplemente no quería que fuera una interferencia cuando estaba hablando de ello. Bien, así que vamos a golpear Play. comenzar el juego. Bien, eso es bueno. Otro efecto de sonido que podría querer agregar es cada vez que aparecemos la pantalla de selección de nivel arriba, creo que eso podría usar un efecto de sonido. Aparte de eso, creo que nos vemos bien. Entonces, subamos a la pantalla de selección de subir de nivel. Bien, haz clic en Agregar un reproductor de AudioStrem aquí. Déjame ver si tenemos algunos buenos efectos de sonido para subir de nivel en el proyecto. Entonces va a estar bajo menú de interfaz de usuario de audio. Claro, déjame revisar. Bien, usar artículo parece que funcionaría. Entonces voy a tomar el reproductor de flujo de audio aquí. Vamos a hacer estallar en el artículo de uso. Esto no va a Autoplay, así que necesito ir a la selección de LevelUp. Vamos a agregar en un pop up de exportación var. AudioStream, que será un reproductor de AudioStream. Así que vamos a decir pop up audiostream dot play, y solo tengo que arreglar esa exportación Bien, y luego asegúrate de agregar el pop up AudioStream en la exportación Entonces tenemos que agregar eso en. Podríamos hacer a punto afirmar si queremos afirmar pop up Recuerda configurar el reproductor AudioStream para reproducir sonido de nivel superior Bien, ahora vamos a golpear play. Podemos ir a Start Game. Y probemos derrotando a un enemigo, subimos de nivel. Y luego tomamos nuestra actualización. La música continúa. Y creo que eso fluye bastante bien. Definitivamente es agradable tener un efecto de sonido real para el veo up. Así que sigamos adelante con Syth esta vez. El Syth definitivamente pone en guerra aquí. Podría ser OP, en realidad. Bien, entonces Syth cuatro, veamos cómo va eso. Definitivamente, es muy duro. Eso es un gran problema. Como es básicamente un AOE, probablemente no debería estar haciendo tanto daño, seamos honestos Bien, creo que ya he visto suficiente ahí. Sólo voy a afilar la lanza. Y hacer que la lanza sea más divertida de usar realmente. Así que vamos a saltar al jugador, el arma de lanza. Vamos a saltar a la definición de escena. Podemos simplemente pulirlo por mucho que nos apetezca, creo Nivel uno corto. Podemos dejar eso como los impagos. Nivel dos, tres, cuatro, cinco. A ver. Para el nivel dos, solo haré que haga de 20 a 30 de daño, y que se enfríe. Sí, podemos hacer 0.9. El nivel tres será del 30 al 35. Creo que la lanza también puede hacer dos golpes en el nivel dos. Eso está bien. Y luego nivel tres, haremos 30 o 40 daños. Bien, entonces el máximo golpea dos, y luego vamos a subir los proyectiles a dos en el nivel cuatro, y esto será de 35 a 45 de daño a 0.8 enfriarse Y luego hagamos de 40 a 45 daños. Puede ir más rápido. Hagamos el enfriamiento 0.6. Los proyectiles pueden ser ¿por qué no? Digamos que tres proyectiles. Eso parece bastante loco, pero bueno. Y luego voy a hacer un recorrido rápido con la lanza. A ver si la lanza puede incluso competir con la guadaña. Bien, más lanzas. Eso debería darnos dos proyectiles. Eso debería ser mucho mejor. Llegar al Nivel cuatro fue un poco duro. No voy a equilibrar esto demasiado, pero sí quería hacerlo al menos soportable Oh, Dios. El desove se está volviendo un poco ridículo Oh, se me olvidó hacer un bucle de la música. Bien, abre el mundo del juego. Eso es bastante importante. Así que el mundo del juego. Vamos a abrir esa escena. Tenemos el reproductor de flujo de audio. Queremos tomar esta música y check loop. Entonces creo que tenemos que hacer eso en el proyecto. Hagamos tres. Haga doble clic en esto y habilite el bucle Bien. Cerrar. Y luego reproducción automática Entonces, en tu reproductor de flujo de audio, vamos a verificar Looping on para ese audio Eso también debería estar en la pantalla del menú principal por si acaso. Así que aquí parámetros, dando vueltas, y luego voy a deshacer el juego Así que eso no empezará hasta que volvamos a entrar ahí. Entonces como golpeamos Lanza Nivel cinco, ya no podemos seleccionar lanza Eso es bueno verificar dos veces y asegurarse de que, ya sabes, no irr hacia fuera tratando de subir de nivel hasta el Nivel seis Así que todavía podemos elegir la guadaña, claro. Bien. Y sólo voy a dejarme morir en este momento. Creo que sí. Todo parece bastante bien. Ah, y la pantalla de puntuación alta aquí, si eso todavía no se muestra correctamente, saltemos a ella. Entonces, para los puntajes más altos, para asegurarnos de que aquí haya suficiente espacio, fijemos un tamaño mínimo en estos. Voy a poner esto en 60.0 y luego vamos a expandir la base de puntuación más alta hacia la izquierda Bien, también toma la etiqueta de cantidad, y hagamos un tamaño mínimo de 60, ¿de acuerdo? Y podemos tomar los puntajes más altos y hacerlo aún más grande a la izquierda. Todo bien. Y luego pulsamos play. Y solo asegúrate de que los puntajes más altos no vayan por el borde en ningún lado. Entonces esto sería bueno para al menos un dígito más, creo, sin pasar por el borde y envolverlo ni nada. Bien, entonces en este punto, más o menos, creo que el prototipo está relativamente pulido. Estoy seguro de que hay ajustes que podemos hacer en el código y el contenido para que se agreguen al juego y simplemente que sea un juego de pleno derecho Pero en lo que va del curso, mostrando los fundamentos de cómo configurar todo esto, un superviviente como juego y GD Script Gudo 4.4 Creo que eso es más o menos sobre todo lo que hay que mostrar Entonces espero que ustedes hayan disfrutado mucho siguiendo a Long todo el camino hasta el final. Puede haber algunos pequeños videos de actualización, pero eso es prácticamente todo. Entonces gracias de nuevo por ver a Iben Chris, y los veré chicos en mi futuro contenido de video