¡Inventario y tiendas en Godot! | Thomas Yanuziello | Skillshare
Buscar

Velocidad de reproducción


1.0x


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

¡Inventario y tiendas en Godot!

teacher avatar Thomas Yanuziello, Indie 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.

      Promoción

      1:38

    • 2.

      monedas

      14:38

    • 3.

      Polaco

      16:41

    • 4.

      Recogida

      17:39

    • 5.

      Inventario

      15:34

    • 6.

      Artículos

      15:21

    • 7.

      Consumibles

      17:32

    • 8.

      Equipo

      12:11

    • 9.

      Tienda

      13:43

    • 10.

      ¿Qué sigue?

      0:32

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

Generado por la comunidad

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

22

Estudiantes

--

Proyecto

Acerca de esta clase

Este curso es una continuación de Fundamentos del desarrollo de juegos en Godot.

¡Haz clic en el enlace de mi sitio web en mi perfil para unirte a nuestro servidor de discord!

En este curso, cubriremos diferentes métodos para recoger artículos, administrar los datos de inventario del jugador, mostrar su inventario en la interfaz de usuario en un menú, permitir que el jugador interactúe con su inventario de diferentes maneras e intercambiar artículos con NPC.

También aprenderás habilidades útiles para trabajar con el motor de juegos Godot y organizar y diseñar tus proyectos para que sean más escalables.  Aprenderás a codificar con GDscript, con todo lo explicado en detalle.  Nuestros scripts estarán escritos para ser altamente personalizables y reutilizables.  Todos los archivos del proyecto también estarán disponibles en GitHub si necesitas revisar el proyecto tal y como estaba después de completar cada lección.  Estos videos se grabaron con Godot versión 4.2.2.

Este curso será parte de una serie diseñada para enseñar piezas de desarrollo de juegos del tamaño de un bocado que se puedan usar indistintamente entre sí.  Así que cuéntame qué tipos de juegos te interesa aprender a crear y trataré de incluirlos en futuros cursos de esta serie.

Conoce a tu profesor(a)

Teacher Profile Image

Thomas Yanuziello

Indie Game Developer

