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