Profesor(a)
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. Promoción: Bienvenido a mi curso de inventario y tiendas en Gado. Este curso es una continuación del diálogo y eventos en Gado pero se puede seguir y aplicar a cualquier proyecto que implique recoger artículos, agregarlos a un inventario, dejar caer, usar o equipar artículos de un menú de inventario, e intercambiarlos con un MPC Te invitamos a unirte a nuestro servidor de discordia para trabajar en este curso junto a tus compañeros En este curso, cubriremos diferentes métodos para recoger artículos, administrar los datos del inventario de los jugadores, mostrar su inventario en la interfaz de usuario en un menú, permitir que el jugador interactúe con su inventario de diferentes maneras e intercambiando artículos con NPC Cuando termines, tendrás un sistema de inventario sencillo para tu juego que es fácilmente personalizable en su presentación y función. También aprenderás habilidades útiles para trabajar con el motor de juego Gada, organizando y diseñando tus proyectos para que sean más escalables. Estarás aprendiendo a codificar con script GD con todo lo explicado en detalle Aplicaremos principios de diseño orientado a objetos en nuestros scripts, herencia, encapsulación, abstracción y polimorfismo, para mantenerlos organizados, personalizables y reutilizables para un proyecto de Todos los archivos del proyecto también están disponibles en GitHub, si necesitas revisar el proyecto tal como estaba después de completar cada lección. Estos videos se grabaron usando Gdoersion 4.2 0.2. El proyecto comienza con activos de K Kits, personajes y paquetes remasterizados de Dungeon hechos por Paquete Basic Guy hecho por Penzilla, e iconos hechos por Shakahi Todos están disponibles para descargar gratis en él. También se incluyen los efectos de sonido realizados por Valensbyer y están disponibles 2. monedas: Hola, amigos. Antes de comenzar, deberías tener un juego visto en tu proyecto, que contenga un personaje que el jugador pueda controlar y un nivel en el que puedan caminar. Debes tener al menos otro personaje para que actúe como comerciante, así como activos para monedas y artículos para que el jugador los recoja, use y equipe A lo largo de este curso, le daremos al jugador un inventario para realizar un seguimiento de su dinero y artículos, mostrarlos en la interfaz de usuario, usar consumibles, equipar artículos al personaje y comprarlos o venderlos a NPC Puedes usar tu propio proyecto para seguir junto con este curso o descargar un proyecto de inicio desde mi GitHub, titulado Curso de Inventario de Godo, Sucursal principal Tu proyecto puede ser dos D o tres D y casi cualquier género de juego que implique al personaje tener dinero y/o artículos en un inventario y la capacidad de comerciar con NPC Empecemos agregando una variable para realizar un seguimiento de la moneda de los jugadores en su archivo guardado, que en este proyecto es el recurso de progreso. Exportando las variables, por lo que será serializada y guardada Vamos a llamarlo monedas. Será un entero con un valor predeterminado de cero. A continuación, mostremos esta información en el Canvas, usando un nodo de etiqueta. Después de establecer la fuente y el tamaño de fuente, es una buena idea decidir el límite de qué tan grande es un número que desea permitir que se muestre, experimentando con un número de marcador Suma límite de 10 millones. Sería bueno tener un icono al lado este número para decirle al jugador lo que significa. Utilizando una textura nudo destrozado, poblado con un icono de moneda, podemos poner tanto como hijos de un contenedor de caja horizontal para arreglarlos para nosotros. Cambiemos el nombre de la billetera del nodo padre. Y moverlo para estar detrás del desvanecimiento. Creo que el contador de monedas se verá mejor en la esquina superior izquierda, a la que ya está anclado, pero con 32 píxeles de relleno desde el borde de la ventana El icono es demasiado grande, así que voy a cambiar su modo de estiramiento aspecto para mantener su relación de aspecto y hacer que se redimensione automáticamente para que se ajuste a su ancho proporcional a su altura Restablecer la altura del contenedor padre. Ahora se establecerá por el tamaño de fuente de los nodos de etiqueta, que al parecer es de 42 píxeles. La altura del icono también será de 42 píxeles, y así con una relación de aspecto uno a uno, el icono también tendrá su ancho establecido en 42. También tendré el texto centrado verticalmente y agregaré un contorno negro de 16 puntos al número para que coincida con el contorno alrededor del icono. Pensando en el futuro, me gustaría que el icono pulse ligeramente cuando cambie el número. Estableciendo su valor y de tamaño mínimo personalizado en 42. Haga clic y arrástrelo hacia la derecha, y podremos ver los efectos de aumentar y luego disminuir este valor a lo largo del tiempo. Haciendo esto rápidamente, podemos ver el efecto de aplicar un efecto de pulso rápido, pero sutil, que también moverá ligeramente la etiqueta, captando la atención del jugador También me gustaría mantener al Canvas alejado de información irrelevante mientras el jugador está jugando el juego Entonces tendremos el contador de dinero oculto cuando no sea necesario. Seleccionando el nodo monedero. Podemos hacer clic y arrastrar la posición y valor para ver cómo se puede mover hacia arriba fuera de la pantalla para ocultar y volver a bajar para mostrarse. Comencemos la cartera en su posición cerrada, donde su posición y valor será el mismo que su tamaño y valor pero negativo. Después de mostrar la billetera, podemos iniciar un temporizador para ocultarlo automáticamente después de un período de tiempo usando un nodo temporizador. Vamos a llamarlo auto hide, y establecer su propiedad one shot en true, por lo que solo contará una vez cuando se le solicite para mantener corta la demostración. Voy a ocultar automáticamente la cartera después de solo 3 segundos. Al agregar un script a este nodo, llamémoslo contador y guardarlo en la carpeta de scripts de la interfaz de usuario. Puede heredar del control ya que no necesita ningún comportamiento del contenedor de caja horizontal Necesitaremos referencias a todas las notas secundarias establecidas durante la fase de preparación. Y una variable privada de preadolescentes. Las funciones públicas estarán disponibles para indicar a esta nota que abra o cierre, devolviendo la señal de preadolescentes terminada cuando termine, y una para establecer el valor del contador Abrir el contador se logrará al ajustar su posición y al positivo 32, y cerrarlo hará lo mismo al negativo de su tamaño punto y Sería una buena idea exportarlas como variables para hacer que el script sea más reutilizable para otros contadores. Sería una buena idea exportarlas como variables para hacer que el script más reutilizable para otros contadores Añadiendo variables de posición en pantalla y fuera de la pantalla, tanto como vector dos, O pen ahora puede interponer la posición de los nodos para estar en pantalla y cerrar preadolescentes a Cambiando el argumento float en un vector dos. Tweening la posición de los nodos, aceptando una nueva posición como parámetro vector dos, y devolviendo la señal de tween terminada Primero comprobaremos si existe una preadolescentes y se está ejecutando. Si es así, mátalo y crea uno nuevo. Luego podemos interconectar la posición de los nodos para alcanzar la nueva posición durante un período de tiempo Exportemos esta como otra variable y le demos un valor por defecto de 1 segundo. Recuerde establecer los valores de las posiciones en pantalla y fuera de pantalla de este nodo de control en el inspector Para establecer el valor, necesitamos un nuevo valor para establecerlo, que debería ser un entero. Estaremos configurando la propiedad text del nodo label para que coincida con este entero después de convertir su tipo a una cadena, pero sujetándolo para que esté entre cero y el valor máximo permitido que el comprador muestre. Pero primero, debemos verificar si actualmente se está visualizando el contador, y si no, esperar la función open. Para eso, necesitaremos una variable booleana nos diga si el contador está actualmente abierto o no, que se establecerá en true durante la función open, pero solo después de que la tween Entonces también esperan la animación de pulso de icono antes de actualizar el número real. O puedes omitir el peso a aquí para que el pulso y el número se actualicen simultáneamente Añadiendo una función de pulso, devolviendo la señal de tween terminada después de hacer las comprobaciones habituales de Tween, simplemente entretendré los iconos de la propiedad mínima y personalizada para que sea Digamos 46 pixeles. Durante una duración de una décima de segundo, luego se vuelve a interponer a su tamaño original durante la misma duración También podemos exportar variables para la duración y tamaño del pulso si queremos. Tenga en cuenta que debido a la configuración de nodo que estoy usando, se ignorará el encogimiento del icono para que sea menor a 42 píxeles Siempre puedes cambiar el tipo de la caja horizontal para que sea un nodo de control normal y posicionar manualmente sus hijos si quieres más flexibilidad. Seleccionando el nodo temporizador auto hid, podemos conectar su señal de tiempo de espera a la función de cierre del contador. Al seleccionarlo de la lista, la flecha verde muestra que la función está conectada a una señal. A veces es posible que queramos desactivar la función de ocultación automática. Agreguemos esa funcionalidad con un parámetro booleano opcional llamado stay open, que por defecto es true. Almacenando esto en una variable local del mismo nombre, podemos usar esto como condición antes de solicitar que se inicie el temporizador de ocultación automática, desactivando el comportamiento de ocultación automática y manteniendo este contador abierto Al establecer el valor del contador, si el contador no está ya abierto, entonces es lógico razonar que no se le haya dicho al contador que permanezca abierto. Entonces debemos esperar su apertura y pasar false como argumento para activar el auto hide, y set está abierto de nuevo a false al cerrar. Ahora cambiemos a la escena de nivel y creemos una pila de monedas que el jugador pueda recoger. Comenzando con un nodo Aa tres D, llamémoslo pila de monedas Pequeño. A continuación, arrastre el activo del modelo al nodo D del área tres para agregarlo como hijo. Al hacer clic derecho en la pila de monedas, seleccione make Local para separar este nodo del activo importado, convirtiéndolo en una copia local, en lugar de una referencia al activo. Ahora podemos extraer solo la instancia de malla tres nodo D que está dibujando la pila de monedas y eliminar todo lo demás. Asegúrate de que las monedas descansen limpiamente en el piso, ajustando tu perspectiva si es necesario A continuación, agregaremos una forma de colisión para el nodo D del área tres. Usaré una esfera, le daré un radio que la rodee suficientemente y la moveré por encima del suelo. Adjuntemos un nuevo guión a esta pila de monedas llamada pila de monedas. Lo pondré en la carpeta de guiones de eventos. T. Y que herede de evento de proximidad para reaccionar automáticamente ante colisiones con el jugador Para obtener más información sobre eventos, consulte el curso de diálogo y eventos de la serie. Exportemos una variable por la cantidad de monedas que están en la pila, un entero con un valor predeterminado de diez. También podemos restringir este valor para que esté contenido dentro de un rango usando la etiqueta de rango de exportación, especificando un valor mínimo y máximo permitido para esta variable. Una pila de monedas no debería estar vacía, así que el valor mínimo sería uno, y sólo pondré el máximo en 10 millones. A proporcionar una definición para que el administrador de eventos llame a la función de eventos de ejecución de scripts, aceptando el administrador de eventos como parámetro, no necesitaremos usarlo, por lo que se puede proceder con un guión bajo Tenemos que establecer la variable de progreso para que sea más el valor de esta pila de monedas, luego destruirla usando Q libre. También tendremos que anular la función en el cuerpo ingresado para decirle al administrador del juego que no deshabilite el nodo jugador durante este evento. Hagamos de esta pila de monedas su propia escena, guardándola en la carpeta de escenas y creemos una nueva subcarpeta para los elementos. Después aleja la pila de la posición inicial del jugador. Lo último que tenemos que hacer es actualizar la interfaz de usuario cuando se recogen las monedas. Probablemente va a haber muchas monedas en el juego y no queremos gestionar sus señales manualmente. Eso sería una pérdida de tiempo. Una manera fácil de lograr esto es usar señales autocargadas. Al crear un nuevo script de carga automática, llamémoslo global y darle una señal llamada monedas fechadas con un parámetro entero para la nueva cantidad de monedas. Este script también es útil para proporcionar valores para variables de uso común en diferentes scripts a lo largo de tu proyecto, particularmente aquellos que no están destinados a ser ajustables por el jugador en la configuración del juego. Luego podemos agregar el script global a la lista de nodos cargados automáticamente en la configuración del proyecto. El script de contador adjunto a nuestra billetera ahora puede usar la función ready para conectar esta señal a su función de valor establecido. Establecer la etiqueta en la interfaz de usuario para que coincida con el argumento pasado a través de la señal emitida por la carga automática global. Y también inicializar el valor a lo que esté almacenado en el archivo de guardado de los jugadores cuando el juego se cargue por primera vez Pero esto ya no es un guión reutilizable. Entonces vamos a darle un contador de nombres de clase. A continuación, crea un nuevo script heredado del contador llamado Wallet. El cual tendrá esta función lista vinculándola directamente a las monedas del jugador. Reemplazar el script unido a la pared arrastrándolo al nodo El script de contador ahora se puede utilizar para contar cualquier cosa que se muestre en la UY, como claves o pociones de salud, por ejemplo En el script de progreso, agregando una función setter a la variable coins, podemos decirle a esta señal que emita automáticamente cada vez que cambie el valor Usando una instrucción if, podemos asegurarnos de que el número no se esté configurando en lo que ya era. Vamos a probarlo. Caminando hacia las monedas, desaparecen. El monedero aparece con el saldo de cero, que pulsa y actualiza para ser diez. Entonces después de un tiempo de espera de tres segundos, la cartera se esconde. Ahora tenemos monedas que el jugador puede recoger y realizar un seguimiento en el Canvas del juego. En la siguiente lección, agregaremos efectos visuales y de audio para mejorar la apariencia de estas mecánicas de juego. Te veré en la siguiente lección. 3. Polaco: Hola, amigos. En la lección anterior, agregamos monedas coleccionables a nuestro juego En esta lección, usaremos todo tipo de efectos especiales para pulir el proceso de recolección de monedas para que sea más satisfactorio. Comenzando en el script de contador, podemos agregar una variedad de efectos al comportamiento de nuestros preadolescentes usando transiciones y easings, que cambian la forma en que cambia la propiedad a lo largo del tiempo Exportemos una variable de tipo de transición de Tween. Y configúrelo al crear la preadolescente. mirar en el inspector, el comportamiento predeterminado es una transición lineal, cambiando uniformemente la propiedad a lo largo del tiempo. Pero podemos cambiarlo a varias opciones diferentes. Echando un vistazo a estas gráficas, creo que quedaría bien si el contador usara el tipo de transición elástica. Y cada uno de estos también se puede combinar con un tipo de flexibilización, aplicándolos a la mitad de preadolescentes o a la mitad de salida o En lugar de exportar el tipo de facilidad, me gustaría tener diferentes easings aplicados a las funciones abiertas cerradas Ya que tendría sentido que el efecto elástico se reprodujera en pantalla, así tendré la función open y la función closed adentro. Pasar el tipo de flexibilización de las funciones abiertas cerradas a través la función de posición de preadolescentes en cada caso En la escena de la pila de monedas, podemos esperar a que la pila se encoja antes de destruirla en lugar de simplemente desaparecer Agarrando una referencia al desorden durante la fase lista, podemos decirle a la malla que se encoja usando una tween Como no hay forma posible esta preadolescentes se pueda usar más de una vez, no necesitamos preocuparnos por ello. Simplemente crea la preadolescente Usaré el mismo tipo de transición elástica y entretendré la propiedad de escala de mallas a cero durante una corta duración y devolveré la señal Pero sí necesitamos asegurarnos de que el jugador no vuelva a chocar con esta área mientras ocurre la preadolescentes Así que vamos a desactivarlo agregando una función en el script de eventos de proximidad que establece su máscara de colisión en cero. También podemos agregar pulimento adicional agregando un reproductor de flujo de audio de tres nodos D. Poblado con un efecto de sonido de tintineo de monedas. Estoy usando el paquete de sonidos de monedas creado por val inspirado o. Necesitamos tomar una referencia a este nodo usando add on. Y dile que juegue durante el evento. Entonces espera a que termine el sonido antes cola el nodo para que sea liberado para que pueda Como un reproductor de flujo de audio de tres nodos D, el sonido emitido ajustará su volumen en función la proximidad al oyente predeterminado, la cámara Si queremos agregar efectos de sonido a la interfaz de usuario, debemos usar en su lugar el nodo reproductor de flujo de audio básico, que siempre reproducirá su efecto de sonido en el volumen en el que está configurado. Agarrando una referencia al nodo reproductor de flujo de audio. Podemos reproducir un sonido de tintineo de moneda cada vez que se establece el valor del contador Ahora tenemos efectos de sonido que se reproducen desde diferentes nodos y diferentes escenas. Un nodo autocargado también está reproduciendo música de fondo mientras otros nodos están reproduciendo efectos de sonido, y definitivamente tendremos mucho más a medida que el juego se haga más grande, y otros también podrían jugar al diálogo. Deberíamos establecer su volumen para que coincida con el de la configuración del juego. Pero manejarlos individualmente sería difícil. Si hacemos clic en la pestaña de audio en la parte inferior del editor, Gada tiene un bus de audio incorporado que podemos usar para categorizar nuestras diferentes fuentes de audio Esto nos permite ajustar los volúmenes u otras configuraciones de cada uno colectivamente a través del bus, en lugar de cada nodo individual. Al agregar un nuevo bus para música y otro para efectos de sonido, ambos se pasarán por el maestro antes de ser emitidos a los altavoces. Ajustar el volumen maestro afectará a todo en el juego. Ajustar el volumen de la música afecta solo a la música y de igual manera con los efectos de sonido. Seleccionando los nodos de flujo de audio de efecto de sonido, podemos cambiar su bus a SFX Como no podemos acceder al nodo de música fuera del script autocargado, podemos usar la función ready para configurar su bus a la música. Asegúrate de que la ortografía sea exactamente la misma. De lo contrario, el autobús se ajustará al valor por defecto de maestro. Guarde el diseño del bus de audio como recurso del proyecto. Luego abra la configuración del proyecto En buses de audio, seleccione el diseño del bus de audio para que sea el predeterminado. El nodo de música ya no necesitará referirse a la configuración de volumen, ya que el bus de audio musical establecerá el límite para su volumen y simplemente puede desvanecerse a un volumen lineal de uno. En el recurso de configuración, podemos agregar variables para almacenar cada configuración de volumen individual, maestro, música y efectos de sonido, proporcionando valores predeterminados para cada uno también. En el menú de configuración, podemos agregar deslizadores de volumen para cambiar cada uno de estos valores Voy a cambiar el volumen a volumen maestro. Después duplicarlo dos veces, y editar los duplicados para que sean volumen de música y efectos de sonido Agarrando referencias a cada deslizador durante la fase de preparación Inicializándolos para que coincidan con la configuración del juego cuando se carguen por primera vez Ya no necesitamos configurar manualmente volumen de la música ya que será manejado por el autobús. Y cuando el reproductor cambie sus valores, cambie las variables en el recurso de configuración, y también ajuste los volúmenes en el bus de audio para que coincidan. Conjunto de servidor de audio volumen de bus Decibelios servidor de audio índice de bus Archivo maestro ajustes de puntos hacer volumen maestro, convertido de lineal a Dando a cada deslizador su propia función de valor cambiado, después de que podamos editar las conexiones de señal de los controles deslizantes para conectarse a las funciones cambiadas de valor apropiado También necesitamos inicializar los volúmenes del bus cuando se carguen por primera vez Ahora, no necesitamos molestarnos ajustar manualmente los volúmenes de cualquier nodo de audio siempre y cuando estén ordenados en la categoría apropiada. Abriendo la pila de monedas pequeña escena Restablecer el origen local transforma si no lo es. También agreguemos un simple efecto de partículas a las monedas cuando desaparezcan. Pudo tiene dos tipos de nodos diferentes para generar partículas, uno que se ejecuta en la CPU y el otro en la GPU. Partículas de CPU que son compatibles con computadoras más lentas o aquellas que no tienen un procesador gráfico dedicado como los dispositivos móviles, pero no pueden producir tantas partículas y tienen menos características. Un sistema de partículas de CPU es lo suficientemente capaz producir una pequeña ráfaga de partículas como lo que estamos tratando de lograr aquí. Pero un emisor de partículas GPU sería más apropiado para emitir miles o millones de partículas en un sistema moderno Usaré un emisor de partículas de CPU. Ahora mismo, nada está emitiendo porque no hay partícula para dibujar. Expanda la sección de dibujo y agregue un recurso de malla para representar una sola partícula. Me gustaría usar la malla de monedas como partícula. Arrastraré un solo activo de moneda del paquete de activos a la escena. Hágalo local, y seleccione la instancia de malla tres nodo D. Después de hacer que esta malla sea única, por lo que ya no está vinculada al activo importado. Puedo guardar esta malla como recurso de proyecto. Lo llamaré malla de monedas. Eliminando todos estos nodos y reseleccionando el emisor de partículas, ahora puedo usar esta malla como Las partículas están emitiendo ahora ocho veces por segundo y cayendo hacia abajo. Me gustaría una ráfaga única de partículas en lugar de una emisión continua. Ampliando la sección de tiempo, pondré un tiro a verdadero y explosividad a uno Al hacer clic en el conmutador emisor, las ocho partículas aparecen todas al mismo tiempo y desaparecen después de 1 segundo, que es la propiedad de por vida Quiero que las partículas exploten hacia arriba, así expandiré la sección de dirección y cambiaré la dirección hacia arriba con una extensión de 15 grados. A continuación, estableceré la velocidad inicial para que sea un número aleatorio 2-3 metros/segundo y estableceré la gravedad más baja en solo 4 metros/segundo al cuadrado negativo Haré que las partículas alineen sus vectores locales hacia arriba hacia la dirección en la que se mueven. Veamos cómo se ve hasta ahora. Preferiría que las monedas no aparecieran o desaparecieran repentinamente, así ampliaré la sección de escala, y en una curva de escala. Ampliando el recurso de curva para editarlo, tenemos tiempo a lo largo del eje x y escala a lo largo del eje y. Tenga en cuenta que un tiempo de uno no es de 1 segundo, ni es una escala de uno, de 1 metro. Estos son porcentajes de la vida útil de las partículas y las propiedades de escala. En el tiempo cero, quiero que la moneda sea invisible, poniendo su escala en cero, y la misma en el tiempo uno. En el punto medio de la vida útil de las partículas, quiero que su escala sea de tamaño único o completo Esto crea una onda por lo que la partícula crecerá y se encogerá gradualmente a lo largo de su vida útil. Podemos modificar los anclajes de cualquier punto esta curva para ajustar cómo afecta la escala de las partículas Ahora parece que las monedas estallaron hacia arriba y llovieron después de ser recogidas. Hay muchos ajustes diferentes para ajustar cómo se generan las partículas y cómo se comportan a lo largo de su vida útil Intenta experimentar con diferentes configuraciones de efectos de partículas para obtener el tipo de efecto que deseas para tu juego En el script de pila de monedas, podemos tomar una referencia al nodo emisor de partículas y establecer su propiedad emisora true cuando se recogen las monedas Entonces aguarda su señal terminada antes de poner en cola este nodo para ser liberado Voy a tener la contracción, el efecto de sonido y el efecto de partículas, todos suceden simultáneamente Duplicando la pequeña escena de la pila de monedas, podemos hacer una pila mediana y otra grande Sustitución de la instancia de malla tres nodo D con diferentes pilas de monedas. También estableceré el valor de estas pilas para que tengan un valor predeterminado más alto cambiándolo en el inspector dentro de sus escenas. Cambiar su efecto de sonido y su número de partículas emitidas por sus efectos de partículas. Después agrega diferentes pilas alrededor del nivel para ser recogidas por el jugador. También podemos usar efectos de partículas en dos D también. Hagamos un efecto similar en el icono de la billetera cuando se actualice el encuentro con monedas. Agregar un emisor de dos partículas D al nodo de icono. Lo colocaré para estar en el centro. A Usando casi todas las mismas propiedades para este emisor de partículas, simplemente cambiaré la partícula a una copia del icono de la moneda Usa una extensión de 180 grados, así las partículas vuelan en todas las direcciones y eliminan la gravedad. La velocidad se mide en píxeles por segundo, así que voy a hacer que varíe 16-32 Pero aplica la misma curva para que las partículas crezcan y se encojan. Y establece la escala mínima y máxima a solo 5% de su tamaño normal. Entonces en el script del contador, agarrando una referencia al emisor de partículas, podemos decirle que emita al actualizar el valor del contador Ahora al recoger las monedas, los comportamientos de las monedas y la interfaz de usuario se ven mucho más interesantes. Intenta experimentar con diferentes tipos de transición y flexibilización, efectos de sonido y efectos de partículas para obtener la apariencia que deseas para tu juego Ahora tenemos una experiencia más satisfactoria para el jugador que recoge monedas en nuestro juego gracias a una variedad de efectos. En la siguiente lección, permitiremos que el jugador recoja un objeto presionando un botón y agregándolo a su inventario. Te veré en la siguiente lección. 4. Recogida: Hola, amigos. En la lección anterior, agregamos pulido a la mecánica de recolección de monedas. En esta lección, agregaremos elementos que el jugador puede recoger presionando un botón. Empecemos por hacer un par de artículos que el jugador debería poder recoger. Comenzando en la escena del personaje, podemos usar uno de los elementos en sus manos. Voy a usar el hacha Bárbaros. Haciendo de este hacha su propia escena, guardándola en la carpeta de escenas de elementos, Observe cómo el origen del hacha está en el pinzamiento donde lo sostiene el personaje. Podemos agregar un cuerpo rígido tres nodos D a esta escena, que lo hará un objeto de física, indicado por el icono de pelota de playa. Dale una forma de colisión. Sólo voy a usar una caja colisionar. Luego ajuste los límites y la posición de la caja para encapsular el modelo x El uso de puntos de vista ortográficos hace que esto sea mucho más fácil. Al hacer clic derecho sobre el cuerpo rígido tres nodo D, voy a hacer de este el nodo raíz de escenas y renombrarlo a X. Pongamos esto en una nueva capa de colisión. Voy a usar la Capa seis para los artículos. Este objeto puede enmascarar el terreno, otros elementos, el jugador y el MPC Abriendo la configuración del proyecto, Nombres de capa, física de tres D, dejando a un lado la capa seis para las recogidas de elementos Adjuntando un script al nodo raíz, solo lo llamaré ítem. Lo mantendré simple por ahora y solo exportaré un nombre para mostrar para el elemento como una cadena. Ampliaremos los propios artículos. Volviendo a la escena del personaje, podemos eliminar el nodo item, ya que aún no tenemos los sistemas adecuados para manejar su equipamiento En la escena Dungeon, arrastrando una botella A etiquetada como marrón a la escena y haciéndola local, el activo fue importado para tener ya un cuerpo rígido adherido a Podemos hacer click derecho sobre este nodo y convertirlo en su propia escena y nombrarlo poción de salud Re padre y renombrar la poción de salud y eliminar el Nodo tres D. O madurando la escena, la simulación del mundo se desactiva Lo volveré a activar. Cambiemos el nombre del nodo raíz a poción de salud también. Y adjunte el guión del ítem, dando a la poción de salud un nombre para mostrar Usando los mismos ajustes de colisión que el hacha. El origen de las pociones está en su base donde se sentará en el suelo, igual que su centro de masa, dando lugar a algún comportamiento inusual Para que los elementos sean más fáciles sostener en sus manos, ayuda que su origen sea donde el personaje se aferrará a él. Así que seleccionando tanto la malla como la forma de colisión, vamos a moverlas hacia abajo aproximadamente dos tercios de la botella, posicionando el origen alrededor del cuello de la botella. Y seleccionando el nodo de cuerpo rígido, expandiendo la sección de distribución de masa. También podemos cambiar el centro de masa cambiándolo de automático a personalizado, desplazándolo para estar más cerca de la parte más ancha de la botella hacia abajo a lo largo del eje y aproximadamente un tercio. Esto va a evitar que la botella se comporte como un polo rolly. Ahora tenemos dos ítems diferentes que el jugador debería poder recoger. Coloquemos un hacha y dos pociones sobre la mesa para que el jugador las recoja Pero esto parece bastante aburrido, y como se trata de objetos de física que pueden moverse, pongamos una de las pociones en el suelo volcada sobre su costado De vuelta en la escena potente de la salud, podemos intentar adjuntarle un evento de interacción, utilizando un nodo D de área tres y una forma de colisión. Usaré la misma cápsula que nuestros PNJ como ejemplo. Si bien este sistema funcionó muy bien para interactuar con NPC y puertas, que generalmente son más grandes y no giran, ahora podemos ver las limitaciones de nuestras interacciones de eventos existentes al tratar con objetos más pequeños y/o objetos física que pueden rotar Para esta demostración, encenderé formas de colisión visibles. Adjuntar un evento de interacción a la poción de salud hará que sea ininteractable si se inclina y rueda sobre el piso Ya que el área de colisión también rotará sobre el origen local de la poción de salud Esto se vuelve mucho más difícil apuntar de manera confiable con un rayo fundido. Podríamos hacer que la colisión forme una esfera y lo suficientemente grande como para que siempre sea detectable por el rayo emitido. Pero usemos una solución diferente. Muchos juegos también permiten al jugador recoger elementos detrás ellos que todavía están muy cerca del personaje para mayor comodidad. Un elenco que solo mira hacia adelante no va a lograr esto. Otra forma de interactuar con el entorno se puede lograr utilizando un nodo D de área tres unido al personaje del jugador, utilizando ya sea una esfera o una forma de colisión de cilindro, estableciendo el radio en un límite de rango apropiado. Voy a usar el mismo rango que el rayo de interacción fundido de 2 metros. Establecer la altura a la altura de los colisionadores de caracteres de 2.6 metros y centrarlo en el personaje a la mitad de esos 1.3 metros Pero si el personaje está parado en una pendiente descendente y el jugador quiere recoger artículos ligeramente por debajo de ellos, debería poder hacerlo. Entonces agregaré medio metro de altura y bajaré el centro en un cuarto de metro. Esta forma de colisión estará monitoreando los elementos que el jugador pueda recoger cuando presione el botón de interacción , enmascarando la capa seis. Adjuntar un script a este nodo de área. Vamos a llamarlo radio de recogida. Haré una nueva carpeta para guiones de jugadores y pondré esto ahí. Después mueve los guiones del jugador y del brazo de resorte a esta carpeta también. Luego conecta la señal ingresada por el cuerpo a este script para reaccionar a cualquier cuerpo en Capa seis entrando en el radio de recogida. Así como la señal de salida del cuerpo cuando dejan el radio de recogida Este script necesitará mantener una lista de cada elemento en el rango del jugador que se puede recoger usando una matriz de nodos tres Ds, que por defecto será una matriz vacía. Cuando un cuerpo entra en esta área, se anexará a la matriz. Y cuando salga de esta área, se borrará de la matriz Pero la desventaja de usar las colisiones de área de esta manera es que no hay forma de detectar obstáculos en el Esto en realidad permitirá que el jugador recoja objetos del otro lado de una pared. Tendremos que usar otro lanzamiento de rayos para determinar si lo que el jugador quiere recoger está obstruido por el terreno u otros obstáculos Al agregar un nodo D de lanzamiento tres al radio de recogida de elementos, moveré hacia arriba a lo largo del eje y hasta la mitad del personaje, 1.3 metros, y haré que colisione solo con el terreno o los Cuando el jugador presiona el botón de interacción, solo haré que les recojan el objeto más nerest. L et's escriben un algoritmo que obtendrá el ítem más nerest al jugador dentro de esta área, devolviendo un nodo tres D. Al escribir un algoritmo, lo mejor es llegar primero a cuáles son todos los casos posibles que deben considerarse Qué sucede cuando la matriz está vacía, lo que significa que no hay elementos dentro del rango para que el jugador los recoja. Deberíamos devolver nulo, significando nada. Si solo hay un elemento en la matriz, primero tendremos que verificar si hay una ruta sin obstáculos entre este nodo y el nodo item usando el ray cast Establecer la posición objetivo de los rayos proyectados para que sea la diferencia entre los elementos y las posiciones globales de los nodos de lanzamiento de rayos . El rayo apunta desde su propio origen directamente al origen de los ítems. Después de cambiar hacia qué apunta el raycast, la información de colisión no se actualizará hasta el siguiente proceso de física, pero podemos obligarla a actualizarse inmediatamente con una llamada a función Si el raycast golpea el ítem, entonces podemos devolverlo. De lo contrario, seguiremos devolviendo null, ya que el único elemento de la matriz está obstruido por el terreno Hagamos que este código sea reutilizable convirtiéndolo en una función privada. Lo llamaré obstruido, aceptando el ítem como parámetro y devolviendo un booleano si el rayo fue obstruido o Dado que estos casos cubrirán la gran mayoría de las veces cuando el jugador presiona el botón de interacción, deben ser revisados primero y manejados de la manera más eficiente posible. En la rara circunstancia de que haya dos o más elementos en la matriz, entonces tendremos que comparar la distancia de cada uno con el jugador para decidir cuál es el más cercano, aumentando enormemente la complejidad del algoritmo Ahora necesitaremos algunas variables adicionales, el índice de matriz del elemento más nerest, la distancia al elemento más cercano y la distancia al siguiente elemento de la Una vez realizados todos nuestros cálculos, podemos devolver el artículo en el índice del artículo más cercano. Al comparar distancias como esta, es matemáticamente más eficiente usar la distancia al cuadrado en lugar de la Dado que la distancia entre dos puntos en tres espacios D es la raíz cuadrada de x cuadrado más y cuadrado más cuadrado, entonces d cuadrado es igual a x cuadrado más y cuadrado más cuadrado Eliminando la necesidad de calcular la raíz cuadrada de este número, y si d uno es menor que d dos, entonces d uno cuadrado también es menor que d dos al cuadrado Podemos comenzar estableciendo el índice cero y la distancia al elemento más cercano a algo más grande que el radio de recogida al cuadrado, por lo que cualquier elemento dentro del radio de recogida se considerará más cercano por defecto. Como mi radio es dos, solo usaré cinco. Para cada elemento de la matriz, necesitamos determinar la distancia al cuadrado a él. Usando la posición global de este nodo, distancia al cuadrado a la posición global del ítem en el índice Después compara esta distancia con la distancia más cercana. Si es más pequeño, entonces también verifica si el artículo no está obstruido Si esto es cierto, entonces esta es la distancia más cercana que hemos encontrado hasta ahora, y yo es el índice del ítem más cercano hasta ahora Tenga en cuenta que las operaciones booleanas se ejecutan de izquierda a derecha. La comparación de las distancias se completará primero, lo cual es un cálculo matemático bastante eficiente. Si la distancia al siguiente elemento no es menor que la distancia más cercana, entonces no importa si el artículo no está obstruido El funcionamiento booleano ya comenzará con false, y por lo tanto, no importa lo que resulte ser el otro lado, ya que false y cualquier cosa sigue siendo falsa, saltándose el rayo fundido por completo, que es un cálculo más costoso Elegir cuidadosamente el orden de las operaciones a partir de comprobaciones comunes y simples y posponer los casos más complejos o raros hasta el final donde podrían omitirse, puede ayudar a que sus algoritmos funcionen de manera más fluida Repetiremos esto hasta llegar al final de la matriz. Entonces tendremos el índice de matriz del ítem más cercano al jugador y podremos devolver el ítem a recoger. Esto no debería ser igual a. El jugador necesita un inventario para almacenar sus artículos, que formarán parte de su información de progreso. Declaremos una variable privada llamada inventario como diccionario e inicialicemos que esté vacía usando llaves en lugar de corchetes Un diccionario es una colección de pares de valores clave, similares a una matriz. Si considera que el índice de matriz es la clave, pero un diccionario puede usar cualquier cosa como su clave. Siempre y cuando cada clave sea única. Usando el nombre para mostrar los artículos como clave, podemos apilar fácilmente los artículos usando la cantidad como valor. Esta es una estructura de inventario muy simplista, pero suficiente para esta demostración Por ahora, dirigiremos una función llamada add to inventory, aceptando un ítem para ser agregado al inventario del jugador y una cantidad opcional con un valor predeterminado de uno Primero, verificando si el artículo ya existe en el inventario del jugador. Podemos incrementar el valor en esta clave por la cantidad. Si el ítem no existe ya en el inventario del jugador, entonces podemos establecer el valor para que sea la cantidad, lo que también crea esta entrada en el diccionario. Al final, solo imprimiremos el inventario para que podamos verlo. En el guión de los jugadores, podemos darle al botón interactuar múltiples usos sensibles al contexto. Al tomar una referencia al radio de recogida de objetos, también declararemos una variable para contener el objeto más cercano al jugador Al presionar el botón de interacción, primero asignaremos el valor del elemento más cercano para que sea el elemento más cercano devuelto por el radio de recogida utilizando nuestro algoritmo. Si el script de radio de recogida devuelve un elemento, cualquier cosa que no sea nulo, entonces debemos recoger ese elemento, agregarlo al inventario del jugador y poner en cola el objeto a ser liberado, eliminándolo del árbol de escenas Pero si no hay ningún elemento en rango para recoger, el script devolvió null, entonces podemos proceder con el comando de interacción de caracteres. Y si el jugador está ambos enfrentando a un NPC con el que quieren hablar, y hay un ítem que pueden recoger a sus pies Al crear comandos sensibles al contexto, considera a qué contactos se les da prioridad y cómo eso afectará la experiencia del jugador. En este caso, al presionar el botón de interacción se recogerá primero el artículo. Entonces el jugador tendrá que volver a presionar el botón para hablar con el MPC A veces podría ser mejor usar un botón diferente si va a ser más conveniente para el jugador. Bien. Si ejecutamos el juego, paramos detrás de la pared y presionamos el botón de interacción, el artículo se obstruye y no hemos podido recoger el artículo Mudarse a la habitación, presionando el botón de interacción sin ningún tipo de obstrucción. Las dos pociones de salud y el hacha se agregan al inventario del jugador, cada una con una pulsación de botón separada y se muestran en el registro de salida Las pociones de salud también se apilan juntas en una sola entrada del diccionario Ahora tenemos al jugador recogiendo artículos un botón y agregándolos a su inventario. En la siguiente lección, mostraremos el inventario del jugador en el Lienzo. Te veré en la siguiente lección. 5. Inventario: Hola, amigos. En la lección anterior, agregamos elementos al inventario del jugador presionando un botón. En esta lección, mostraremos el contenido del inventario del jugador en un menú. Un buen lugar para comenzar con los menús es armar una maqueta de qué información quieres mostrar al jugador. Esto puede ayudarte a darte una idea de la mejor manera de usar el espacio disponible y tal vez hacerte considerar cosas que de otra manera no habrías pensado incluir. Comencemos con un nodo de panel básico y renombrémoslo a inventario. Probablemente querremos algunos nodos de etiqueta, un título para este panel para decirle claramente al jugador para qué sirve, así como un nombre de elemento y descripción del elemento seleccionado actualmente. El título solo dirá inventario, y usaré texto ficticio para el nombre y descripción del artículo Voy a tener ambas envolturas para que no deletreen fuera del panel. Y también un contenedor, generalmente ya sea un contenedor de caja vertical o un contenedor de rejilla para organizar todos los artículos. Cualquiera que sea el contenedor que vayas a usar, es probable que esté lleno de botones, cada uno representando un artículo o una pila de artículos. Vamos a agregar uno ahora. A continuación, vamos a crear un tema para este menú. Voy a llamarlo inventario. Haz una nueva carpeta de recursos para temas y pon esto ahí junto con el tema existente. Ampliando el tema en el panel del inspector, cambiaré la fuente predeterminada a la fuente más legible que estoy usando para mi juego y estableceré el tamaño de fuente predeterminado en 96, que en realidad no será tan grande que en realidad no será tan grande después de reducir el panel. En la pestaña tema, comenzaré agregando el panel. Entonces dale al panel una nueva textura de caja de estilo. Al hacer clic en la textura de la caja de estilo para abrirla en la pestaña Inspector. Usaré la imagen cuadrada de caja gris con márgenes de textura de 128 píxeles en todos los lados. La imagen es muy grande, así que voy a escalarla a un cuarto de tamaño. A continuación, establezca el tamaño de los paneles para duplicar la resolución de pantalla de 12 80 por 720. Ocupa la mitad de la pantalla tanto en ancho como en alto. Establecer el pivote para que sea el centro usando la mitad de la propiedad size, luego anclando el panel al centro de la pantalla. Con el panel en posición, ahora puedo anclar cada uno de los elementos a diferentes posiciones dentro de él. Anclaré el título para que esté centrado dentro del panel horizontalmente y 10% hacia abajo desde la parte superior. Creciendo en ambas direcciones horizontal y verticalmente, por lo que se centra alrededor del punto de anclaje. Voy a hacer que use la fuente más elegante y una fuente más grande de 128 El nombre del artículo y la descripción del artículo, voy a poner dentro de un contenedor de caja vertical. Luego usa anclajes personalizados para colocarlo en el lado derecho del panel, cubriendo todo 60-95% horizontalmente y 20 a 90% Al volver a establecer los desplazamientos de anclaje, se ajustarán los límites del control para que coincidan con los puntos de anclaje Usaré una anulación de tema para espaciar el modo y 64 píxeles adicionales entre sí. El nodo label quiere que se establezca un tamaño mínimo personalizado, así que solo los configuraré en 64 píxeles de alto para deshacerme de las advertencias. Eso deja la mitad izquierda del panel disponible para la lista de elementos o cuadrícula. Nuevamente, usando anclajes personalizados, tendré la cubierta de rejilla 5% a 58% horizontalmente y 20 a 90% verticalmente Le daré a mi botón de muestra un tamaño mínimo personalizado de 256 por 256 píxeles. Después también cambia la fuente del nombre del elemento para que se destaque más de la descripción. Al agregar botones al tema de inventario, también podemos cambiar la apariencia de los botones del artículo. Voy a usar la misma caja gris para los botones que el panel. Usaré el mismo cuadro de estilo para cuando se presione el botón. El destino es cuando está deshabilitado. Cambia el botón a blanco cuando tenga foco, o amarillo cuando se cierne sobre él Voy a añadir una textura destrozada y una etiqueta al botón para mostrar un icono para representar el objeto, y un contador de cuántos de ese objeto tiene actualmente el jugador Quiero que el icono mantenga su relación de aspecto y permanezca anclado al centro del botón En cuanto al nodo de etiqueta. Lo pondré en 99, para que pueda ver cómo se ve. Anclaré el contador a la esquina inferior derecha del botón y le daré un contorno grueso para que destaque contra el icono. Pero cuando sea un número de un solo dígito, voy a querer que esté centrado horizontalmente. A partir de mis iconos, estaré usando una hoja de sprite hecha por Shashi en itch dot IO Usando una textura de atlas, podemos definir esta textura como una sola s a partir de una hoja. Estableciendo la propiedad textur como la textura Atlas, entonces podemos hacer clic en el botón dit region, luego dividir la hoja de sprite en sprites individuales Seleccionando uno para que actúe como marcador de posición, usaré una poción de salud y la escalaré para llenar el botón Estos activos son pixel art, que no debería ser borroso así Voy a necesitar cambiar el filtro de textura a vecino más cercano para obtener el aspecto apropiado para este icono. Voy a establecer su tamaño en 32 por 32 píxeles, y es pivote para estar en su centro, así que se sienta muy bien dentro del botón. Ahora que tenemos un artículo de muestra, vamos a duplicarlo un montón de veces para simular cómo se verá un inventario completo. El contenedor de rejilla necesitará tener más de una columna. Cinco columnas encajan muy bien en el espacio. Pero todavía solo podemos contener 20 artículos dentro del contenedor de cuadrícula antes de que los artículos se desborden fuera del panel. Recordando los valores de anclaje que utilizamos para este contenedor. Si agregamos un contenedor de desplazamiento, luego copiamos los mismos anclajes para el contenedor de desplazamiento que teníamos para el contenedor de cuadrícula Luego anida en el contenedor de rejilla dentro del contenedor de desplazamiento. desplazamiento se habilitará automáticamente para permitir que se retengan cualquier número de artículos Reiniciaré los desplazamientos de anclaje del contenedor de vista de desplazamiento para obligarlo a permanecer dentro de los anclajes Ahora podemos eliminar todos menos uno de los botones de marcador de posición. El último botón debemos guardar como escena propia. Uno que podamos usar como plano para generar el inventario del jugador Lo guardaré en una nueva carpeta de escenas para escenas de UI. Después mueve el menú de configuración a esta carpeta también. A continuación, podemos eliminar el último botón y eliminar todo el texto del marcador de posición, dejándonos con una pantalla de inventario vacía Nuestro panel de inventario también debería incluir un botón cerrado si planeamos lanzar este juego en PC. Vamos a agregar un botón. Re. Y anclarlo a la esquina superior derecha del panel. Nuestro tema ya tiene un ajuste para los botones, pero podemos cambiar el aspecto de este botón sin afectar a otros botones usando una variación de tipo. Pero agrega un nuevo tipo a nuestro tema de inventario, y esta vez solo escribe un nombre personalizado para nuestro botón cerrado. En la última pestaña de nuestro nuevo tipo, podemos especificar un tipo base para este tipo, que será botón. Luego cambiando a la pestaña de cuadro de estilo, podemos sobrescribir sus valores para usar diferentes cuadros de estilo específicamente para botones cerrados Usando el botón X rojo pre hecho del UIPac para el estado normal del botón, entonces podemos seleccionar el nodo de botón cerrado y establecer su variación de tipo para cerrar Utilizará esa configuración de tema en lugar de la configuración normal del botón. Voy a establecer su tamaño para que sea de 128 píxeles y lo volveré a anclar a la esquina superior derecha. Solo usaré el mismo cuadro de estilo para cada estado de botón para el botón cerrado. Es adjuntar un script a nuestro panel de inventario, nombrarlo inventario y guardarlo en la carpeta de scripts de la interfaz de usuario. Puede heredar de una clase que escribimos en el menú del curso esencial Al heredar de la clase de menú, ya nos encargaremos de abrir y cerrar el menú, darle enfoque a un elemento de enfoque predeterminado cuando se abra el menú y proporcionaremos migas de pan si hacemos que este menú sea accesible desde otro Sin embargo, me gustaría anular estos comportamientos para poder desactivar el nodo jugador mientras el inventario está abierto. Copiar las definiciones de abrir y cerrar en el script de inventario, y llamar a las súper definiciones. Nuestro árbol de escenas se está volviendo bastante grande y complejo ahora, por lo que la ruta del nodo entre el inventario y el nodo jugador requerirá subir varios niveles. Al acceder a un nodo único a través de una ruta de nodo compleja, es mejor marcar el nodo como único. Al hacer clic derecho en el nodo del jugador, seleccione el acceso como nombre único. El nodo está marcado con un signo de porcentaje. Ahora cuando tomamos una referencia a él usando add on re, la ruta del nodo se reemplaza con el signo de porcentaje y ahora es una referencia directa a este nodo único específico. Al abrir el, podemos establecer la propiedad habilitada del nodo jugador en caídas, para que el jugador no pueda moverse ni saltar. Y cuando el cerrado, si no hay pan rallado, entonces podemos volver a habilitar el nodo jugador para que el jugador pueda seguir jugando el juego. También necesitaremos agregar un botón al mapa de entrada de la configuración del proyecto para abrir el inventario. Usaré la tecla de retroceso o el botón de selección en mi controlador En el guión del jugador, si se presiona el botón de inventario, podemos decirle al administrador del juego que active el inventar Pero el jugador debe poder cerrar el inventario mientras el nodo jugador está deshabilitado, por lo que será necesario separar la comprobación de la funcionalidad de pausa. En el guión del administrador del juego, agarrando una referencia al menú de inventario Podemos abrirlo si está cerrado o cerrarlo si está abierto. Entonces, el script de inventario necesita poder decirle al administrador del juego si está abierto o no. Entonces, al declarar una variable booleana, naturalmente, por defecto será false, y podemos establecerla cuando el inventario se abra Cuando se abre por primera vez el menú de inventario, es probable que el inventario del jugador esté vacío, así que no va a haber nada que pueda tomar el foco. Podemos agregar una instrucción if al script del menú para verificar primero si el elemento de enfoque predeterminado se ha establecido antes de decirle que tome el foco. Ahora el inventario que no tiene un elemento de enfoque predeterminado no se molestará en tratar de tomar el foco cuando esté vacío. L et's conectan la señal pulsada de los botones cerrados a la función de cierre de menús de inventario. Y establecer la propiedad visible del inventario por defecto, lo que se cierra por defecto. Vamos a probarlo. Al abrir el menú, el inventario del jugador está vacío y el movimiento y el salto del jugador se han desactivado. Pero aún podemos cerrar el inventario con el mismo botón utilizado para abrirlo, que re habilita los controles del jugador. Ahora tenemos un menú de inventario en nuestro juego que podemos usar para mostrar el contenido del inventario del jugador. Y en la siguiente lección rellenaremos este menú con los elementos de los jugadores y permitiremos que el jugador los seleccione para obtener más información sobre ellos. Te veré en la siguiente lección. 6. Artículos: Hola, amigos. En la lección anterior, agregamos un menú de inventario a nuestro juego. En esta lección, agregaremos botones de artículos al menú de inventario. Nuestros artículos van a necesitar mucha más información que solo un nombre para mostrar, y no queremos que esta información esté vinculada a la escena tres D y el modelo del artículo. Ya que cuando el objeto está en el inventario del jugador, no se sorteará en tres D, sino que se sorteará en dos D dentro del menú de inventario. Podemos agrupar toda la información sobre nuestros artículos en un script de recursos personalizado. Lo pondré en la carpeta de recursos personalizados y crearé una nueva carpeta para los elementos. Lo nombraré elemento heredando del recurso. Luego, en la parte superior del guión, le daremos a este script un elemento de nombre de clase. Aquí podemos exportar cualquier variable que necesitemos para describir el ítem, como su nombre y descripción, así como una Textura dos D para que su icono sea dibujado en el inventario del jugador. Y también podemos incluir una escena de tres D del ítem, pero aún no necesitamos esto, y si se hace incorrectamente, romperemos tu proyecto. Por ahora, solo agreguemos un comentario diciendo que incluya esto más adelante. Guarde el script, para que el motor reconozca el elemento como una clase de recurso. Al hacer clic derecho en la carpeta de nuevos elementos, ahora podemos crear un nuevo recurso de tipo item, y nombrarlo después del ítem. Empezaré con el At. Voy a requerir que cada elemento mi juego tenga un nombre único y que el archivo de recursos de ese elemento también use la ortografía exacta de ese nombre para simplificar. El recurso debe abrirse automáticamente en el panel inspector cuando se crea. Pero si no, se puede abrir haciendo doble clic sobre él. Luego podremos ver y editar sus propiedades. Dándole un nombre y una descripción, podemos rellenar el icono con una textura de atlas, seleccionando el sprite apropiado de la hoja de sprites Cambiaré el corte de sprites a una cuadrícula de 32 por 32 píxeles y seleccionaré el icono x crearé el recurso de artículo de poción de salud con un nombre, descripción y un icono Pero quiero que la poción de salud sea apilable. Podemos usar herencia para dar a nuestros artículos propiedades adicionales. Vamos a crear otro recurso personalizado heredando del elemento llamado apilable Este script agregará un nuevo nombre de clase, elemento extensible apilable, y solo exportará una variable adicional, el límite de pila del ítem, que por defecto voy a 99 Al hacer doble clic en el recurso potente Salud, bajo la sección Rf count, podemos cambiar el script del que hereda este recurso al script apilable Ahora podemos establecer el límite de tamaño de pila. Algunas otras variables pueden tener sus valores restablecido al hacer esto, y necesitaremos repoblarlas. A continuación, debemos abrir las escenas de elementos y editar los guiones de elementos antiguos adjuntos a ellas. Estos scripts ya no necesitan un nombre para mostrar, sino una referencia al recurso del elemento. Que luego podemos asignar en el inspector para cada ítem. A continuación, ahora que tenemos un script de inventario adecuado, vayamos al script de progreso, hagamos pública la variable de inventario y movamos la función add to inventory al script de inventario donde pertenece. Voy a renombrarlo para agregar ítem, aceptando un ítem como parámetro en lugar de un nodo tres d y dejando el parámetro quantity como está. De vuelta al guión de recursos Progress, me gustaría permitir que en el inventario del jugador aparecieran múltiples copias del mismo ítem, lo que sería algo más difícil con un diccionario. Entonces voy a cambiar el tipo de la variable de inventario a una matriz. Pero cada elemento en la matriz de inventario todavía necesita un identificador del nombre del artículo, y si el artículo es apilable, entonces también una cantidad Entonces el inventario será una matriz de diccionarios con cada diccionario conteniendo el nombre del artículo y posiblemente otros detalles como cantidad en ese espacio de inventario. Cualquier detalle específico sobre cualquier elemento que se pueda cambiar y deba guardarse también deberá incluirse como entrada de diccionario. Si el jugador recoge 98 pociones de salud y dos ejes, el inventario acabará luciendo algo así En el script de inventario, necesitaremos poder agregar botones de ítem al menú de inventario que representen cada ítem o pila de artículos en el inventario del jugador. Para eso, necesitaremos un botón de artículo prefabricado. El que creamos en la lección anterior y lo guardamos en la carpeta UI scenes. Arrastrar un archivo de escena a un guión mientras mantiene presionada la tecla de control o comando, declarará una constante para retenerlo y precargar la escena con una llamada a función, devolviendo un tipo de escena empaquetada Las constantes se nombran convencionalmente en todas las mayúsculas y los valores de retención, que por definición nunca cambian Llamemos a esto prefabricada. Dado que contiene un plano para un botón prefabricado, estaremos produciendo en masa escribir una función que agregará un botón de nuevo artículo al menú de inventario, aceptará un artículo y una cantidad como parámetros. Declarando una nueva variable de botón de ítem, instanciaremos una copia del A continuación, cambie la propiedad de textura de los nodos del icono al icono que pertenece a este elemento. Si la cantidad es otra cosa que no sea una, estableceré la propiedad text del nodo de etiqueta de botones para que sea la cantidad convertida en un tipo de cadena. Y si es uno, establece su propiedad visible en false para ocultarla. También necesitaremos una referencia al nodo contenedor que contiene los botones. No necesitamos especificar el tipo de contenedor o artículos, ya sea una caja vertical o una cuadrícula, por lo que seguirá funcionando si queremos cambiarlo más tarde. Después de que se haya creado el botón, solo necesitamos agregarlo al contenedor para que se dibuje en el menú. Cuando la escena del juego se cargue por primera vez, tendremos que inicializar el inventario del jugador para que ya se complete con el contenido de los artículos de inventario del jugador Iterando a través de cada elemento en el inventario del jugador, agregaremos un nuevo botón de elemento al contenedor para cada entrada Dado que el valor almacenado en el inventario del jugador es un nombre de cadena del artículo, necesitaremos cargar el recurso que contiene la información real del artículo. Arrastrar cualquier recurso de elemento desde la pestaña del sistema de archivos al script nos dará una ruta hacia él. Luego podemos reemplazar el nombre del artículo en esta cadena por el nombre del artículo en el inventario del jugador, ya que todos se nombran exactamente como su nombre de artículo. Si desea que varios artículos tengan el mismo nombre pero diferentes propiedades, entonces el valor almacenado en el inventario tendría que ser un nombre de archivo único, no el nombre para mostrar. También necesitaremos la cantidad del artículo si el artículo tiene un valor de cantidad. De lo contrario, sólo podemos asumir una cantidad de uno. Esto generará los botones para mostrar las 98 pociones y dos ejes con los que se ha dicho el juego para comenzar Al agregar un objeto al inventario del jugador, primero podemos determinar si el artículo es apilable o no, ya que el proceso diferirá mucho Luego llame a funciones privadas separadas para agregar un elemento apilable o un solo elemento Al agregar un solo elemento, simplemente empujaremos un nuevo diccionario en la parte posterior de la matriz de inventario del jugador. Un diccionario que contiene un nombre, el nombre del elemento. Luego podemos agregar un botón de nuevo artículo para este artículo. Hagamos la cantidad opcional dándole un valor predeterminado de uno. Si el artículo es apilable, el proceso es mucho más complicado Primero necesitamos buscar a través del inventario de jugadores para encontrar las pilas existentes del mismo artículo. Verifique si esas pilas tienen espacio para los artículos que se agregan, verifique si se excede el límite de pila y repita hasta que todos los artículos se hayan agregado a las pilas existentes o cada pila existente esté llena. Si aún queda algún artículo por agregar, entonces tendremos que crear nuevas pilas para retenerlos. Tendremos que iterar a través cada pila en el inventario del jugador Comprobando si el nombre de los artículos almacenados en ranura I es el mismo que el nombre de este artículo. Entonces necesitamos verificar si hay más espacio en la pila comparando la cantidad de la pila con el límite de tamaño de la pila. Entonces podemos agregar la cantidad a la pila. Entonces podemos establecer la cantidad para que sea la cantidad de pila menos el límite de tamaño de pila, que ahora es el número de artículos que exceden el límite de tamaño de pila. Entonces, si la cantidad es ahora algo mayor que cero, se ha excedido el límite de tamaño de pila, y podemos establecer el tamaño de la pila al límite. Si la cantidad en la pila no superó el límite, ya terminamos y podemos salir del bucle. cantidad ahora contiene los artículos que aún no se han agregado a una pila, y el bucle continuará agregando elementos a las pilas hasta que la cantidad se haya usado o cada pila esté llena. Después de que se complete este ciclo, si queda alguna cantidad, necesitaremos generar nuevas pilas de artículos para mantenerlas. Comprobando si la cantidad es menor o igual al límite de pila. Podemos generar una pila de tamaño cantidad. Luego establece la cantidad a cero. De lo contrario, podemos crear una nueva pila completa y reducir la cantidad por la cantidad límite de pila y repetir. Agregar nuevos botones al menú de inventario para las nuevas pilas. Cada vez que se cambia la cantidad de artículos en una pila, tendremos que actualizar la etiqueta en el botón para que coincida con el nuevo valor. Así que vamos a crear una nueva función privada que acepte el botón y la nueva cantidad como parámetros con el botón teniendo el mismo índice de matriz dentro los contenedores hijos que el índice de inventario. La cantidad también deberá actualizarse antes de salir del bucle. Definir esta función, aceptando los mismos parámetros. Ya hemos escrito este código al crear nuestros nuevos botones de elemento. Movamos este código a nuestra nueva función, y llamémoslo aquí también. En el guión del jugador, podemos usar el mismo método de nombre único para obtener una referencia al inventario del jugador. Después al presionar el botón interactuar, agrega el recurso adjunto al ítem más cercano al inventario del jugador. Volviendo al script de inventario, Para mostrar la información de los artículos, también necesitaremos tomar referencias al nombre del artículo y a los nodos de descripción del artículo. Escribamos otra función que muestre información de un elemento en el lado derecho del panel, aceptando un elemento como parámetro. Dándole un valor predeterminado de null, también podemos usar esto para no mostrar ninguna información también. Establecer la propiedad de texto de nombres de elemento el nombre del elemento si el elemento no es nulo, lo contrario una cadena vacía, y lo mismo para la descripción. Cada vez que se agrega un nuevo botón de elemento al menú, podemos conectar su señal de enfoque ingresada a esta función. Pero la función requiere un ítem como argumento, y la señal no tiene ningún argumento. Podemos enlazar argumentos a un callable con una llamada a función, pasando el elemento en sí Por último, al abrir el menú de inventario, si el contenedor tiene hijos, debemos decirle al niño superior que se concentre. Y si no tiene hijos, mostrar la información del elemento, pasar null es el argumento. L et's pruébalo. Comenzamos con 98 pociones de salud y dos ejes en nuestro inventario, y la información de las pociones de salud se enfocó, mostrando la información a la derecha Después de recoger los artículos sobre la mesa, se agregó una poción de salud a la pila de 98 llenándola, mientras que la otra inició una nueva pila junto con el otro hacha Como los botones tienen enfoque, también son navegables con las teclas de flecha del teclado o el pad direccional del controlador Ahora tenemos el inventario de jugadores que se muestra en el menú. En la siguiente lección permitirá al jugador dejar caer o consumir artículos en el inventario. Te veré en la siguiente lección. 7. Consumibles: Hola, amigos. En la lección anterior, agregamos artículos al inventario del jugador y mostramos la información del artículo. En esta lección, permitiremos que el jugador caiga o consuma artículos en su inventario. En el menú de inventario, necesitaremos presentar opciones al jugador de sus opciones para el artículo seleccionado. Para que las cosas sean simples, solo tendré dos botones debajo descripción del artículo organizados en un contenedor de caja horizontal, y renombrarlos auxiliares y Drop. Eliminando los cuadros de estilo anulando el tema del botón, solo voy a tener el botón izquierdo diga use y el derecho diga soltar No todos los elementos del juego serán utilizables, por lo que no tiene sentido que el botón diga usar cuando se selecciona el hacha. Tendría más sentido que dijera equipar. Este botón será sensible al contexto en función del tipo de elemento que se seleccione. Quiero que estos botones estén espaciados uniformemente en la parte inferior del panel. Voy a establecer su alineación horizontal para alinear con expandir y llenar. Después también restablecemos los desplazamientos de anclaje de la caja vertical para mantenerla contenida dentro de los anclajes Y también dile la descripción para alinear con expandir y llenar la caja vertical tanto como pueda, presionando los botones hasta la parte inferior del panel. T. En la configuración del proyecto, agregaré asignaciones de entrada para Ue item y drop item Luego configure el botón x en el Controlador para su uso y el botón Y en mi Controlador para soltar. agregaré estos indicadores de botón a las propiedades de texto de los botones. Entonces el jugador sabe qué botón del controlador hace qué. Los reproductores de PC pueden simplemente hacer clic en los botones. Quitaría el texto X o Y y probablemente agregaría más cuadros de estilo para estos botones para la exportación de PC del juego. En el script de recurso item, podemos agregar una variable booleana que especifique si un elemento es utilizable o no y otra para especificar si el elemento se consume cuando se usa Mientras estemos aquí, también necesitaremos acceder a la escena de las tres D que contiene el objeto real, para que cuando el jugador suelte el objeto, podamos generarlo en la escena, o si usa el objeto, podemos hacerlo aparecer en la mano del personaje No podemos dar a la escena tres D una referencia al archivo de recursos y también darle al archivo de recursos una referencia a la escena tres D. Esta es una referencia cíclica y crearemos un bucle infinito que rompe cualquier escena que contenga el elemento T. En su lugar, solo le diremos al recurso item dónde encontrar la escena tres D, dándole la ruta a ella como una cadena para que podamos cargarla cuando sea necesaria. Luego, en el archivo de recursos de pociones de salud, podemos copiar la ruta de la escena de la poción de salud y pegarla en el campo de escena Podemos configurarlo para que sea utilizable y consumido en uso. No tengo ningún plan en mente para implementar un artículo que no se consume cuando se usa, pero es una buena idea flexibilizar el código. Y repita esto para el otro ítem. En el script de inventario. Tendremos que tomar una referencia a los botones de acción usando add on ready. Cuando se enfoca un botón elemento y se muestra la información del elemento, podemos establecer la propiedad text del botón auxiliar para decir, si el ítem es capaz y establecer su propiedad disabled en false. De lo contrario, por ahora solo deshabilitaré el botón. Conectemos las señales de los botones presionados al script de inventario. También agregaré una función de entrada que indicará la señal presionada del botón auxiliar para emitir cuando se presione el botón use item. Pero sólo si el menú de inventario está abierto, y el botón está habilitado. Y haz lo mismo si se presiona el botón de soltar elemento en el controlador. Normalmente no pondría una función de entrada directamente en un script como este, pero para atajos simples para presionar botones, creo que está bien omitir el paso de usar un script de manejo de entrada separado. Si se presiona el botón x usando el controlador o se hace clic en el botón de uso del menú con un mouse, se llamará a esta función en cualquier caso Pero necesitamos saber qué ítem se selecciona. Y también podría ser importante saber qué artículo específico en el inventario del jugador si tiene múltiplo del mismo artículo. Cada vez que un artículo enfoca y se muestra su información, aceptemos también el botón que representa ese elemento en el menú de inventario Dándole un valor por defecto de null, por lo que será opcional, también podemos enlazar este argumento al callable pasando el botón new item como otro argumento De igual manera, cuando estos botones pierdan el foco, sería una buena idea no mostrar información y desactivar los botones. También conectemos sus señales de salida a la misma función, vinculando nulo como los argumentos Si no se selecciona ningún elemento, entonces no podemos verificar si es utilizable, y debemos desactivar ambos botones. Declarando nuevas variables privadas para mantener el ítem seleccionado y su botón correspondiente, Podemos almacenar el ítem seleccionado y su botón cuando esté seleccionado Cuando estos botones de acción captan el foco, me gustaría decirle al botón de elemento que vuelva a enfocar inmediatamente para que el jugador siempre sepa qué elemento está seleccionado. Conectando sus señales ingresadas enfocadas, que pueden llamar a la misma función. Vamos a llamarlo en acción botón de enfoque ingresado. Pero por estos botones de acción entrando en foco, el botón seleccionado ha salido al mismo momento del foco El botón seleccionado es ahora nulo. Declaremos otra variable llamada botón previamente seleccionado que se ajustará al botón seleccionado cada vez que cambie el valor de los botones seleccionados. Entonces enfoco los cambios de un botón de elemento a un botón de acción, el botón seleccionado se establecerá en nulo. Pero el botón seleccionado anterior conservará su referencia, por lo que podemos decirle al botón previamente seleccionado que tome el foco. De esta manera, el jugador aún podrá ver qué elemento se selecciona si hace clic en los botones de acción. Ahora, cuando se realiza cualquiera de las acciones, podemos acceder fácilmente al botón que se selecciona, así como al elemento que ese botón representa en el inventario del jugador. Para soltar un elemento, si se selecciona un elemento, primero podemos declarar una variable para contener una instancia de ese elemento y establecer su valor para cargar, pasando la ruta a la escena tal como se almacena en el archivo de recursos items e instanciarlo Luego agrega este elemento al árbol de escenas. Probablemente querrás que sea un hijo del nodo de nivel para que se elimine automáticamente junto con el nivel cuando se descargue Por simplicidad, sólo voy a agregarlo al manager del juego. Declarando una variable para representar una dirección aleatoria a lo largo del plano xd, será un número aleatorio entre cero y T. To representa la circunferencia completa de un Luego estableceremos la posición global del ítem para que esté cerca la posición global del personaje del jugador ligeramente por encima del suelo, aplicando seno y coseno la dirección para obtener los valores x y Z de la nueva posición Primero asegurémonos de que tenemos una referencia al personaje del jugador usando un nombre único. Y elimina el artículo caído del inventario del jugador, pasando el artículo que se está quitando, una cantidad de uno, y el botón seleccionado que representa el artículo específico. Si el jugador presiona el botón de acción auxiliar, si hay un ítem seleccionado y ese ítem es utilizable, podemos llamar a una función privada separada para usar el ítem seleccionado. A medida que otros usos del botón auxiliar se vuelven relevantes, entonces se pueden agregar más funciones aquí. Para usar un artículo. Si el personaje del jugador está en el piso y no están ocupados haciendo otra cosa, usaré la variable can move, aunque esté marcada como privada, entonces podemos decirle al personaje que use el ítem. Si el objeto se consume en uso, entonces podemos eliminarlo del inventario del jugador, pasando el ítem seleccionado, una cantidad de uno, y su botón como argumentos. Ya que voy a agregar una animación de elemento e al personaje y quiero que el jugador la vea, cerraré el inventario del jugador al solicitar usar un elemento para que podamos ver cómo se reproduce la animación. Eliminar un objeto del inventario del jugador es muy similar a agregar uno con el comportamiento diferente para los artículos apilables frente a los artículos individuales Entonces al quitar un solo artículo si el botón no es nulo, entonces podemos seguir adelante y eliminar la entrada de inventario cuyo índice coincide con el índice hijo de este botón en la matriz de los contenedores hijos. Y también quita el botón del artículo del menú de inventario y devuelve. Haré esto en otra función privada para mantener también un control adecuado de las referencias de botones seleccionados y previamente seleccionados. Si no se proporcionó el botón, entonces tendremos que buscar a través del inventario de jugadores para encontrar este artículo. Una vez que lo encontremos, podemos retirarlo del inventario y los contenedores infantiles y devolverlo. Antes de eliminar cualquier botón de elemento, tendremos que verificar si este botón fue seleccionado o previamente seleccionado. Y si es así, establece estas referencias en null, para que no intentemos accidentalmente hacer referencia a botones que ya no existen. Usaremos gratis aquí en lugar de Q free para hacer que el efecto sea inmediato en lugar de esperar al final del fotograma actual. De esta manera, en caso de necesitar eliminar múltiples entradas del inventario del jugador, los contenedores hijos seguirán coincidiendo con los índices de inventario. Pero quitando este botón que actualmente tiene foco, tendremos que decirle a un botón adyacente que tome el foco. Entonces llamaré a una función privada para cambiar enfoque al siguiente ítem de la lista aquí. forma en que se maneje esto dependerá del número de niños que tenga actualmente el contenedor. Si hay menos de dos niños, entonces nada necesitará tomar el foco y podremos regresar. Si no se proporcionó ningún botón como punto de referencia, podemos decirle al niño superior que tome el foco. Si se proporcionó un botón, necesitaremos conocer su índice hijo dentro del contenedor. Si el siguiente índice es válido, es decir, es menor que el número de hijos del contenedor, entonces el siguiente niño puede tomar el foco. De lo contrario, este es el último hijo y, en cambio, querremos que el niño anterior se concentre. Combinemos esto en una declaración turn re. Entonces podemos proceder a eliminar el botón item ahora que ya no tiene foco. Quitar un artículo apilable será un poco más complicado. Si se proporcionó un botón específico, entonces podemos obtener su índice hijo dentro del contenedor. Luego elimina la cantidad de la pila en el espacio de inventario coincidente. Si el resultado de la resta es menor o igual a cero, entonces la pila está vacía Estableciendo el nuevo valor de cantidad el negativo del tamaño de pila actual, este valor ahora contendrá la cantidad que la pila estaba por debajo de la cantidad que estábamos tratando de eliminar. Así podemos eliminar tanto la pila de inventario el botón que lo representa del menú. Si el resultado de la resta fue un número positivo, entonces la pila no está vacía, y solo necesitamos actualizar su nuevo valor de cantidad Después regresamos ya que terminamos. Ahora que terminamos de verificar el botón sugerido, si queda alguna cantidad por eliminar, tendremos que buscar a través del inventario del jugador para encontrar más pilas de este artículo. Entonces podemos repetir la misma lógica que la anterior, usando el alias índice I en lugar del índice del botón. Y quitando el botón de coincidencia cuyo índice hijo coincide con el índice de inventario. Si alguna vez alcanzamos una cantidad de cero, ya terminamos. En una escena de personaje, seleccionar el nodo del árbol de animación dentro de la máquina de estado miscelánea. Podemos agregar la animación use item. Ya que como otras animaciones aquí, también comienza y termina con la dopose Usando los mismos ajustes de transición que las otras animaciones, configurando el modo avanzado de la transición a la animación a habilitado y el modo de conmutación de la transición fuera de la animación a al final. Pulsar el icono de reproducción nos permitirá previsualizar la animación. En el script, agreguemos una nueva función pública para usar un elemento, aceptando un elemento como parámetro. Para ello, necesitaremos una referencia a la mano principal del personaje, por lo que sabemos dónde colocar el ítem que se está utilizando. Esta también será la posición principal de la mano utilizada para equipar armas. Así que al crear una nueva categoría exportada para equipos, voy a exportar una nueva variable para la ranura principal de la mano del personaje con un tipo de unión ósea tres D. Seleccionando el nodo raíz de mi personaje. Esta ranura principal del equipo de mano será el mismo nodo de unión ósea que previamente sostenía la x con una mano. Al usar un artículo, declararemos una nueva variable para sostener una instancia del artículo y asignaremos su valor para ser carga. Pasando la ruta a las tres escenas D almacenadas en el recurso item como argumento e instanciarlo. Esto creará el artículo, que agregaremos como hijo de la ranura principal del equipo de mano. Pero este ítem tiene física y colisiones. Chocará con el personaje y se verá afectado por la gravedad Tendremos que establecer su propiedad de congelación en true, así el motor ignorará todo eso y solo lo tratará como si estuviera pegado a la mano del personaje. A continuación, esperaremos la finalización de la animación de elementos de uso. Por último, haciendo cola la instancia del ítem para ser liberada del árbol de escenas, solo vamos a suponer que la mano del personaje está vacía antes de que todo Aquí es donde se activarían los efectos de usar el ítem, pero solo imprimiremos una declaración para que actúe como marcador de posición, para que sepamos que funciona Correcciones menores en el script de inventario. Solo podemos eliminar el botón del artículo sugerido una vez. Si eliminamos varios elementos individuales, entonces usaremos null cada vez después del primero. Y al decirle al siguiente botón que tome el foco, entonces no debemos configurarlo en null inmediatamente después. Vamos a probarlo. Al abrir el inventario, tenemos 98 pociones. Podemos usar uno que cierre el inventario, y podemos ver al personaje sostener una poción en la mano, beberla y desaparece volver a abrir el inventario, ahora tenemos 97 pociones, y podemos dejar algunos artículos, eliminándolos del inventario, que ahora están dispersos en el piso alrededor personaje después de cerrar el inventario Incluso podemos volver a recoger los artículos y volver a agregarlos al inventario del jugador. Ahora tenemos artículos que se pueden soltar o usar del menú de inventario del juego. En la siguiente lección, permitiremos que el jugador equipe armaduras y armas. Te veré en la siguiente lección. 8. Equipo: Hola, amigos. En la lección anterior, permitimos al jugador usar o soltar artículos de su inventario a través del menú. En esta lección, permitiremos que los jugadores equiparan objetos a su personaje. Cada uno de nuestros personajes tiene varios artículos diferentes en sus manos, una capa y un sombrero. A excepción del pícaro, cuya capucha lamentablemente no está separada del resto del modelo, por lo que no podemos usarla como equipo Todos estos se pueden convertir en artículos siguiendo los métodos utilizados en lecciones anteriores que podemos recoger y agregar al inventario del jugador. Tenga en cuenta que el pícaro no tiene un accesorio de hueso de sombrero, y el mago no tiene un accesorio de hueso fuera de la mano Podemos arreglar esto agregando nuestros propios nodos de unión ósea al personaje y uniéndolos a los huesos correctos dentro del esqueleto. En la escena de personajes de Mag, podemos agregar un nodo hijo al esqueleto de tipo hueso adjunto tres D y cambiarle el nombre a algo así como offhand Luego en el inspector, adjunte esto a la ranura de mano uno, decir, izquierda, y ahora este nodo seguirá automáticamente la mano izquierda del personaje en todas las animaciones. Arrastrando el libro a este nuevo accesorio óseo, podemos ver cómo sigue siguiendo la mano izquierda Cualquier otro elemento destinado a ser sostenido en las manos del personaje puede ser reparado en las ranuras de mano principal o fuera de equipo antes de convertirlos en sus propias escenas para mantener sus posiciones y rotaciones relativas Luego podemos repetir este proceso para agregar un accesorio de hueso de sombrero para el personaje de fila que sigue a su hueso de la cabeza. También reorganizaré y renombraré los nodos para que coincidan exactamente con el del mago La ranura de sombrero Mag también es diferente de los otros personajes. Se posiciona más alto y se gira ligeramente. Para facilitarnos la vida, agreguemos un nuevo nodo de fijación ósea que siga la cabeza de Majes y utilicemos eso como lote de sombreros en su lugar Arrastrar el activo sombrero desde su accesorio óseo existente al nuevo también nos dará posición exacta y la diferencia de rotación de este sombrero Cuando creamos la escena del artículo de sombrero de Majes, podemos hacer de esta posición y rotación una parte natural de ella Usando estos métodos, todos nuestros personajes deben tener los mismos cuatro espacios para equipos, y cualquier artículo puede equiparse a cualquier personaje. Las ranuras del equipo se pueden renombrar para obtener consistencia, si lo prefiere, y la unión ósea no utilizada se pueden eliminar tres nodos N de las escenas de los personajes Pero el pelo de algunos de los personajes se recortará a través de algunos de los sombreros. En algunos juegos, notarás que se le quita el pelo al personaje cuando se equipa un casco o sombrero para solucionar este problema. En estos activos, el cabello es parte del modelo de cabeza, por lo que tendremos que restringir quién puede usar qué sombrero, escalar o reposicionar el sombrero dependiendo de quién lo esté usando, o simplemente ignorar el tema Especialmente cuando se usan activos de marcador de posición, es mejor tomar nota de las limitaciones y asegurarse de que los activos de producción finales aborden los problemas en lugar de replicarlos Antes de crear cualquier nuevo recurso de elemento, definamos un nuevo tipo de recurso de elemento. Lo llamaremos equipo, heredando del artículo. Esto nos permitirá agregar una nueva variable a los artículos que entran dentro de esta categoría, el tipo de equipo que es, que determinará cómo se puede equipar. En nuestras enumeraciones de proyectos, podemos agregar una lista enumerada de las diferentes ranuras de equipo para nuestro juego, mano principal, fuera de mano, cabeza y espalda, así como cualquier otra ranura de equipo que La enumeración del tipo de equipo ahora se puede usar como un tipo para la variable de tipo de equipo, por lo que podemos configurarla fácilmente en el inspector Cambiar la secuencia de comandos de eje de elemento a equipo. Se puede configurar para que sea equipo para la ranura principal de la mano del personaje. En el script de caracteres, podemos agregar más variables para cada ranura de equipo o cambiar la variable en una matriz de accesorios óseos llamados sockets. Al usar un artículo, la mano principal ahora es socket cero. A continuación, asigne cada cavidad de fijación ósea en el mismo orden en la matriz para cada carácter. A continuación, podemos agregar nuevas funciones públicas para decirle al personaje que haga o haga piezas de equipo. Ponerse una pieza de equipo requerirá una referencia al artículo, y quitarse solo requerirá la A D una pieza de equipo es mucho lo mismo que instanciar la poción y ponerla en la mano del personaje Sustitución de la toma de mano principal con cualquier enchufe para el que esté destinado el artículo. dopaje solo requiere que verifiquemos si el zócalo tiene un hijo, y si es así, deshacernos de él Usando un artículo, ya no podemos asumir que sus manos están vacías. Declaremos una nueva variable para contener lo que sostenía el personaje antes de que se le dijera que usara el ítem. Si la toma de mano principal tiene un hijo, entonces eso es lo que sostenían, y deberíamos establecer su propiedad visible caídas para ocultarla cuando usen el artículo. Si estaban sosteniendo algo antes de usar el elemento, entonces podemos establecer su propiedad visible de nuevo en true después de que se haya completado el uso del ítem. En el recurso de progreso, necesitamos hacer un seguimiento de todo lo que el jugador tiene equipado. Una forma sencilla de hacer referencia a los artículos dentro del inventario sería usar su índice de matriz Entonces, el equipo de nuestro jugador es una matriz de enteros con cada elemento de la matriz que contiene el índice de matriz del equipo en el inventario del jugador Al establecer por defecto el contenido de la matriz a uno negativo para cada entrada, podemos usar uno negativo como significante de que la ranura está vacía Ahora para conectar todo esto al menú de inventario. Cuando un botón de elemento está enfocado, estamos mostrando su información, pero necesitaremos crear cajas separadas para cuando se trata de una pieza de equipo. Luego divida aún más en función si este artículo está equipado actualmente o no. En cualquier caso, el botón auxiliar está habilitado, pero el botón desplegable debe desactivarse si el artículo está equipado. Cambiar el botón auxiliar para equipar o equipar en consecuencia. ¿Cómo sabemos si el artículo seleccionado está equipado? Necesitamos conocer su índice dentro de los contenedores hijos, ya que ese es el número guardado en la matriz de equipos del recurso de progreso. Entonces podemos verificar si la matriz de equipos en el índice de los ítems seleccionados designada ranura coincide con este valor y devolver verdadero o falso? Todo esto se puede hacer en una sola línea de código. Si el botón desplegable está desactivado o no, también deberá manejarse para los artículos consumibles y los casos nulos Cuando se presiona el botón auxiliar, si el artículo seleccionado es equipo, entonces podemos usar la misma condición para desequipar o equipar el artículo seleccionado Para equipar un objeto, estableceremos matriz de equipos en el recurso de progreso en el índice de la ranura del artículo para que sea el índice de matriz del elemento dentro del inventario del jugador. Entonces dígale al personaje que haga el equipo. Reutilizaré la etiqueta en el elemento pero configurando su texto predeterminado una E mayúscula para equipar y estableceré su propiedad visible al equiparlo También actualizaré el texto de los botones auxiliares y deshabilitaré el botón desplegable. Para desequipar un artículo, estableceremos la matriz de equipos en el índice de la ranura de elemento en uno negativo, ya que ahora está vacía, diciéndole al personaje que dof lo que tenga en el socket coincidente Ocultar la E para equipado en el botón, fechar el texto de los botones auxiliares y activar el botón desplegable. Pero antes de equipar un artículo, tendremos que verificar si un artículo ya está equipado en esa ranura, lo que significa que el valor de la matriz de equipos en el índice de la ranura del artículo es cualquier otra cosa que no sea negativo En ese caso, deberíamos decirle al personaje que dof lo que tienen en ese socket Entonces también encontramos el botón en el contenedor cuyo índice coincide con el del valor del array del equipo, así podemos ocultar la E para equipado. Luego podemos proceder a equipar el artículo seleccionado. Para que esto funcione, los valores en la matriz de equipos siempre deben coincidir con los índices de matriz de los artículos en el inventario del jugador. Pero los índices de matriz cambian cada vez que se elimina un botón de elemento. Requeramos el índice de matriz como parámetro al eliminar los botones del ítem del menú de inventario, que ya lo encontramos cada vez de todos modos. Luego podemos buscar a través de la matriz de equipos cualquier valor que sea mayor que el índice del elemento que se está eliminando. Si los hay, entonces se pueden reducir en uno, por lo que aún coinciden con el índice del artículo equipado. En mi recurso de progreso, comenzaré al jugador con un montón de artículos nuevos en su inventario y también tendré algunos de ellos. Después de inicializar primero el inventario del jugador, también podemos iterar a través de la matriz de equipos Si la ranura del equipo es otra cosa que no sea una negativa, entonces podemos encontrar el botón cuyo índice coincida con el valor almacenado aquí. Para simplificar las cosas, solo usaré funciones existentes, diciéndole al botón que tome el foco y equipando el elemento seleccionado Ahora cuando se inicializa el inventario, así también, el jugador está equipado con artículos tal y como se almacenan en su archivo. Vamos a probarlo. El personaje comienza equipado con algunos artículos y abriendo el inventario tenemos varios para elegir. Podemos desequipar artículos, equipar otros nuevos. Si tratamos de equipar un artículo en una ranura ocupada, el artículo equipado no está equipado antes de cambiar Si tomamos una poción, el objeto principal de la mano del personaje se oculta durante la animación y regresa después de que hayan terminado Ahora tenemos artículos que se equipan para el personaje del jugador a través del menú de inventario. En la siguiente lección, permitiremos que el jugador cambie artículos con un NPC Te veré en la siguiente lección. 9. Tienda: Hola, amigos. En la lección anterior, permitimos que el jugador equipara elementos del menú. En esta lección, haremos que compren y vendan artículos de un PNJ Para ahorrar tiempo, voy a reutilizar el mismo menú de inventario para crear la tienda. Cambiaré el nombre del contenedor de caja vertical a info y lo duplicaré para crear otro control con los mismos anclajes y tamaño, y renombrarlo para comprar En lugar del nombre y la descripción del artículo, la tienda contendrá un contenedor de desplazamiento, un contenedor de cuadrícula del stock de las tiendas al igual que el que contiene los artículos del jugador. El contenedor de desplazamiento puede llenar el espacio, presionando los botones hacia abajo. En lugar del botón auxiliar, tendré un icono de moneda, el precio del artículo seleccionado actualmente y un botón de transacción sensible al contexto para comprar o vender el artículo seleccionado. El icono de la moneda puede mantener su relación de aspecto, pero encajar proporcionalmente dentro del espacio proporcionado Voy a averiguar la cantidad máxima de espacio que el precio podría ocupar y usarlo como su tamaño mínimo personalizado. Entonces el botón puede usar el resto del espacio. También agregaré 32 píxeles de separación entre estos tres controles dentro del contenedor de caja horizontal y cambiaré la propiedad de texto de la transacción para decir. Llenemos el stock de la tienda con un montón de artículos ficticios para ver cómo se ve Las columnas de la cuadrícula deben caber dentro del espacio muy bien. Para cambiar entre la vista de inventario y la vista de tienda, todo lo que necesitamos hacer es alternar la visibilidad entre los nodos de información y tienda, y también podemos cambiar el título también. Cuando esté satisfecho con el diseño de su tienda menos, puede eliminar los artículos ficticios del stock de la tienda En el script, necesitaré actualizar la ruta del nodo al nodo info para reflejar su nuevo nombre. Necesitaremos referencias al título, la información y los nodos de la tienda, para que podamos intercambiarlos de un lado a otro, y también el contenedor que contendrá el stock de la tienda, la etiqueta de precio y el botón de transacción. Nuestro script de inventario se está volviendo un poco grande. Una manera útil de mantener organizados los scripts más largos es crear regiones de código usando comentarios. Con un comentario de región encima de un bloque de código que nombra la región y un comentario de región final en la parte inferior de la región La región puede colapsarse y expandirse para organizar mejor el guión. Agreguemos una nueva función pública que abre el menú de inventario como tienda. Cambiaremos el título para decir tienda en lugar de inventario, estableceremos la propiedad visible de la vista de información false y la visibilidad de la vista de tienda en true. Entonces podemos llamar a nuestra función abierta existente para hacer también el resto de estas otras cosas. También tendremos que crear una función para abrir el menú en modo inventario, restablecer el título de nuevo al inventario e invertir la visibilidad de los nodos de información y tienda El administrador del juego abrirá el menú como inventario cuando se presione el botón de inventario. Utilizando el sistema de gestión de eventos que construimos en el curso anterior, podemos adjuntar un nodo D de área tres a cualquier personaje de nuestra escena de nivel y cambiarle el nombre de tienda. Al agregar una forma de colisión tres D cuando era niño, podemos darle un tamaño y una forma que sea fácil para el jugador apuntar con su refundición de interacción El área tres D no necesitará monitorear nada más que ser monitoreable existente en la capa de colisión específicamente para interacciones y no tener máscara de colisión Para obtener más información sobre eventos de interacción, consulte el curso anterior de diálogo y eventos. Vamos a crear un nuevo script para este nodo, guardado en la carpeta de scripts de eventos. Heredar del evento de interacción. En este script, podemos exportar una variedad de artículos para representar el stock de artículos que están disponibles para su compra. Al igual que cualquier script de eventos, escribiremos una función de evento de ejecución, aceptando el administrador de eventos como parámetro, que contiene todas las referencias de objetos nuestros eventos puedan necesitar para hacer su trabajo. En este caso, el administrador del evento necesitará una referencia al inventario del jugador y la tienda si estás usando un menú separado para ello. Esto también permitirá al administrador del evento agregar o eliminar elementos del inventario del jugador durante los eventos o dialogar si es necesario. El guión de la tienda puede pedirle al gerente de eventos que abra el menú de la tienda. Pasar una referencia a sí misma es un argumento, por lo que el inventario tendrá acceso al stock y a cualquier otra variable pública que desee. Vamos a darle a esto un nombre de clase de tienda, para que el script de inventario pueda aceptar una tienda como parámetro al abrir el menú como tienda. Para usar el comando de espera durante el evento, nuestra función open as shop también necesita devolver una señal para esperar. Aceptando la tienda como parámetro, podemos almacenar una referencia a ella al abrir el menú de inventario como tienda. La señal devuelta será cuando se cierre el menú de inventario. Podemos emitir esa señal cada vez que se cierre la ventana, aunque nadie la esté escuchando, cuando se abra el menú como inventario del jugador. Para que nuestras tiendas sean más únicas, también exportemos una línea de diálogo para el vendedor como introducción y otra como outro Luego agréguelos a la función run event como diálogo adicional antes y después de acceder a la tienda. Y dígale al manager del juego que ponga fin al evento. Incluso podemos exportar un multiplicador de valor llamado markup para dar a diferentes proveedores diferentes precios para sus artículos Voy a establecer el marcado predeterminado para que sea diez veces el valor. Llenemos la tienda nocturna para incluir la poción de salud y el A así como una línea de diálogo intro y outro. En nuestro recurso personalizado de artículo, podemos darle a cada artículo un valor como un entero con un valor predeterminado de una moneda. A cada elemento del juego se le puede asignar entonces un valor diferente, que en este caso, será la cantidad por la que el jugador puede vender un artículo. Pero compraremos a diez veces ese precio. De vuelta al guión de inventario, también sería útil exhibir las monedas del jugador. Hagamos de eso un nodo único y agarremos eso también. Podemos abrir el contador de billetera cuando se abre el inventario, y decirle que se mantenga abierto pasando true como argumento. Entonces dígale que cierre cuando se cierre el inventario. A diferencia del inventario del jugador donde inicializamos los muchos botones onload, luego agregamos o eliminamos botones a medida que se agregan o eliminan artículos del El stock de la tienda deberá generarse cada vez que el jugador interactúe con el vendedor y se despeje por completo cuando haya terminado de comprar Borrar el stock es bastante sencillo, simplemente iterando a través de cada uno de los hijos del contenedor de stock y ponerlos en cola para ser liberados del árbol de escena También podemos establecer shop null aquí o en la función cerrada. Podemos borrar el stock en cualquier momento que el menú de inventario esté cerrado. Si el menú de inventario se abrió como inventor y no como tienda, el contenido de stock de la tienda estará vacío de todos modos. Generar el stock es casi el mismo proceso que generar el inventario inicial del jugador, iterar a través de cada artículo en la matriz de stock de la tienda, luego llamar al botón agregar artículo Pero necesitaremos un nuevo argumento para especificar a qué contenedor se va a agregar el botón. Luego agrega el parámetro a la función para que coincida, dándole un valor predeterminado del contenedor de ítems del jugador. Esta información de en qué contenedor se encuentra este botón también será relevante a la hora mostrar la información de los artículos, así como cuando se presione el botón de transacción. Podemos almacenar esta información dentro de los metadatos de los nodos. Agreguemos una nueva entrada a los metadatos de nuestro botón recién creado, con el nombre está en el inventario, con un valor de si el contenedor al que se está agregando es igual al contenedor de ítems del jugador. Ahora cada botón sabe qué lado del menú de la tienda está. Al mostrar una información de artículos, si hay un botón seleccionado, podemos obtener sus metadatos utilizando el mismo identificador que está en el inventario. Si el artículo está en el inventario del jugador, entonces podemos establecer la etiqueta de precio al valor del artículo y establecer la propiedad de texto del botón de transacción en x vender. Para que las cosas sean simples, no permitiré que el jugador venda ningún artículo que tenga equipado y desactive el botón de transacción en ese caso. Si el artículo está en stock de la tienda, entonces el texto del precio será valor de los artículos multiplicado por el margen de beneficio de la tienda. Y el texto de los botones de transacción cambió a x por. Si el botón está desactivado o no dependerá si las monedas actuales del jugador son menores que el precio. Al verificar si el artículo seleccionado está equipado, asegurémonos de que haya un artículo seleccionado y que también sea una pieza de equipo. En la función de entrada, si la variable shop no es nula, podemos volver para evitar que se verifiquen las funciones use item o drop item. Si se presiona el botón de usar artículo, que estamos reutilizando aquí para activar la acción de compra o venta, siempre y cuando el botón de transacción no esté deshabilitado, podemos emitir su señal presionada Conectando la señal pulsada del botón de transacción al guión, moveré a la región de la tienda. Si no se selecciona ningún artículo o no se está interactuando actualmente con ninguna tienda, entonces simplemente podemos regresar Si el botón seleccionado está en el inventario del jugador, entonces el botón de transacción venderá el artículo seleccionado actualmente. Aumentar las monedas del jugador por el valor del objeto, y eliminarlo del inventario del jugador. De lo contrario, el botón seleccionado debe estar en el stock de la tienda, que significa que el botón de transacción lo va a comprar, reduciendo las monedas del jugador por el valor del artículo multiplicado por el margen de beneficio de la tienda, agregando el artículo al inventario del jugador y volviendo a verificar si el botón de compra debe estar deshabilitado o no el botón de compra debe estar deshabilitado Una pequeña corrección al actualizar la cantidad en un botón deberá establecer su propiedad visible en true. En el guión de progreso. Voy a empezar el jugador con algo de dinero. También ignoraré la advertencia de conversión de ala estrecha generada al lanzar este flotador en un entero. Recuerda que el menú de inventario debe comenzar cerrado. Vamos a probarlo. Hablando con la noche, nos reciben con una línea de diálogo antes de que abra la tienda, que también muestra nuestras monedas. El botón de transacción muestra vender al seleccionar nuestros artículos. Pero se desactiva cuando el artículo seleccionado está equipado. Podemos vender artículos de nuestro inventario, lo que nos da más oro. El botón de transacción muestra comprar al seleccionar los artículos en stock de la tienda, pero se desactiva cuando no tenemos suficiente dinero para comprar el artículo. Podemos comprar artículos al vendedor gastando nuestro oro. Y cuando cerramos la tienda nu, la noche nos lo agradece. Ahora tenemos una tienda en nuestro juego para que el jugador pueda comprar y vender artículos de un NPC 10. ¿Qué sigue?: Hola, amigos. Antes de que empecemos, deberías tener un proyecto con un personaje jugador que pueda moverse en un entorno, y algunos enemigos para que peleen. También es posible que desee tener un menú de inventario capaz de equipar artículos, incluyendo al menos un arma mala, un arma arreglada y un escudo A lo largo de este curso, agregaremos controles, mecánicas y animaciones a nuestro proyecto para bloquear un objetivo, atacar, esquivar, bloquear y disparar proyectiles