Transcripciones
1. Introducción al curso: Hola a todos, Chris, aquí. Y en este video,
tengo algo realmente genial. Me emociona
compartir con todos ustedes. Es mi nuevo curso de
desarrollo de GidoGame para crear un juego similar a
Survivor Así que ahí tenemos mucho
contenido. Es decir, son más de 60 lecciones y casi 12 horas de video. De lejos, es el
curso de desarrollo de juegos
más largo y completo que he publicado. Entonces, si alguna vez has pensado hacer tu propio divertido juego de
Survivors Light, eso es exactamente lo que
vamos a hacer. Lo construiremos paso a
paso, desde cero. Estaremos usando la versión 4.4 de
GIDOEngine, que probablemente ya
sepas que es gratuita y de código abierto Así que vamos a codificar todo
en script GD. Que es el lenguaje
específicamente hecho para el editor Gadot Es apto para principiantes,
es fácil de leer y está estrechamente
integrado en el motor ado. Así que funciona fantásticamente para hacer
prototipos de juegos como este Entonces, si eres nuevo el desarrollo de
juegos o
ya has hecho un poco de codificación y solo realmente quieres solidificar
tus habilidades con un nuevo proyecto
interesante,
creo que este curso
va a ser para
ti tus habilidades con un nuevo proyecto
interesante, creo que este curso
va a ser para Empezaremos simples,
poniéndonos cómodos con elementos esenciales como el movimiento de arriba
hacia abajo del personaje. Entonces realmente
empezaremos a hacerlo crecer, construyendo a partir de algunos conceptos
genuinamente complejos. Pondrás estadísticas de personajes, sistemas de
nivelación, recolección de objetos, incluso
construiremos
un sistema de desove que colocará a todos
tus enemigos fuera de la pantalla para que
puedan enjambrar al jugador
desde todos los lados Entonces, en pocas palabras,
nos pondremos realmente manos a la obra con el sistema de escenas
Godos two D. Eso va a cubrir
todo lo demás, desde proyectiles hasta crear interfaces de usuario
pulidas Al final del
curso, tendrás un superviviente totalmente jugable como prototipo de
juego visto
en segundo plano y todo el conocimiento que necesitas para convertirlo en un proyecto más grande Entonces, ¿qué dices?
¿Estás listo para convertir esas ideas de juego
en algo real? Ven y únete a mí en el
curso, y
construyamos juntos algo bastante
increíble.
2. Configuración del proyecto Godot: Hola a todos, Chris
aquí, en este video, comenzaremos
con el primer paso de nuestro proyecto Survivors Like y GD Script
descargando el GDOEngine Si aún no lo
sabes, Gadot es un motor de
juegos de código abierto gratuito que tiene su propio idioma primario, GD Script escrito
específicamente para Gdo, que es lo que vamos a
usar para codificar Es un lenguaje de scripting. Puedes, por supuesto,
usar otros idiomas en Gdo como C Sharp, que tiene un fuerte
soporte incorporado con una
Mnoversión La mayoría de los tutoriales que
encuentres van a estar en GDScript porque GD Script es
rápido para comenzar con Tiene realmente una gran integración
con el Editor EUI. Es fácil de usar, y no
tienes que
compilar tus scripts cada vez que quieras
hacer cambios en él. Entonces, en lo que respecta a la simplicidad, especialmente para proyectos pequeños, GD Script tiene
mucho a su favor. Entonces mirando el sitio web de Gado, voy a estar usando la versión
de lanzamiento
actual de Gado 4.4 0.1. Específicamente va
a estar descargando la versión no mono de la misma, lo
que significa que no cuenta con soporte de
C Sharp porque la versión
de GD Script solo permite exportar a la web Pero si usas el Gado Mono, esa función no es compatible. Entonces Gadot 4.5 ya está
bajando por la tubería, y hay un par de características que creo que son bastante
geniales saliendo. Pero como estamos
tratando de mantener este curso
para principiantes
nivel intermedio, no
quiero abrumar a nadie con todos esos conceptos Así que sigamos adelante y haz clic en
Descargar y agarra 4.4 0.1, y queremos la versión azul
aquí. No es Mono. Esto va a ser solo
para GD Script. Si querías C sharp,
puedes grabar.net. No vamos a necesitar eso para esta
versión del proyecto. Podría crear una
versión C Sharp del curso más adelante si tiene sentido.
Ya veremos cómo van las cosas. Entonces vas a
querer guardar esta instalarla y luego
abrir el GadoEditor Entonces, una vez que lo abras, deberías ser golpeado con el gerente de proyectos, que te dará una lista
de tus proyectos actuales. Probablemente no
tengas mucho aquí. Podría haber algunas demostraciones. Pero lo que vamos
a querer hacer es crear nuestro nuevo proyecto. Así que vamos a crear un nuevo proyecto, y puedes darle a este
el nombre que quieras. Voy a llamarlo guión
Survivors nombre sutil, sé, porque es guión GD, y es un estilo sobreviviente Así que voy a poner esto en mi directorio de
tutoriales, que he configurado
específicamente para este
tipo de tutoriales de
formato largo. Así que vamos a establecer eso como
la carpeta actual, y deberíamos ver algo
así como el nombre del proyecto aquí y la ruta al
proyecto completo. Porque hice Script
sobrevivientes Una palabra, en
realidad no puso
un separador aquí abajo. Entonces solo usaré un guión como separador predeterminado
para espacios. Y vamos a querer el
renderer en modo móvil. Este es un curso de pixel art, así que realmente no necesitamos el renderer
Ford por ningún motivo, y solo seguiremos adelante
y crearemos con eso Entonces, una vez que tu
proyecto se haya iniciado, deberías ver el puerto de
tres vistas D aquí Una de las
cosas interesantes de Gadot es que tiene dos
flujos de trabajo completamente separados para dos D y tres D, pero sí los soporta a
ambos A diferencia de Unity, son entidades
completamente separadas. Entonces no es fingir dos
D en un sistema de tres D. En realidad son completamente
dos D. Y si
miras a la izquierda
en esta ventana de escena, verás que aquí hay bien, realmente cuatro tipos de nodos, dos escenas D, tres
escenas D, interfaz de usuario. Y luego si hacemos clic en otro nodo, ahí está la
clase base aquí nodo, que no tiene
componentes 2d3d a él Entonces no es una posición en ninguna parte, lo usarías para
cosas como sistemas, procesamiento de información de
fondo, no objetos realmente
en el mundo del juego. Para todo lo que
hay en el mundo del juego, generalmente, vamos a
estar usando una escena dos D. Entonces ese va a
ser un icono de nodo azul por aquí, igual que
la diferencia. Y luego la interfaz de usuario
son los nodos de control. Entonces eso está marcado por el verde, cualquier cosa que sea
un botón en pantalla, texto de combate
flotante, ventanas pop up de
UI, como cuando estamos haciendo selección de
recompensas por lo que puedes obtener
por subir de nivel. Esos son todos los nodos de la
interfaz de usuario. Entonces, claro, a medida que
avanzamos, voy a explicar más sobre qué es realmente un nodo. Por ahora, vamos a cubrir
un poco más la interfaz. Entonces tenemos el sistema de archivos en la esquina inferior izquierda. Ahí es donde
vas a tener todos tus archivos en Gdo incluyendo cualquier activo importado,
tus archivos SEN, que es donde tomas
uno o más nodos, y los guardas en una escena, de la
cual puedes crear copias
de cualquier parte de tu juego Entonces es básicamente una
plantilla que puedes reutilizar. Y luego otros archivos Gdo
y no Gudo como recursos también Entonces en el Viewport aquí,
tienes tu acceso X, Y aquí. Un
punto distintivo es abajo es en realidad la
dirección positiva para el eje Y. Entonces, si estás
hablando de moverte hacia arriba, quieres ir negativo Y, y si quieres moverte
hacia abajo en la pantalla, estarías hablando de
un valor Y positivo. Derecha es X positiva, y luego izquierda es negativa X. Así que eso será
realmente relevante cuando estemos moviendo a nuestros personajes
por la pantalla. Quieres asegurarte de que se muevan en la dirección correcta y que también estás obteniendo la entrada para la dirección correcta. Si miras muy de
cerca el punto de 1,200 píxeles, al
menos para mí, habrá los límites de nuestra interfaz de
usuario Por lo tanto, la interfaz de usuario
suele estar en su propia capa de lienzo
separada. Entonces es algo completamente
separado mundo
de los dos
juegos D en sí. Se podría pensar en la interfaz de usuario de la interfaz
de usuario como una especie
de capas en la parte superior de la cámara, ya que está
viendo los dos mundos D. Así que cada vez que la cámara se mueva, todos los elementos de la interfaz de usuario también se
van a mover. Pero los
objetos del mundo del juego no se mueven con
la cámara en general. Entonces, si mueves la cámara, la interfaz de usuario permanecerá en su lugar
y todo lo que hay debajo de ella, los personajes,
los enemigos, esos no se mueven
con la cámara. Y ese es uno de los mayores
factores distintivos entre
los dos nodos D y los nodos de control de la
interfaz de usuario Cualquier cosa que sea un elemento UI
es un nodo de control en Gadot. A la derecha,
tenemos el inspector que se utiliza para definir cualquier propiedad sobre sus nodos. Cuando escribes scripts, puedes darle una etiqueta at export, que la marca como editable dentro
del inspector Eso es muy importante. Vamos a estar haciendo mucho de eso. Así que editarás eso por aquí. Por supuesto, hay otros Windows que tienen una importancia variable. También los cubriré en los videos
posteriores. Entonces, en el siguiente video, nos
pondremos en marcha con nuestro proyecto. Importaremos todos los activos
artísticos que necesitamos, incluyendo audio,
música, arte, fuentes. Y luego también hay
un par de plugins
que creo que serían sumamente
útiles para el proyecto, los gratuitos para descargar y usar. Entonces cubriremos todo eso
en el segundo video.
3. Arte, sonido y complementos ~ Importación e instalación: Entonces en este video,
vamos a continuar con configuración de
nuestro proyecto
obteniendo todos los activos y audio y complementos todos configurados en los proyectos que estamos
bien para comenzar a trabajar. Entonces sobre PaySPN, tengo todos los enlaces a los activos que
necesitamos para el curso,
todo lo que utilicé en el proyecto de
pre grabación para sobrevivientes de guiones Entonces, si sigues el enlace aquí
arriba en la parte superior,
voy a hacer zoom en eso. Básicamente puedes simplemente ir
a cada uno de estos enlaces, y solo necesitas las
versiones gratuitas de cada activo. Tengo que compartirlo de esta
manera para respetar la regla de
no redistribución que tienen
muchos de estos activos, pero básicamente solo
necesitas seguir los enlaces
a cada página de la tienda y
agarrar la versión gratuita Entonces, antes que nada, Pixel Crawler tiene nuestro modelo basado en personajes que
usaremos para armar algunas
armas y enemigos Es realmente el núcleo
de este tutorial, así que eso es lo que realmente
basamos mucho del Alfa. Así que a continuación Íconos de fantasía de cuervo. Para los elementos de la interfaz de usuario, la interfaz de usuario Crimson
Fantasy. La fuente, voy
a estar usando m5x7. Pero honestamente, puedes
elegir la fuente de
pixel art
que creas que se ve bien También hay mucho en el punto de
picor IO. Para algunos efectos de sonido básicos
de audio de juegos, Leo pasa RPG
Essentials SFX gratis Y luego para la
música, The Red Hearts preparado para Dev por Tall Beard es música de melodía de
chip
absolutamente perfecta para el estilo del juego
Survivors Light. En realidad funciona
muy, muy bien. Bien, entonces descargas
todos los archivos zip, y luego lo que puedes hacer es hacer clic
derecho en el sistema de archivos, crear una nueva carpeta para el arte. Voy a poner todas
las imágenes aquí. Y luego haz click derecho, crea
una nueva carpeta para audio, cualquier cosa que esté en Efectos de sonido o música, voy a
estar poniendo ahí. Y luego abrirlo rápidamente
en Windows File Explore, o el equivalente si
estás en Max o Linux, es hacer clic derecho y hacer
Open and File Manager. Bien. Y luego solo
quieres extraer todos los archivos en
esa carpeta de arte. Entonces aquí tenemos la GUI de fantasía
Crimson, tenemos los íconos de fantasía, y luego el pack gratuito Pixel
crawler La única excepción es que
para los íconos de fantasía, hay como tres o cuatro versiones
diferentes de la misma. Solo estaba usando las hojas
completas de sprites. Estos son los más fáciles de
trabajar en Gadot porque
puedes crear un recurso de
textura de atlas, y luego simplemente elige el ícono que
deseas seleccionar para eso Por cada uno de los elementos a los que vas a estar
asignando un ícono, simplemente
me resulta mucho
más fácil trabajar de esa manera Y también Para Gadot, si está importando
cada icono por separado, que es una opción
con ese paquete, lleva mucho tiempo cargarse realmente en el motor Entonces, cuando tienes tus imágenes empaquetadas en un archivo como este, es simplemente mucho más eficiente. Creo que es el camino a
seguir. Aparte de eso, creo que solo estaba
trayendo todo el directorio. No cambio los
nombres de los archivos ni nada por el estilo. Normalmente, en Gadot,
irías con carcasa de
serpiente para los nombres de tus carpetas de
directorio, pero creo que es simplemente
más sencillo
usar lo que los artistas proporcionaron
aquí y simplemente ir con eso Por lo que no debería causar ningún
problema ni nada. Solo tal vez un poco
en optimizado, pero eso está perfectamente bien. Y luego para el audio
de los efectos de sonido, si abres el zip,
simplemente vendremos así. Y la música, solo estaba tomando el salto de caja de los tres Red
Heearts, que es la primera pista musical De hecho, puedes seleccionar la pista de música que quieras usar para tu nivel de juego, pero creo que esta funciona
muy, muy bien Ya sabes, vamos a seguir adelante
y previsualizar por un minuto. Sí, así que una
pista absolutamente asesina para los juegos de
estilo Survivor, creo. Así que una vez que
importas todo, lo pones en tus archivos. Si reabres la ventana de Gado, deberías ver todo lo que
se importa en estas carpetas correctamente, y luego debería
mostrarse aquí a la izquierda Así que podrías recibir algunos mensajes de
error cuando estés importando cosas
por primera vez. Simplemente puedes confirmar que
los archivos están ahí, y eso es lo principal
importante aquí. Creo que estos mensajes
pueden ser ignorados. Drop Stable ni siquiera tiene nada que ver
con ese proyecto. Podría estar relacionado con el
almacenamiento en caché en mi computadora. Pero lo importante
es que aquí tenemos
los archivos . Puedes hacer
doble clic sobre ellos. Se puede ver que se le está
reconociendo, como la música de ahí y los efectos de
sonido por aquí. Entonces parece que estamos bien. Así que adelante y claro ese logo. Entonces necesitamos dos plugins
para el curso. Uno, creo que es solo
una gran calidad de vida cuando estás navegando por
el sistema de archivos por aquí. Se llama colapsar
carpetas porque podrías notar que cuando abres un
montón de carpetas como esta, realmente no
hay una manera fácil colapsar o plegarlas todas de nuevo hacia abajo para que puedas ver tu sistema de archivos completo
aquí en una ventana. Entonces lo que quieres hacer es
ir al Asset Lib aquí arriba en la parte superior y luego
buscar colapso. Entonces haga clic en la
barra de búsqueda tipo colapso. Y entonces el que
queremos por aquí es colapsar carpetas.
Entonces descarga eso. Instalarlo Bien, diré
instalado correctamente. Ahora queremos ir a
Project en la parte superior izquierda, configuración
del proyecto y pasar
a la pestaña plugins aquí. Comprobación habilitada, pulsa Cerrar. Y lo que eso hace es que crea este pequeño icono por aquí
donde puedes colapsar todo, y puedes tener
todas las carpetas, volver a la raíz. Nada está expandido, y es mucho más fácil navegar por
el sistema de archivos con eso. Creo que es sólo un botón
muy práctico. Debería estar ahí en
Gadot básico, honestamente. Entonces el otro es un plug in mucho
más involucrado, y
lo vamos a estar usando para máquinas estatales en Gadot También se usa
para árboles de comportamiento, pero debido a que la IA es muy
simple y un juego de supervivientes, aquí solo
vamos a estar pegándonos
con las máquinas estatales No hay necesidad de hacerlo más complejo con un árbol de comportamiento. Entonces estamos buscando Limbo AI, y como estoy en 4.4, voy a estar usando
Limbo AI 4.4, claro Podrías notar que
actualmente aquí, al menos, todavía no
hay 4.5 fuera
porque, bueno, quiero decir, 4.5 todavía en Dev, así que puede funcionar
si decides usar la versión Dv o puedes encontrarte con algunos problemas. Probablemente funcione, pero, ya
sabes, puede
haber un error aquí o allá. Entonces, ya sabes, otra razón para apegarse a la versión
estable de Gado. Entonces vamos a descargar esto, y este va a ser
nuestro enchufe
de máquina estatal . Podemos instalarlo. Tomará un poco
más porque este es un enchufe bastante grande. Voy a hacer caso omiso de
estos mensajes una vez más. Eso podría estar sucediendo porque el
nombre del proyecto es el mismo, aunque el
directorio sea diferente, así que simplemente cambiaré el nombre del proyecto para que
esas cosas dejen de aparecer. Ojalá, esto
solucione. Así que sólo voy a cambiar el nombre y darle el nombre GD script ahí.
¿Es una etiqueta extra? Cerremos que voy a
borrar los mensajes, y solo recargaré el
proyecto mientras estoy por delante y solo veré si
hay algún problema cuando vuelva a cargar el No, bien, parece bueno. Bien. Entonces, si verificamos configuración del
proyecto del proyecto
y vas a Plugins, notarás que Limbo AI
no aparece aquí La IA del limbo en realidad está
escrita en C plus plus, lo que podría ser la razón por
la que no aparece como un enchufe cado específicamente Me imagino
que lo hizo para maximizar la eficiencia del código
ya que CplusPlus es más rápido que el script C Sharp
y GD Pero sí, así es como es. Entonces, para confirmar que
Limbo AI funciona, podemos crear rápidamente una nueva escena TD aquí
en la parte superior izquierda Y luego haz clic derecho
aquí en el nodo raíz, el nodo dos D, agrega un nodo hijo y busca solo escribe en Estado. Deberías ver
pop up del estado del limbo y estado BT. Siempre y cuando veas aparecer esas clases
de Limbo AI, entonces sabrás que el plugin
está instalado correctamente Entonces, para recapitular, deberíamos tener un audio nuestros efectos de sonido
sobre cinco carpetas aquí, al
menos una pista de audio Y el arte, deberíamos tener GUI de fantasía
Crimson, los íconos de fantasía de
Raven, y solo estoy trayendo la carpeta
completa de hojas de sprites, y luego Pixel Crawler
para nuestro personaje principal, nuestros
accesorios de fondo y enemigos, accesorios de fondo y enemigos, especie de activo de arte principal para
la serie de Y luego una fuente. Así que traje m5x7
como fuente TTF de punto. Creo que otros tipos
pueden funcionar también, pero probablemente lo mejor es simplemente ceñirse al mismo para mayor consistencia. Y luego tenemos agregaciones, carpetas colapsadas, y Limbo AIA Entonces esos deberían ser todos
los archivos externos que
necesitamos traer
para este curso. Todo lo demás va a
ser script GD que escribamos, o escenas que configuramos u
otros archivos Gadot que creamos, también, como recursos
que pueden guardar en un Entonces eso va a ser
todo para este video. A continuación, vamos
a empezar a crear nuestro personaje de
juego de dos D de arriba hacia abajo y agregar algunos
controles básicos de movimiento al personaje, que pueda moverse
en la pantalla.
4. Movimiento del jugador de arriba abajo: Entonces, en este tutorial,
vamos a implementar el movimiento de personajes de arriba hacia abajo para nuestra escena de personaje de jugador principal. Pero justo antes
de entrar en eso, sí
quiero
señalar que podemos eliminar la carpeta demo del Limbo AI que
importa automáticamente con el enchufe en sí mismo Si quieres pasar por la demo o mantenerla ahí,
eres bienvenido a hacerlo. Esto incluye ejemplos
sobre cómo usar Limbo AI, pero te estaré mostrando
en video
esos pasos para la
máquina de estado específicamente Así que en realidad no necesitamos
eso para nuestro proyecto. Voy a quitar eso. Bien, y ahora estamos listos para comenzar. Así que queremos
comenzar con una escena dos D en la esquina superior izquierda, así que voy a hacer clic en
crear nodo raíz dos escena D. Entonces eso nos va a dar
un nodo base dos D. Ahora bien, la raíz de nuestro personaje, términos generales, queremos
ser un cuerpo de carácter dos D, que es un tipo de nodo dos D. Así que podemos hacer clic derecho sobre nuestro nodo dos D e
ir a cambiar Tipo, y luego vamos a
escribir en carácter. Encontraremos el
cuerpo del personaje dos D. Tenga en cuenta que esto hereda del cuerpo
físico dos D, que es un objeto de colisión Que es un tipo de nodo dos D. Así que hay
toda una serie de clases o tipos de objetos de
los que el cuerpo del personaje
está heredando, y adquiere todos
los rasgos de todas las
clases que le preceden Entonces eso significa que cualquier cosa que
un cuerpo físico dos D pueda hacer, un cuerpo de personaje dos
D también puede hacer. Entonces vamos a golpear cambiar aquí al cuerpo del
personaje dos D. Y tan pronto
como lo hagas, habrá esta pequeña señal de advertencia de triángulo
amarillo que
dice que el
objeto de colisión no tiene forma. Entonces necesitamos hacer clic derecho
y agregar un nodo hijo, que va a ser una
colisión en forma dos D, y solo voy a acercar
el centro 0.00 aquí. Aún no verás nada porque en realidad no
hemos agregado un sprite Pero comencemos haciendo clic
en forma y el inspector en el lado derecho y
haciendo nueva forma de círculo. Así que podríamos volver a editar
eso y reducir su tamaño, pero primero necesitamos el sprite para poder ver realmente con
qué estamos trabajando Entonces tomemos el nodo raíz y también renombrémoslo
presionando F dos. Y
sólo voy a llamarlo jugador. También podrías llamarlo personaje de
jugador o personaje jugador cuerpo dos D,
lo que sea que tenga sentido para ti. Y luego vamos
a guardar esta escena, que es básicamente
la escena raíz y cualquiera de los
nodos hijos en un solo archivo,
un archivo de escena
TACN punto en nuestro proyecto Entonces si pulsamos Control S para guardar, entonces entonces hacemos clic en la esquina
superior derecha, esto crea un nuevo botón de carpeta. Y vamos a darle un nombre. Voy a hacer personajes,
voy a minúsculas, que suele ser el nombre
estándar de Gadol, caso de serpiente Entonces, si necesitas
espacios, pondrías guión bajo y luego otras
cosas, algo así Entonces hagamos personajes. Y luego en personajes,
voy a crear una carpeta para el reproductor solo
porque sé de antemano, habrá un montón de guiones, y luego podremos
combinar esos todos en el mismo subdirectorio Entonces voy a crear una nueva carpeta. Jugador. Y digamos Bien. Así que tenemos player dot
TSC y vamos a guardar eso en este
directorio o carpeta Así que guarda la escena ahí. Entonces en Godot, tu proyecto se compone
esencialmente de
escenas dentro de escenas Entonces podrías tener una escena de juego
principal. Tenemos toda la configuración del sistema, y bajo eso, podrías
cargar en la escena del mundo del juego, que es el mapa de dos D y
los objetos que deberían poblar y dentro
de ese mundo de dos D, tendrías, por supuesto,
tu escena de jugador, las escenas para tus enemigos, tus orcos, tus
esqueletos, etcétera Y así, cuando tu escena
se guarda en un archivo, es muy fácil
instanciar esto
porque solo va a ser básicamente tomar los datos
guardados y cargar una copia de los mismos y
ponerlos en tu Así que muy rápido,
en realidad podría demostrarlo. Si hacemos clic en esta nueva pestaña, crear un nuevo botón de escena. Podemos agregar una nueva escena
dos D aquí. Llamemos a esto el mundo. Entonces le pegaré a F dos para cambiarle el nombre, y esto solo será mundo. Podemos mantenerlo como un
nodo estándar dos D. Realmente no lo
necesitamos para tener otra
cosa que no sea una posición en la pantalla. Entonces, vamos a darle a Control
S para salvar esta escena. Voy a salir a la raíz y
podemos simplemente salvar a World Dot
TSN dentro de aquí Bien, ahora queremos agregar una copia de nuestro jugador
al mundo. Entonces, lo que podemos hacer
es arrastrar la escena del jugador a la jerarquía mundial en la pestaña de escena
en la parte superior izquierda. Así que solo arrastras al jugador punto
TSN aquí arriba bajo Mundo. Y ahora hay una copia
del jugador dentro
del mundo del juego. Entonces sabes que está ahí porque
puedes pasar el cursor sobre él. Diré jugador
aquí. Se puede ver el icono para el cuerpo del
personaje dos D, y se puede ver la
forma de colisión que definimos. Ahora, todavía no hay sprite. Vamos a agregar eso
ahora mismo. Entonces golpearé Controlarnos para
salvar el mundo. Iremos al jugador.
Voy a hacer clic derecho sobre el jugador, agregar un nodo hijo que estamos
buscando sprite Así que Sprite dos D. También hay un nodo Sprite dos D animado, y ambos pueden ser
utilizados prácticamente para los mismos fines Configuraron las cosas de manera un
poco diferente. Yo diría que para los personajes de los
jugadores, en realidad
es más fácil trabajar
con Sprite dos D y luego definir las propiedades
que necesitas para animar en el reproductor de animación Nos
adentraremos más en la animación de un sprite en el siguiente video Entonces agreguemos un nodo
Sprite dos D. Y por ahora mismo,
vamos a querer cargar en una textura. Cuando estamos cargando
en la textura aquí, no
vamos a establecer
una sola imagen de sprite En realidad vamos
a establecer una hoja de sprites. Entonces obtenemos nuestra hoja de sprites
del directorio art. En el
pack de orugas Pixel, tenemos, creo que fueron entidades,
personajes, cuerpo
A, y animaciones Así que sólo empezaremos
con el ídolo. Entonces para este personaje, obtienes una hoja de sprites abajo y arriba Cuando estás haciendo dos juegos D de arriba
hacia abajo, en realidad
puedes simplemente voltear
la hoja de sprites laterales De izquierda a derecha, lo que
significa que no necesitas crear una cuarta
hoja de sprites para izquierda y derecha porque puedes
reutilizar la misma hoja de sprites, y funciona igual Te ahorra mucho tiempo
para animarlo de esa manera. Así que queremos que Idle down comience
solo para poder
ver realmente el personaje que
estamos viendo. Así que vamos a cargar eso aquí. Entonces este es un sprite de
carácter base. Entonces la idea aquí es que
pudieras
agregar ropa como un
sprite adicional encima de ella, hacerle cualquier personalización, pero las animaciones en el
núcleo permanecen iguales ya que
desarrollarías el personaje
final para básicamente diferentes
estilos y apariencia Bien, así que
probablemente destaquen algunas cosas. En primer lugar, el personaje
obviamente no tiene ropa. Entonces este es un sprite de
carácter base. La idea es que lo que
harías es tomar sprites
adicionales de ropa y agregar esos encima de tu animación base
para el personaje final, tal vez como un
sombrero de mago o algo así Y la idea es que
puedas intercambiar sprites para terminar tu personaje
final Pero para las animaciones base, se proporcionan aquí
en el paquete gratuito, y solo
construirías a partir de ahí. Así que solo estaremos trabajando
con esto para el tutorial. Los otros dos
temas obvios es, bueno, uno, tenemos cuatro copias
del personaje que se muestran en pantalla a la vez. Entonces queremos que sea
así solo uno se muestra. Y la forma en que lo hacemos es ir a la pestaña de animación aquí, y cambiamos los
fotogramas H por el número de sprites que están mostrando en
esta hoja de sprites horizontales Así que solo cambio fotogramas
H a cuatro. Y ahora solo está mostrando
la posición cero del fotograma, que es el primer sprite
en esta animación inactiva El tercer problema es
que es muy borroso
para el pixel art Así que podemos arreglar esto en todo
nuestro proyecto
subiendo a la configuración del proyecto, y queremos desplazarnos hacia abajo hasta, creo que es renderizador No, texturas. Entonces
renderizado y luego textura
por defecto filtro de textura lineal aquí es más apropiado
si estás haciendo, supongo, cosas como arte vectorial. Pero para el pixel art, que
tiene que ser Pixel Perfect, quieres cambiar
esto al más cercano. Y en cuanto lo hagas,
básicamente va a mostrar cada píxel renderizado de manera nítida, como cabría esperar
de un juego de pixel art Y más o menos para el proyecto, eso es todo lo que vas
a necesitar hacer para
configurarlo específicamente para
un formato de pixel art. Ahora, el personaje y la forma de colisión son un
poco raros aquí ahora mismo. Generalmente, para los juegos de arriba hacia abajo, quieres que la forma de colisión
vaya a algún lugar alrededor de
los pies del personaje. Entonces me gusta mantener
mis escenas aún centradas a las 00 para que sepa básicamente la posición
exacta en la que el personaje está representado en el mundo del juego y el offset no sería
raro ni nada por el estilo. Entonces, lo
que realmente queremos hacer aquí es compensar no la escena base. Queremos mantener eso en cero,
cero, pero el nodo sprite Entonces, si seleccionas el Sprite dos D y
presionas W para ir al modo de movimiento, puedes hacer clic izquierdo y
mantener presionado y arrastrarlo hacia arriba Si quieres encajarlo
al eje Y,
puedes mantener presionada la tecla Mayús, lo que te ayuda a evitar que vaya a la izquierda a
menos que vayas muy lejos. Y solo queremos
arrastrar esto hasta que los pies del personaje estén
básicamente por ahí. Y entonces queremos que la forma de colisión
sea una representación
del área de pies del personaje
porque aquí es donde se le permitiría
al personaje chocar con otros objetos Entonces tiene sentido
que la posición sería donde los
personajes realmente parados en el mundo del juego de
dos D. Um, acostumbrarse a
la perspectiva de dos D hace falta un poco de acostumbrarse
porque es un poco menos obvio, supongo, que tres D, donde simplemente
sería más
como la vida real. Entonces aquí solo tenemos que darle la ilusión de que nuestros personajes realmente están parados ahí mismo, pesar de que el characterprte
va de aquí a aquí, esta es la zona donde
el personaje está Así podemos salvar eso ahí. Eso debería ser bueno. como referencia eso fue de 4.12 pixeles En realidad
voy a redondear eso a cuatro, solo un poco de
preferencia para tratar de mantener todo
a los tamaños perfectos de
píxeles. Para un juego de Pix art, probablemente no sea gran cosa
y cause algún problema,
pero, ya sabes, por si acaso. Así que ahora si hacemos clic de nuevo
a nuestra escena mundial, veremos que nuestro personaje está realmente parado
en el mundo del juego. Y si queremos
jugar al mundo, pulsaríamos este
botón de reproducción de aquí, que reproduce la
escena actual del mundo. Y podremos
ver al personaje muy,
muy pequeño en la esquina superior
izquierda. En realidad es casi
imposible verlo. Entonces, lo siguiente que probablemente
queremos es agregar una cámara. Así que vamos a hacer clic derecho sobre el
mundo, agregar un nodo hijo, hacer una cámara dos D. Y aunque el mundo
crea automáticamente una cámara por defecto, incluso cuando no
se ha agregado un nodo de cámara, cuando en realidad
definas correctamente una cámara,
puedes configurar el Zoom, que es muy útil para Pixart porque estamos
hablando de trabajar con, como, 48 píxeles por 32 píxeles caracteres,
algo así así. Así que queremos tomar el Zoom
y probablemente bache que hasta cerca de tres o cuatro
podemos ver la cámara dos D ahora también está centrada
en el punto cero en lugar de ser
más de
esta caja de lienzo por defecto aquí. De hecho podemos ver que la
cámara es esta línea rosa. Y si corremos la escena ahora, nuestro personaje debería estar centrado y mucho más grande
y más visible. Entonces, si quieres, puedes
chocar eso hasta un cuatro. Creo que tres es
bastante bueno por ahora. Lo cambiaré más tarde
si es necesario. Pero mientras puedas ver al personaje,
creo que eres bueno. Otra cosa cuando
estamos jugando el juego, creo que quiero que esto
sea mucho más visible. Entonces aumentemos el tamaño de la
ventana ahora para que
podamos diseñar para un tamaño de pantalla
más
grande de manera más adecuada para que, ya
sabes, cuando estemos
haciendo nuestras vistas previas, ustedes puedan ver realmente
lo que está pasando mejor. Así que vamos a la configuración del proyecto, y voy a tomar
la pantalla de la ventana y cambiar esto a
algo mucho más grande. Entonces creo que algo así como
1980 para 180 sería bueno. O sea, eso depende de cuál tu resolución para
tu pantalla. Para mí, eso va a
ser algo así. Bien, voy a probar esto
desde mi pantalla. Estoy trabajando en un monitor blanco
extra bastante grande aquí, así que un poco de
prueba por error. Creo que eso va a funcionar bien
porque entonces todavía puedo ver el botón uh Of por aquí. Así que, por cierto, reproduce la pausa de la escena principal y detiene los botones actuales del
proyecto en ejecución. Yo diría,
mientras lo veas , entonces
eso va a estar bien. Entonces con nuestro juego Canvas, así de grande, probablemente también
quiero impulsar el Zoom. De hecho, puedes editar las propiedades mientras se ejecutan
los juegos. Así que sólo puedo tomar este
Zoom y cambiarlo a cuatro. Volvamos a tocar,
y podrás ver que el tamaño se actualizó de inmediato. Entonces, si eso es lo suficientemente grande para
ti, puedes quedarte con eso o
podemos subir hasta cinco. Sabes, tal vez en realidad voy a
hacer un 5.0 Zoom ahí. Ahora por el momento, ustedes realmente lo
han estado esperando. Vamos a entrar en el código real. Entonces necesitamos crear
un guión que extienda el cuerpo del personaje dos D y que tenga eso
adjunto al jugador. Podemos hacer todo eso de una sola vez haciendo clic en el botón
izquierdo del jugador y luego simplemente haga clic en el adjuntar un script nuevo o existente
al nodo seleccionado. Y sólo vamos a llamar a esto el jugador punto gd guión Y en realidad
no vamos a usar el cuerpo del personaje plantilla
dos D script de movimiento básico. Es decir, um si recuerdo más para platformers porque
agrega saltos y honestamente, podemos escribirlo mucho mejor Así que vamos a darle a Create, y eso nos va a saltar
al editor de guiones aquí. Así que por ahora, solo lo
guardaré como el editor de scripts embebido. Pero también puedes hacer clic en este botón de aquí y
hacerlo flotante si quieres ir
a pantalla completa con
el editor de scripts que puede ser útil si realmente te estás metiendo en la codificación de
GD Script Pero aquí, este
guión va a ser bastante rápido y sencillo,
así que no es necesario, de verdad. Así que vamos a subir a la cima. Bien, entonces podemos ver que nuestro script extiende el cuerpo del
personaje dos D. Esto significa
que nuestro script tiene la clase base del cuerpo del
personaje dos D. Bien, así que si pasamos el cursor sobre el cuerpo del personaje
extiende dos D, puedes ver la jerarquía de clases aquí bajando del cuerpo del
personaje dos D, todo el camino a un objeto Gadot
base Esto solo quiere decir que en
todo el camino, heredará las habilidades de cada una de esas clases
diferentes Entonces un cuerpo de personaje TD
en realidad puede hacer mucho. Sólo vamos a necesitar un
poquito de ella, de verdad. Así que solo ten en cuenta que todo lo enumerado ahí,
cada una de estas clases, que puedes
saltar dando click sobre sus nombres si
quieres leer sobre ellos es algo
que el cuerpo del personaje dos D también puede hacer. Entonces, leer todo
eso sería mucha documentación en este momento,
bueno conocerla. Bueno para leer a medida
que avanzas, pero un poco abrumador
por ahora mismo. Entonces trabajemos en nuestra clase. Queremos darle un
nombre de clase para que este script pueda ser fácilmente referenciado
desde otros scripts por su nombre yendo
al inicio de la línea. Y luego presionando
Enter. Vamos a subir a la primera línea y escribir el nombre
de la clase jugador. Y ahora, hemos definido este
guión como el guión de los jugadores. Entonces esto es básicamente
un símbolo global ahora en nuestro proyecto
que podemos buscar y usar solo haciendo referencia al jugador escrito exactamente
así con Verás a medida que
avanzamos en el curso que eso es sumamente útil, sobre todo para algo
así como un guión de jugadores, que muchas otras clases van a necesitar tocar. Así que vamos a trabajar en la
función de proceso de física para el personaje. Entonces, escribamos FU NC para la
función y luego subrayemos. Y verás que este
menú se rellena automáticamente con los métodos que se definen dentro de
las clases padres Estas son básicamente
funciones que podemos anular y agregar en código para que realmente
haga algo o cambie lo que originalmente hizo la
clase base. Entonces queremos proceso de física aquí. Si encuentras
proceso de física y presionas Enter, nos
dará la definición completa de la
función aquí para el nombre aquí,
subrayado proceso de física Bien, entonces aquí tenemos el
nombre de nuestra función. El guión bajo aquí
indica que está destinado a ser
privado como y no accede desde otros
scripts y solo para ser contenido o encapsulado
desde dentro de este script El Delta aquí es el
nombre de nuestro parámetro, y float es el tipo
de nuestro parámetro. En el script GD, no tienes que escribir realmente tus funciones Entonces, si lo quieres,
podrías quitar este flotador de colon y
simplemente llamarlo Delta. Ahora, ¿qué es Delta? Bueno,
eso terminaría siendo lo que el collar decidiera pasar
a esta función, que en este caso,
básicamente no tiene nada que impida que sea
otra cosa que un flotador. Prácticamente
esperarías que fuera una carroza. Entonces en este caso, es
mucho mejor
declarar realmente su tipo con
dos puntos y luego flotar aquí. Por lo que sí recomiendo esto. Y luego aquí también un componente
opcional de la declaración de función. Tenemos esta flecha, que es
un guión junto a la tecla cero. Bien, y luego por
aquí a la derecha, tenemos la
flecha de retorno apuntando al tipo de vacío de retorno. Vacío significa que no tiene retorno. No esperas
que realmente devuelva nada que usarías
dentro de otras funciones. Entonces, para escribir eso manualmente, harías guión y
luego un gradual y firmar Y esa es tu flecha de retorno
apuntando al tipo de retorno. Bien, entonces, claro,
cuando escribimos esto, nuestra función en realidad no
tiene nada en ella. Puedes hacer que una
función no haga nada
escribiendo pasar minúsculas, así que esa es una
palabra clave reservada ahí Pero sin eso,
si lo deshago,
entonces verás que este error
aparece en la parte inferior de aquí diciendo endantblock esperado
después de la declaración de la función, lo que significa que debería
haber algo aquí después de que se declare la
función Y puedes ampliar
esta lista aquí para ver todos los errores dentro
de tu script actual, una
pequeña ventana bastante práctica ahí. Tan bueno si necesitas
copiar y pegar, solo
puedes seleccionarlo
todo y copiarlo. Y puedes pegarlo en cualquier otra aplicación
que estés usando. A lo mejor estás haciendo un
reporte de error o algo así. Bien, así que finalmente,
podemos
empezar a escribir algún código de
función. Sé que voy un poco lento, tratar de mantenerlo
accesible aquí, especialmente en los videos
anteriores
definitivamente va a ser mucho más
intenso a medida que avanza el curso. Entonces, antes que nada, para
nuestro proceso de física, queremos que el personaje se mueva, lo que significa que necesitamos
una velocidad y necesitamos una dirección en la que el personaje
se vaya a mover. Entonces, en algún lugar tenemos que declarar qué tan rápido se mueve nuestro personaje. Entonces podríamos declararlo
bien en la función. Pero en realidad, lo que quiero
hacer ahora mismo es hacer una
variable de exportación donde
realmente podamos cambiar la velocidad
en el editor muy fácilmente simplemente yendo
por aquí la derecha y luego tecleando la velocidad
que queramos. Y podemos cambiar eso
durante el juego, también. Así que vamos a escribir a la velocidad de
exportación var y darle el tipo de flotador. Así que vamos a recorrer
esto lentamente primero. En Export aquí hay una
palabra clave que la declara como capaz de ser
editada en el inspector. Bien, y entonces var
aquí significa variable. Velocidad es el nombre
de la variable. Colon aquí define el tipo, y luego float es el tipo. Para que podamos tomar esta velocidad. En realidad vamos a
escribir pase aquí para el proceso de
física y luego
presione Control como para guardarlo. Y verás que la velocidad aparece aquí y la parte superior derecha
para el guión del jugador. Asegúrate de tener
seleccionado
el nodo jugador , y
podrás ver esto. Ahora, también se puede ver que
el valor por defecto es 0.0. Entonces ese es el
valor predeterminado para float. Probablemente por velocidad, en realidad quiere asignarle
un número real a eso. Entonces voy a tomar
esto y decir iguales, vamos con 100.0
hit Control S. Ahora el valor predeterminado se carga aquí arriba automáticamente porque no
hemos establecido un valor personalizado Si estableces un
valor personalizado haciendo clic aquí, digamos 150 y presionas Enter
ahora la velocidad es 150. Si cambiamos el valor predeterminado a 200 aquí y presionamos Guardar
dentro del script, entonces verá que
el valor personalizado aún anula el valor
predeterminado de 200 Puedo presionar el botón de reinicio aquí para restablecerlo a la
predeterminada, así que ahora son 200. Ahora quiero que la
velocidad del guión sea de 100. Creo que eso es lo que tenía
para el proyecto por defecto. Siempre podemos cambiar
eso más tarde y siéntete libre de establecer la velocidad de
tus jugadores a lo que sea que te sientas cómodo.
Eso es completamente. Y así es como podemos tener nuestro editor definido propiedad para
ser usado dentro del script. Así que las variables de exportación son realmente útiles para hacerlo
más accesible para editar los detalles de
cómo editaría nuestro script sin necesidad de saber nada sobre cómo funciona realmente el
código. Bien, entonces tenemos nuestra velocidad. Ya podemos escribir
proceso de física. Bien, entonces veamos
aquí. Voy a obtener
primero la dirección de entrada. Bien, así que por
ahora mismo, queremos
declarar una
variable de dirección, así var dirección. Y verás que estoy escribiendo esto dentro
de la función. Entonces esto la convierte en una
variable local a la función, es
decir, en cuanto
se hagan las funciones , esta va
a ser borrada. Solo se usa dentro
de la función a menos que devolvamos como nuestro tipo de retorno. Entonces es temporal, básicamente. Y vamos a establecer
esto igual a input. Ahora sé que estoy capitalizando
el yo porque este es un nombre de clase al
que estamos haciendo referencia Entonces la clase de entrada es que se podría pensar en
ella como una clase global. Puedes acceder a ellos en cualquier lugar si necesitas que
haga algo por ti. Y vamos a estar usando la clase Import
para obtener un vector. Entonces un vector va a
tener X y un componente Y, un vector dos, más bien. También hay vector
tres para tres juegos D, que se suma en el eje Z. Pero para dos juegos D, solo
tienes X y una Y, lo que con solo quitar
ese tercer eje hace dos juegos D sean un poco más fáciles de
entender y trabajar con ellos. Entonces queremos obtener
la X negativa aquí. Se pueden ver los parámetros que esta función está definiendo, y en realidad hay
algunos extra por aquí como zona muerta,
que no necesitamos. Pero los cuatro que necesitamos
son X negativo, X
positivo,
Y negativo, y Y. positivo Así que en uno de los dos videos
anteriores, creo que sí toqué esto, pero X negativo y Gadot
queda en la pantalla Entonces queremos entrada para izquierda. Ahora, se puede ver
que se completa con
algunos nombres de cadenas de
acción predefinidos Ya sabes, es un
nombre de cadena, por cierto, porque tiene un ampersand
aquí frente a la cadena,
que son citas, y luego el nombre
real aquí,
terminando Pero todas estas son acciones de interfaz de usuario
predeterminadas, y no es una buena idea
usarlas realmente. En el sentido de controlar a
tu personaje
porque ya controlan la interfaz de
usuario por defecto. Así que vamos a subir a la configuración
del proyecto. Así que proyecte la
configuración del proyecto en la parte superior izquierda, Mapa de
entrada, y
escribimos una nueva acción. Voy a escribir a la
izquierda y luego hacer clic en Agregar. Entonces nuestra acción izquierda, voy a presionar Agregar evento aquí, y me gusta usar las teclas WASD Es bastante estándar
para muchos juegos. Entonces voy a
simplemente escribir A aquí donde dice escuchar
entrada y una regla. Asignarlo automáticamente a la clave A, física o Unicode. Entonces básicamente, A
en tu teclado. Puedes hacer clic en Bien ahora. Y ahora moviéndose a la izquierda
está asignado a A. Y queremos hacer eso para
arriba abajo y derecha también. Entonces escribe a la derecha, agrega, y luego hacemos clic
aquí para asignar la clave, agregar evento, presionar D para derecha. Golpea Bien. Ahora vamos a aguantar. Haga clic en agregar evento, presione W para arriba, agregue una acción, abajo, haga clic en Agregar evento, S para abajo, y ahí está nuestra entrada de movimiento. Entonces Kidob
manejará automáticamente la conversión de
esas pulsaciones de teclas en la acción real
que podemos usar dentro de la columna de función vectorial de clase
G de entrada Entonces lo que queremos hacer aquí es poner los nombres de esas
acciones que acabamos de escribir Entonces podemos hacer
cotización dejada aquí. Y verás que en realidad se llena
automáticamente, y puedes simplemente presionar Enter
aquí para confirmarlo para X
negativo para
X positivo, queremos correcto También puedes ver aquí
simplemente apareció un poco, así que solo podemos hacer doble clic en él. Entonces el tercero negativo Y, podemos escribir abajo o
encontrarlo en la lista. Entonces abajo. Y luego para Y positiva, oh, en realidad lo mezclé. Y negativo está arriba, Y
positivo está abajo. Así que voy a agregar Y
positiva aquí abajo, y luego por aquí, voy a borrar
el abajo y escribir arriba. Así que estoy bastante seguro de
que ahí está. Definitivamente lo averiguaremos en
un minuto una vez que juguemos la prueba. Queremos tomar la dirección
de entrada, y si no es cero,
entonces queremos movernos. Entonces, si es cero, solo queremos dejar de mover nuestro
personaje por completo. Entonces puedes hacer eso
diciendo si dirección. Entonces esto básicamente
ya comprueba si la dirección es igual
al vector cero o no. Entonces, si dirección
significa que no es cero, entonces podemos tomar la
velocidad de nuestro personaje. Ahora bien, ¿de dónde sacamos
la propiedad de velocidad? Bueno, nuestro clásico se encuentra el cuerpo del
personaje dos D, y la velocidad es una propiedad
del cuerpo del personaje
dos D. Así que si tuviera hacer clic
derecho sobre el cuerpo del personaje dos D e ir al símbolo de búsqueda, puede desplazarse hacia abajo aquí
y ver la velocidad aparece aquí mismo en
la lista de propiedades. Entonces, cualquier propiedad o método, que es una función dentro de
una clase que pertenece a una clase padre, van a ser heredados y utilizables por
esa clase heredadora Entonces dentro de un jugador, podemos tomar la velocidad
y podemos establecerla
a queremos la dirección
multiplicada por la velocidad. Ahora, verás este componente
Delta aquí. Este es el tiempo entre fotogramas. No necesitamos
asignarlo aquí para el
estilo de movimiento particular que estamos usando, que es mover y deslizar. Hay otro
movimiento y choca, donde pasarías y
el Delta cuando llamas a esa función, si no
recuerdo correctamente Entonces es un poco
extraño que, ya sabes, el Delta se
contabiliza automáticamente aquí, pero así es como funciona. Entonces se presiona cualquier pulsación de tecla para el
movimiento. Vamos a
asignar la velocidad
a la dirección
multiplicada por la velocidad. Entonces aquí abajo después de eso, podemos hacer movernos y deslizarnos. Ahora, ¿qué
pasaría ahora mismo? En realidad, sería
más fácil sólo de mostrar. Vamos a tocar, y aún no hemos
seleccionado una escena principal. Entonces, seleccionemos la
escena mundial como nuestra escena principal. Yo sólo voy a subir los directorios aquí
y elegir mundo. Haga doble clic.
Tenemos un personaje. Y si presiono una
tecla de movimiento y lo solto, verás que no
detiene a nuestro personaje. Simplemente se mantendrá deslizante, lo que podría usarse para algún
tipo de mecánico de iluminación. Pero para el movimiento regular, en realidad
queremos agregar una declaración se aquí como
el seguimiento a nuestra I. Así que se y luego asegúrate de
poner el colon al final. Entonces eso básicamente declara
lo que viene siguiendo como un bloque para que la función
continúe ejecutando código. Y queremos
tomar la velocidad. Queremos reducir
eso hacia Serrel. La velocidad es igual al vector dos. Así que en realidad estamos creando
un nuevo vector dos aquí, y ponemos paréntesis aquí Se puede ver que
el tercer tipo de
construcción de un vector
toma un valor X y un valor Y. Entonces, dentro de los
paréntesis, presiona Enter. Entonces esto va a separar el primer paréntesis
del segundo y deja muy
claro escribir la lógica X
aquí y luego la
lógica Y justo debajo de ella Entonces queremos movernos hacia
el punto de velocidad x a cero. Y sólo vamos a hacer
eso la velocidad actual. Entonces esto básicamente significa que en
cuanto lo soltamos, estamos bajando la velocidad
a cero de inmediato. Hay muchas
maneras diferentes en las que puedes hacer esto. Puedes hacer que disminuya
gradualmente con el tiempo si usas una función larp Pero este es probablemente el más sencillo.
Así que vamos a ir con eso. Muévete hacia. Y luego en
la segunda línea aquí, queremos obtener el valor Y
para la nueva velocidad. Así que muévete hacia el punto de velocidad
actual Y, estamos haciendo que se acerque a cero en el cambio o Delta de velocidad. Entonces lo guardamos ahí,
y esto significa que esto va
a tomar nuestra velocidad actual, que podría ser, digamos, hacia la derecha a toda velocidad, y vamos a bajarla
por la cantidad de velocidad completa, lo que
significa que inmediatamente
va a caer a cero. Nos acercamos a cero. Así que en cuanto
soltamos nuestras teclas de entrada, nuestro personaje deja de moverse, es el resultado final de.
En realidad cuenta eso. Entonces para declarar un comentario,
si quieres hacer eso, pones un hash tag y
luego la descripción. Para que puedas mantener tus comentarios en línea si lo deseas, en general. estos días, en realidad
los saco a la parte superior de
la función así, así Control X y luego
Control V para pegarlo. Y si quieres que este
texto aparezca en la
documentación generada automáticamente para tu clase, entonces puedes hacer dos ampersands Y guárdala, y luego
eso va a
agregarla a la documentación de la
clase del jugador. Y podemos acceder a
esa documentación pulsando Buscar ayuda aquí. Buscamos player, nuestra clase personalizada, hit open, y podrás ver el
nombre de nuestras propiedades, que en este caso solo se
refiere a una variable que existe como parte de
la clase local. En este caso, podríamos referirnos
simplemente como una variable que es un estado local existente dentro de la clase en lugar de una
variable local de una función. Para que puedas editar y leer
de estos según necesites. En otros lenguajes de programación, cosas como campos o propiedades están mucho
más claramente definidas. Pero creo que generalmente para la mayoría de las funciones
básicas de GD Script, su propiedad y variable
terminan siendo lo mismo No declararías
algo así como un campo privado de respaldo
como lo harías en C Sharp. Yo diría que en la mayoría de los casos, sin embargo, porque, ya sabe, todavía
habría
algunas razones para hacer eso para tener un respaldo privado
a su propiedad pública. Aquí puedes ver el método aquí y si nos desplazamos hacia abajo
las descripciones del método. Entonces proceso de física. Tan pronto como soltamos
nuestras teclas de movimiento, nuestro personaje deja de moverse. Así que esto es en realidad una de las cosas más geniales del script
GD es que
es esencialmente la generación de
autodocumentación Siempre y cuando pongas los comentarios donde se supone que van
con los dobles ampersands, puedes comentar un
campo o una propiedad Puedes comentar un método. Y esto es realmente útil. Hace que sea fácil
para otras personas entender básicamente
tu código sin leer todo el script
de arriba a abajo. Así que en realidad podrías hacer lo
mismo con la velocidad aquí. Entonces dos ampersands y
dicen el movimiento base,
la base, la velocidad de
movimiento base,
del personaje del jugador Control S guardar, y
luego podrá ver nuestra documentación aún
está abierta aquí en la ventana de script. Entonces si hago clic en Player,
puedes ver, oh,
ahora, nuestra propiedad de velocidad tiene una descripción que se
puede leer fácilmente. Entonces eso es muy útil. Téngalo en mente. Y ahora
podemos seguir adelante y darle a Play. Entonces vamos a mover
nuestro personaje WASD. Ahora veremos en
cuanto detengamos Import, el personaje deja de moverse. Que es más lo que
esperarías de un personaje que se mueve en cualquier estándar como
hierba o piedra o lo que sea, cosas que deberían tener
fricción, no hielo. Y ese es el movimiento básico vamos a utilizar para el resto
del juego, básicamente. Ahora, obviamente, los
personajes no animados. No tenemos las animaciones de
ejecución. No está mirando la
dirección como debería todavía. Esas son todas las cosas que
vamos a cubrir en futuros videos en el futuro. Una última cosa que quiero agregar
a una última cosa que quiero
agregar para este personaje,
bueno, estamos por delante de las cosas, es agregar solo una propiedad de nombre para
mostrar más. Entonces voy a agregar realmente una exportación para una var,
un nombre para mostrar. Y esto va a
ser un nombre de cadena tipo. Y vamos a
establecer eso igual a ampersan lo que sea
por defecto que quieras, solo
puedes hacerlo
jugador y golpear Entonces para nuestro reproductor, podemos ver ahora que la propiedad de
nombre de cadena de nombre para mostrar es editable dentro
del inspector Entonces voy a cambiar
esto y ponérselo a Jaco, porque vamos a hacer que
nuestro personaje por defecto, tenga un arma de lanza Entonces creo que eso funciona. En los juegos de Survivor Light, generalmente, tendrías múltiples personajes entre los
que puedes seleccionar. Entonces, tener a todos ellos un
nombre para mostrar distinguido tiene sentido. Ahora, muy rápido,
también hay una propiedad de nombre que tienen
todos los nodos. Eso se refiere al nombre del
nodo aquí arriba. Pero se pueden ver cosas como
colisión forma dos D. No porta espacios
y nombres de nodos. Entonces, usar eso como
tu nombre para mostrar puede ser un poco raro. Como, digamos que
agregas una subclase como el dragoon de fuego Pero podrías hacer el nombre del nodo
del reproductor aquí, Freragoon sin este espacio, por lo que puedes tener un nombre
para mostrar
separado distinguido tener una
propiedad personalizada como Entonces, ¿qué es eso para el dragoon? Hit Control S. Y eso parece
aceptable por ahora mismo. Eventualmente,
tomaremos esta entrada y la moveremos
a un guión separado. Tomaremos estadísticas como la velocidad de los
personajes, y también haremos
que sea un guión separado. Pero este es un buen comienzo. Entonces eso va a ser
todo para este video. Traté de reducir la velocidad aquí
intencionalmente para cubrir toda
la terminología del guión que vamos a usar
para el script GD como, ya sabes, la base
para el resto del curso, estas son todas las cosas
que van a
seguir surgiendo una y otra vez Espero que no haya sido
demasiado lento para nadie, pero vamos a estar
acelerando desde aquí. Entonces hasta el siguiente
video, los veré.
5. Cómo reproducir animaciones a partir de hojas de sprites: Entonces, como están las cosas en este momento, nuestro personaje
técnicamente puede moverse, pero no hay animación
para el sprite en absoluto. Así que queremos que nuestro personaje se anime cuando corre ídolos y, por
supuesto, la animación de la muerte también cuando perdemos el juego Bien, así que lo primero
que vamos a hacer es cambiar
la hoja de sprites aquí Si miras en el pack
Pixel Crawler, podemos agarrar la
hoja de sprites Idol para pasar la noche, o puedes usar el pícaro o
el mago si Así que cojo esto y lo
traeré aquí. Y estos son básicamente sprites orientados hacia los
lados. Notarás que
este personaje no tiene un up o un down. Algunas ventajas
de esto, sin embargo. En primer lugar, si
solo estás animando una dirección y
luego volteándola, que es lo que realmente hace el
superviviente estándar Es mucho más fácil
construir personajes porque solo necesitas
animar una dirección Y en segundo lugar, puedes saltarte
por completo los árboles de
animación y
enfocarte en un reproductor de animación y una máquina de estado que
controla la lógica para tu personaje cambie
entre estados como Idle y dadas esas razones, en realidad solo
vamos a cambiar a la hoja de
sprites Idol nocturno aquí Podrías usar el ídolo
prácticamente indistintamente. Después podrías usar, como,
la hoja de sprites pícaro, como ahí mismo o el
mago de aquí también Entonces, cualquiera de esos va
a funcionar perfectamente bien, y ya está
la configuración para tener tres
clases de caracteres ahí mismo. Pero iba
por más de un caballero que
empuñaba lanza para
empezar. Entonces, como un personaje
llamado agroun, este spright le queda como que
le queda, y podrá lanzar lanzas Bien, entonces tenemos nuestro juego de hojas de
sprites aquí. Queremos convertir esto
en una animación ociosa. Los fotogramas He
ya se han configurado aquí, pero necesitamos un reproductor
de
animación real para poder hacerlo. Entonces haga clic derecho en el
nodo del jugador, agregue un nodo hijo. Busque
reproductor de animación. Agrega eso en. Entonces, cuando tengas el reproductor de
animación, la ventana de animación
estará aquí en la parte inferior. Puedes hacer clic aquí mismo
si aún lo necesitas. Y queremos ir
a animación y luego Nu y escribir el
nombre de la animación. Así que estamos comenzando con
la animación inactiva, así que solo vamos a escribir Idle. Y podemos agregar en
una pista de propiedad. Así que vamos a
agarrar del Sprite dos D algunas de estas propiedades,
a saber, la textura.
Entonces haz doble clic en eso. Vamos a
hacer clic derecho en Property Track, agregar en H frames, y luego propiedad
Track, Sprite dos D. V frames. Entonces por último, por ahora mismo, al menos
necesitamos el propio número de fotograma. Así que agrega y enmarca como una propiedad. Así que ahora podemos tomar este
Zoom y acercar un poco en
nuestra hoja de sprites Primero, quiero tomarme el tiempo de
chasquido aquí abajo donde
dice 0.033 3 segundos
y cambiarlo a 0.1, decir que
vamos a estar trabajando en intervalos de
0.1 segundos o
una décima de segundo A continuación, habilite este ajuste
al cursor de la línea de tiempo. Ahora podrás
simplemente hacer clic
aquí a los intervalos de 0.1
segundos, hace que sea mucho
más fácil trabajar con ellos. Es posible que hayas visto
en esta brillante hoja que hay cuatro
fotogramas de animación. Así que vamos a recorrer
esos cada 0.1 segundos, lo que significa cuatro por 0.1, queremos una animación
larga de 0.4 segundos. Entonces por aquí en el lado derecho, escribe 0.4, y luego esta cosa que
parece flechas
alimentándose unas a otras. Bucle de animación,
quieres hacer clic en eso para que hagamos
nuestro bucle de animación Ahora, en nuestra línea de tiempo de animación, no
hay fotogramas clave que
definitivamente queremos establecer un fotograma clave al inicio de la animación para todas estas
propiedades Así que haga clic derecho insertar clave. Si dejaste clic aquí,
verás que el valor de
la textura ya está preestablecido para esta animación nocturna
inactiva. Si no lo es, entonces
vas a querer
cambiarlo a la hoja de sprites
Idle Desde aquí, puedes arrastrar y soltar así y poner eso ahí. Entonces, lo que significa este fotograma clave
es que al inicio de nuestra animación a 0.0 segundos cuando esta
animación comience a reproducirse, va a establecer la textura en nuestro sprite a este valor, lo que significa que tan pronto
como comience la animación, cambiamos la hoja de sprites Ahora, marcos H, también queremos
hacer clic derecho y clave Serta. Ahora ya preestablecimos
nuestro valor aquí como cuatro en este brillante dos D. Así puedes ver que
cuando claves Serta, agregará cualquier valor en el
que
esté configurado
actualmente como el punto de fotograma clave
en la línea de tiempo de animación Y cada vez que estos
fotogramas clave golpean, eso significa que el valor
en ese momento es ese valor Ahora, para nuestro juego Pix art, casi siempre vamos a estar usando el modo discreto por
aquí en el extremo derecho. Se pueden ver estos tres puntos. Lo que eso significa es
que el valor
no cambia hasta que llega
al punto clave del fotograma. En algo más
como un juego de tres D, podrías hacer animación
continua, lo que significa que
irá gradualmente entre
los valores de los fotogramas clave Entonces, si tuvieras algo así
como un fotograma clave de posición, entonces animará
la posición
entre la posición inicial de cero y
la
posición final de 100 a lo largo del medida que avanza esta
línea de
tiempo de animación Así que mucha animación en los juegos en realidad solo
está cambiando los valores de las propiedades en
tu objeto a medida que pasa el tiempo. Bien, así que continuando con V frames, podemos hacer clic derecho insertar una clave. Verás que el valor aquí, si dejamos clic
en el fotograma clave
ya está establecido en uno.
Eso es lo que queremos. Una vez más, si miramos
la hoja de sprites Idol, tiene cuatro marcos H, marcos
horizontales y un marco vertical en
términos de filas y columnas Entonces por eso tenemos cuatro para fotogramas
H y uno para cuadro V. No hay mucha personalización
que tenemos que hacer aquí. Solo tenemos que
asegurarnos de que al inicio, esté ajustado a esos valores para
que nuestra animación se
reproduzca correctamente. Ahora bien, lo que realmente
tenemos que hacer es poner en nuestros cuatro fotogramas
de animación aquí. Así que haga clic derecho en el primer
marco y haga Insertar clave. Verás que para frame,
en realidad te muestra una
vista previa del sprite Va a mostrar muy útil, pero también puedes hacer click
izquierdo sobre él y ver que está
configurado en valor cero. Ahora queremos chasquear a 0.1. Si aún no elegiste aplicar ajuste al
cursor de línea de tiempo, puedes hacerlo aquí Eso hará que sea mucho
más fácil ir al 0.1. Supongo que también puedes escribir
manualmente el valor si quieres
saltar en la línea de tiempo. Normalmente simplemente chasqueo con
el cursor del ratón, aunque. Después haga clic derecho en
la sección del marco, la fila del marco y haga la tecla de inserción. Ahora conseguirás una línea
que va entre estas. Esa línea significa que
no hay cambio de valor
entre aquí y aquí. Es sólo una continuación
del mismo valor. Entonces queremos hacer clic aquí
y cambiarlo a uno, y eso significará que
ahora va a estar reproduciendo el segundo
fotograma de animación. Dado que la hoja Bright es
como una matriz de valores, comienza en cero, no en uno. Generalmente, en la programación,
así sería como funciona. Entonces uno es en realidad el segundo
fotograma de animación y cero es en realidad el
primer fotograma de animación. Vamos a hacer clic derecho en
0.2, insertar una clave, hacer clic en el punto clave del marco, y luego cambiar
el valor a dos, y luego ir aquí a 0.3. Derecha, haz clic en la tecla de inserción. Haga clic aquí, cámbielo a tres. Ahora bien, ya no deberías ver
ninguna línea entre ninguno de
estos marcos. Podemos ir al inicio aquí, golpear play, y ahí está nuestra
animación para el personaje. Ahora, una vez más,
porque solo estamos haciendo animación izquierda y derecha, solo
vamos a
necesitar hacer un ídolo, una muerte, y una animación de
ejecución aquí. Y luego
controlaremos el volteo
del personaje de una
manera diferente . Te lo
mostraré más adelante. Así que una configuración mucho más simple y mucho más fácil de agregar nuevos personajes si
quieres hacer eso. Así que vamos a duplicar esta animación porque mucho de esto en realidad
vamos a reutilizar. Sólo vamos a
cambiar quizá el valor del fotograma
He y la textura. Y dependiendo de cuántos marcos de
ejecución haya, podemos cambiar los
marcos aquí también. Pero vamos a duplicarlo
haciendo clic aquí en animación y hacer duplicar,
y vamos a hacer Run. Bien, ahora queremos hacer
click en la textura, y queremos arrastrar y soltar la
hoja de sprite de ejecución y hasta aquí Podemos ver que esto tiene seis
fotogramas de animación. Entonces, lo que eso significa
es que necesitamos cambiar el valor de los fotogramas H aquí a seis. Queremos cambiar la duración de la
animación a 0.6 porque ahora estamos trabajando en
seis fotogramas, no en cuatro. Y entonces vamos a
querer ir a 0.4 segundos y sumar en el
quinto fotograma de animación. Así que inserta la clave, da clic aquí, cambia el valor a cuatro para el quinto fotograma y
luego pasa a 0.5 segundos. Haga clic derecho aquí,
inserte la tecla, izquierda, haga clic en el fotograma clave, cambie
el valor 4-5 y presione play Y ahí está nuestra animación redonda. Por lo que duplicar ahorra
mucho tiempo. Bien, ahora agreguemos en la
animación de la muerte mientras estamos en rollo. Así que vamos a duplicar
y sumar en la muerte. Y entonces queremos
cambiar la textura aquí, por
supuesto, a la sábana mortal de la
noche. Así que arrastra y suelta la hoja de muerte en el inspector de fotogramas clave Puedo contar aquí. Hay
seis marcos. Así que vamos a hacer clic. En realidad, no necesitamos
cambiar nada más porque
simplemente lo duplicamos de
alrededor. Sólo podemos darle a Play. Pero se puede ver que está en bucle. Entonces los personajes no
suelen hacer eso. Así que queremos desactivar realmente bucle haciendo clic dos veces aquí. Lo hará para que la
animación haga bucles de ida y vuelta. Al igual que, va hasta el final
y luego de vuelta al inicio. Eso sería más útil para algo así como
una plataforma móvil. Queremos hacer clic
por segunda vez para desactivar el bucle por completo. Entonces ve a 0.0, presiona play, y la animación debería
detenerse aquí al final. Y luego una vez que la
animación de la muerte se haga más tarde, solo
necesitamos
hacer algo como clave un Game Over
para nuestro personaje, y entonces eso será todo. Bien, entonces, ¿qué
animación va a estar jugando
cuando ejecutemos el juego? Bueno, vamos a golpear
play y averiguarlo. Bien, entonces puedes ver que la animación
inactiva está ahí, pero en realidad no está reproduciendo
ninguna de las animaciones. Uh, en realidad no establecimos una animación para
Reproducción automática en Inicio Nuestras animaciones
eventualmente van a ser controladas con algo
llamado máquina de estado. Eso será en lo que nos metamos
más en el siguiente video. Vamos a hacer clic en
Reproductor de animación y cambiemos aquí la animación que estamos viendo
de muerte para correr. Y vamos a dar click
aquí a este pequeño botón de
reproducción automática al cargar Así que haz clic en ese hit play, y ahora verás
que independientemente de si nuestro personaje
se está moviendo o no, va a estar reproduciendo
la animación de ejecución. Tenga en cuenta que tampoco voltea
direcciones automáticamente. Ese será un script sencillo
que agregaremos más adelante también. Pero tenemos tres animaciones
sobre nuestro personaje, y tenemos la
capacidad de cambiar entre ellas
llamándolas por su nombre. En el siguiente video,
crearemos la máquina de estado con un estado de movimiento que podrá cambiar
entre inactivo y Ejecutar.
6. Máquina de estado de jugador: Bien, entonces nuestro personaje tiene reproductor de
animación y la capacidad reproducir la animación de ejecución, pero queremos cambiar entre animaciones
idol y run
dependiendo si hay entrada clave para
nuestro personaje o no. Entonces vamos a controlar esto
con una máquina de estado. Entonces, si recuerdas al
inicio del curso, agregamos en Limbo AI, que es una máquina de estado y sistema de árbol de
comportamiento que
puedes usar en Gado fuera de la caja, te
ahorra mucho trabajo, no
tener que hacerlo manualmente Va a estar pegando a
las máquinas estatales para el curso. Creo que son solo un poco más fáciles de
trabajar en el
futuro y mucho mejores para configuraciones
simples como esta Y esto es, para ser honesto,
una configuración muy sencilla. Entonces, hagamos clic derecho sobre el jugador en la
base en un nodo hijo. Y vamos a estar
buscando la palabra clave limbo. Entonces verás aquí Limbo HSM estado jerárquica Al igual que en el nodo raíz aquí, la propia máquina de estado
va a controlar los estados,
los estados del limbo, y
va a poder alternar
entre ellos a medida que añadimos
transiciones entre esos estados Entonces, vamos a crear el Limbo HSM. Y luego voy a
hacer click derecho aquí y vamos a agregar nuestro primer estado
agregar nodo hijo. Entonces queremos un estado limbo
y simplemente crear eso. Entonces la jerarquía es la máquina de estado
raíz, y todos los estados son
lo que podemos cambiar entre. Y cada uno de estos estados
van a ejecutar código
diferente dependiendo de en qué estado se encuentre el personaje. Para este curso, en
realidad solo vamos a tener un estado de movimiento
y un estado de muerte. Así que muy sencillo. Pero sigue siendo importante
porque queremos
saber cuándo nuestro personaje debe
cambiar al estado de muerte,
y el estado de movimiento va a estar controlando las animaciones de
ralentí y movimiento. Técnicamente, podrías separar Idle y pasar a
sus propios estados, pero esencialmente
van a estar ejecutando el mismo código porque ya sea que el personaje esté
inactivo o
se mueva, sigue siendo libre movimiento
para el personaje Es solo cuestión de qué animación
va a estar reproduciendo. Y no creo
que eso necesariamente justifique un estado completamente
separado Entonces vamos a
hacer click derecho sobre Limbo HSM, y le voy a
adjuntar un guión Esto se llamará,
digamos, jugador subrayado HSM. Entonces es el jugador máquina de estado
jerárquica. Vamos a crear eso. Y luego aquí arriba en la cima,
vamos a, por supuesto, querer darle el nombre de
clase, jugador HSM En términos generales, como voy a
mostrar aquí en el sistema de archivos, si buscamos HSM,
lo que sea que pongas como caso de serpiente
para el nombre de archivo, también
querrías tener el nombre de la clase aquí arriba, pero esto, por
supuesto, tiene
mayúsculas y te saltas los espacios porque este
es un símbolo tipo Es una muy buena idea mantener sincronizados
este nombre y el
nombre del guión. Por lo que el jugador HSM nos va
a ayudar a controlar el cuerpo del personaje del jugador a través de los estados que
existen en el Limbo Entonces queremos agarrar
al jugador y configurarlo como el agente que controla
la máquina de estado. Bien, entonces primero para
nuestro jugador HSM, queremos una referencia
al jugador que
va a estar manejando nuestra máquina estatal Así que vamos a hacer en la exportación var
jugador de tipo jugador. Y si hemos definido
el nombre de la clase para nuestro guión corporal de jugador de personajes como jugador, esto
debería aparecer bien. Y se puede ver en el inspector aquí a la derecha
que sí se presentó. Entonces, si quieres, puedes hacer clic en Asignar y asignarlo
al jugador ahora mismo. Entonces eso significa que nuestra máquina de estado
jerárquica del jugador ahora tiene una referencia
al jugador Entonces lo que queremos hacer es
asegurarnos de que en Rady, que este script va
a configurar la máquina
de estado inicializándola con
el reproductor como agente Así que vamos a crear la función, subrayar Rady, y el
tipo de retorno va a ser Prácticamente siempre es para
funciones listas porque esta es una función de nodo predeterminada
destinada a configurar tu nodo, como en uno de estos nodos de
aquí a la izquierda, algo que existe dentro de tu escena después de que se hayan definido todas sus
propiedades. Entonces la función ready ejecuta el código que cuando
el objeto esté listo, va a hacer algunos pasos
finales de configuración Muy común para usar antes de que el objeto realmente
comience a correr en la escena, pero haciendo los pasos esenciales de configuración
final. Mientras seguimos
adelante con esto, también
voy a introducir
algunos conceptos nuevos también. Entonces, en primer lugar, la
afirmación aseverar. Así que vamos a escribir en afirmar. Entonces esto significa que pasas
en alguna condición y esperas que
evalúe a verdad. Entonces en este caso, lo que queremos comprobar es que el jugador en realidad
se ha establecido en el inspector. Siempre que estableces una variable de
exportación aquí, básicamente
dependes del diseñador o de quien esté
configurando el proyecto del juego
para rellenar
realmente estos campos, y es muy fácil definir uno de estos, especialmente si tienes
muchos scripts
corriendo con estas variables de exportación. Son muy convenientes para configurar las cosas
en el inspector, pero es propenso a errores del usuario. Entonces solo podemos afirmar que
el jugador no es nulo. Ahora ve que hago signo de
exclamación y luego un signo igual. El signo de exclamación significa
invertir lo que sea que intentes
probar Entonces, si jugador es igual a nulo, que en realidad serían
dos signos iguales como ese, entonces comprobarías
que el jugador es nulo. Pero si haces un signo de
exclamación y un signo igual, entonces estás diciendo que el jugador
no lo es y cada vez que
haces una declaración, tienes la opción
de pasar también un mensaje de falla opcional Entonces, ¿qué quiere que le
diga a quien esté ejecutando el guión cuando esa
condición no sea cierta? Entonces en este caso, me
gustaría algo así como jugador agente debe
estar configurado en el HSM Así máquina de estado jerárquica. Entonces solo estoy poniendo
aquí en la parte superior, mencionando muy
claramente que
se trata de una máquina de estado jerárquica Entonces, si alguna vez tienes alguna
duda sobre por qué está HSM, bueno, está ahí arriba así que
vamos a mostrar esto en acción Si ejecuto la escena,
no va a fallar
porque hemos establecido el nodo reproductor como referencia en
la
variable de exportación para un jugador. Pero si desconfiguro al jugador aquí
mismo y lo ejecutamos, vas a recibir un mensaje de error
inmediato Va a decir que fracasó
la aserción. El agente del jugador debe
estar configurado en el HSM. Entonces la afirmación es
solo un cheque para
asegurarse de que lo que esperas que
sea verdad es realmente cierto Por lo que escribir declaraciones
contra una condición es la idea general de probar dentro de la programación
en general. Para ir más avanzado que esto, escribirías pruebas unitarias
o pruebas de integración usando
un marco de pruebas como
GD Unit o
GUT Godot unit testing GD Unit o
GUT Godot unit Eso definitivamente va
más allá
del alcance de esta serie de cursos, pero es algo para
buscar si tienes tiempo después
porque escribir pruebas, asegúrate de que tu código
esté realmente escrito bien, y puede ser
útil en el largo. Atrapa bichos temprano. Entonces,
sigamos adelante con eso. Sólo vamos a usar estas
pequeñas afirmaciones de aseveración así. Se puede
ver cómo funciona. Si la condición falla,
entonces obtenemos un mensaje, y eso nos deja saber que, oh, nos olvidamos de establecer algo que deberíamos
haber establecido algo. Entonces es bastante práctico, en realidad. Entonces, asegurémonos de
que en Limbo HSM, una vez más,
asignemos al jugador Y luego hagamos la
configuración del propio HSM. Así que en realidad voy a
hacer de esta una
función separada porque esto
va a hacer algunas cosas
diferentes. Así que vamos a crear otra
función aquí abajo, la función. Y cuando digo función, realmente
me refiero a FU
y C, solo digo. El guión bajo configuró HSM, y luego los paréntesis, la flecha de giro y
el vacío
tenían un espacio extra ahí Entonces lo que queremos llamar en la máquina de estado es inicializar, y tenemos que pasar en un agente Como mencioné, el
agente en este caso, es el jugador para
pasar en el jugador, y luego necesitamos
llamar a configurar HSM Dentro de la función ready. Así subrayado configuración HSM. Bien, entonces para recorrer esto, estoy convirtiendo en una
función privada con el
guión bajo aquí, lo que significa que
solo deberíamos estar ejecutando esto dentro de este script del
jugador HSM La inicialización hace toda
la configuración de fondo
para la máquina de estado, y va a hacer que opere con el
reproductor como agente La otra cosa que tenemos que
hacer aquí mismo es establecer el estado inicial. Entonces, ¿qué estado vamos
a ejecutar primero? También cambiemos el nombre del nodo Limbo
HSM a jugador HSM. También me gusta mantener este tipo de sincronizados con el
guión adjunto a él. Entonces jugador HSM aquí. Equivale al HSM del jugador dentro
de la ventana de escena. Y luego el estado del Limbo aquí, llamaremos a esto el estado de movimiento y luego le adjuntaremos un
nuevo guión También una ventaja
de si le cambias el nombre antes de adjuntar el
script, si haces el botón derecho, das
clic en el estado y luego
adjuntas el script ahora, verás que
el nombre del script también tiene por defecto
el nombre del nodo Así que mantener esas tres
cosas sincronizadas generalmente es una buena idea
mantiene las cosas organizadas. Y solo guardaremos esto
en la carpeta del reproductor por defecto por ahora, y vamos a heredar
del estado Limbo Crear. Bien, entonces voy a llamar
a esto el estado de movimiento, nombre de
clase estado de movimiento. De hecho, podríamos volver a usar
esto para el enemigo también. Ya que todos van
a estar esencialmente usando la misma configuración de animación. Entonces el estado de movimiento,
vamos a necesitar los nombres de
dos animaciones, que son nuestra animación inactiva y nuestra animación de movimiento,
que se ejecuta. Entonces voy a decir
export para Idl anim, y vamos a
configurar este tipo a un nombre de cadena Y vamos a establecer por defecto
el valor a Idle. Ahora, poner el ampersand aquí para convertirlo en un
nombre de cadena es en realidad opcional Cuando se declara como
un nombre de cadena aquí, la variable, se va
a convertir automáticamente. Entonces es opcional si
quieres hacer esto como Ah, así que vamos a hacer exportar var. Yo solo lo llamaré ejecutar
animación
porque así es como se
va a llamar por defecto en este proyecto, y haremos igual ampersand Poner un par de comentarios aquí dos hashtags hace que los comentarios
aparezcan en el inspector. Entonces, si voy al inspector
y pongo el cursor sobre la animación inactiva, puedes ver que los
comentarios realmente
aparecen ahí automáticamente,
lo cual es muy útil También puedes ver
cómo se
define la propiedad como un nombre de cadena con un valor predeterminado de inactivo o
run para el y para ello, queremos asegurarnos comprobando el reproductor de animación
que nuestros nombres coincidan. Así se puede ver que estaba haciendo un ídolo
minúscula, carrera en minúscula Es sensible a la carcasa cuando
estás usando estas cuerdas. Así que asegúrate de que
coincida aquí y aquí, lo que sea que aparezca en el reproductor de
animación
para inactivo y correr. Bien, entonces voy
a hacer click derecho sobre el nombre del Estado
Limbo aquí
y buscar el símbolo Y vas a ver
que hay un montón de métodos
especiales que tiene
este nodo enter, exit, y setup y también actualizar. Entonces estos son métodos
específicos de estado. Suenan algo parecido. A lo que tendrías en
un nodo Gadot estándar. Pero la diferencia es
que estos solo
se ejecutan cuando la máquina de estado
en realidad está usando este estado. La máquina de estado solo ejecuta el código de uno de los estados a
la vez, y los otros estados básicamente simplemente se sientan ahí pasivamente hasta la máquina de estados haya
determinado que es el
momento de hacer la transición a
un estado diferente Entonces eso significa que puedes
escribir básicamente cuatro conjuntos de código y solo uno se
va a ejecutar a la vez, y eso es muy útil para
evitar que sucedan cosas
innecesarias mientras
tu personaje no
debería estar haciendo esas cosas. Al igual que un personaje
no debería estar atacando cuando el personaje solo está corriendo y no hay entrada de ataque. Por lo tanto, no permites que ese código se ejecute
administrándolo con una máquina de estado. Bien, entonces queremos comenzar
con esta función enter. La palabra clave virtual para
estas funciones aquí significa que aunque pueda haber una implementación predeterminada
para la función, podemos escribir nuestro
propio código personalizado, que cambia completamente lo hace cuando estas funciones
realmente se ejecutan. Echemos un vistazo al script de estado de
movimiento, y vamos a estar haciendo subrayado de
función Enter Entonces, ¿qué queremos que ocurra cuando el estado de movimiento entre dentro
de la máquina de estado? Así que queremos tomar
el reproductor de animación, y queremos establecer su
animación en ocioso o correr dependiendo de si el personaje
se está moviendo o no. Bien, ahora para nuestro estado de mudanza, ¿cómo vamos
a conseguir una referencia al reproductor de animación? Entonces la idea es que
para nuestro agente, sólo
va a tener
un jugador de animación, el reproductor
de animación del jugador. Hay varias
formas en las que puedes obtener esa referencia dentro
de tu script Move State. Sólo voy a tratar de mostrarle al que de la parte superior de mi cabeza, creo que aquí sería lo
más práctico. Entonces si vamos al jugador HSM, entonces podremos exportar una referencia
al reproductor de animación Así que vamos a hacer en la exportación
var reproductor de animación, y luego Colon reproductor de animación. Bien, un comentario para dejar
claro que este es el reproductor de animación del jugador, y luego
lo asignamos en el inspector. Ahora bien, la razón por la que lo estoy
haciendo en este guión lugar de los
guiones infantiles, como los estados, es
que solo quiero una referencia
exportada aquí, y luego la usaremos para obtener el reproductor de animación
de nuestros guiones estatales. Entonces, si saltamos al guión de estado de
movimiento, podría simplemente
obtener muy rápidamente la referencia que
tiene el jugador HSM
aquí en la parte superior haciendo algo como get parent y luego
dot animation player Entonces eso es realmente todo
lo que tendrías que hacer ahí. Y ahora podemos asignarlo a una variable local si queremos. Otra opción sería que pudiéramos
tener un método que siempre obtenga esto o podríamos guardarlo en
caché aquí localmente. Entonces solo necesitamos
tomar este valor aquí y luego asignarlo
a una variable local. Así var, voy a decir guión bajo reproductor de
animación, que es de tipo reproductor de
animación Entonces podría estar en Enter, pero lo cambiaré
para configurarlo más tarde. Haremos jugador de
animación de subrayado. Igual, Obtener padre. Sí.
Se puede ver autocompletar, deshizo del nombre de la
función ahí Esta debería ser tu línea
completa aquí. En Enter ahora mismo,
va a asignar el reproductor de animación a lo que sea el reproductor de animación de padres. Así que eso lo hace un poco
más fácil que tener que tener referencia de variable de
exportación en
cada uno de estos scripts de estado. Los guiones estatales en
cambio solo dependen el padre tenga una referencia
al reproductor de animación, lo cual creo que es justo
porque un jugador HSM realmente va
a estar controlando las animaciones en
el jugador de todos modos Entonces creo que la configuración tiene
sentido en este caso. Ahora, en lugar de en Enter, que se llamará cada vez el personaje ingrese al estado, implementaré
la función de configuración. Función,
configuración de guión bajo y luego autocompletar que devuelve void Tomaremos esta línea y la
pondremos aquí así. Entonces la configuración solo se ejecuta una vez cuando la
máquina de estado se inicializa Entonces, básicamente,
no necesitamos obtener el reproductor de animación cada
vez que ingresamos al estado, solo una configuración establecida. Ahora, lo que sí queremos que ocurra en Enter es que reproduzcamos
la animación correcta. Entonces en este momento, no
tenemos la forma correcta de determinar la animación
porque nuestro código para eso está realmente atrapado
en el guión del jugador con esta dirección que se establece
en una variable local. Entonces vamos a
tener que
sacar eso más tarde para que esto
funcione completamente. Pero lo que podemos hacer ahora mismo es hacer animación player dot play, y digamos comencemos
con la animación inactiva. Ahora, no, estoy poniendo
en la variable aquí, una referencia a la animación inactiva, que resolverá
al nombre de la cadena. Entonces esto espera un nombre de cadena, pero no nos cuesta
escribir esto aquí abajo. Queremos asegurarnos de que
es la variable para que todavía tengamos la opción de cambiarla en el
inspector, si eso tiene sentido. Generalmente, por
regla general, si tienes algo que quieres
cambiar, eso es una cadena, quieres sacarlo a
algún tipo de variable en
lugar de escribirla duro cada vez que la
referencies en el mismo script. A veces, si el mensaje solo
se va a usar una vez en ese
lugar específico, está perfectamente bien escribir la cadena de su código en
su código de función. Eso también puede estar bien.
Bien, entonces va a reproducir la animación inactiva tan pronto
como comience el estado de movimiento. Ahora, para
probarlo, queremos apagar la ejecución automática dentro
del reproductor de animación. O tal vez en realidad no lo hacemos. Detengamos el juego
y lo ejecutemos como es, y en realidad debería entrar en la animación ociosa
o eso pensé. Así que vamos a tratar de producir
el juego automático en carga aquí. Ahora, sin Autoplay en carga, creo que no debería jugar nada Y así todavía tenemos el problema de que parece que el estado
no está entrando porque la
animación no se está reproduciendo. Entonces lo que podemos hacer para demostrarlo es volver al editor
de guiones. Y voy a
establecer un punto de quiebre aquí haciendo clic izquierdo a la izquierda del
número de línea en el guión. Y esto va
a significar que cuando llegue a esta línea de código, se va a romper y nos
permitirá ver qué
pasa en el debuker Entonces voy a golpear play, y no va a golpear ahí, lo que significa que el estado nunca entró realmente.
No está activo. Entonces eso significa que tenemos que
volver al guión de HSM y asegurarnos de que
el estado de movimiento esté realmente activo al
inicio del juego Entonces entremos al jugador HSM. Y creo que lo que me olvidé
aquí fue llamar en realidad set active en el propio
jugador HSM Por lo que queremos establecer active true. Nosotros inicializamos, que
ejecuta la configuración, pero no la hemos activado, lo que en realidad hace que la máquina de
estado comience a funcionar Entonces ahora si le pegamos
a play, golpearemos esa línea Enter en
el estado de movimiento. Entonces esto prueba que el estado de movimiento en realidad está siendo reconocido por la máquina de estado. Para ir un poco más detallado, puedes mirar el
seguimiento de pila en la parte inferior,
y puedes ver, si
lees atentamente,
que la función
enter de estado de movimiento se ejecutó, y se ejecutó después de que se ejecutara la configuración HSM, y en realidad puedes hacer clic aquí y saltar a
la línea de código, lo que provocó que Enter se
ejecutara en el estado de movimiento Ver set Active true aquí, que llama al Enter en el
primer estado que se ejecuta. Y todo esto ocurrió,
si hace clic en la línea de fondo en HSM de configuración
lista Entonces se puede ver, básicamente lo que
llevó a entrar siendo llamado. Entonces fue la función ready en el llamada
el HSM de configuración, que llamó set active y luego
set active hizo que se ejecutara el estado de
movimiento Entonces ahora si aún no lo has hecho, puedes desmarcar este
punto de interrupción y
puedes dar click aquí abajo para continuar o presionar F
12 en el teclado, y podrás ver que el
estado inactivo se va a ejecutar Si quieres cambiar
eso al estado de ejecución, así que tomamos run aquí y reemplazamos play Idle animation por play
run animation, pulsa play. Y ahora se puede ver
que está reproduciendo la animación de ejecución cuando entra
el estado. Entonces, en el siguiente video, nos
centraremos en controlar realmente el estado de movimiento con la entrada del jugador para asegurarnos de que estamos reproduciendo la animación
correcta en
el momento adecuado.
7. Entrada del jugador como componente: Nuestro estado de movimiento es reproducir la animación en el
reproductor de animación para nuestro personaje, pero en este momento no
tiene el código para saber cuándo cambiar
a la animación de ejecución, cuándo hay entrada real del
jugador. Entonces para manejar eso, si miramos el guión del jugador, podemos ver que
aquí es donde
se está adquiriendo la dirección para el jugador, y lo estamos haciendo con una
variable local para la dirección. Entonces esto funciona para esta función de proceso de
física, pero entonces no podemos usar la dirección de entrada
en ningún otro lugar que no sea aquí. Así que querríamos sacar
eso a algún tipo de variable de propiedad a la que puedan acceder
otros scripts. Ahora, podríamos hacer algo como dirección
VR aquí del vector dos, y luego cambiar
aquí mismo para establecer la dirección
variable local. Y esa probablemente
sería la opción más sencilla. Juntos. Sin embargo, creo que si seguimos por
esta ruta y colocamos toda la entrada dentro del guión
del cuerpo del
personaje del jugador, entonces realmente estaríamos rompiendo
una separación de preocupaciones. Entonces, el guión del cuerpo del
personaje del jugador se trata principalmente de simplemente
mover al jugador. Si agregamos toda la funcionalidad de
entrada, adquiriendo todas las entradas de
los jugadores en ella, entonces ahora el guión
va a servir para dos o tres o
incluso más propósitos ya que seguimos
abarrotando el guión del jugador Entonces voy a tratar
de sacar esto a un script de nodo separado que nuestro
script de jugador aún puede usar, pero también podemos hacer
referencia, digamos, nuestros estados para manejar toda la entrada para nuestro personaje
jugador. Así que vamos a hacer
clic derecho en el nodo del jugador, y voy a estar
agregando un nodo hijo. Vamos a escribir en nodo aquí. Entonces esta será solo una clase de nodo
básico, create. Y quiero renombrar
esto para que sea entrada del jugador. Vamos a adjuntarle un guión. Haga clic derecho adjuntar
guión, entrada del jugador. Y podemos darle
el nombre de clase, entrada
del jugador para
que se
pueda referenciar fácilmente en una variable de
exportación. Entonces ahora desde nuestro guión de jugador, tenemos que básicamente agarrar esto, y solo voy a controlar C, pegarlo a la
entrada del jugador, para que pueda ponerlo ahí. Pero donde
realmente queremos obtener la dirección está dentro del método de entrada. Entonces ahora mismo en el guión de
los jugadores, proceso de
física está ejecutando cada
frame de procesamiento de física de nuestro juego, que por defecto es algo
así como 60 veces por segundo. Probablemente no estamos presionando
las teclas 60 veces por segundo, así que eso es mucho
innecesaria get vector call y probablemente no
importaría tanto
para un personaje de jugador. Pero en general,
creo que puede ser un poco mejor en
el guión del jugador manejar la entrada de dirección
dentro del método de entrada de
subrayado de función Así que la función de subrayado de
entrada, básicamente, cada vez que
se envía un evento de entrada al juego, entonces
pasará por este método y verá si hay algún
código para que responda Y la forma en que verificamos si el evento es
realmente relevante para nosotros es que básicamente verificaríamos nombre de
la acción en
el evento en sí. Entonces vamos a escribir if, y voy a
hacer un nuevo método si guión bajo es acción de movimiento Y vamos a pasar en
el evento a esta función. Entonces vamos a
hacer algunas cosas. De lo contrario, vamos a simplemente pasar y no
hacer nada todavía. ¿Cuál es la función I movimiento
acción? Por lo general, solo nos estamos protegiendo contra otro tipo de acciones, y solo queremos procesar la entrada si la acción
es una acción de movimiento. Entonces diremos que la función
es acción de movimiento. De tipo evento, evento de entrada. Y entonces esto va
a devolver un booleano. Entonces un booleano es un
verdadero valor falso. ¿Es una acción de movimiento? Verdadero o falso? Entonces esto va a verse
algo así. Retorna evento que es acción, y
en realidad vamos a copiar y pegar estos
nombres por ahora mismo. Bien, para que podamos ver
aquí estoy repitiendo la misma cadena aquí
que está aquí arriba. Entonces, en general, trataría sacarlos a su
propia variable separada. Pero podríamos Sí, ¿por qué no
hacemos eso ahora mismo? Y luego te voy a mostrar un paso podemos ir más allá de eso, incluso. Así que vamos a poner una variable aquí, Var left action o en realidad, digamos que var left
es de tipo string name, y va a ser igual
a este valor aquí mismo. Así que vamos a Control C, copia esto, pégalo aquí abajo, y luego voy a
seleccionar esto de nuevo. Voy a presionar Control
R para buscar y reemplazar, y voy a
reemplazarlo por izquierda. Ahora, cuando estés
usando esta herramienta, va a reemplazar lo
que has seleccionado actualmente. Entonces quiero reemplazar esto con el nombre de la izquierda, así que
voy a presionar Reemplazar. Ahora, el segundo, al
que automáticamente va a saltar o tal vez
no Uh, aquí
mismo, sí queremos mantener
como Cita de Ampersand a como Cita de Ampersand Así que hagamos clic en Siguiente coincidencia, y encontraremos
aquí abajo queremos
reemplazar esto con
left, así que presiona Reemplazar. Y eso va a ser
básicamente ahí. Probablemente
deberíamos encargarnos de este mensaje de error
ahora mismo, también. Entonces voy a declarar
esta dirección lejana, y nos preocuparemos por asignarlo
correctamente en un minuto Bien, para que se deshaga
del mensaje de error, puede guardar el
script para ahora mismo. Entonces ahora mismo, me
movimiento acción está regresando si la
acción es la acción de izquierda. Entonces, ¿el nombre
de la acción en el evento coincide con el nombre que queda? Ahora, tenemos
otras tres acciones, así que tenemos que verificar aquí
otras tres condiciones. Entonces, saquemos esto rápidamente. Voy a seleccionar
este Control X para cortarlo, escriba a la derecha. Ve aquí abajo, crea una
nueva variable var right, string name equals, y luego
Control V para pegarla. Entonces tenemos la variable asignada a la
cadena nombre derecho. Y haz lo mismo
para arriba. Así que selecciona esto. Control X para cortar,
teclear hacia arriba. Ve aquí abajo. Var up es de tipo string name, y es igual a Control V para pegarlo N. Y apenas una
vez más. Control X. Escriba abajo,
baje aquí, abajo, nombre de
cadena es igual,
Control V, pégalo. Bien, entonces ahora tenemos nuestras cuatro
variables que corresponden a los nombres de cadena reales que realmente
estamos pasando
a métodos como este. Quieres otro truco divertido, podrías tabularlos
así,
seleccionar justo detrás de la pestaña de golpe de signo
igual,
detrás de la pestaña de golpe de seno igual,
detrás de la pestaña de golpe de signo igual, detrás de la pestaña de
golpe de seno igual, así. Y en realidad puedes
alinear todos estos y se ve bonito
y todo eso. Podría ser un poco más legible. Depende de ti si te gusta
tener la pestaña o no. Bien, pero ahora lo
importante es terminar este método, necesitamos revisar
las otras acciones. Entonces vamos a hacer espacio. Y luego el carácter de
línea recta, que es shift y justo debajo del retroceso, la línea
vertical Entonces la
línea vertical, la línea vertical, y hay que mantener presionada tecla Mayús para hacer eso, al
menos en mi teclado. Entonces esas dos
líneas verticales significan o. Supongo que en realidad podrías
escribir o así, y sería lo mismo. Y podríamos
intentar eso si eso en realidad es un poco más fácil de leer y hacer
evento punto es acción, y queremos Derecha. Aguanta. Escriba el nombre
de la variable. Bueno. Entonces,
parece que eso funciona. Así que vamos a hacer eso de
nuevo o evento que accione arriba o evento
es acción abajo. Bien, entonces ojalá
eso tenga sentido. Estamos comprobando si el
evento es acción izquierda, acción
derecha,
acción arriba o acción descendente. Ahora bien, esta línea va un poco larga. Se puede ver esto como punto de
corte verticalmente. Entonces estas son una especie de pautas
generales aquí. Se puede ver que
tenemos 107 caracteres en esta línea. No es un problema. Quiero decir, creo que es
bastante legible, pero si quieres que tu código baje
más verticalmente, entonces realmente puedes
dividirlo aquí presionando Enter. Ahora bien, si le pego a Control S aquí, nos
va a dar un problema. Se va a esperar
expresión después o. Así que actualmente no sabe que estamos tratando de
saltar a las siguientes líneas. Entonces, lo que realmente
tienes que hacer es poner una diagonal inversa justo después de la O, y ahora sabe que esto
continúa en la siguiente línea puedas seguir haciendo
eso así, Barra diagonal inversa Enter para
poner una nueva línea, y luego hacer una diagonal inversa Enter
y poner Ahora bien, yo diría que esto
se ve bastante limpio aquí. Entonces tenemos nuestras cuatro condiciones, y va a
verificarlas todas, y en cuanto una de
ellas evalúe la verdad, va a volver a ser verdad Y si ninguno de ellos
es cierto, entonces es falso. Entonces, si la acción es
una acción de movimiento, entonces vamos
a poder procesar nuestro código de movimiento. Bien, entonces aquí es donde asignamos
realmente el vector. Hay dos lugares donde
vamos a usar la entrada. Uno es para la dirección de orientación y otro es para la dirección del
movimiento. Entonces vamos a obtener la
variable para la entrada. Var entrada es de tipo vector dos, vamos a establecer que igual
a Importar punto G vector. Y al igual que antes, queremos izquierda, derecha, arriba y abajo. Bien. Y ahí está nuestro aporte. Así
que cada vez que presionamos cualquier tecla, queremos establecer la entrada
direccional. Entonces la dirección simplemente va a ser igual a cualquiera que sea el valor de
Importaciones. Pero con la dirección de orientación, es un poco especial. Un personaje en un juego de cuatro
direccionales dos D no puede enfrentar al vector 00 porque eso sería básicamente
mirarse a sí mismo, no mirar a la derecha, arriba a la izquierda o abajo, que son las únicas
direcciones que puede mirar. Cuando estamos asignando
el vector de orientación, solo
queremos hacerlo si
la dirección no es cero Entonces si la entrada no es
igual al vector 20, entonces para un vector dos
dirección de cero, eso significa que X es
cero e Y es cero, recuerden, los vectores tienen componentes
X e Y. Entonces dado que esa
condición está establecida, entonces podemos tomar frente
y ponerla a la entrada. Y vamos a deshacernos
de este pequeño pase aquí porque no necesitamos eso. Y luego en la parte superior aquí, var mirando como de tipo vector dos. Podemos simplemente por defecto
esto a, digamos, vector dos punto derecho,
que funciona perfectamente. Si
siempre se espera que nuestro personaje
mire a la derecha por defecto en la carga, podrías, por supuesto, hacer
eso a la izquierda en su lugar si quieres. Y luego la dirección aquí,
queremos reemplazar esto con el vector dos o si
quieres ser un poco más elegante, aunque este es el valor
por defecto también, podríamos decir colon es igual al
vector dos punto cero. Entonces esto aquí mismo
en realidad significa que estamos inferyendo el tipo de la
variable de la asignación, y la asignación
es un vector dos, lo que significa que esto
automáticamente va a ser asignado
a un vector dos, lo que significa que
no tienes que escribir este vector dos es
igual al vector dos Eso sólo se ve un poco gracioso. Entonces, del mismo modo,
en realidad puedes hacerlo aquí abajo también. Y que sea un
poco menos prolijo, aunque ambos funcionarán
perfectamente bien aquí El único inconveniente
es que si cambias este vector de dos puntos a la derecha
en algo así como una cadena, que esto también va
a
ser técnicamente correcto
porque ahora está a
ser técnicamente correcto
porque ahora asignado a la cadena
de vector dos puntos a la derecha, y eso significa que
esto es ahora una cadena Entonces, hay que tener un
poco de cuidado con eso. En realidad no he visto
que eso sea un problema. Entonces creo que en estos casos, inferir el tipo
de la variable lugar de declarar
el tipo de variable directamente es perfectamente razonable y bien y a menudo un
poco Entonces hasta ti, puedes hacer ambas cosas. Si estoy viendo las
cosas correctamente, creo que ese es básicamente
nuestro guión de jugador por ahora. Volveremos y le agregaremos
señales un poco más tarde. Bien, entonces en nuestro guión de jugador, cambiemos las cosas aquí. Entonces, en lugar de tener
una variable local para dirección y asignar la dirección en lugar
de proceso de física, lo que vamos a
estar haciendo es golpear en Exportar var input es
de tipo player input Y aquí abajo para el proceso de
física, lo que queremos estar haciendo es obtener la
dirección actual de la entrada. Así que var dirección, y voy a inferir el tipo de
inport dot direction, va a ser asignado a
la dirección local, y luego usamos
eso para el resto de nuestro script comprobando, Es la dirección en realidad
un valor que no es vector 20 es lo que
esta línea significa aquí Y si es así, tomamos la dirección y la multiplicamos por la velocidad. La diferencia ahora es que la entrada es administrada por un script
completamente separado. Nuestro guión de jugador
se mantiene más limpio, y tenemos un componente de
entrada de jugador reutilizable que
podría usarse para diseños de
personajes
completamente diferentes que necesitan el mismo
tipo de entrada del jugador, incluso si el personaje realmente maneja la mecánica de su movimiento de
manera completamente diferente. Así que vamos a hacer clic en
el guión del reproductor, y queremos asegurarnos de
que Import está asignado. Entonces como antes, lo que
podríamos hacer es poner función, subrayado listo, y afirmar que entrada no es nula
y darle el mensaje Se debe asignar entrada para el cuerpo del
personaje se mueva correctamente, ejecute el juego, vea que nuestra
afirmación falla, lo cual es bueno Haga clic en el reproductor y asigne
la entrada a la entrada del jugador, ejecútela una vez más y
vea que realmente funciona. Y si haces WASD, puedes ver que
se mueve en función de la entrada de nuestro script de importación
del jugador
8. Cambia las animaciones con señales: este momento nuestra entrada direccional arriba abajo izquierda derecha está controlada por el script de entrada
del jugador, pero aún no tenemos las animaciones controladas por la
dirección en ese guión. Entonces, si echamos un vistazo
al script de estado de movimiento, podríamos imaginar que podríamos simplemente
agarrar una referencia a la entrada del jugador y obtener
padre en ella igual que antes. Este método, aunque generalmente
funciona bien, depende del script HSM
del reproductor, teniendo una referencia a
todas estas propiedades Si cambiamos el script jerárquico de la máquina de
estado del
jugador ,
en cualquier momento, puede romper cómo funciona
este script, y el script también tiene una
especie de dependencia directa del padre que tiene todas
estas propiedades Así que no podríamos reutilizar esto en una
máquina de estado completamente diferente que no tenga, digamos, un
reproductor de animación expuesto. Entonces lo que puedes hacer como otra opción es
usar pizarras Entonces miramos por aquí a
la derecha cuando
tengas seleccionado el HSM, puedes ver que el
plan de Blackboard es una Entonces, cuando creas
un plan Blackboard, le dice a cualquier nodo hijo en el sistema de la máquina de estado qué va
a tener acceso Y en este caso, queremos la dirección
de orientación de la entrada del jugador. Entonces voy a crear un nuevo plan de Blackboard
aquí en el jugador HSM, y luego presionaré Podemos ir por aquí
y agregar una variable, y queremos agregar
vamos con el frente. Entonces, cuando
hablamos de las animaciones, lo que es más relevante para nosotros es la dirección que el
personaje está tratando enfrentar en lugar de la dirección en la
que se mueve el personaje. Esas suelen ser lo
mismo, pero no siempre. Así que tendremos frente aquí, y luego en el desplegable,
vector dos, así podemos hacer clic en Administrar por aquí y
luego agregar una variable Y vamos a buscar
el vector de dirección dos. Así que cambia el tipo de
float al vector dos. Y luego podemos golpear Bien, así que para obtener esta
dirección también y que
se use a través de nuestros diferentes estados de máquina de
estado, queremos ir a binding, y luego direction, queremos vincular esto al script de importación del
jugador. Pero si lo hacemos ahora mismo,
nada va a aparecer. Entonces, una de las limitaciones a la
vista del sistema Lambo AI es que para vincular una propiedad
al plan Blackboard, esa propiedad necesita
ser exportada variable Entonces, si vamos a player Input, podemos tomar dirección
aquí y simplemente darle en la exportación y luego guardar. Entonces haces clic en el jugador Importar, verás que la
dirección aparece aquí arriba. Técnicamente, esto
significa que podrías cambiar la dirección
antes de que comience el juego. Se va a
sobrescribir de inmediato por esta función Iport
tan pronto como presione una tecla Así que en realidad no hay
mucho inconveniente. Es solo que se tiene que exponer
la dirección para que esto funcione. Entonces en el HSM, ahora
podemos vincularnos al script de inport
del jugador, y vamos a estar
buscando la propiedad direction Así que elige dirección
y golpea abierto. Bien. Entonces, si lees esto ahora, la dirección ahora está enlazada
a la dirección de importación del jugador, lo
que significa que cualquier cosa que establecemos en dirección de importación del
jugador va a reflejarse en
este Blackboard, y podremos usarlo dentro de nuestros scripts
como el estado de Entonces, mientras estamos en
ello, también podemos poner el reproductor de animación
en el plan de Blackboard, y eso eliminará
la dependencia
entre el estado y el HSM Vamos a gestionar y agregar una variable, voy a decir reproductor de animación. Y vamos a escribir
y elegir Node path, creo que es lo que queremos aquí. Bien. Haga clic en Bien. Y asignamos esto al reproductor de
animación. Entonces ahora si leemos
desde la pizarra para el reproductor de
guiones bajos de animación de propiedades, deberíamos poder obtener una
referencia al reproductor de animación Bien, entonces ahora si
vamos a Mover Estado, cómo va a
quedar esto es más así. Por lo tanto, el jugador de animación de subrayado va a ser igual
a Blackboard Por lo que el Blackboard se
crea en tiempo de ejecución, basado en el plan Blackboard Así que este es básicamente
el objeto runtime donde obtenemos las
variables que necesitamos. Entonces tenemos que hacer
Blackboard dot, Get VR, obtener guión bajo var, y estamos buscando
el nombre de la propiedad Entonces, en este caso, ese va a ser jugador de
guión bajo de animación El valor predeterminado será nulo. Queremos que se queje
si no puede encontrarlo porque eso significa que nos
equivocamos en algún lugar alrededor de nuestra configuración Ahora, básicamente podemos
eliminar esta línea ahora, y ahora nuestro script
no
depende en absoluto del script HSM Simplemente
depende de que el Blackboard se esté configurando para tener
un reproductor de animación, cual recibirá un mensaje de error si no tiene
reproductor de animación en el Blackboard Entonces ahora para la dirección,
sólo tenemos que conseguir eso
en actualización, supongo. Entonces función, actualización de subrayado, y vamos a estar obteniendo la variable actual de
Blackboard Entonces esa va a
ser la dirección VR. Va a ser igual al punto de
Blackboard Get VR, y estamos buscando dirección Y no podemos inferir este tipo de
variable porque no
sabemos qué va
a devolver realmente Git VR aquí Así que vamos a declararlo
como un vector dos. Bien, entonces ahora tenemos
la propiedad direction, y nuestro script
ni siquiera necesita saber nada sobre el script de entrada
del jugador. Todo lo que hay que saber es que la pizarra tiene una propiedad de
dirección, y podemos usarla
para nuestras animaciones Entonces muy simple, si
la dirección no es cero, eso es forma corta
para eso, entonces
vamos a reproducir la animación de ejecución
en el reproductor de animación. Así subrayado reproductor de animación, juego de
puntos, animación de ejecución, Ale, reproductor de animación, juego de
puntos, animación inactiva Así que sigamos adelante y pulsemos Reproducir
ahora y veamos si esto funciona. Entonces si FUE y D, entonces puedes ver que obtenemos el movimiento de
animación
para nuestro personaje. Ahora, aquí hay un gran defecto, que es que el desplazamiento en
nuestros sprites no coincide Ahora bien, esa es solo la naturaleza de cómo se configuraron
las hojas de sprites específicas Creo que el tamaño de cada
cuadro no coincide. Entonces crea un desplazamiento. Ahora, eso sería algo que
puedes arreglar en un editor como A Sprite, si eres el artista, o si solo quieres
que funcione, para este caso, podemos hacerlo
en el reproductor de animación Entonces en el reproductor de animación, podemos ir a digamos vamos a
comprobar la animación inactiva. Y aquí lo tenemos centrado
aquí como esperaríamos. Entonces, cuando vamos a la
animación de ejecución de Run, solo
necesitamos
asegurarnos de que esto coincida con la animación inactiva. Entonces vamos a
querer enmarcar clave la posición en cada una
de nuestras animaciones. Entonces agreguemos una pista, pista de
propiedad. Veamos, el
Sprite dos D porque estamos hablando
del desplazamiento del sprite,
no del desplazamiento del personaje del jugador Y entonces queremos posición aquí. Entonces agreguemos una clave. Ahora mismo está en negativo 14. Voy a ir a Idle. Y luego vamos a agregar
la misma propiedad por adelantado. Entonces posicione dos D y luego
agregue el fotograma clave aquí. La razón por la que estoy haciendo esto es porque la posición de inactividad ya
es correcta, así que no quiero tener ese cambio cuando estoy
configurando la carrera. Mientras estamos en ello,
vamos a comprobar la muerte. Creo que la animación de la muerte está en realidad en el lugar correcto. Entonces todo lo que tenemos que hacer es ir aquí, agregar la pista, sprite
dos D, posición Bien, inserta la llave. Bien, y entonces eso
debería ser bueno. Entonces ahora necesitamos
cambiar el valor de la ronda a animación
específicamente. Así que pulsa Q para ir al Modo
Selección. Clic izquierdo en el sprite. Deberías tener esta caja grande. Se puede ver probablemente de
dónde vino el offset de aquí porque aquí arriba hay
mucho espacio vacío. Pero de todos modos, así que solo
tenemos que golpear W y luego mover esto hacia arriba a la
derecha por ahí. Déjame comprobar la transformación.
Sí, 27 píxeles negativos. Creo que eso es lo que tenía y
el en el proyecto de borrador. Así que vamos a fotogramas clave
eso. Vamos a golpear Play y a ver si eso es mejor. Entonces WASD, ya casi está ahí, pero creo que tiene que
ser unos pixeles más altos Entonces vamos a W y
luego movamos esto hacia arriba. Intentemos 30, le pegamos a W. N
, todavía no está ahí. Bien, vamos a subir más esto. Voy a ver la animación ociosa. Bien. Y ahí es donde están sus
pies en el suelo. Entonces volvamos a correr. Bien, y sus pies
deberían estar aquí arriba, dos pixeles debajo del fondo. Bien, y luego
inactivo, y luego corre. Bien, me olvidé de enmarcarlo con llave. Entonces déjame moverlo una vez más. No creo que
necesitemos el desplazamiento X. Vamos a fotograma clave que en
negativo 30 píxeles aquí. Bien, vamos a golpear play
y probar una vez más. WASD. Eso me parece
correcto. Entonces iremos con eso. Vamos a
golpear Sop en el jugador aquí Y solo para ser claros, como
una solución a más largo plazo, sería mejor
probablemente entrar y arreglar las
hojas de picos de animación y solo asegurarse de que
todas tengan el mismo tamaño, independientemente de la cantidad de
movimiento que haya en
las animaciones para
que no sea las animaciones para
que necesario meterse
con la posición. A largo plazo, esto es un
poco más difícil de manejar, así que es mejor si solo
se fija en la hoja de animación directamente. Bien, entonces para nuestros personajes al
ralentí y movimiento, así que lo último que
realmente tenemos que hacer por nuestros personajes, el
movimiento básico es
hacerlo voltear cuando nos movemos hacia la izquierda y luego voltear hacia atrás cuando
nos movemos hacia la derecha Ese será el siguiente video,
así que te veré en el siguiente.
9. Voltear un personaje en 2D: Entonces tenemos nuestro movimiento arriba abajo izquierda derecha para
el personaje, y puede volver al estado
inactivo. Eso es genial. Lo que necesitamos
cambiar aquí, sin embargo, es que nuestro personaje
necesita
poder voltear de derecha a izquierda, dependiendo de si tenemos
una entrada izquierda o derecha. Así que queremos básicamente voltear el nodo sprite
de izquierda a derecha. Ahora, Sprite
tiene directamente un flip H aquí. Sin duda
podríamos decirlo en un guión personalizado para voltear la H en
función de lo que sea que haga la entrada
del jugador. Para ir un paso un
poco alejado de eso. En cambio, lo que podríamos hacer es
en realidad poner un nodo padre que se voltea a sí mismo cuando cambia
la
dirección de entrada del reproductor, y luego eso volteará
automáticamente el nodo sprite porque
el nodo sprite es hijo de ese
nodo padre dos D. Así que si hago clic en el nodo reproductor
y agrego un hijo, agreguemos un nodo dos D, y luego lo llamaré voltear dos
frente a dos D. Vamos
haga clic derecho en él, adjunte un guión. Vamos a poner esto en la ubicación
por defecto, crear, y vamos a hacer que el
nombre de la clase voltee dos frente dos D. Y esto va a voltear la escala X en la transformación, dependiendo de si el carácter
está mirando hacia la izquierda o hacia la derecha. Bien, entonces, ¿qué significa
esto básicamente? Si agarro este brillante dos D y lo tiro bajo voltear
a enfrentar dos D, y luego pongamos esto de nuevo
arriba donde estaba antes, hacia la parte superior
de la jerarquía, voy a tomar flip a enfrentar dos D, y luego por aquí a la
derecha, desmarque el vínculo entre X e Y porque
sólo estamos cambiando la escala X. ¿Bien? Y luego escribe uno
negativo para la X, y verás que el
personaje voltea hacia la izquierda Si escribimos uno a la X, el personaje mira hacia la dirección original,
que está a la derecha. Por supuesto, debes
tener un
poco de cuidado con la configuración. Si pones tus armas debajo
del flip para enfrentarte a dos Dno, entonces eso significa que tus
armas también
van a estar mirando hacia la
izquierda o hacia la derecha Ahora, a veces quieres
eso, y en otros casos, no
haces tu sistema de
lanzamiento de proyectiles más adelante, no
quieres que voltee
en base a lo que es esta escala de nodos Pero si tuvieras, digamos, poner una lanza en la mano del
personaje, probablemente querrías
que ese sprite mire la dirección correcta
cuando estás mirando hacia la
derecha o hacia la izquierda
cuando estás Entonces solo hay que tener cuidado con qué nodos
pones debajo aquí, porque cualquier cosa que esté
bajo volteo para enfrentar dos D en la jerarquía ahora va a voltear cada vez que ese nodo
padre voltee Así que solo ten en cuenta lo que está parentado a qué, y
deberías estar bien Así que dentro de nuestro flip
to facing two D script, queremos agregar una var de exportación. Y vamos a decir input, que es de tipo player input. Ahora, por ahora mismo,
depender de la entrada del jugador
significa que este guión es específicamente el
guión de un jugador y no necesariamente utilizado por
los guiones enemigos. Para un guión tan
pequeño, en este caso, podría valer la pena tener
la referencia directa a la entrada del jugador porque
eso solo te da la configuración más simple
y práctica. Y entonces lo único que
necesitas para asegurarte es que la entrada está realmente
asignada en el inspector. Entonces podemos hacer eso
con la aseveración. Vamos a hacer una función de
subrayado ya y luego aseverar que la entrada no
es nula y digamos, para voltear la referencia a la entrada del jugador se requiere, una vez más, siempre puedes
simplemente ir al top hit play, y va a
golpear tu aserción, que esa prueba sea buena De lo contrario, en este punto, podemos simplemente obtener el acceso a la
señal desde entrada
del jugador y usarlo para voltear este nodo siempre que cambie la dirección de
orientación. Si recuerdo, aún no he
puesto las señales. Entonces, si hacemos clic derecho
sobre la entrada del jugador, buscamos el símbolo,
queremos ir a la parte superior y
declarar algunas señales. Entonces una señal es como un evento. Si vienes
de otros idiomas como C Sharp, es un evento. Y en este caso,
lo que eso significa es algo desencadenado dentro
de tu código y
quieres notificar a los objetos
suscritos que algo ocurrió y opcionalmente pasar alguna información
contextual o datos al objeto receptor Bien, entonces déjame
seguir adelante y declarar uno, y luego te
lo explicaré un poco más simple. Entonces señal es la palabra clave, y luego
diríamos enfrentando cambiado, y querríamos pasar en la
dirección que cambió también, así podríamos decir valor o cara, y eso va a
ser un factor de tipo dos. Entonces estamos declarando
el parámetro. Lo que estamos enviando a cualquier objeto receptor va
entre estos paréntesis aquí Entonces la señal se enfrenta a cambio. Entonces el evento cada vez que la propiedad frente en este
caso, aquí abajo cambia, queremos enviar
una señal que permita a cualquier objeto suscriptor saber que el
valor de orientación ha cambiado Entonces en ese momento,
pueden responder a ello
en su propio código. Y lo que esto significa es que no es necesario
verificar constantemente la propiedad frontal de la entrada del jugador en
cada actualización de fotogramas. Solo tienes que esperar a que el guión te
notifique que el valor realmente
ha cambiado a
algo diferente. Entonces tienes esa información
significativa, y solo necesitas actualizar como una vez cada pocos segundos
porque tu jugador solo cambió su dirección de
movimiento una vez cada 3 segundos o
dirección de cara en este caso. En otras palabras, te vuelves
dependiente de una señal activa tu otro
código en lugar de verificar
constantemente un valor
para detectar cambios manualmente Entonces con nuestra
propiedad frente aquí abajo, queremos tomarla y agregar un setter para que cuando cambie el valor de
orientación, en realidad
emitamos la señal
cada vez que cambia Entonces, si agregas
dos puntos al final, esto te permite declarar a
tus setters y getters Simplemente puedes hacer una de ellas. No tienes que hacer
ambas cosas. Entonces en este caso, queremos decir valor establecido. Y tenga en cuenta que esto está en una nueva línea. Entonces en este caso, realmente estamos declarando una función,
aunque, en realidad Y esto solo se ejecuta
cada vez que establecemos el valor de esta propiedad
en algo nuevo. Así que estamos cambiando el valor predeterminado de simplemente establecer el valor y no
hacer nada más para
configurarlo y hacer algo de código extra. Entonces, cuando establecemos el valor, queremos tomar frente
y fijarlo al valor. Entonces eso sería
lo que hace por defecto. Si no declaras ninguna función
setter Getter, el Getter simplemente
sería más así,
regreso enfrentando, ¿verdad? Eso es
lo que esperarías. Se accede a la propiedad por nombre, frente, y devolverá
el valor en el que está establecido. Entonces, si no necesitas
código personalizado para el Getter, no
necesitas
declararlo porque eso es lo
que hace por defecto, y esto es lo que
enfrentaría haría por defecto Ahora bien, si quieres hacer
algo como emitir una señal, entonces necesitas el código extra. Entonces ahora queremos decir frente cambió el nombre de
la señal punto emitir, por lo que emitimos la señal, que significa que cualquier objeto se
suscriba a ella ahora
va a ser notificado, pero queremos pasar en la
información del frente Entonces pasamos de frente. Entonces estamos tomando este valor, enviándolo a través de la señal, y luego en nuestros otros guiones, vamos a recibir
esa información, y podemos decidir
qué hacer con ella. Ahora bien, hay otro truco
que quiero mostrar aquí, sin embargo, que es que
no queremos enfrentar cambio para que se emita cada vez que
establecemos el valor de orientación. Esto podría estar configurándose en el mismo valor en cada fotograma. Creo que el cheque de acción de
movimiento en realidad protege contra eso porque esto
solo
se activaría realmente cuando hay una acción de
movimiento real, que sería, en este caso, como presionar la tecla derecha o soltar la tecla derecha o lo mismo para las
otras direcciones. Pero siempre es bueno
estar más a la defensiva
en la programación. Simplemente asuma que tus
otras suposiciones no son necesariamente correctas y
luego protegerte de ello. Entonces vamos a
poner un guardia aquí. Si enfrentar ya es
igual al valor, entonces eso significaría
que no hay cambio. Entonces solo queremos regresar aquí. No necesitamos establecer el frente porque el valor
ya está asignado al frente. Ya es correcto, y
no necesitamos emitir la señal, y no debemos emitir la señal porque el valor en realidad
no cambia. Por lo que tenemos esta guardia contra los malos sets a la propiedad frente. Pero si se pasa esa guardia, entonces colocamos el frente
y emitimos la señal. Entonces con todo eso, la señal ahora
va a emitir. Y podemos simplemente ir a nuestro
flip a enfrentar dos D. Y luego de afirmar que
Import no es nulo, entonces sabemos que está establecido Así podemos ir a la entrada de
punto orientado cambiado. Verás que la señal en realidad
está referenciada
por su nombre aquí, y tiene ese pequeño símbolo o señal de
Wi Fi. Así que ponemos los
revestimientos de puntos de entrada cambiados. Entonces ahora estamos
viendo el nombre de la señal, y queremos conectarnos a él. Entonces punto conecta. ¿Y qué
queremos conectar con él? Bueno, esa sería
una función callable que configuramos aquí Para mantener las cosas, creo,
lo más simple posible, deberíamos crear una
función personalizada en la parte inferior. Entonces voy a decir subrayado
enfrentando cambiado. Va a seguir dando
error porque
no hay ninguna función con ese nombre
dentro de nuestro script. Entonces si le pego
a Enter un par de veces, diremos función,
subrayado al enfrentar cambiado Ahora bien, ¿qué parámetros va a tomar esta
función? Bueno, va
a tomar lo que sea que pasó a la señal. Entonces, en este caso, estarías
mirando hacia la dirección. Entonces voy a decir
P, subrayado frente, P como en parámetro, dejando muy claro
que este valor viene de los parámetros que se pasaron
a la función Y entonces este es un vector dos. No vamos a
devolver nada, así que vamos a regresar nulo. Y ahora podemos escribir
el código para responder
a la señal que emite
frente cambiado. Bien, entonces cuando se cambia la orientación, queremos tomar
la dirección X
del frente y usarla para determinar si debemos
mirar hacia la derecha o hacia la izquierda. Entonces, si p punto frente al punto
X es un valor positivo, entonces lo que queremos
hacer es tomar la escala X de este nodo dos D, la vuelta al nodo de orientación, y queremos establecerlo igual
al valor absoluto
del punto de escala X. Cuando tomas el valor
absoluto, estás haciendo un número siempre
positivo. Entonces, para enfrentar a la
derecha, estamos haciendo bien nuestra dirección positiva. Así que siempre queremos enfrentar
a la derecha siempre que la entrada esté
realmente orientada hacia la derecha. Ahora, no
vamos a decir otra cosa. Vamos a decir otra cosa si P
frente a X es menor que cero, así que no queremos ese caso cero porque nuestros personajes no
deberían poder enfrentar el punto 00 en el
vector dos que realmente
no existe como dirección de cara para
este tipo de dos juegos D. Entonces no queremos hacer
nada cuando ese es el caso. Entonces por eso estoy comprobando si el valor es menor que cero, porque menos de cero
en realidad estaría mirando hacia la izquierda. Entonces hacemos punto escalado X, y vamos a establecer
eso igual a negativo una vez
valor absoluto escalado punto X. Bien, entonces esto va a dar
siempre un número positivo, y entonces siempre
vamos a hacerlo Entonces, probablemente haya algunas formas
diferentes de
matematizar esto aquí, pero creo que eso
debería funcionar bien. Bien, entonces vamos a dos D vista. Hacemos clic en voltear
a enfrentar dos D, y asignamos la entrada del jugador. Bien, entonces ahí es donde
vamos a conseguir la señal. Vamos a conectarnos a él en Rudy de nuevo en nuestro guión de cara Bien, así que si le pego a play, hagamos el movimiento correcto. Nuestro personaje mira hacia la
derecha, y si golpeo a la izquierda, nuestro personaje mira hacia la izquierda. Si hacemos arriba a la izquierda,
estamos mirando a la izquierda. Si hacemos abajo a la derecha,
estamos mirando hacia abajo a la derecha. Solo prueba todas las
ocho direcciones en las que
nuestro personaje puede moverse con la entrada del teclado, y eso me queda bien. Así que solo para ser un
poco progresista, una cosa que podríamos hacer es agarrar este código y sacarlo
a una función diferente, refactorizándolo en
una nueva Entonces digamos función actualizar, voltear, y esto requerirá
la dirección de orientación. Entonces P frente, vector dos, y luego voy a tomar esto, cortarlo aquí abajo y
al enfrentar cambiado realmente voy a llamar actualización flip P enfrentando. Ahora bien, la razón para
hacer esto es para que también
pueda reutilizarlo listo. Así que listo, solo diremos actualización flip Import dot facing. Entonces, cuando nuestro script se carga por primera vez, queremos establecer la
dirección de orientación hacia arriba inmediatamente antes cualquier importación realmente venga nuestro reproductor porque podría
ser el caso en el que decidamos, digamos, en la entrada del jugador, exportamos esta dirección de orientación, y luego cambiamos
el valor por defecto del punto
vectorial derecho al vector
dos punto a la izquierda porque por razón
que sea
queremos nuestro a la izquierda por defecto. Entonces ahora con esto, podemos estar preparados para eso
inicializando automáticamente con la dirección
correcta de volteo en
base a lo que sea que diga
la entrada Entonces ahora, esta es una función
pública. Podríamos simplemente llamar a esto desde
otro script si hubiera un caso no relacionado con Import donde quisiéramos cambiar la
dirección de volteo del personaje. Por ejemplo, tal vez
durante una escena de corte, quieres cortar
toda la entrada del jugador, y quieres
llamar a esto manualmente. Entonces tu personaje estaba de
cara a la derecha, y en la escena del corte,
quieres que mire hacia la izquierda. Así que tendrías la
opción de simplemente llamar a Update flip on the flip
para enfrentar dos nodos D. Bien, entonces definitivamente abre
algunas posibilidades ahí. Y eso es prácticamente todo
lo que vamos a necesitar hacer
para el movimiento WASD
de nuestro jugador Se ve bien. Creo que todas las preocupaciones están
separadas bastante
10. Capas de mapas de césped y mosaico de tierra: Bien, entonces ya que nuestros
personajes se mueven y animan así que básicamente jugando tanto
para Ídolo como para correr, incluyendo la dirección de
volteo, creo que ahora es un
buen momento para empezar a poner en algún fondo
así que el juego se ve un poco más bonito en
lugar de solo tener ese fondo gris
Gadot predeterminado Así que sigamos adelante y
cambiemos a nuestra escena mundial. Si no tienes eso abierto,
puedes ir a la parte inferior izquierda aquí. Solo busca mundo, y deberías poder
encontrar world dottSCN si ese es el mismo nombre que
estabas usando como yo Y luego en la jerarquía mundial, queremos hacer clic derecho
y agregar un nuevo nodo, y estamos buscando
una capa de mapa de teselas. puede ver, había
otro nodo llamado Tilemap, pero eso está en desuso,
creo, desde 4.3,
y desde 14.41 y a
punto de ir a 4.5, definitivamente
se recomienda que
cambies a las capas de tilemap,
lo
que divide el tilemap en nodos de capa
individuales en lugar
de tener cada capa individual Se puede ver, había
otro nodo llamado Tilemap,
pero eso está en desuso,
creo, desde 4.3,
y desde 14.41 y a
punto de ir a 4.5, definitivamente
se recomienda que
cambies a las capas de tilemap,
lo
que divide el tilemap en nodos de capa
individuales en lugar
de tener cada capa individual. Contenido dentro
de un mapa de teselas. Así que agreguemos una capa de mapa de teselas. Y vamos a llamar a
esto algo así como tierra, así que le voy a cambiar el nombre a tierra. Y si lo tienes
seleccionado en la parte inferior, deberías tener la ventana
tilemap Entonces
ábrelo si no está abierto ya. Y luego necesitamos encontrar los activos
artísticos de nuestro proyecto. Así que voy a
entrar en el arte y luego Pixel crawler
entornos conjuntos de azulejos, y vamos a estar queriendo trabajar con las baldosas aquí Entonces, para que podamos traer esto, no
queremos
estar en el tilemap,
sino más bien en la pestaña del conjunto de mosaicos Busque en la esquina superior
derecha mientras tiene
seleccionada la capa de mapa de
teselas y verá el conjunto de mosaicos como un recurso que
puede asignar aquí. Desea hacer clic izquierdo
y hacer un nuevo conjunto de mosaicos, una vez que lo haga en la parte inferior, habrá una nueva pestaña Tilset Entonces, una vez que lo hayas
renombrado a suelo, mira la parte superior derecha
con él seleccionado, y deberías ver un
campo para el conjunto de mosaicos Por lo que queremos hacer clic aquí y declarar un nuevo TilesetrSource Lo haces en la parte inferior, debería
haber dos pestañas aquí
relacionadas con el mapa de teselas,
que es el mapa de teselas para seleccionar y
dibujar
realmente este conjunto de mosaicos, que es para
configurar tus mosaicos, y luego mapa de teselas para
dibujar tus mosaicos. Entonces queremos ir a Juego de azulejos. Deberían ver una caja por aquí que podamos arrastrar las baldosas del
piso. Así que encuentra baldosas
dentro del proyecto. Entonces son pisos subrayado
azulejos punto PNG, y sólo vamos a arrastrar
y soltar eso aquí Habrá este pequeño pop up, que pregunta si quieres crear automáticamente
los mosaicos, nosotros sí. Entonces seguiremos adelante
y nos pegaremos aquí. Y luego verás
en la ventana de vista previa que todas las fichas se
han
cortado automáticamente en recursos de
fichas reales que podemos usar y
pintar en el juego. Entonces, la forma más sencilla de
dibujar sería simplemente ir
a Tilemap y luego seleccionar esos mosaicos individualmente que
quisiéramos colocar Presiona Q para asegurarte de que
estás en modo de selección. Y luego aquí abajo en
la ventana de tilemap, queremos estar en herramientas de pintura, así que eso es D en el teclado Y luego puedes
hacer click izquierdo para dibujar el mosaico. Puede pasar por encima de uno y hacer clic
izquierdo y poner
otro mosaico hacia abajo. Verás que en este momento, el Tap
en realidad se está mostrando frente al jugador.
Eso no es lo que queremos. Lo que puedes hacer es simplemente mover
el suelo a la cima aquí, y eso lo ordenará
automáticamente, así que el suelo está
debajo del jugador. Entonces esa es la
forma más sencilla de hacerlo. Entonces, si bien seleccionar los mosaicos uno a la vez
así funcionará, es muy, muy tedioso Entonces, lo que probablemente
queremos hacer en su lugar es crear un conjunto de terrenos basado en estas baldosas de césped y luego usarlo para dibujar automáticamente
qué baldosa necesitamos dependiendo de
lo
que qué baldosa necesitamos dependiendo esté adyacente a esa
baldosa, si es que hay algo. Entonces, si expandes el
conjunto de mosaicos en la parte superior derecha, puedes bajar a conjuntos de terreno y luego agregar un nuevo elemento. Entonces lo vamos a dejar
en partido esquinas y
lados y expandes
terrenos y agregas un elemento Y podemos simplemente cambiarle el nombre a
esto, digamos, terreno de
pasto cambia el color a algo un poco
más herboso, como un verde Ahora en la parte inferior,
vamos al juego de azulejos, y luego
vamos a hacer pintura. Vamos a seleccionar de
los terrenos del editor de propiedades. Vamos a
seleccionar el
conjunto de terreno como terreno establecido a cero, y luego el terreno
que estamos dibujando es pasto. Entonces debería ser bastante obvio cuáles son
las tejas de pasto aquí. Pero para que las baldosas construyan de manera correcta
y automática, necesitamos seleccionar las baldosas que se supone que forman parte de
este terreno de pasto. Así que en realidad puedes hacer clic
izquierdo y mantener presionado y arrastrar una caja alrededor de todas estas
baldosas de hierba, algo así. Si está resaltado, entonces
eso va a significar que básicamente está marcado como
parte de este terreno. Y esto es pasto oscuro aquí. Podríamos
configurarlo más tarde. Bien. Y entonces es posible que tengamos que conseguir
estos también aquí abajo. Veremos cómo va eso y
estos azulejos de luz ahí. Ahora bien, estos de fondo
parecen ser más una hierba oscura. Podemos tratar de
incluirlos y ver cómo va, pero puede que no
lo hagan en el corte final para el terreno que podría ser más
de una sombra oscura de pasto. Entonces tendremos que ver cómo
eso realmente mosaicos. Bien, así que hemos seleccionado todos
estos azulejos como pasto. Ahora queremos ir a
la parte superior izquierda, y queremos marcar
las esquinas y lados que son pasto o están
adyacentes a la hierba. Entonces, la forma más sencilla de
pensarlo con este juego de baldosas es solo si el área es
transparente, generalmente, no la vas a marcar, y si es pasto sólido
o cerca de pasto sólido, entonces vas a marcar
como pasto o pasto adyacente. Si acabo de dejar clic
aquí y arrastrar por ahí, van a ver que está
rellenando el cursor, y queremos que estos ocho
cuadrados que no están en la
esquina inferior derecha estén marcados como pasto porque
esto de aquí en la esquina inferior derecha está diciendo que hay
algo más aquí abajo. El azulejo de
abajo a la derecha no es pasto y este azulejo lo
está reflejando. Así que básicamente usará
este azulejo cuando todo abajo a la derecha arriba a la izquierda
y estas tres esquinas, sean pasto, pasto adyacente, pero el inferior derecho no lo es. Entonces la idea es que tengas uno
para todos estos escenarios. Entonces, en este caso,
harías estos seis mosaicos superiores, y esto significa que
si no hay pasto debajo de él o
hacia abajo a la izquierda o abajo a la derecha, entonces este mosaico
se asignaría automáticamente. Así que solo queremos seguir haciendo este tipo de cosas en
todos los sentidos. Entonces esta se ve
como todas las esquinas y lados excepto
la parte inferior izquierda. Y entonces éste
es el top cuatro. Este es, creo, igual que éste de aquí
arriba otra vez, los ocho primeros a la derecha. Y sí, es posible
tener múltiples mosaicos que tengan lo mismo creo que lo
llaman un poco máscara aquí. Entonces, si bajamos al fondo, verás que estos son
los nueve azulejos cuadrados, seguro, porque todos son
pasto y pasto adyacentes. Así que en realidad llenarías
todos estos en todo el camino. Y entonces eso llenará todo lo que hay dentro de
estas tejas de borde. Bien, así que solo
necesitamos seguir haciendo esto. Entonces este de aquí arriba en
la parte superior va a ser el medio de arriba a abajo, y el derecho de arriba a abajo. Aquí tenemos los ocho lados y esquinas excepto la parte superior izquierda. Este es el cuatro de
abajo a la derecha. Este lo es todo
excepto arriba a la izquierda. Los seis azulejos inferiores, todo excepto arriba a la derecha, los cuatro inferiores a la izquierda, todo excepto arriba a la derecha, los seis izquierdos, todo menos abajo y
los cuatro superiores izquierdos. Tenemos nuestras
piezas de esquina aquí arriba, y tenemos las piezas
sólidas de hierba aquí abajo. Entonces para dibujar con él, solo
vamos a Tilemap y
luego seleccionamos terrenos, pasto Y lo que podemos hacer es
agarrar esta herramienta rectangular. Déjame alejar un poco la
cámara de aquí. Y vamos a alejar el zoom con rueda del ratón
central
en el mapa del juego, y podemos simplemente hacer clic
izquierdo y arrastrar una caja gigante al fondo. Y ahí está nuestra hierba
de fondo. Ahora, verás que estos
mosaicos eran, de hecho, más oscuros. Fue un poco difícil de
decir en mi pantalla. Entonces tal vez en el juego de azulejos, estos también son pasto oscuro que realmente me pareció
igual. Entonces la solución a esto
es solo que eliminemos los mosaicos oscuros de los azulejos claros cuando estamos
asignando la hierba Entonces, si hago clic derecho en alguna
de estas piezas de máscara de bits, entonces eso la va a quitar
como parte de la baldosa si retiramos completamente todos los nueve
lados, esquinas y centro. Ahora bien, si volvemos a dibujar esto, esas no serán una opción a la
hora de rellenar los mosaicos Así que solo dejaré clic y
arrastraré otra caja sobre ella, y ahí tenemos
la hierba ligera y solo la hierba ligera
para toda esta escena. Ahora, en un juego como sobreviviente, tu personaje puede
moverse mucho por el mapa. Así que en realidad voy a
hacer de esta un área muy grande. Simplemente iremos de aquí
a aquí solo para que haya mucho espacio para que el personaje
se mueva. Ahora, se puede ver que
en realidad lleva un tiempo rellenar eso porque
eso es un montón de fichas. Bien, también quiero
mostrar si golpeo E, para ir al modo Carrera y
luego D para la herramienta de pintura. Entonces podemos dejar clic
aquí, y verás que automáticamente asigna las piezas adyacentes
en función de la baldosa en el centro Entonces este azulejo no tiene azulejo, por lo que automáticamente
reconoció, Oh, necesito las piezas de esquina
y laterales que asignamos en el terreno. Y solo puedo seguir usando
el cepillo de goma de borrar así. Y verás que
está
generando automáticamente los
lados y esquinas. Puede tener algunas limitaciones
como necesitar ir, como, un dos por dos y una línea
para que se vea bien. Depende del juego de
baldosas, realmente, porque hay diferentes
formas de construir las baldosas. Pero por lo menos,
esto es mucho, mucho,
mucho más rápido que si
tuvieras que
asignar manualmente todos estos mosaicos
laterales y de esquina. El solo hecho de dejar que la computadora lo
averiguara por ti basándote en
las reglas del terreno que definas, como acabamos de hacer, es
un gran ahorro de tiempo. Entonces vamos a rellenar esto. También está la herramienta de
cubo de pintura aquí abajo, así que simplemente podemos hacer clic en esta área donde todas las
baldosas son iguales. Y oh, bueno, también tenemos que E
para quitar el erasuod. Y ahora dejamos click y
todo se llena. Como puedes ver,
seleccionará cualquier región
que estés viendo. Entonces eso podría ser todo
esto. Si quieres llenarlo con un terreno de
baldosas totalmente diferente, podrías hacerlo definiendo
una tierra y cambiando
a tierra aquí abajo
y declarándola
abajo así que una tierra y cambiando
a tierra aquí abajo
y declarándola
abajo esto es un poco más avanzado de
lo que realmente pretendía ir, pero definamos otro terreno con
esta suciedad por aquí,
el tipo de suciedad anaranjada para
que la suciedad pueda
pasar a pasto. Entonces vamos en la parte superior derecha, declaremos un nuevo tipo de terreno, y voy a llamar a esto tierra. Ese marrón está bien, creo. Es posible que en realidad no
quieras usar, como, un marrón sobre azulejos marrones para que sea más fácil ver dónde has definido y dónde no. Pero si
te funciona, está bien. Cualquiera que sea el color que quieras
asignar está perfectamente bien. Bien, entonces vamos
a estar trabajando con suciedad de
pintura en la ventana del juego de
baldosas, y vamos
a hacer exactamente lo
mismo con
estas baldosas de tierra. Entonces aquí, estamos pintando
el ocho superior izquierdo, no el inferior derecho, y
luego el seis superior, así. Y voy a seguir
dando vueltas así. Este es un poco confuso, pero voy a ir con
los cuatro de arriba a la derecha, y ya veremos si
funciona correctamente. Si cuando realmente dibujas con tu terreno, no
se ve, posible
que te hayas perdido una de
las partes aquí o allá por, sabes, ya sea encendido
o apagado o central o laterales. Así que a veces se
necesita un poco de prueba y error para hacerlo bien. Pero definitivamente vale la
pena a la larga. Así que sigue dando vueltas, ya
sabes, de la misma forma. Consigue las esquinas y los lados donde está la suciedad y márcalo como suciedad, y luego solo
continúa hasta que termines todo el camino alrededor
en el círculo. Bien, y luego termina con los tres
azulejos inferiores aquí abajo. Obtendremos la suciedad ligera y solo saltaremos la suciedad
oscura por ahora. Bien, y eso se ve bien. Bien, ¿sabes qué?
Mencioné que iba a manejar
la transición de la tierra a la hierba. Pero en realidad, con
este juego de baldosas, no
creo que eso sea necesario porque estas baldosas
individualmente, tienen una especie de transparencia en lugar de
hierba aquí junto a la tierra. Así que no hay que definir el terreno de pasto individual como parte de la tierra así, donde tomarías estas
otras baldosas y dirías: Oh, eso es pasto de ahí, y luego tierra en la parte inferior izquierda. Porque aquí es
transparencia, así que eso en realidad no es necesario. Pero en otros juegos de azulejos,
es posible que tengas que hacer eso. Donde si sabes que como una esquina se supone que es pasto, entonces lo marcas como pasto ahí. Así que tener dos tipos de terreno
para una esquina o lado. Pero aquí, creo que sólo
necesitamos uno. Déjame darle una oportunidad a esto y ver cómo va a
quedar eso. Entonces iré a Tilemap Haremos tierra, e
intentaremos atraparla. Estoy pensando en lo
que realmente necesitamos. Bien, entonces sí, aquí
podemos ver que está marcando los lados como
transparentes. Me equivoco. Entonces intentaré marcar
estos lados como pasto, pero no creo
que eso realmente nos vaya a dar el resultado esperado. Creo que lo que
tenemos que hacer es solo tener dos capas separadas para
este conjunto de mosaicos en particular. Bien. Entonces voy a
intentar dibujar con eso. Así que el modo de mapa de mosaico y luego dibuja con tierra y
vamos a probar eso. Todavía está un poco
desordenado. Voy a probar con una caja. Sí, todavía no funciona. Entonces Control Z deshace algunas veces. Y lo que en realidad
vamos a querer hacer es simplemente pintar con
tierra sobre la hierba, o hierba sobre la tierra depende de qué capa
quieras estar encima. Entonces voy a hacer clic derecho sobre la
raíz, agregar un nodo hijo. Digamos capa de mapa de teselas. Voy a renombrarlo para que
sea digamos suciedad. Voy a mover esto bajo
tierra para que por defecto, se muestre por encima del suelo. Entonces, lo que sea que esté en la parte inferior, en realidad
está en la parte superior. No estoy seguro de por qué está
configurado de esa manera. Yo sólo lo es. Y luego
iremos a la tierra. Ah, y queremos reutilizar el
mismo juego de baldosas, por cierto. Entonces en suelo, voy a
hacer clic derecho sobre el
juego de baldosas y guardarlo. Esto está en la parte superior, a la derecha,
por cierto. Así que guárdala. Localmente en el proyecto. Así puedo crear una nueva carpeta de conjuntos de
mosaicos, y luego solo diré
tierra tileset punto TRs guardar Bien, ahora, si hacemos clic en la suciedad y luego vamos
al inspector, podemos hacer clic en el desplegable,
Quickload, juego de baldosas de tierra Bien, ahora con esta capa
tilemap, podemos usar los mismos conjuntos de teselas que ya hemos definido
previamente Así es como funcionan
los recursos en general. Es muy fácil
compartirlos a través múltiples nodos o
múltiples escenas,
etcétera, compartiendo así los
recursos Bien, entonces vamos a
dibujar con tierra aquí, y luego voy a
dibujar con tierra por aquí, y solo
vas a ver que
la suciedad simplemente se sienta en la parte superior perfectamente porque estamos
pintando en diferentes capas, así que esto solo se nota encima
del fondo y porque aquí
hay transparencia en estos bordes laterales, la hierba básicamente
llena los huecos. El otro método
que estaba mostrando donde toda
la información de textura como
la hierba y la suciedad está todo en un sprite de azulejo sería más donde configuran los múltiples
terrenos en una baldosa,
lo cual es más
complicado, lo cual es más
complicado, Así que voy a cambiar el nombre del
suelo a pasto. Porque ahí vamos a
ser más específicos. Así que tenemos dos capas de mapa de teselas, y es mucho más fácil
manipularlas de lo que
hubiera sido el mapa de teselas. Bien, veamos dónde estamos. Probablemente queremos más,
como, dibujar un camino de tierra. Bien, entonces para que la
suciedad se asigne correctamente, queremos dibujar una línea de
dos por dos. Entonces quieres estar usando la herramienta rectángulo
o el teclado. Si haces solo una línea de un azulejo, va a terminar
algo así. Basado en el
sitio de teselas, no está seguro cómo caer en la
información aquí. No hay azulejo donde
tenga transparencia en la
parte superior y transparencia en la
parte inferior, así que eso no va a funcionar. En realidad necesitas
hacer un camino de dos píxeles como este y luego
simplemente arrastrar tu caja, y eso funcionará para eso. Así que podríamos simplemente hacer
algunos caminos en el nivel, algo así, ya sabes, simplemente dibujando dos caminos
anchos de azulejos donde
quiera que vayan. Y eso va a hacer que sea un poco
más interesante que solo tener baldosas de pasto
liso. Aunque depende completamente de ti
cómo quieres,
como, ya sabes, organizar esto y hacerlo
más interesante. Entonces, como, si alguna vez has jugado, digamos, Sim City, eso es exactamente lo que estoy haciendo aquí
mismo en este momento, como, crear el sistema de carreteras y básicamente
ponerlo donde quiera. No va a llenar ninguna
zona residencial en ningún lugar ni
nada por el estilo. Pero solo tener algunas
fichas más en el mapa es un poco más interesante que
literalmente solo pasto. Bien. Entonces ya veremos si eso es
bueno. Voy a golpear Play. Y si, nuestro personaje tiene algo por lo
que caminar ahora, así que eso es un
poco más interesante.
11. Colocar árboles como accesorios en el mapa: Y ahora creo que
sería una buena idea
agregar algunos accesorios
al nivel de juego Así que también tenemos algunos accesorios aquí arriba en la
carpeta de medio ambiente Entonces hay algunas
animadas y estáticas. Podríamos comenzar
con los árboles como el utilería más simple que podemos
poner en el nivel del juego. Así que vamos a agarrar uh, no lo sé. Haremos doble clic aquí y podrás ver los
modelos de árboles allá arriba. Así que podríamos querer
agarrar estos grandes árboles, y podríamos hacerlo con una muestra de Sprite dos nodos D. Y podemos ponerlos
en súper simples. Todo lo que necesitamos hacer
realmente es ir
al archivo PNG y
arrastrarlo a la escena del juego. Va a crear
automáticamente un Sprite dos D aquí arriba Así que simplemente cámbiele el nombre a Árbol entonces vamos a
tomar esta textura, y no vamos a
dibujar toda la textura. Vamos a dibujar
una región de la misma. Entonces lo que queremos hacer es usar una textura de atlas para que podamos seleccionar la
región que estamos dibujando. Entonces haz clic derecho aquí,
y voy a copiar esta imagen muy rápido porque vamos a dar
click en el menú desplegable, ir a la textura Atlas, que va a desestablecer
esa textura temporalmente Expande esto y luego haz clic
derecho y pega la textura que acabamos de
copiar en el atlas. Y ahí
lo tenemos volver a aparecer. Ahora queremos hacer
clic en Editar región. Y luego dentro de aquí,
iremos al modo Snap, Cid snap, rueda
central del mouse para acercarnos, y simplemente agarraremos
este árbol así, golpearemos cerrar, y tenemos
un árbol en la escena. Bien, ahora,
dependiendo de tu estilo de juego, puedes decidir agregar formas de
colisión a tu árbol. Lo harías de la misma manera que lo harías con, como,
un personaje jugador. Entonces, si miramos al personaje
del jugador, puedes verlo aquí como una forma de
colisión y puedes hacerlo para que los objetos colisionen con los árboles Sin embargo, para esta demo, en realidad
queremos minimizar
la cantidad de colisiones que nuestros enemigos van a estar haciendo con cualquier tipo
de personaje del juego Si tenemos muchos objetos
colisionables dentro
del juego y no
ponemos algo así como un agente de navegación o usamos cuerpo del
personaje dos D para que puedan moverse y deslizarse a lo largo de
la forma de colisión, entonces vas a conseguir que
los enemigos se queden atascados Mucho más simple que eso
sería simplemente saltarse la colisión y simplemente dejar que cualquier personaje camine por
el árbol, tenerlo ahí. Estrictamente para visuales.
Aquí tenemos el árbol. Voy a
hacer click derecho en la escena, y solo crearemos un nuevo
nodo para todos los árboles. Entonces voy a decir nodo dos D, crear, y vamos a
sacar esto del árbol, así que debería ser el inframundo Y podría simplemente
cambiarle el nombre para que sea utilería. Voy a mover el árbol
dentro de aquí. Y entonces podemos simplemente duplicar este árbol tantas
veces como necesitemos. Entonces primero haré clic derecho y
guardaré la rama como escena. Pondremos el árbol en
una carpeta nueva, creo. Yo lo llamaré.
Vamos con Objetos. Sí, y lo
voy a poner dentro de aquí. Entonces árbol punto TSN Podemos presionar Guardar N si
queremos editar el árbol, cambiarlo a
otro tipo de árbol, entonces simplemente podemos
saltar a la escena. Entonces para hacer eso, solo encuentras este pequeño ícono aquí
y abres un editor, para que puedas editar este árbol y
cambiarlo a lo que
necesites si quieres cambiar todas las copias
del mismo en el mundo. Déjenme mostrar un ejemplo de ello. Entonces tenemos el árbol. Voy a duplicarlo un
montón de veces, y después golpearé W para mover
las copias por la escena. Así que selecciona el árbol dos, W, muévelo por la escena. El modo Mover está justo aquí.
El modo de selección está aquí. Por lo que es necesario seleccionarlo
y luego ir al modo de movimiento. Y ahora quiero
cambiar el árbol, todas las copias del
árbol a través del juego. Así que solo voy a la escena del árbol, y luego por aquí a la derecha, expandiremos el atlas
editaremos la región, y luego seleccionemos
esta roja en su lugar. Entonces árbol rojo, golpeó
cerca, golpeó salvar, y ahora de vuelta al mundo, todos los árboles son ese tipo de árbol rojo de hojas
otoñales. Ahora voy a
volver al árbol, y voy a deshacer eso. Entonces, vamos a darle a Control
Z un par de veces. Simplemente iremos con el árbol verde
estándar. Y si quieres dos
tipos de árboles, entonces solo encuentra la escena arbórea
en tu jerarquía aquí. Así que solo puedes hacer clic derecho
aquí y duplicarlo. Vamos a llamarlo árbol
otoño y golpear Bien. Abre el otoño del árbol para
que sea un doble clic. Vamos a acercar el árbol, y tomaré la textura
y editaré la región, y podemos simplemente agarrar estos árboles
rojos de aquí. Y ahora si vamos al mundo,
podemos meter los árboles otoñales, o podemos poner el
árbol simplemente arrastrando escena directamente a
la escena de los
padres, el mundo Si te acostumbras a
eso, puedes poblar la
escena bastante rápido Ahora, una cosa que sí
quiero cambiar aquí, y tal vez voy a necesitar
demostrar para hacer eso obvio es que cuando se
trata de ordenar Y, la posición y la escena
del árbol del sprite va a importar porque vamos a ordenar
Y desde la posición central Entonces dondequiera que el personaje
toque el suelo es generalmente donde vamos a querer posicionar el sprite Así que aquí arriba en este juego de estilo porque lo
hice con
el jugador, ¿verdad? Así que queremos
asegurarnos de que los personajes estén ordenando desde donde están parados. Eso también se aplica a los objetos. Para demostrar por qué
eso es un problema, volvamos a los apoyos de la escena
principal Voy a ir a ordenar
aquí a la derecha. D Y Ordenar habilitado en el
mundo, hacer lo mismo. Vaya a ordenar y
elija WySort habilitado. Bien. Y ahora si jugamos y movemos a nuestro personaje
frente a un árbol, bueno, las cámaras en realidad
no nos dejan hacer eso. Así que agreguemos una cámara de
seguimiento para que
podamos movernos un poco más por
el mapa. Voy a tomar
el reproductor,
clic derecho , agregar un nodo hijo, transformar
a distancia dos D, y luego a la derecha,
queremos asignarlo a la cámara. Queremos actualizar la posición y no la rotación y no
la escala, así que desmarque esas Bien, ahora si le pegamos a
play, así que detente y juegue. La cámara va a
seguir a nuestro jugador, y esa es una cámara básica de
seguimiento en Gudo Bien, entonces llegamos a este objeto. Si estamos aquí arriba,
se puede ver que estamos clasificando detrás del árbol,
lo que esperaríamos. Pero si voy al punto
medio, ahora los personajes parados
básicamente en el árbol Visualmente hablando, todavía
queremos que ese personaje esté detrás del árbol hasta que el personaje llegue
a por aquí. De lo contrario, simplemente se ve raro. Entonces, para arreglar ese salto
a la escena del árbol, puedes hacer clic aquí
para abrir un editor. Y sí queremos que este
sprite esté aquí arriba. Pero creo que si solo
mueves el sprite así, porque es el nodo raíz, no
va a arreglar nada Así que vamos a volver al mundo, y sí, vamos a golpear
play. Ya verás a lo que me refiero. Vamos a ir por aquí, y
va a cambiar la posición donde
instancia estos árboles, no la posición de
donde se ordena, verdad? ¿Ves el
problema aún ahí? Así que tenemos que volver
a la escena del árbol, y voy a hacer click derecho. Voy a agregar un nodo hijo,
un nodo a voy a hacer
click derecho sobre esto y
convertirlo en la raíz de escena. Entonces este es el verdadero
árbol en la raíz, y entonces este es solo
el sprite dos D ahora Entonces, cuando instancias un objeto
dentro de otra escena, la raíz básicamente
en su posición central. Entonces este es el centro
del nodo raíz padre dos D, y ahora podemos
compensar el sprite Entonces, si tomo este sprite, bueno, en realidad
ya está compensado, pero puedes simplemente W y moverlo a donde
necesites que esté Solo recuerda que tu posición de
transformación es un desplazamiento desde la raíz, y la raíz
es donde en realidad va a ser instanciada en el
punto 00 aquí mismo Entonces es por eso que esto
es necesario para tener una base no dos D y luego
te sprite anidado debajo Entonces también queremos hacer lo
mismo con el otoño de árboles. Pero podrías
notar que debido a que estos objetos son muy similares, en realidad
están repitiendo
un montón de pasos. Entonces lo que
realmente podemos hacer es tener una escena heredada
basada en el árbol verde veraniego donde solo reemplazamos
la imagen srt, pero todo lo demás es
igual para ese árbol Entonces voy a borrar la escena otoñal
aquí abajo. Árbol otoñal. Borremos eso. Oh, tengo que borrarlo y
cerrar la escena. Así que borra eso y luego aquí arriba, asegúrate de cerrar esto
también. Así que no ahorres. Y entonces en el
mundo, puede que todavía tenga una copia de la escena porque no la borra
por completo. Es solo que ahora no hay una escena de
padres a la que vaya esto. Yo
también cortaré eso y lo guardaré. Así que hemos movido todas
las instancias. Bien. Y ahora en
la parte inferior izquierda, queremos hacer click derecho sobre Árbol, hacer nueva escena heredada. Entonces ahora tenemos escena no guardada
basada en la escena de los padres. Podemos guardar esto como árbol otoño, y queremos ponerlo en la carpeta de objetos.
Así que guarda eso. Y lo único que estamos
cambiando aquí es el sprite. Así que golpea Editar región y agarra el sprite para el árbol de
verano, golpea de cerca Y si volvemos
a la escena principal, ya verás que
podremos volver a instancia del árbol otoño. Parece que en realidad me metí la pata. Entonces necesitamos hacer que la textura del
atlas sea única. De lo contrario,
terminas con esto donde está reemplazando los árboles. Entonces ahora en la escena otoñal del árbol, queremos tomar
este brillante dos D, y el primer instinto que
tuve fue en realidad solo editar la región y
cambiarla a esto aquí abajo Pero eso en realidad es incorrecto. Y déjame explicarte por qué. Entonces, aquí mismo, este
es un recurso de textura, y los recursos se comparten entre cualquier escena
que lo haga referencia. Y tanto nuestro árbol nuestro árbol otoño están
haciendo referencia al mismo recurso Entonces, si cambiamos sus propiedades
como la región del atlas, al
igual
que la región de edición
aquí en la escena otoñal, en realidad va a
actualizar esas mismas propiedades en la escena del
árbol original también, porque están compartiendo
el mismo recurso. Entonces no es una nueva copia
del recurso de textura. Es literalmente el
mismo recurso. Así que queremos hacer
click derecho aquí y luego
hacerlo único en la escena otoñal. Y ahora podemos cambiar esto
a esta textura aquí abajo. Así que selecciona el
árbol de verano y golpea cerca. Golpea Guardar. Si vamos
al árbol verde, deberías ver que todavía tiene el sprite de árbol verde.
Podemos ir al mundo. Parece que un par
de estos árboles no fueron referenciados, así que tal vez queramos
eliminarlos muy rápido Así que en realidad voy a
tomar accesorios y hacer que sea 00. Y luego quiero tomar el nodo de props y
quiero bloquearlo. Entonces, si haces clic aquí arriba, puedes bloquearlo, y sí, eso debería evitar que se mueva. Entonces, si le pego a W y trato de mover el nodo de props ahora, no
se va a mover Entonces, una cosa importante a tener en cuenta es que tienes un
nodo padre dos D aquí, props, toda la posición de sus
hijos en
realidad se basa en relación con
la posición del padre Entonces, si tienes un
nodo de agrupación como props, pero aún necesitas
que sea un nodo dos, probablemente una buena idea para bloquearlo Entonces aplicaría lo
mismo si tienes un nodo de
agrupación de enemigos o proyectiles, que probablemente
tendremos más adelante Ahora solo podemos agregar
nuestros árboles a los accesorios, así que solo voy a hacer
estallar algunos ahí dentro Bien, así que si cojo este árbol que acabamos de crear y golpeo W e intento moverlo hacia arriba
más allá del punto de encenificación, entonces notarás
cuando llegue aquí, simplemente va a desaparecer detrás de la hierba y la tierra Entonces eso es por
por qué clasificar. Entonces lo que vamos
a necesitar hacer es en la parte superior izquierda
para pasto y tierra, vamos
a necesitar seleccionarlos. Creo que incluso puedes
seleccionarlos a ambos al mismo tiempo. Y luego ir al lado
derecho. Buscamos
ordenar y tomar su índice Z y ponerlo algo así como
digamos diez negativo, cualquier valor que sea negativo. Entonces esto hará
que estos estén siempre detrás de cualquier cosa que
tenga un índice Z de cero. Entonces si seleccionamos el
árbol ahora y vamos a W y lo movemos, ahora está arreglado. Siempre se va a mostrar
encima de estos otros objetos. Entonces esto es justo sobre cómo
estamos superponiendo nuestra escena. Algunos objetos, se
quiere ordenar con otros objetos en
el mismo índice Z, como el carácter en el árbol. Pero entonces otros objetos como el mapa de teselas simplemente deberían estar
siempre en el fondo para estos mosaicos de tierra porque los personajes están
parados en el suelo, por lo que deberías ver los personajes antes
de ver el suelo. Bien. Y ahora
solo queremos llenar la escena
con algunos árboles más. Simplemente puedes
seleccionarlos y
duplicarlos y moverlos hacia arriba. Asegúrate de ponerlos en el nodo props como padre
solo por razones de clasificación Y luego solo
seleccionaremos estos y los duplicaremos. Puedes duplicar
más de uno a la vez. Entonces, si solo
quieres un cierto patrón, entonces podemos hacer un grupo de árboles y luego simplemente
copiar todos estos alrededor. Incluso puedes moverlos
a su propio subgrupo, como tener como un padre de bloque de
árbol, y luego en eso tendremos un montón de árboles
diferentes y puedes ocultarlo
para que no tengas tantos nodos de árbol
poblando apoyos Si eso te
ayuda. Bien, así que vamos a
mover algunos árboles
un poco más, y podría simplemente
seleccionar todos estos diez árboles. Y voy a sí, probemos
lo del bloqueo que mencioné. Simplemente haré clic derecho
y agregaré un nodo hijo. Digamos nodo dos
D, bloque de árbol. Voy a agarrar todos los árboles, moverlo debajo del bloque de árboles. Así que solo selecciónalos todos. Y ahora podría guardar esta escena de
bloque de árbol en el proyecto, y vamos a querer
guardar ese bloque de árbol Objetos. Ahora podemos simplemente duplicar
el bloque de árbol, controlar D W, moverlo
así y como que simplemente rellenar la escena como necesitamos con árboles donde
queramos que estén. En algún momento,
probablemente quieras personalizar esto un
poco más, pero supongo que esta es una forma
rápida crear prototipos de la escena, y ojalá
no se vea tan mal cuando golpeamos Play
y acercamos el zoom Pero sí, si estuviera haciendo
esto árbol por árbol, esto tomaría, ya sabes,
probablemente, como, 20
minutos o algo así. Entonces si necesitamos hacer
algunas personalizaciones,
como aquí mismo, si acercamos el zoom, veo que este árbol ya sabes, poco cerca de la carretera, a mejor quiero editar eso para poder darle a Q y luego click
izquierdo sobre esto Podemos ver que es parte del Bloque
de árbol tres. Podemos hacer click derecho
en la jerarquía y hacer hijos editables Y luego para
éste, específicamente, ahora
podemos seleccionar los
árboles y moverlos. Entonces así,
tenemos un poco más de un bloque de árbol
personalizado. Bien, y podemos esconder eso.
Entonces ahora solo estamos mirando 15 bloques de árboles en
lugar de 150 árboles. Podemos jugar, entrar en modo de juego y simplemente caminar por
nuestro mundo de juego. Y a partir de esto Acercado, es bastante difícil de decir eso, es solo copiar y pegar la misma configuración de árbol
como diez veces, pero es mucho
menos aburrido que solo tener pasto, Como, tenemos el
camino, tenemos pasto. Si conseguimos algunas flores
u otras cosas aquí, en realidad podría
parecer casi un nivel de juego legítimo Ah, y aquí hay un
árbol que podemos arreglar. Entonces, ya sabes, un
poco de pruebas de juego. Puedes encontrar cosas
así.
Acerquemos y arreglemos eso muy rápido. Entonces esto es parte del Bloque de
árbol dos. Si miras en la
pantalla, en
realidad puedes ver el nombre del nodo sobre
el que estamos
flotando Entonces este es el nodo padre, el que la escena es
Enstus el bloque de árbol, no sus nodos hijos que están contenidos dentro
de esa Para que esto sea editable,
haga clic derecho sobre Bloque de árbol
dos, hijos editables Pulsa Q para ir al Modo Selección, seleccionar este árbol,
moverlo, y podemos agarrar
este también, sacarlo del camino, y solo hacer esas
pequeñas ediciones Y si, de estar alejados, parece que ya ninguno de los
árboles está en la carretera. Entonces ese es probablemente
el mínimo de lo que necesitamos pasar.
12. Agregar stumps y arreglar la clasificación Y: Así que estaba buscando a través
del paquete
de rastreadores de píxeles algunas flores que se
pudieran poner alrededor la escena para
picarlo un poco Realmente no lo vi en la versión gratuita, desafortunadamente. Pero supongo que tenemos
estos tocones por aquí. Podemos tratar de usar
eso como utilería y simplemente llenar un
poco los huecos y hacerlo
un poco menos aburrido. Entonces tomaremos esto y crearemos
una nueva escena de muñón a partir de ella. Así que básicamente voy a repetir los mismos
pasos con el árbol. Arrastraré esto a la escena. Vamos a la textura. Derecha, haz clic en Copiar. Así que copia esa textura. Y luego en el menú desplegable, haz clic en una nueva textura de atlas, y luego vamos a
pegar en el atlas aquí. Así. Bien, entonces
deberías ver la imagen completa. Ahora queremos editar región y seleccionar el tocón que
queremos usar en nuestra escena Entonces Uh, creo que este tiene un tocón un
poco menos rojizo, que mira más cerca
de nuestro árbol real Entonces hagámoslo. Golpea guardar. Ahora voy a hacer click derecho esto y guardarlo en una nueva escena. Entonces diremos tocón punto TACN. Ahora bien, si recuerdas, queremos compensar
este tocón, también Puede que tengamos que hacerlo de todos modos. Creo que en este caso, sí tiene que estar
unos pixeles hacia abajo. Entonces eso significa que necesitamos otro
nodo dos D en la raíz. Entonces haga clic derecho en Agregar un nodo hijo, el nodo dos D, y luego
haga clic derecho y haga de esto la raíz. Bien, entonces ahora esto es solo
un Sprite dos D. Bien, entonces la textura del tocón
es un Sprite dos D, y luego la raíz Entonces ahora guardaremos la escena
del muñón. Toma el sprite, golpea W, muévelo hacia arriba probablemente a la derecha por ahí para propósitos de clasificación
Y. Regresa al mundo.
Ahora tenemos el tocón Vamos a crear algunos tocones más y crear algunos tocones más
alrededor de la escena Si por casualidad
seleccionas accidentalmente el pasto o la suciedad, lo que puedes hacer es
subir aquí arriba a la izquierda y bloquear así los
nodos. Y ahora no deberías
poder seleccionarlos, creo. Entonces si golpeamos Q y seleccionamos el tocón o
alrededor del tocón, Bien Por lo que ahora estos nodos no
deberían poder ser seleccionables haciendo
clic en el mapa. Bajemos a los
tocones aquí abajo. No están usando esta escena base
correcta. En realidad solo voy a
seleccionar estos y eliminarlos. Y vamos a deshacernos del
nodo dos D, también. Bien, busca tocón en el
proyecto. Mueve eso en apoyos como ese. Bien, ahora nos alejamos. Encontramos este sumidero, golpeamos W para moverlo,
colóquelo donde lo desee. Te controló para duplicarlo. Bien, ahora tiene el nombre tocón para cuando está criado como apoyos, así que eso es más como
lo que estamos buscando Y solo pon algunos tocones
alrededor de la escena, ya sabes, solo cosas que puedes encontrar que son más interesantes de ver
que solo pasto Por supuesto, la manada
tiene otras cosas como edificios para,
como, un juego de manualidades No pensé que esos fueran
los más apropiados. Y si realmente vas
a poner edificios, creo que empezarías
a argumentar que
realmente necesitas las formas de colisión y posiblemente los agentes de navegación para hacerlo más creíble Pero lo estamos manteniendo lo más
simplista posible, porque solo estamos
haciendo, como, ya sabes, un juego muy simple como
sobreviviente Creo que ya hay suficiente en
el curso que, ya sabes, no
quiero abrumar a nadie, pero si al final, realmente
quieres entender a los agentes de navegación
y tocones, avísame Tengo algunos videos en
YouTube para ese tipo de cosas. Si buscas el agente de navegación del
tutorial de Chris, deberías
poder encontrarlos, si quieres
empezar con eso. Pero sí, esto
parece una escena decente puesta a punto. Bien, juega Vamos a correr por ahí. Nuestra escena. Tenemos los tocones. Ahora, sólo podemos caminar a través de
él. Eso está bien. Ahora, aquí, esto está
un poco menos bien. Podemos ver que la clasificación
en este árbol no es correcta. De hecho, el árbol
no está clasificando en absoluto. Creo que sí supongo que aquí
tenemos que entrar en la escena del árbol otoñal
e intentar arreglarlo. Bien, así que vamos a la vista de escena
Local por
aquí arriba a la izquierda. Estamos viendo la escena otoñal
del árbol. Haga clic en la raíz. Y tal vez lo que
necesitamos aquí es
comprobar por qué la clasificación
habilitada para esta escena, y es posible que tengas que hacer eso en la escena de los padres, también. Entonces ordenando Y sort habilitado. Tenga en cuenta que mis juegos
siguen funcionando, así que puedo pestañear y ver de inmediato si
funcionó o no. Y actualmente, no lo
es. Entonces déjame ver ese árbol en el mundo. ¿En realidad es
parte del padre? Oh, ¿sabes lo que debe
ser? Son los bloques del Árbol. Bien, entonces tenemos que
entrar en los bloques de árbol, dar clic en el bloque Árbol
ordenando ySort Enabled Oh, sí, cuando creas un
nuevo nivel de la jerarquía, si aún quieres que la
clasificación Y esté ahí, tienes que asignar ySordenabled
en el nivel padre Entonces props tiene YSort habilitado,
pero Tree Block no lo hizo. Ahora Tree Block sí. Entonces, si vuelvo a
ficha al juego,
es por eso clasificando. Bien, entonces queremos poder
caminar sobre los tocones y ver que
podemos ordenar delante del muñón y
detrás del tocón Y en su mayor
parte, eso funciona. Ahora, también me di cuenta de que hay un pequeño
problema con los árboles. Ellos hacen la clasificación, o al
menos estaba haciendo
la clasificación, aguanta. Déjame verificar con el árbol de aquí. Sí, éste está clasificando. Pero la posición en la que está
clasificando está bastante apagada. Entonces, lo que realmente
quiero hacer es entrar en la escena del árbol base para
que se aplique a ambos árboles, y asegúrate de estar en vista
local aquí si tienes el juego corriendo
en la parte superior izquierda. Seleccione el nodo Sprite dos D porque estamos controlando
el desplazamiento del Sprite Golpea W y luego mueve esto hacia abajo probablemente
en algún lugar como ahí. Voy a volver al juego ahora mismo. Y entonces
intentas caminar así, deberías ver que la
clasificación Y es mucho mejor. Entonces aquí estamos
parados frente
al árbol como cabría esperar. Y entonces aquí estamos
parados detrás del árbol. Entonces eso es mucho mejor.
Tienes que hacer bien
esas compensaciones o las cosas
simplemente no se verán bien. Y eso se ve
como la mayor parte de lo que necesitamos aquí para los apoyos de nivel Yo podría crear un grupo de
tocones, también,
así podría simplemente tomar
estos 16 tocones, y vamos a darle un padre Entonces hagamos clic derecho y
reparemos a un nuevo nodo. Y luego haremos un nodo dos D. Así que ahora todos estos tocones se
han agrupado bajo un nodo dos D. Vamos
a llamar a eso el tocón Haremos clic derecho aquí,
guardaremos el bloque de tocones como su propia escena en
la carpeta de objetos Y ahora podemos simplemente duplicar
nuestro tocón, golpear W, moverlo por nuestra
pantalla, y simplemente como, ya
sabes, poner tocones en
otros lugares Entonces no es exactamente como la generación de
procedimientos aquí, sino una idea similar
donde solo estamos
tratando de llenar el mapeo
con el patrón. De los parámetros, que
básicamente son simplemente duplicar las posiciones de los tocones
y luego compensarlos Entonces se ve un poco diferente. Y podemos correr alrededor de
un juego una vez más. Tenemos la clasificación Weiss
funcionando bastante bien aquí. A lo mejor para el tocón, queremos
cambiarlo un par de pixeles para poder
entrar en la escena del muñón Y luego vamos a la vista
Local y movemos el sprite dos D offset
hacia abajo un par de pixeles Entonces veamos cómo es
eso ahora mismo. Uh, a lo mejor tengo la
dirección mezclada. En realidad, tal vez
necesitamos hacerlo más así y luego darle a guardar. Entonces estamos moviendo esto hacia arriba. Bien,
eso está detrás del muñón Esto es frente al tocón. Bien. Sí, eso se ve
un poco correcto. Entonces solo el fondo mismo
del tocón debe estar por debajo
del punto 00 del padre Y vamos a andar por ahí. Sí, sólo veremos
tocones y árboles. En realidad no es necesario que aquí
sea muy variado porque el foco está solo en el
combate y va a ser subir de nivel y
recoger notas y ese
tipo de cosas Pero tener algo en el fondo sí
lo hace más interesante. Así que solo quería
pasar por todo eso. Se puede, por supuesto, mover
manualmente algunos de estos tocones fuera
del camino si
terminaron en la carretera de la
misma manera que antes Así que vayamos al
mundo encontremos ese muñón
que estaba
en la carretera, ¿de acuerdo? Le pegaré a Q, la seleccionaremos. Entonces vemos a Stump bloque tres
por aquí a la izquierda. Haga clic derecho y haga hijos
editables. Después da click en el tocón
, sácalo del camino y haz lo mismo con cualquier
otro tocón que encuentres Y aquí hay uno. Bien, entonces voy
a seleccionar este nodo, Stump bloque dos. Vamos a niños
editables Después haga clic en el tocón
individual, W para moverlo, sacarlo
del camino, y eso está hecho Bien, también podemos hacer eso
con este árbol de aquí arriba. Entonces eso es parte del bloque cinco de
Tree. Hagámoslo editable. Selecciona el árbol, muévelo. Oh, aquí
hay otro. Interesante. Debo haber duplicado
realmente un
bloque de árbol en el mismo lugar. Sí, bien. Vamos a
movernos por aquí. Todo bien. Bien, en realidad no veo ningún
otro árbol en la carretera. Hay un muñón por aquí, así que voy a tratar de
arreglarlo, también. W para moverlo,
sacarlo del camino. Haz que el padre sea editable
si es necesario. Y eso probablemente
va a estar casi bien. Una última.
Niños tan editables. Así que selecciónala. Hacer que el padre sea editable, seleccionar el nodo individual
, sacarlo del camino.
Y eso es básicamente todo. Así que colapsa todo, para que no esté
abarrotando tu jerarquía Esa es una de las razones por las que hice el nodo prop para empezar. Um, si tuvieras, como, texturas de
flores u otros doodads, tal vez rocas, probablemente las
pondrías en una capa separada de rocas o
doodads aquí arriba y solo la colocarías en
un índice Z que es más alto
que Esa sería una buena manera
de empezar con eso. Alternativamente, pueden ser
sus objetos individuales vistos. Sin embargo, no estoy seguro de la
actuación. Yo asumiría que si es
parte del mapa de teselas, probablemente
sea mucho
mejor que si son, ya
sabes, sus propios
nodos en la escena del juego. Pero mientras no
tengas demasiados locamente, probablemente no
sea un Um, probablemente no
sea un Um, así que esa va a ser básicamente nuestra
porción de mapeo de teselas del curso Y a partir de aquí, podemos
pasar a montar
armas y enemigos,
ganar exp, subir de nivel, HP, todos esos pícaros RPGSh
como tipo
13. Proyectiles de efecto spawn con temporizador: El personaje puede
moverse. algo así como un
mundo de juegos en el que jugar. A continuación, lo que tenemos que
hacer es crear un ataque que esté en un
temporizador que creará un proyectil donde
podamos usarlo para atacar a los enemigos sin necesidad ninguna otra entrada clave
del jugador En los juegos de supervivientes, normalmente
terminas acumulando un montón
de armas diferentes, y simplemente se
activan automáticamente para ti Lo único de lo que debes
preocuparte es caminar la pantalla y dejar que las armas hagan
el trabajo
mientras evitas a los enemigos. Y ese es básicamente
el bucle de jugabilidad. Así que empieza con eso. Vamos a crear nuestro
guión de armas y jugador. Entonces en esta escena de dos D, voy a
hacer click derecho sobre la raíz. Vamos a agregar un nuevo
nodo hijo D, el nodo dos D aquí. Vamos a cambiar el nombre de
esto para que sea arma, y hagamos
clic derecho en él y adjuntemos un guión para que sea arma doTGD Y esto puede entrar en la carpeta
del reproductor por ahora mismo. Entonces vamos a tener
este guión de armas. Podríamos incluso hacerla
arma dos D, honestamente. Entonces, si queremos
entrar en el sistema de archivos, podemos renombrarlo
para que sea arma dos D, si eso tiene más sentido. Bien, entonces lo que va a necesitar este guión de arma dos
D para crear los objetos de
juego de proyectiles que realidad son la
representación dos D del arma en el mundo del juego que puede dañar un enemigo es que
vamos a necesitar un temporizador Entonces voy a decir var
timer de tipo timer. Ahora, puedes
agregarlos directamente en el inspector de escenas de
aquí a la derecha, como agregarías otros nodos. Pero no quiero
tener que hacer eso por cada
guión de arma que creo. Entonces para que eso sea un
poco más rápido y más fácil, voy a decir función
subrayado listo Entonces, cuando nuestro script esté listo, simplemente
tomaremos
la variable timer y la configuraremos en un nuevo temporizador. Bueno, agrega el temporizador cuando era niño, así que agrega temporizador infantil. Eso quiere decir que
este nuevo temporizador
va a existir bajo el arma. Si retiramos el arma, también
retiramos el temporizador. Y luego queremos conectarnos
a la señal del temporizador. Entonces el temporizador tiene una señal de
tiempo de
espera, y queremos
conectarla a una función, una función llamable, para que
podamos decir en tiempo de espera. Y aquí abajo, podemos ir a
funcionar en el tiempo de espera del temporizador. Ahora bien, este tiempo de espera de señal en realidad
no envía ningún dato, así que no necesitamos
ningún paréntesis Y entonces esta
función va a tener un tipo de retorno de vacío. Entonces, cuando el temporizador se agota, queremos básicamente
lanzar nuestro hechizo. Queremos convocar a
los proyectiles. Entonces creo que el elenco está bien
nombre para esa función. Entonces solo diremos elenco, y queremos
pasar la dirección en la que nuestro proyectil
va a ser lanzado Entonces, si estamos de cara hacia arriba,
vamos a lanzar hacia arriba. Así podemos obtener una referencia a la
dirección de orientación para eso, pero volveremos
a eso en un segundo. Entonces tendremos funcion cast, y esto va a tomar una dirección
P del vector dos, la dirección en la que estamos
lanzando, y podemos regresar void para eso. Entonces, para que la
señal de tiempo de espera sea alcanzada, tenemos que iniciar primero
el temporizador Entonces diremos temporizador punto inicio. Entonces, el tiempo que queremos
configurar por cuánto tiempo hasta que
creemos una instancia de proyectil
va a depender la definición de cada arma de
proyectil Y luego tendremos diferentes
niveles de las armas, así que en realidad podemos
cambiar el
enfriamiento ya que el arma
sube de nivel para poder disparar más a menudo sería una forma en que podemos
alimentar a nuestro personaje. Para el arma dos D,
vamos a querer tener esa definición como
un recurso que podamos usar para que nuestra arma
sepa operar. Así que vamos a hacer en la exportación VR, y digamos definición
de tipo definición de arma, y vamos a
necesitar crear eso. Entonces en el sistema de archivos, vamos a expandirnos hacia afuera,
y luego
voy a crear una nueva
carpeta para nuestras armas Así que voy a hacer clic derecho
sobre los recursos y hacer Crear nuevas armas de carpeta. Y dentro de esta carpeta, sólo
voy a crear un nuevo recurso. Así que haga clic derecho en Nuevo recurso. Y vamos a crearlo como un recurso
base por ahora mismo. Diré definición de lanza. Como nuestro personaje es un ragón le
daremos una lanza
como arma por defecto Así que lo guardaré aquí, Script, necesitamos crear nuestra
nueva definición de arma. Entonces vamos a hacer clic derecho sobre las armas, crear un nuevo guión. Digamos
definición de arma para ahora mismo, y va a heredar del
recurso y crear eso Entonces ahora entramos en definición de
arma. Vamos a darle el
nombre de clase, definición de arma. Y aquí es donde
vamos a definir las estadísticas en los detalles de la interfaz como nombre de cómo se representa
nuestra arma
en un formato de datos, pero no en el mundo del juego Eso va a ser más de
la clase de proyectiles, que se extiende desde el
nodo hasta el D. Así que
necesitamos bastantes aquí para juntar
todo Yo diría que el sistema de armas es probablemente la parte más
complicada, así que voy a tratar de atravesarlo a
fondo. Entonces, antes que nada, es posible
que queramos establecer un nombre. Así que en la exportación var nombre. Entonces los nodos por defecto tienen una propiedad name, pero
los recursos no. Así que podemos aprovechar eso definiendo un nombre
de cadena personalizado. Entonces ese va a
ser el nombre para mostrar, cómo lo representamos en la interfaz de usuario. Y entonces podríamos decir en exportación var icono de
tipo textura dos D. Posteriormente agregaremos en bloques de stat
personalizados para
cada nivel de arma, pero eso es demasiado
para este video. Entonces por ahora, lo que sí necesitamos de aquí
puede ser algo más como una función get cool down, y podemos pasar en un nivel aquí porque en realidad
no sabemos qué nivel es el arma
a partir de la definición de arma. Eso se va a establecer en el arma de tiempo de ejecución dos objetos
D por aquí. Porque esto sube de nivel en el juego. Y entonces la definición es
más una definición de editor. Establece cómo
opera el arma en cada nivel. Entonces esas son cosas separadas. El nivel está en el arma
a D. Así que queremos
pasar el nivel en el
que se encuentra actualmente. Entonces podríamos decir, nivel P, y eso va
a ser un entero. Devolveremos un flotador el
enfriamiento para el arma. Entonces por ahora mismo,
voy a hacer esto simple y solo hazlo digamos
si giras un punto. Posteriormente, podemos hacerlo
más costum
resolviendo realmente el enfriamiento
basado en el nivel que pasamos Pero solo manteniéndolo simple
aquí para que podamos probar que todo el arma
dos D realmente funciona. Entonces en arma dos D, queremos
iniciar el temporizador en, digamos, definición
punto Get Cool Down. Y solo vamos a pasar digamos uno negativo aquí porque
queremos cambiarlo. Entonces estoy poniendo un poco
para hacer nota aquí para
recordarme a mí mismo para obtener
el nivel real, solo una nota para que, ya sabes, una vez
que probemos esto funciona, podamos seguir adelante desde ahí e
implementar completamente el sistema. Bien, también vamos a
querer poder obtener la instancia de proyectil que
estamos tratando de crear Así que vamos a hacer una
función get scene. También podemos pasar en el nivel. Esto va a
devolver una escena repleta. Sigamos adelante y creamos
esa escena de arma, el proyectil,
más específicamente Entonces en dos vista D, sigamos
adelante y agreguemos una nueva escena. Aquí vamos a crear
una escena de dos D. Voy a renombrar
esto para que sea Spear. Hagamos click derecho sobre
él, adjuntemos un guión, y esto va a
ser proyectil punto GD Probablemente quiera
guardar esto y oh, digamos la carpeta de armas. Creo que eso
tiene sentido. Y luego abre Crear, eso es cancelar. Create está por aquí, y luego
queremos darle el nombre de
clase proyectil, y guardaremos el
punto de lanza TSCN dentro de las armas para que podamos ver
realmente Queremos adjuntarle
un Sprite. Haga clic en Lanza, adjunte
un nodo Sprite dos D, y luego vamos a
agarrar el arma Lo cual va a ser parte de una textura
atlas
aquí arriba a la derecha. Así que haz una textura de atlas. Y luego vamos a
cargar rápidamente de nuestro proyecto. Creo que fue de 16 por 16. Y luego necesitamos
obtener nuestra textura. Así que ve al arte en la parte inferior izquierda. Ir a Pixel crawler, ir a armas, madera Y luego word dot PNG, lo dejamos caer en
la ranura Atlas. Bien. Y ahora
podemos editar región, acercar, y queremos la
lanza, que está aquí mismo Así que vamos a arrastrar alrededor de
eso y darle a Cerrar. Bien, ahora tenemos
el sprite de lanza. Así que al menos podemos ver
nuestro proyectil uppear en el juego una vez que
básicamente está cargado Queremos cargar en esta escena. Volvamos al jugador, y voy a
abrir el guión del arma. Entonces voy a hacer click derecho sobre Definición de
arma
y símbolo de Loup Y para conseguir la escena, simplemente
vamos a hacer
algo como retorno de carga. Y ahora queremos cargar
esa escena de lanza en. Así escupir punto TSN. Se puede ver que sólo
se puede encontrar en los recursos armas escupir punto TSEN y poner eso ahí Entonces, una vez más, esta es
una medida temporal solo para
que sea simple para que no tengamos que implementarla
completamente. Entonces en nuestra arma dos
D, cuando lancemos, vamos a conseguir que esa arma
se vea desde la definición. Entonces queremos decir var, proyectil va a
ser de tipo proyectil, y vamos a poner
eso igual a definición Obtener SN y vamos decir negativo uno aquí para
el nivel. ¿Sabes qué? En realidad, podríamos empezar a declarar nuestro
nivel real del arma Entonces hagamos de eso un nivel uno. Diré a nivel var de exportación. Este será un tipo de tipo entero, y
comienza en uno. Bien, así que ahora solo podemos pasar el nivel a estas funciones, enfriarnos y ser vistos. Todavía no hace nada con él ,
pero al menos lo
tenemos ahí. Y, por supuesto, cuando subamos de
nivel nuestra arma, sólo vamos a incrementar
el nivel aquí en uno, y eso va a cambiar lo que nos
devuelven
estas funciones si tratamos de
refrescarnos o conseguir la escena Bien, entonces conseguimos la escena, y luego queremos
hacer una instancia en ella Entonces queremos
agregarlo de niño
a nuestro grupo de proyectiles
y a la escena principal ¿De dónde sacamos el nodo para generar
realmente los
proyectiles? Vamos a la
escena mundial dos D view, y voy a minimizar esto. Vamos a hacer click derecho sobre Mundo
y la parte superior izquierda y añadir un nuevo nodo dos D. Sólo
voy a renombrar
este proyectiles Ahora vamos a la parte superior derecha, y aquí voy a
usar grupos. Vamos a asignar un grupo
al nodo proyectiles. Entonces agrega un nuevo grupo. Yo solo haré proyectiles,
minúsculas, lo haré global, y diré el nodo donde todos los proyectiles Bien, ahora podemos ver en el nodo proyectiles que
tiene este grupo, y podemos hacer referencia al nodo
haciendo primero en Entonces volvamos al guión. Es el subrayado de los proyectiles. También podríamos declarar eso
como una constante si queremos. Entonces yo diría constante grupo de
proyectiles, haciendo constante todos los topes
la convención estándar Deja claro que
este es un valor constante que no va a cambiar y se diferencia de una variable regular como
nivel o definición, que puede cambiar
durante el juego Así que pongamos esto
igual a proyectiles minúsculas, Entonces vamos a querer
obtener este nodo y agregarlo a ese nodo. Así que vamos a guardarlo en caché. Como variable local, digamos var
proyectiles padre, y esto va a ser un nodo Entonces, para que eso esté listo, hagámoslo antes del temporizador. Subrayar proyectiles
padre es igual al nodo G. Pero primero tenemos que conseguir
el árbol. Así que get tree dot get
first node and group, y queremos que el grupo de
proyectiles, que es un nombre de cadena En la mayoría de los casos, las
cadenas y los nombres de cadenas se pueden
usar indistintamente Convierte entre los tipos automáticamente en muchos
casos en la parte posterior. Podemos declararlo
como un nombre de cadena aquí porque eso es
lo que espera para esto. Entonces obtenemos el primer
nodo en el grupo. Si eso no existe, probablemente
vamos
a obtener un error en la consola, lo cual
es algo bueno. Así que solo tenemos que
asegurarnos de que nuestros niveles de juego
tengan realmente un
nodo de proyectiles como Si lo deseas, podrías guardar este nodo en tu
proyecto y reutilizarlo, haz clic
derecho en Guardar
escena de sucursales y luego tal vez
crearemos una carpeta de niveles. Para cualquier cosa relacionada con los niveles y poner los proyectiles
punto TSC aquí Entonces si sigues
reutilizándolo desde aquí, siempre
estarán en
este grupo de proyectiles, y
básicamente no deberías tenerlo desincronado Así que ahora puedes reutilizar la escena de los
proyectiles sin preocuparte de que los valores cambien entre los
niveles en los que la usas, así que eso podría ser
un poco útil Y ahora, una vez que hayamos
creado el proyectil, queremos asegurarnos de
que eso se agregue como hijo al padre
proyectiles Así subrayan proyectiles
padre Ad hild proyectil. Así. Ya podemos
deshacernos de esto. Y entonces solo queremos
asegurarnos de que la posición global sea igual a la posición global del arma dos
D. Entonces digamos que la posición
global del proyectil es igual a la
posición global aquí Entonces estamos tomando la posición
del arma dos nodo D. Y entonces tenemos que
pasarlo dirección en cast. Así que vamos a hacer
vector dos puntos, ¿verdad? Eso son mayúsculas.
Un valor constante. Y ahora el script debería
poder ejecutarse sin error. Bien, entonces tiene la escena. Sé qué tiempo de enfriamiento establecer. Y sabe crear una copia
del proyectil encima del arma dos nodos D
cada vez que transcurre el temporizador Así que vamos a correr esto
y darle una oportunidad. Podemos ver obtener
cooldown y null. Así que en realidad no hemos establecido
la definición de arma. Entonces podríamos decir, afirmar que definición
no equivale a nulo Entonces, cada arma requiere
un conjunto de definición de arma. Entonces tenemos que
ir al jugador. Tenemos que encontrar esta
arma dos nodo D. Le renombraré arma dos D. Vamos al
inspector arriba a la derecha, y luego definamos nuestra definición de
arma aquí. Entonces nueva
definición de arma, amplía esto. Posiblemente vamos a
querer el icono y el nombre. Entonces llamaré a esta lanza. Y vamos a sacar el icono
de la escena de la lanza. Así que solo podemos tomar el mismo sprite y
copiarlo al icono Entonces voy a hacer clic derecho sobre
la textura. Y copia. Ahora vayamos a la
escena del jugador donde tenemos el
conjunto de definición de arma y simplemente
haga clic derecho sobre el icono y péguelo en. Bien, entonces ahí está nuestra
representación UI de la lanza. Así que golpeamos Play, y conseguimos la lanza a instancia
después de cada 1 segundo Ahora nuestro proyectil aún
no se mueve. No tiene código para que se mueva, pero tenemos el tiempo trabajando para poner
los proyectiles en el mundo en el momento
adecuado
basado en nuestra clase de definición de armas Por supuesto, hay
mucho más que eso. Aún no nos hemos metido con estadísticas ni nada, pero
este es un buen comienzo Así que voy a entrar más en
esto en el próximo
14. Mover proyectiles en dirección de lanzamiento: Entonces, en este punto,
estamos listos para comenzar a poner enemigos
en el juego y luego hacer que nuestros proyectiles capaces de golpearlos moviéndose a
lo largo de la pantalla Bien, así que hagámoslo para
que nuestros proyectiles puedan moverse ahora en la dirección en la
que se lanzan Voy a
repasar a la escena de la lanza, y este es el proyectil de
lanza, que en realidad
instancias en
el mundo del juego Vamos a abrir ese guión. Y vamos a querer
poner una función de lanzamiento dentro de aquí para que cuando se instancie nuestro
proyectil, otro guión pueda decirle en qué dirección se va a mover Entonces voy a poner
en lanzamiento de funciones, y vamos a
pasar en una dirección. Entonces P subrayan el vector de
dirección dos, y esa va a
ser la dirección en
la que van a moverse los proyectiles Entonces queremos tomar esa dirección de
lanzamiento y hacerla local para que podamos
usarla en nuestras funciones de proceso,
proceso va a actualizarse
en cada segundo y traducir nuestro
nodo de proyectil a través de la pantalla Entonces var direction
va a ser vector dos, y vamos a
configurar eso aquí mismo en el lanzamiento. Entonces dirección es igual a dirección P. Ahora, una vez que lancemos
un proyectil, también
queremos ponerlo en cola para
liberarlo después de cierto
periodo de tiempo De lo contrario, los proyectiles
que nunca alcanzarían un objetivo existirían en tu mundo de juego
para siempre y
eventualmente causarían problemas de
rendimiento Así que sí queremos asegurarnos de
que los objetos se liberen eventualmente. Entonces podemos hacer eso esperando una cierta cantidad de
tiempo. Diré que espere. Entonces esto básicamente significa
que va a
volver al resto
del código que sigue esta línea después de que se cumpla la
condición. Entonces vamos a decir consigue árbol. Entonces estamos obteniendo el árbol de escena
actual en el que este nodo de proyectil
existe dentro, y luego vamos
a hacer crear temporizador Y le damos un tiempo. Entonces,
digamos 1.0 segundos. Todo lo demás lo puedes
dejar como predeterminado. Entonces todo esto
significa que estamos esperando el método de tiempo de espera en el temporizador que creamos
usando el árbol de escenas, y esperamos un segundo
para que ocurra ese tiempo de espera Y luego una vez hecho eso, podemos apenas lo cuartito
sobre el nodo proyectil Eso va a liberar el
proyectil sobre cualquier cosa que esté debajo de él. Ahora bien, un proyectil
que golpea objetivos, si golpea un objetivo,
probablemente se va a quitar
antes de esto,
pero esto es solo una alternativa para
que si simplemente echa de menos por completo a todos los enemigos, eventualmente se libere Bien, y entonces necesitamos que el
proyectil se mueva realmente. Entonces digamos que el
proceso de subrayado de función o el proceso de física, en realidad, es probablemente un
poco más apropiado Hagámoslo. Por
lo general, se utiliza el proceso de física para cualquier cosa que implique mover objetos de física
a través del juego. Ahora bien, este es un nodo dos D. No
estamos agregando nada como física corporal
rígida
al proyectil, sino solo para que su movimiento se sincronice con todo lo
demás en el juego Si el proceso de física se establece 60 veces por segundo o 60 períodos de
movimiento por segundo, entonces este se moverá
60 veces por segundo, solo para mantenerlo consistente
con todo lo demás en el. Exportar velocidad var aquí
en la parte superior del tipo flotador. Lo agregaremos a 100. Así que esa solo será la
velocidad predeterminada para el proyectil. Entonces cosas como la velocidad y la duración que
dura
este proyectil en el mundo del juego son estadísticas que quiero sacar a un guión de estadísticas separado para
que podamos definirlo por arma y por nivel de cada arma de una manera mucho
más organizada Pero por ahora, ya
es suficiente, así que trabajaremos en eso más adelante. Entonces queremos decir
traducir aquí. Cualquier nodo TD puede traducirse
a través de la pantalla. Es movimiento sin
ninguna colisión. Y vamos a decir
que nos estamos moviendo en la dirección multiplicada por la
velocidad, multiplicada por el Delta. Ahora bien, si quieres saber qué calcula esto
cuando estás
depurando, golpeando un punto de interrupción,
entonces es posible que realmente quieras hacer
algo más como Var mover, que es un vector dos va a ser igual
a este bit aquí mismo, Control X, pega ese extremo ahí, y luego solo
traduces el movimiento. Así que ahora si tuvieras que llegar a
un punto de interrupción, aquí mismo, y en realidad podemos hacerlo con solo golpear play porque el proceso de
física va a desencadenar tan pronto como ese
espíritu se cree, entonces podemos ver en la parte inferior, tenemos el valor de movimiento de
00 e Y es cero, cero, porque no lanzamos el proyectil con esta función, así que en realidad
no tiene el por defecto
es vector dos
punto cero para ahora mismo Bien, entonces voy a
deshacer el punto de interrupción. Tú. Bien, así que cierra el juego. En realidad trae a colación un buen
punto que quiero tocar, que es que si la
dirección es vector 20, entonces eso probablemente
represente un problema porque siempre
lanzamos en una dirección
la dirección a la que se enfrentan los
personajes, que nunca debería ser
vector dos punto cero. Entonces podríamos esperar que ya se haya llamado a
la función de lanzamiento antes de ponerla en
escena completamente con Adhild Así que vamos a hacer listo ese subrayado de
función. Y vamos a afirmar que dirección
no es igual al vector 20 Llame al lanzamiento para establecer dirección o proyectil antes de
agregarlo niño Entonces queremos así que queremos
exigir que ya hayamos establecido la dirección
con la función de lanzamiento y dar una nota que deberíamos llamar a
launch antes de llamar a Add hild Entonces la lista ocurre después de bien. Ahora bien, si corro, debemos darle
inmediatamente a la aseveración
como esperaríamos Así que vamos a saltar al arma dos guión D donde estamos agregando el hijo del padre
proyectiles Entonces ahora queremos llamar
proyectil punto lanzamiento en la dirección P que
pasamos a la función de lanzamiento Para que en realidad
lo establezca en algo propio. Ahora, podemos ver que
aquí abajo en el tiempo de espera del vector, estamos usando vector
dos punto derecho Entonces supongo que sería
una buena manera de probar. Siempre se debe mover a
la derecha en este caso. Entonces el problema aquí
es realmente que nuestro lanzamiento está tratando de
hacer dos cosas separadas. Creo que en realidad tiene
más sentido sacar este bit a la función ready
ya que estamos usando eso ahora. Entonces voy a pegar eso
ahí, Control X, esto, control V,
pegarlo adentro. Esto tiene sentido. Tan pronto como el
proyectil esté listo, tenemos listo para liberarlo
después de un período de tiempo establecido Así que esto mantiene el método de lanzamiento
solo manejando una cosa, que es básicamente inicializar el objeto una vez
que se ha creado Entonces esta es casi certaintly
la mejor manera de hacerlo. Bien, ahora vamos a golpear play. Y tenemos nuestro proyectil
disparando a la derecha. También se puede ver que
solo duran 1 segundo, probablemente no lo suficiente, pero es una buena prueba para asegurarse de que en realidad
están liberando. Entonces en este punto, sólo
habrá una o dos de las lanzas en
la escena en cualquier momento No debería causar ningún problema de
rendimiento en absoluto.
15. Configuración de enemigos y casillas de éxito: Nuestros proyectiles se
mueven hacia la derecha. Ahora, vamos a crear
un enemigo para que nuestros proyectiles puedan
conectarse con él y golpearlo Entonces eso va a
significar que estamos configurando una caja de impacto y una caja de daño
en este video, y nos preocuparemos por las
estadísticas más adelante, como HP. Entonces en mi proyecto ahora mismo, veo en la parte inferior, aquí hay
algunas advertencias. Estos solo están mencionando
que si no estás usando un parámetro,
debes subrayarlo. Entonces voy a hacer click en cada uno de estos y solo darle un
poco de subrayado ahí Entonces no estoy usando Delta en
este proceso de física del jugador. Por lo que subrayo el Delta. Implica que
no se está utilizando. Y luego aquí en otro guión, voy a hacer lo mismo. Y solo por cualquiera
de esas advertencias que estás recibiendo, solo repite. No estás usando el parámetro, luego subrayarlo para que
indique que esperas
no usar el parámetro y que
eso no es un accidente
o un error Y seguiremos adelante y
crearemos nuestro primer enemigo. Entonces comencemos con un Oc. Voy a crear una nueva
escena aquí arriba en la parte superior, e iremos a la escena dos
D a la izquierda. Voy a cambiar el nombre de esto para que sea Oc. Vamos a la derecha, haga clic en él,
cambiaremos el tipo a un cuerpo de carácter dos
D. Y seleccionaremos eso. Bien, entonces quiero hacer click
derecho sobre el orco, agregar un nodo hijo Haremos un sprite TwoD aquí. Además, haz clic con el botón derecho aquí y
agrega una forma de colisión infantil. Y a la derecha,
vamos a hacer
que sea una pequeña forma de círculo, algo así como lo que
hiciste con el jugador. Y vamos a controlar, guardar la
escena dentro de los personajes. Voy a hacer una nueva
carpeta para los enemigos. Entonces enemigos, metan eso ahí, y luego salvan a la orca TAC. Bien, ahora nuestro orco necesita a
Bright, claro. Así que vamos a seleccionar este nodo Brit, y bajaremos
a la parte inferior izquierda Buscaremos creo que
fueron entidades turbas orcos tripulación, y queremos
agarrar uno de estos Así que solo estaba usando
el orco predeterminado para que podamos agarrar la hoja inactiva Voy a seleccionar este nodo
Bright two D, y luego a la
derecha, vamos a arrastrar y soltar esa hoja
inactiva en aquí. ¿Bien? Ahora, obviamente, tenemos una configuración similar al reproductor donde tenemos una hoja de sprites Necesitamos definir cuántos fotogramas H son de izquierda a derecha,
que puedes ver son cuatro. Y queremos hacerlo
con un reproductor de animación. Entonces voy a dar click en Ok, agregar un nodo hijo.
Jugador de animación. Así que selecciona el reproductor de animación, baja al fondo, haz una nueva animación de Ídolo. Bien, y necesitamos fotogramas clave algunas de las propiedades del
sprite Así que agreguemos una pista, pista de
propiedad, sprite dos D, y
vamos a buscar fotogramas H.
Entonces haz doble clic en eso. Bien, y luego repita los
pasos para pista de propiedad, sprite dos cuadros D, V, pista de
propiedad,
sprite dos textura D. Y en la parte inferior derecha, habilite el
ajuste aquí mismo y luego cambie el
tiempo de captura a 0.1 segundos. Entonces, un fotograma por
décima de segundo. Y por último, a la derecha, queremos cambiar esto a 0.4 segundos de duración total
y habilitar el looping Bien. En la línea de tiempo aquí, vuelve al inicio
de la animación, haz clic
derecho en insertar una tecla. Entonces tenemos nuestros marcos H. Queremos tomar eso,
y en la parte superior derecha, cambiamos eso a cuatro. Y luego VFrames
queremos insertar una clave. Dejamos eso como uno aquí arriba. Haga clic derecho en insertar un marco. Entonces ese va a
ser nuestro primer marco. No te preocupes por cómo muestra los cuatro fotogramas a la vez que
se arreglarán automáticamente en un segundo. Y luego queremos
hacer click derecho e insertar una clave para nuestra textura, que puedes ver
en la parte superior derecha
ya está por defecto a
nuestra animación aquí Así que aún no hemos reproducido
la animación, así que sigue mostrando cuatro
fotogramas, pero en cuanto juegue, va a mostrar el primer
fotograma de la animación inactiva,
y la sección de fotogramas de
aquí abajo se actualiza automáticamente
a lo que esperaríamos. Entonces ahora queremos
ir a 0.1 segundos. Debe ajustar intervalos de 2.1
segundos, y luego hacer clic derecho y especie
de clave para fotograma y luego cambiarlo en la parte superior
derecha a uno aquí arriba. Entonces ese es el segundo
fotograma de animación. Luego agregue el valor de
fotograma de dos, que es el tercer fotograma
aquí arriba y el último
fotograma de valor tres, que representa el
cuarto fotograma de animación. Bien, ahora, si estamos en juego, deberíamos tener nuestra animación
ociosa. Y para el simple
superviviente como personaje, sólo
vamos a
hacerlo de cara a izquierda y derecha. Así que solo necesitamos un nodo
volteando en estas animaciones individuales para ya sea hacia la
izquierda y hacia la derecha Entonces porque esto es para un
simple superviviente como juego, solo lo
estamos teniendo
cara izquierda y derecha. Entonces solo necesitaremos agregar
un nodo volteante más adelante. Y aparte de
eso, solo necesitamos nuestras animaciones de ejecución ociosa y
muerte. Y eso es prácticamente todo a menos que un personaje necesite una animación de ataque
especial. Así que vamos a duplicar
la animación inactiva, y vamos a poner en
nuestra animación de ejecución. Para la animación de ejecución, queremos
tomar la textura aquí abajo y cambiar el valor y la
parte superior derecha a la hoja de ejecución. Así que corre y
arrastra eso hacia arriba a la derecha. Bien. Y eso son seis
fotogramas de animación. Entonces queremos tomar cuadros H
aquí y cambiarlo a seis. Y luego queremos agregar en el
fotograma cinco y el fotograma seis aquí. Y así la clave cambia
este valor y la parte superior derecha a
cuatro, inserta una clave, cambia este valor a cinco, y luego toma la duración de la animación de ejecución y
hazla 0.6 segundos, presiona play, y deberíamos
tener nuestra animación de ejecución. Ahora, creo que está
compensado incorrectamente, algo así como lo fue el ídolo a
la carrera del jugador. Así que vamos a necesitar hacer
ese ajuste de compensación, también. Entonces vamos al ídolo. Vamos a mover a este personaje hacia arriba. Asegúrate de seleccionar
el nodo sprite específicamente. Después pulsa W para ir al
modo de movimiento y mover el sprite hacia arriba para que el punto 00 quede
centrado en sus pies aquí abajo Donde sea que sea centro de gravedad donde toque
el suelo debería estar. Y luego ir a transformar a
la derecha e insertar un fotograma clave Entonces tengo 14
píxeles negativos como la posición Y. Fotograma clave eso, presiona Crear y solo tienes la pista de
reinicio. Eso está bien. Y ahora también necesitamos
fotogramas clave de la carrera. Entonces para correr, vamos
a ir a la parte superior derecha, y lo haré
Probemos 27 píxeles negativos. Intentemos 30 píxeles negativos. Me imaginé que estos están configurados de la misma manera
que el jugador era, mismo artista y todo eso.
Así que vamos a fotogramas clave esto Y crear. Y tenemos
nuestra animación de carrera. Ahora,
cambiemos rápidamente a Idol. Bien, entonces ahora tenemos nuestra animación de
ejecución jugando. Cambiemos rápidamente
a Idle y juegue. Y parece que
los píxeles se alinean. Tendremos que probar ese juego
final, claro, si realmente vamos a
mostrar la animación Idle. En este caso, sin embargo, es
posible que en realidad nunca mostremos la animación Idle a menos la animación Idle a menos que
el enemigo deje de correr hacia el jugador. Pero idea, al menos con esta
configuración va a ser que el enemigo siempre esté
corriendo hacia el jugador mientras
el jugador exista. Así que tal vez nunca
veamos realmente la animación ociosa. Le correspondería a usted. A lo mejor
cuando el jugador es derrotado, los personajes apenas
empiezan a ralentí en vez de moverse más por la pantalla porque no hay
más jugador para pelear Pero eso solo sería como
un extra que realmente no se requiere. Sin embargo, lo que sí necesitamos es la animación de la muerte. Así que vamos
a correr porque creo que la
animación de la muerte es de seis fotogramas, y vamos
a duplicar esto para hacer una animación de muerte
así que escribe Death Enter. Vamos a
apagar el looping para esto. Los personajes solo mueren una vez. Entonces queremos tomar
la textura y cambiarla a la
hoja de sprite de la muerte en la parte inferior izquierda Arrastra eso al inspector
y vamos a darle a play ahí. Y entonces si cambiamos a inactivo, parece que se alineara y
corre parece que se alineara. Bien, entonces eso probablemente sea bueno. Supongo que la posición sobre
la muerte es negativa 30. En fin, tenemos a nuestro Oc. Podemos simplemente meter a un orco
en el mundo del juego. Entonces, llevemos a orco aquí. Y en realidad, probablemente
queremos como enemigos jerarquía, así que voy a hacer clic derecho
insertar un nodo. Entonces nodo dos D, vamos a hacer enemigos o incluso podríamos ser
solo NPCs si queremos A lo mejor los enemigos es mejor. Y voy a
dejar caer un orco de abajo a la izquierda. Bajo enemigos. Entonces podemos ver que en realidad aún no está mostrando la animación. Entonces voy a golpear
Open y Editor, y vamos a ver
qué pasa con eso. Probablemente necesitamos, como,
establecer una animación predeterminada. Entonces podría tomar la muerte
y cambiar eso a ocioso. Vamos por defecto como inactivo. ¿Bien? Hit play. Volvamos
al mundo del juego. ¿Eso arregla esto? Supongo que no. Bien, entonces como
eso no está funcionando, deberíamos ir al reset. Animación. Entonces esto es cuando no estás
reproduciendo una animación, se restablece a estos valores Y podemos ver que
el He enmarca aquí, si miramos en la parte superior derecha en realidad
se establece en uno. Entonces si pusimos eso a cuatro, y supongo que ahora pulsamos
play en el reset, entonces esto es lo que deberíamos ver si volvemos
al mundo del juego. Así que guarda tu escena orca,
ve al mundo del juego, y bien, ahora se
ve correcta Entonces voy a golpear W
y mover la c. Bien, y luego vamos a solo Control D, duplicar unos cs más. Y entonces creo que
lo último que queremos hacer aquí es tomar enemigos y habilitar en
ordenar y ordenar habilitado. Como esto es evidente
para todos los orcos, sí
queremos que los orcos se
ordenen entre sí, también Eso podría ser necesario. Entonces eso podría ser
necesario para establecer ahí. Bien, entonces nuestras lanzas pueden moverse, pero en
realidad no pueden golpear nada No hemos configurado una caja de impacto, y nuestros orcos pueden existir, pero no tienen caja de HRT
para realmente recibir daños Por lo que las cajas de HRT y las cajas de golpe y Gadot D van
a ser el Área dos Ds Si vienes
de la unidad,
sería más como una zona de activación. Vamos a Spear
y crearemos un Área dos D que
haremos como nuestro hit box Entonces voy a hacer clic derecho sobre la lanza agregar nodo hijo, Área dos D, y voy a renombrar esto
rápidamente para ser golpeado cuadro dos D. Vamos a hacer clic derecho en
él, adjuntar un script Ahora bien, esto va a ir
probablemente en más como la raíz. Entonces déjame ver.
Supongo que ponerlo en la carpeta de armas tiene sentido
aquí y vamos a golpear abierto. Entonces vamos a crear el guión
en weapon Hit Box two D. Create dale el
nombre de clase Hit box two D. Bien, entonces en nuestro script de caja HIT, queremos conectarnos inmediatamente
a la señal que ya tiene
el área, que es área Porque lo que estamos
tratando de verificar es si entramos en el
área de una casilla RT. Entonces, si hacemos función subrayado
listo, luego en listo, podemos hacer área
ingresada punto connect, y vamos a
conectarlo a on area ingresada, que es una función que
estamos a punto de configurar Así que crea
subrayado de función en, área Ingresada. Esto va a recibir y el
área dos D es el parámetro. Entonces área P área dos D y
retorno tipo de v Bien, entonces un área ingresó a esta área, ¿
qué tipo de áreas nos importan? Nos importan las cajas
específicamente lastimadas. Entonces, si el área P es una caja Hurt dos D y el
tipo aún no existe, entonces debería ser una época aquí. Entonces por ahora,
podríamos decir algo así como impresiones entonces por ahora mismo, podríamos decir algo
como Prance, que va a imprimir un
mensaje a la consola ¿Por qué no lo intentamos así? Porcentaje s y comillas significa que vamos a
reemplazar esto con una cadena. Por ciento de aciertos. Incluso podríamos decir en posición, porcentajes, y luego
vamos a reemplazar esas cadenas usando
otro signo de porcentaje Y tenemos tres cuerdas que necesitamos reemplazar
dentro de esa cadena. Así que vamos a
pasar en una matriz de valores que queremos hacer
para el reemplazo. Entonces el primero va
a ser, digamos yo solo. Entonces vamos a
conseguir la caja Hit, que va a golpear
la caja de Hurt del área P. Y entonces vamos a
decir que la posición es la posición global
del punto del área P. Entonces un Área dos D
sigue en el nodo dos D, por lo que todavía tiene una posición
global. Eso funcionará
solo por recoger que nuestro hit box en realidad está
golpeando el cuadro de HRT Bien, ahora necesitamos
hacer una caja RT en el Oc. Así que vamos al Oc y voy a
hacer click derecho aquí y crear un nodo Ágil Área dos D. Vamos a renombrar esto
para que sea Hurt Box, y voy a
capitalizar la B para caja Dos D. Vamos a
darle clic derecho, adjuntar un guión. Vamos a querer
lastimar a la Caja dos D. Eso solo puede ir en tal vez
personajes por ahora. No vamos a tener realmente
ningún objeto destructible, al
menos en esta demo Entonces podrías argumentar, Bien, esto pertenece más
a la carpeta de objetos, o tal vez estés organizando
tus scripts por completo en una carpeta de scripts que
contiene específicamente scripts. La
organización depende de usted. Así es
como estoy haciendo las cosas. Entonces los personajes
recortan Hurt Box dos D, nosotros la crearemos ahí Bien, ahora este guión, tenemos que llamarlo nombre de
clase Hurt Box
dos D. Por ahora mismo, no
vamos a cambiar
nada más al respecto. Solo queremos esa etiqueta
identificadora, Hurt Box two D. Ahora, la caja Hurt, puedes ver que también necesita una
forma de colisión. Así que hagamos clic derecho y agreguemos un nodo hijo, forma de colisión. Y luego a la derecha,
voy a crear una
nueva forma de círculo. Así podremos definir dónde se puede golpear a
este personaje. Así que podría golpear W y moverlo hacia arriba. Podemos simplemente hacerlo un
poco grande aquí. Entonces, si lo hago más grande, algo
así, estaría bien. También podría preferir
una forma de cápsula. Entonces, si seleccionamos
la forma de
la cápsula también podría preferir una forma de
cápsula aquí. Entonces, si hacemos una forma de cápsula, que es más como un humanoide, entonces podemos seleccionar la forma de
cápsula Y luego por aquí, solo
podemos darle a W, moverlo aquí arriba. Esto sería bueno si quieres, todos los píxeles
que se muestran en pantalla para que el k
sea realmente áreas dañables Entonces podrías hacer ese argumento. Y entonces solo queremos que esto sea un hijo
de la caja Hurt tot Y entonces nuestro orco también
necesita una forma de colisión. Entonces, ¿dónde pueden
chocar los pies por la c? Entonces eso va a tener
más sentido como forma de
círculo aquí. Y luego nos fijamos
en los pies orcos. Vamos a encogerlo
aquí abajo, algo así. Entonces, si elegimos
tener colisiones entre nuestros orcos y otros
orcos u orcos y el jugador, otros apoyos y el objeto,
entonces esta es la forma que en realidad
estaríamos usando para eso realidad
estaríamos Ahora, si quieres que tus
enemigos choquen con otros enemigos y
jugadores y cosas así cuando se mueven
usando move and slide, eso es algo que
un cuerpo de personaje dos D puede hacer fuera de la caja Pero va a tener un costo de rendimiento
asociado a eso,
ya que en realidad se trata de calcular movimiento basado en la física. Si quieres obtener el máximo número de
caracteres en pantalla, podrías considerar usar
translate en su lugar, igual que hicimos con la lanza, que significa que solo se va
a mover independientemente de lo que esté pantalla
en la dirección en la
que esté tratando de moverse Así que manteniéndolo lo más tonto, simple posible, depende de ti lo que
quieras al final del día Y cuántos miles de enemigos necesitas
en pantalla a la vez. Bien, entonces antes de que terminemos esto, creo que la lanza también necesita una forma de colisión
para el hit box Entonces voy a hacer click derecho
aquí, agregar un nodo hijo, colisión forma dos D.
Vamos por encima de la parte superior derecha. Hagamos de esto una forma de círculo, y luego tomaremos la
forma del círculo y la moveremos hacia arriba hasta la punta de la lanza y la
encogeremos, algo así Tal vez prefieras que
tenga forma de cápsula. Depende de lo
quisquilloso que quieras ser. La cápsula
obviamente podría ser más ovalada o menos
de un círculo puro. O tal vez incluso sólo un rectángulo. Entonces, si quieres ir
con un rectángulo, podrías hacer, digamos, forma de
rectángulo aquí arriba,
encoger los lados así, derribar esto, y
tal vez así. Entonces, usando una especie de la forma primitiva
más simple aquí como sea posible para el hit box mientras se
sigue tratando mantener la forma real de
mantener la forma real del sprite donde
tenga sentido Entonces creo que esto
sería bastante bueno. No creo que nadie
realmente se diera cuenta mucho de que, ya
sabes, tal vez esta mitad de
la lanza no ha golpeado aquí Si realmente
quisieras ser quisquilloso, podrías hacerlo así Y si, tal vez eso
sería un poco mejor. Sólo un poco
menos de posibilidades de que lo golpee podría deslizarse por el
borde de aquí a la izquierda. Una vez más, uno de esos más, pruébalo y obtén una idea de cómo está funcionando tipo de cosas y mira si es adecuado para
tu juego o no. adelante y
ejecutemos el juego ahora, e intentaremos que los orcos golpeen con esos proyectiles Entonces veamos no se puede
instanciar un nulo. Nivel. Bien. Entonces ahora mismo, el proyectil ya no está
puesto en el arma dos D.
Eso es interesante. Vamos al jugador, y
voy a tomar el arma dos D. Podemos ver que la definición de
arma se establece aquí. Si explico el arma dos D, saltemos a la definición de
arma. Entonces tenemos el símbolo de buscar. A lo mejor me moví el arma.
A ver. ¿Dónde está Spear? Accidentalmente moví la lanza de la lanza de armas a esta carpeta
diferente Entonces,
volvamos eso a las armas. Bien,
ahora va a funcionar bien. Vamos a golpear a Load. Bien, y luego
tenemos las lanzas. Entonces vamos a la salida. Voy a
bajar esto un poco estos orcos en
realidad están siendo golpeados por la
lanza, lo cual es bueno Podemos ver la posición
en la que ocurrió eso. La información del hit box
no es muy útil, pero al menos sabemos qué
tipo está golpeando a qué tipo. Si fuera un tipo de área completamente
diferente, diría el
nombre de la clase para ello aquí. Y eso está funcionando más o menos.
16. Infligir daño a enemigos con hits boxes y estadísticas: Las cajas de golpe y
las cajas de daño están funcionando lo suficiente como para que podamos recoger
el golpe en la caja de HRT, que va a ser
el comienzo de infligir daño a nuestros enemigos orcos Entonces en este video, necesitamos
configurar las estadísticas para el
orco y asegurarnos que estamos pasando un daño golpear al orco que
va a recibir Una gran parte de este
tutorial va a
ser definir las
estadísticas de la lanza, las estadísticas del
orco, y establecer la interacción entre
los dos Entonces, si saltamos al guión del
proyectil, queremos que el proyectil
responda cuando la caja de impacto golpee la caja Hurt pasando
el daño del proyectil sobre
la caja
herida y Entonces voy a poner un en
export var para cajas de aciertos. Esto va a ser una matriz
de hit box dos D. Bien. Ahora, los que quiero asignar en la inspección Así que si hago clic
en Spear array dos D, la matriz de
cajas de hit está por aquí Necesitamos aumentar
su tamaño a uno, hacer clic en un signo en
el primer elemento y luego elegir Hit box. Por lo que ahora tenemos una referencia a la caja de impactos para el proyectil
dentro del guión Está hecho como una matriz porque algunas armas en realidad pueden
tener dos o más cajas de impacto. Entonces solo hacemos de eso una
opción desde el inicio aquí. Y lo que vamos
a hacer es conectarnos a cada señal de caja de impacto impactar para que nuestro proyectil
pueda infligir el daño. Así que vamos a hacer clic derecho en la casilla de
golpe dos D. Símbolo aquí, hacer símbolo Lou, y esto saltará
al guión de hit box. Entonces, en lugar de
imprimir que
golpeamos, en realidad queremos
emitir que golpeamos. Así que vamos a crear una
señal golpeada aquí arriba. Siempre que el cuadro de aciertos
reconozca un hit, entonces pasaremos en
el objetivo que golpeemos o la caja lastimada
que golpeemos en este caso. Entonces diremos Hurt box aquí es un tipo de rt box dos D. Bien. Y así, en vez de imprimir aquí, voy a cortar eso, y
voy a decir hit dot EMIT, y vamos a pasar
eso con el área P como un Hurt Box dos D. Así que ahora si vamos al guión
del proyectil, podemos simplemente conectarnos a
esa señal en listo Entonces hagámoslo antes de
hacer la porción de espera. Primero, diremos afirmar
hit booxes dot vacío. Entonces no queremos
que eso sea cierto. Entonces podríamos decir
igual, igual a falso, y decir que necesita al menos un cuadro de
aciertos para golpear un objetivo. Ahora bien, esto
depende un
poco de cuál sea tu intención. Teóricamente podrías tener un proyectil que
no necesita golpear Entonces esta afirmación podría no ser
necesaria, pero para nuestro juego, sí
queremos que los proyectiles
puedan
infligir daño a objetivos enemigos Entonces vamos a dejar
esa afirmación ahí dentro. Y así después de nuestras aseveraciones, podemos decir cuatro cajas y
cajas de golpe Vamos a decir box
dot hit dot Connect, y podríamos decir en hit box hit. Así que vamos a
conectar esa señal a una nueva función que estamos escribiendo aquí
abajo. Entonces función en Hit Box
Hit va a tomar una caja P Hurt podría hacer cuadro de subrayado de HRT si queremos ser
más consistentes Y eso va a
ser de tipo Hurt Box dos D y retorno nulo. Bien, entonces con la caja de HRT, vamos a llamar,
digamos, caja P Hurt Digamos punto DL daño, y la cantidad
va a estar basada en nuestros cálculos aquí mismo. Entonces, ¿de dónde sacamos los
daños a calcular? Bueno, vamos a declarar aquí
el daño final. Y pondremos eso en
diez por ahora mismo. Y esto será un entero. Por lo que todo el daño y HP en el juego
estarán basados en enteros. Sólo para que sea
simple, técnicamente, podrías hacer una fracción de una unidad de daño, pero
eso es bastante confuso. La mayoría de los juegos
solo usarán enteros. Bien, entonces diremos que tratamos
con el daño final aquí, y luego nos preocuparemos por el cálculo del
daño. Entonces podríamos decir, para hacer Cálculo de
Daños. Bien, entonces ahora nuestra caja de daño, queremos agregar ese método de
infligir daño. Pasemos a Hurt Box. Entonces voy a decir función
infligen daño, y pasaremos el
daño de un entero. Oh, podríamos poner un
tipo de retorno aquí ahora mismo, solo lo
devolveré
como nulo porque
estamos esperando que el daño que
infligamos sea el
daño que recibe. Estamos calculando en
el guión del proyectil
más que en el guión de la caja
Hurt, en este caso Vamos a cambiarlo
a un tipo de retorno booleano. Entonces voy a decir trata de
infligir daño aquí. El motivo de ello es
que vamos a hacer una
condición de que sea posible que las estadísticas
sean imposibles de golpear, así que tendremos eso manejado aquí. Entonces el último punto de falla de
si realmente va a recibir el daño será la
invencibilidad en las estadísticas Entonces supongo que eso tiene más sentido desde el punto de vista de la caja. Entonces diremos, si no, se puede golpear
un
punto del controlador de estadísticas, luego devolveremos false. Ahora bien, las estadísticas son donde
estamos aplicando el daño. Se va a administrar las
estadísticas de tiempo de ejecución para el personaje. Así que vamos a necesitar
configurarlo todo en un minuto. Entonces ahora probablemente sería el momento
adecuado para configurarlo. Así que aquí arriba en la parte superior,
vamos a querer en Export VR, una referencia de controlador de pila. Por lo que este será de
tipo controlador de pila. Entonces crearemos un
nuevo script con. Pasemos a la
escena de la organización en dos vistas D, y vamos a hacer clic derecho en
ella y agregar un nodo hijo. Entonces este va a
ser un nodo regular. No es un espacio de posición. Este es un gestor de estadísticas, así que es todo base de datos. Por lo tanto, es un
nodo, no un nodo TD. Y lo llamaremos
Stat Controller. Todo derecho haga clic aquí.
Vamos a adjuntar un guión. Entonces el nombre del mismo
solo será Sat Controller, y lo pondremos en la carpeta del
personaje porque nuestro
personaje principal también tendrá un controlador de pila.
Vamos a crear el guión. Voy a poner en el nombre de la clase, y voy a controlar el controlador
vPasteDN Stat porque copié eso
del otro script Esto administra las
estadísticas de tiempo de ejecución de un objeto. Así que vamos a
tener cosas como VaraHP que es un entero, y podemos establecer eso en una cantidad
predeterminada tal vez 100 También tenemos Var Max HP,
que puede ser lo mismo. La idea será que el HP
nunca se pueda poner por encima del MX HP. Entonces, si solo quieres
encargarte de eso ahora mismo, vamos a poner otro cool
aquí al final, y voy a decir valor establecido. Entonces HP va a ser igual a los hombres del valor
y al MaxHP Bien, entonces esto de aquí
solo lo limita para que alguna vez
puedas poner el HP
por encima del MaxHP También podríamos querer una variable
para es el objeto vivo. Entonces vamos a decir lejos en vivo,
esto va a ser un booleano. Va a ser por defecto a true. Y entonces necesitamos esa función que estábamos recibiendo
un error. Entonces si marco Hitbox, ahí está la función can be hit Tenemos que poner en práctica eso. Entonces vamos a Stat Controller. La función puede ser golpeada, que va a
devolver un booleano Para que podamos poner aquí
las condiciones que queramos. Por ahora, vamos
a decir, volveremos en vivo. Entonces, si el personaje está
vivo, puede ser golpeado. De lo contrario, no se puede golpear. Así que de vuelta por aquí,
si está vivo, entonces podrá ser golpeado, pero esto está invirtiendo
eso con la k Así que
si no está vivo,
entonces regresamos falso. que
si no está vivo,
entonces regresamos falso Básicamente. Ahora, aquí abajo, vamos a decir retorno verdadero porque asumimos
que en este punto, sí hizo daño porque se cumplieron
las condiciones. Ya pasamos
la cláusula de Guardia. Entonces queremos tomar
el controlador SAP, y queremos tomar su HP y queremos
configurarlo al nuevo valor. Tal vez queramos calcular
eso justo encima de él. Y como variable local. Entonces nuevo HP va
a ser igual a stat controller dot HP menos es igual al daño o
simplemente menos, en realidad. Entonces la asignación en realidad está por aquí a la
izquierda del nuevo HP. Entonces configuramos el HP del
controlador de estadísticas al nuevo HP, y volveremos true. También podemos querer poner aquí como una señal
que emite el cuadro Rt, que también
sería una señal de acierto Bien, así que quiero
probarlo todo hasta el momento. Voy a establecer un
punto de quiebre por aquí a
la izquierda para que
podamos golpear eso en Debug si el arma logra
dañar al personaje. Entonces, vamos a presionar Play y veamos
si funciona en este punto. Seguro que me faltan
un par de cosas. Entonces podemos ver en la parte inferior
aquí que infligir daño no existe porque
en realidad ahora es daño tri infligir. Entonces cambiamos el nombre y
luego volveremos a ejecutar esto. ¿Llegamos al punto de ruptura?
Llegamos hasta aquí. Se puede golpear el controlador de pila, pero en realidad no
asignamos el
controlador de pila a la caja RT. Entonces este podría ser otro
caso en el que queremos afirmar en la parte superior que el controlador SAT
en realidad se ha configurado Por lo tanto, asert stat controller
no es igual a null. La caja de HRT necesita en la
referencia del controlador para efectuar el efecto. Por lo que la Caja HRT necesita una
referencia al controlador SAT para que pueda cambiar sus
estadísticas. Entonces vamos a ver. Si vamos a TD View, modo
Local aquí arriba, y luego hacemos clic en el RT Box, simplemente
asignaremos a la derecha
el controlador de pila de aquí. En caso de que nos olvidemos en algún
momento con alguna caja lastimada, tenemos la afirmación de tener
un respaldo para atraparnos Así que vamos a correr esto una vez más. Vamos a darle a eso y ya ves que
hemos vuelto verdad. También se puede ver
en la parte inferior que el nuevo HP se ha establecido en 90. Nuestro HP base para el controlador
stat es 100, así que 100 menos diez, obtenemos 90, así que sabemos que eso
en realidad se está actualizando correctamente. Y lo siguiente que haremos
al inicio de Next video va a ser configurar
la máquina de estado orco para
que podamos pasar
de vivos a muertos una vez el HP baje a cero y luego sacar al
orco de la escena
17. Estado de muerte cuando el enemigo alcanza los 0 HP: Ahora queremos montar una
máquina estatal para nuestros enemigos. Va a ser
increíblemente sencillo. Sólo habrá dos
estados del bate, que van a ser el estado de movimiento o el
estado de muerte, que lo despeja del juego Así que vamos a hacer clic derecho sobre
Oc agregar un nodo hijo. Voy a decir HSM aquí, y vamos a
agarrar el Limbo Podríamos
renombrar esto para que sea Enemy HSM, y luego voy a
hacer click derecho sobre él, adjuntar un guión Entonces esto irá directo a
la carpeta de enemigos
slash enemyShsm Eso vamos a crear. Establezca
la cima aquí. Enemigo HSM. Esta es la máquina estatal para
los enemigos dentro del Bien, así que mirando al jugador HSM, aquí
va a ser
muy similar Creo que porque en realidad
cambiamos a Blackboard, ese guión ya no necesita una referencia al reproductor de
animación directamente, lo cual sería correcto si miro por aquí en el plan de
Blackboard No hace falta
la segunda referencia. Así que en realidad puedo
cortar eso ahí mismo. Entonces vamos a
copiar este código del jugador HSM
al guión HSM enemigo Entonces digamos que
en lugar de jugador, este va a
ser un guión de NPC, que podría tener sus
estadísticas establecidas en él Entonces NPC de tipo NPC aseveran
que el NPC no es nulo. Entonces, el agente NPC debe
estar configurado en el HSM, y lo inicializaremos
con el Así que solo un poco cambiando
los nombres aquí principalmente. Entonces el guión de NPC, pasemos a la escena
orca a D View Y vamos a
querer hacer clic en OC, adjuntar un guión. Vamos a decir que esto es NPC, y lo pondremos en personajes
no en personaje slash Enemigo, o podría ser en
enemigos hasta ti Crearemos este script
para el cuerpo del personaje. Y llamemos a esto
ClassName NPC. Entonces el NPC solo
tendrá una referencia fácil al controlador
de pila Para que no
necesitemos necesariamente hacer
referencia a esas dos
cosas por separado. Dentro de la máquina de estado, es bastante conveniente
acceder a las propiedades del
agente porque siempre sabes que el agente va
a estar ahí en cualquier
script de máquina de estado una vez que lo hayas inicializado en
la máquina de estado Entonces, si exportamos estadísticas
VAR aquí, y luego diremos controlador de
pila, entonces podemos hacer referencia a eso súper fácil dentro de la máquina de
estado, también. Entonces por aquí a la derecha,
asignamos el controlador de pila, y ahora dentro del HSM enemigo, los errores deberían
desaparecer siempre y cuando hagamos clic en Enemy HSM.
Bueno, esto no está bien. Se supone que diga NPC. Entonces solo necesitamos reiniciar
el proyecto Cadle,
ir a Proyecto, recargar Bien, y eso
debería arreglarlo. Entonces ahora asignamos al
orco, que es el NPC, y tenemos una referencia tanto al agente como a las estadísticas,
y eso debería ser la mayor parte de lo que
necesitamos para nuestra máquina estatal Bien, así que hagamos
clic derecho sobre el HSM enemigo. Voy a añadir un nodo hijo. Y hagamos un estado de limbo. Podría cambiar el nombre de esto y decir algo así como NPC move state Bueno, haga clic derecho adjuntar
un guión. Crear. Bien, entonces a continuación, vamos a crear
un estado de Chase para el enemigo. Aquí será donde va a estar
la lógica central para que
nuestro personaje se mueva hacia
el jugador, además de jugar
la animación de carrera tan pronto
como la
tengamos en el estado. Entonces voy a hacer clic derecho
sobre el HSM enemigo. Agreguemos un
nodo hijo, un estado Limbo. Voy a renombrarlo Chase State. Y voy a hacer click derecho
aquí, adjuntar un guión. Entonces Chase estado que probablemente
pertenezca a un enemigo. Voy a golpear Crear. Bien. Vamos a darle un nombre de
clase en la parte superior ,
Chase State, y
le daremos un comentario. Entonces esto va
a terminar corriendo hacia el jugador donde
sea que esté en el juego. Por ahora, sólo
vamos a hacer que reproduzca la animación. Configuraremos una transición
del estado de Chase
al estado de muerte y
solo nos aseguraremos de que nuestro personaje
caiga a cero HP haga que el enemigo viva
dentro del juego. Entonces diremos
subrayado de función, Enter. Cuando entramos, queremos
reproducir la animación de ejecución. Así que incluso podemos hacer la configuración de
subrayado de función, y luego vamos a
conseguir ese reproductor de animación Hasta el momento, subrayado
reproductor de animación de tipo reproductor de animación, y vamos a conseguir
eso de la pizarra, tal como hicimos
con el Así reproductor de animación es igual a punto
de pizarra obtener var. Y estamos buscando el jugador de
animación de citas finales, y queremos quejarnos
si no lo encontramos Entonces tenemos el reproductor de animación. Cuando entramos al estado,
jugamos la animación. Así que vamos a decir guión bajo animación jugador punto play, y queremos
reproducir la animación que definimos aquí arriba en la parte superior Hagámoslo en Export var. Digamos animación de Chase. Claro. Y ese
será un nombre de cadena. Lo voy a ejecutar por defecto. Y luego copiamos
esto hasta aquí abajo. Entonces tocamos la animación correcta
cuando entramos al estado. Bien, y nuestro HSM Enemigo, ya
lo inicializamos Ya lo activamos. Entonces probablemente va a funcionar. Entonces podemos ver si corre ahora. Vamos a entrar en el modo de juego. Oh, no hemos puesto el
reproductor de animación en la
Pizarra, claro Entonces nos dice enseguida
que hubo un problema. Eso es bueno. Haga clic en Enemy HSM, vaya al plan Blackboard y hagamos Nuevo plan de
Blackboard,
administrarlo, agregar un reproductor de animación variable Elija el tipo de ruta de
nodo. Golpea Bien. Y ahora un
reproductor de animación queremos asignarle el reproductor de animación del o y ahora podemos usarlo
dentro de nuestros estados. Bien, pulsa Reproducir de nuevo. Y veamos si nuestros orcos
están corriendo. Todos lo son. Eso es genial. Entonces
necesitamos nuestro estado de muerte, y necesitamos
establecer nuestra transición. Entonces voy a
hacer click derecho sobre Enemy HSM, agregar un nodo hijo, que
va a ser Limbo State Renombrar esto a Estado de la Muerte. Haga clic derecho, adjunte un
guión, presione Crear. Lo llamaremos
Estado de la Muerte en la cima. Entonces nombre de clase Death State. Bien, ahora en nuestro estado de muerte, también
necesitamos reproducir
una animación muy similar a la que hicimos
en el estado de Chase. Este es
un código que vamos
a repetir aquí, pero debido a que solo estamos haciendo algunos estados para nuestro juego, creo que hacer
cosas como hacer una nueva clase base es un
poco demasiado extra
en este momento. Así que sólo voy
a copiar esto de nuevo. Al estado de la muerte.
Bueno, pega eso en. Y solo podría
decir que la animación aquí que queremos
para el estado de muerte está por defecto a muerte, y conseguimos que la animación se
reproduzca de la misma manera Pero entonces queremos reproducir
la animación por aquí. Y como no estamos
usando un estado base, no
tenemos que
preocuparnos por cosas como llamar a Super para asegurarnos de que el
código de estado de animación realmente se ejecute porque ambos
van a usar setup, y
ambos van a usar Enter. Si declaras una nueva
configuración o función Enter, realidad anula
lo que esté en la clase base
si olvidas llamar a
Super y por cierto, llamarías a Super así Super solo significa que
sea cual sea la clase padre, la
ejecutas en
este momento. Entonces puedes ver que es un
poco complicado y confuso usar ese tipo
de herencia directa. Si tienes como cinco o
diez estados diferentes que todos son estados de animación
porque todos juegan
en animación exactamente de la misma manera, entonces vale la pena
tener eso. Pero literalmente
solo vamos a tener Chase y la muerte,
así que es exagerado Pero Tay debería mencionar que esa es otra forma de
hacer las cosas, también. Entonces en el Inter,
básicamente queremos que nuestro personaje
sea invencible Por lo tanto, es posible que queramos hacer algo como agent dot stats dot LI, y queremos asegurarnos de
que esto esté configurado en false. Así que recuerda que cuando un
controlador de estadísticas no está vivo, entonces puede ser golpeado
va a devolver falso. Por lo que esto evitará que
golpeemos accidentalmente a un personaje que
se encuentra en su estado de muerte. También hacen algo así como,
digamos, función terminada, y declaramos esta función
para que realmente puedas llamarla desde la animación
u otros lugares. Y vamos a decir que
el agente necesita u libre. Entonces agente Qu libre. Entonces esto básicamente significa
la ruta Aosne la org. Vamos a liberarlo y
todo lo que hay dentro de él. Cuando llamamos al método
terminado. Así que ahora podemos ir a dos
D view reproductor de animación aquí
abajo en la parte inferior. Vamos a ir a
la animación de la muerte. Acercamos la línea de tiempo,
vamos al final aquí. Nosotros agregaremos Track, call method track
sobre el estado de la muerte. Y luego vamos a hacer click
derecho aquí abajo, insertar una clave, y vamos a buscar ese
método terminado que acabamos de crear. Entonces, esto quiere decir que cuando termine nuestra animación de
muerte, va a llamar terminada
terminada en el
estado de muerte va a liberar
al agente tan pronto como el frame renderizado
y todo lo demás se resuelva. Por lo general,
llamarías trimestre, no gratis,
congelación gratuita de inmediato, y el trimestre espera a que
otras operaciones
se resuelvan adecuadamente Así que esto en realidad
reduciría la cantidad de errores
extraños que podrías
obtener cuando te cuesta qu. Bien, entonces
lo último que tenemos que hacer es saltar al HSM enemigo Vamos a crear una nueva función
para las transiciones de configuración, que devolverá void. Entonces queremos agregar
una transición de
nuestro estado de persecución a estado muerte cuando se emite el evento de
muerte. Entonces cuando declaras un
evento aquí así,
esto es solo una cadena a la que nuestro
sistema va
a responder podríamos subir aquí y
crear un evento de muerte constante. Va a ser un nombre de
cadena igual a que solo haremos
la muerte en minúsculas, pegaremos eso
ahí abajo, y podremos conectarnos a las estadísticas de
nuestro agente así Digamos que las estadísticas de puntos de NPC
dot Alive cambiaron. No hemos creado esta señal, pero voy a seguir adelante y
saltar aquí, así que conéctate. El subrayado en NPC Alive cambió. Bien, así que voy
a copiar esto abajo a la función de abajo pegar
en NPC live cambiado, y esto va a
tener el nuevo valor Así que vivo es un booleano. Podría decir P para parámetro
si nos gusta aquí. Normalmente me gusta
hacer eso. Y esto va a estar devolviendo
una especie de vacío. Entonces, cuando el PNJ ya
no esté vivo, entonces quiero emitir
el evento de la muerte Entonces si P vivo es igual a falso, entonces vamos a
despachar el suceso de muerte. Bien. Y cuando
añadimos la transición, eso quiere decir que
esta transición
va a ocurrir cuando ocurra
este suceso de muerte. Ahora, todavía nos está dando un mensaje de
error porque no
tenemos la referencia del estado Chase o el
estado de muerte aquí en la parte superior. Entonces solo podemos decir en
export var Chase state, que es un estado limbo, y en export var death state, que es un estado limbo Ahora guarda el guión
en el inspector. Podemos asignar el estado de Chase
y asignar el estado de muerte. Y ahora, una vez que llamamos transiciones de
configuración, va a manejar la
gestión de estas transiciones. Creo que queremos llamar a
eso antes de inicializar, o tal vez justo después Hagámoslo justo después. Así que
subraye las transiciones de configuración A eso lo llamamos.
Configuramos nuestras transiciones. No debería haber necesidad de crear un estado de muerte para perseguir estado porque actualmente no tenemos
enemigos que vuelvan
a la vida, aunque, más tarde puedes
agregar ese tipo de cosas. Ciertamente, ese
sería un tema común, sobre todo para, como, enemigos
no-muertos Bien, entonces lo último para
que esto funcione muy rápido, ir a la escena de la lanza, y saltemos a la caja de éxitos, ¿
o es la lanza?
Bien, la lanza Y queremos tomar el
daño final y establecer esto en 100, por lo que será un golpe
igual a un orco derrotado Hit play, y veamos si todo
esto se junta. Entonces nos está dando un error.
No he creado eventos
cambiados en vivo en las estadísticas de NPC Haga clic derecho sobre el
símbolo NPC, vaya al símbolo Lou. Haga clic derecho sobre el
símbolo, símbolo Lou, haga clic
derecho en Stat
Controller, símbolo Lou. Bien, y aquí están nuestras estadísticas.
Vamos a crear la señal, así podríamos decir que la
señal en vivo cambió. Y esto va a pasar en el nuevo valor en vivo como booleano Volveremos aquí y asignaremos más señales, pero por ahora mismo, quiero asegurarme de
que esta señal emita cada vez que cambie un valor
en vivo Entonces voy a decir valor establecido. Entonces primero, vamos
a protegernos contra si el valor es el mismo que
el valor que se le establece. Entonces, si un vivo es igual, dos signos iguales al
valor simplemente volverán. De lo contrario, un vivo es igual a valor. Y luego finalmente, un punto
cambiado en vivo emite
con el nuevo valor. Entonces, ¿dónde queremos
calcular Alive? Bueno, un buen lugar para hacerlo
sería en este setter HP. Entonces cada vez que cambia el HP, queremos comprobar si el
personaje sigue vivo. Entonces eso solo
va a estar en vivo es igual a HP es
mayor que cero. Bien, así que eso se maneja. Ahora tenemos el evento cambiado en vivo. Todo esto debería activarse cuando
el personaje alcanza cero HP. Detengamos el juego
y volvamos a ejecutarlo y a ver si
le pegamos con un arma, así, ¿se quita el
personaje? ¿Va al estado de la muerte? Y podemos ver que
la respuesta es sí. Por lo que toma 100 de daño. HP llega a cero. Un live
se establece en false. La señal se emite. Y entonces eso significa sobre la máquina del estado enemigo que la transición desencadena
porque esta señal golpeó. Este parche en el HSM enemigo
emite el evento interno. Por lo que estos eventos de máquinas de estado
están separados de las señales. Estos son solo para
la máquina estatal en señales de IA del
limbo en el contexto
mayor de Gadot Entonces conseguimos ese evento de muerte
interna, y eso nos hace pasar del estado de
Chase al estado de la muerte. Dentro del estado de muerte, jugamos la animación muerte en Enter nos aseguramos que esto esté configurado en
falso aquí, aunque. En teoría, no
necesitarías hacer esto, pero no creo
que vaya a doler nada para asegurarnos de que si estamos jugando al estado de muerte, que el personaje ya no
esté vivo, creo que está bien. Y luego tenemos el método
terminado, que en realidad estamos
llamando desde la animación. Como viste antes, la animación de
muerte
aquí abajo lo llama justo
al final de nuestra animación, y así es como
hacemos que nuestros enemigos se vuelvan en vivo tan pronto
como bajen a cero HP. Entonces sé que hay un montón de
piezas que se juntan. Yo recomendaría
para esta parte si
aún no has estado descargando
las
instantáneas de las partes individuales que
sí tomas la de
este video si estás, ya las
instantáneas de las partes individuales que sabes, te encuentras con hipo y ves dónde tal vez tu
guión está un Entonces, lo que estamos haciendo aquí mismo con señales es el patrón de
observador. Es realmente útil cuando
quieres que una pieza de código responda a un cambio en una
pieza diferente de tu código. Y algo así como C Sharp, esto se llamaría eventos
y luego manejo de eventos. Pero en Gadot se
llama señales. Esencialmente, son
el mismo concepto, sin embargo. Entonces es patrón de
observador. Si quieres buscar
eso y leer más respecto. Así que eso va
a ser un envoltorio para esto
18. Rotación y apuntación de proyectiles con carga de armas: Bien, entonces en este video, vamos a
hacerlo para que nuestra lanza gire para mirar en la dirección
correcta después instanciar y que
podamos
lanzar la lanza en la dirección
correcta Entonces, cómo vamos a
necesitar configurarlo está dentro de nuestro guión de arma
dos D aquí. Entonces en nuestro juego como sobreviviente, probablemente
queramos
hacerlo para que un personaje pueda tener múltiples armas
al mismo tiempo. Por lo tanto, en realidad tiene
sentido tener algún tipo de gerente para
todas estas armas. Entonces podemos crear un guión de carga de
armas que sea evidente para
esta arma dos D, y podríamos usarlo como una forma de
muestra para
resolver cosas como la importación del jugador para nuestras
armas individualmente Entonces, hagamos clic derecho en el nodo del reproductor y
agreguemos un nuevo nodo hijo. Voy a llamar a este nodo dos D, y luego vamos
a renombrarlo
para que sea carga de armas. inmediato vamos a padre arma dos D a carga de arma aquí, y debería cambiar el nombre del arma
dos D para que sea simplemente como arma de
lanza dejando claro
lo que realmente sostiene Y luego hagamos clic en
Carga de armas y agreguemos un guión. Entonces esto va a ser la
carga de armas que puede ir en jugador, crear y luego en la parte superior,
haremos la carga de
armas de nombre de clase Entonces este va a
ser un guión de manager para todas las armas que
un jugador tenga equipado. Así que aquí podríamos simplemente tomar una referencia rápida a
la entrada del jugador. Bien, y ahora podemos ir al
guión de las armas de lanza, e vamos a insistir en que cada vez que
tengamos un arma de lanza, tenemos la dependencia de
que el padre es una carga de armas que será
consistente a lo largo Entonces creo que
la configuración está bien. Entonces voy a hacer var
underscore loadout aquí dentro de nuestras
armas dos guión D. Y esto será de
tipo armamento de armas. Entonces listo, vamos a
querer conseguir esa carga. Entonces digamos, subrayado loadout
es igual a get parent, y debemos afirmar que
el loadout El padre de un arma debe
ser una carga de arma. Bien, y parece que
podría haber establecido el nombre de la clase. ¿Son armas con S? Sí. Bien, entonces eso es una carga de
armas aquí,
no una carga de armas Bien, entonces tenemos una referencia al script
de loadout padre Esto sí crea una dependencia, pero también facilita el
acceso a las cosas que necesitamos. Entonces, en caso de que alguna vez
decidimos que queríamos cambiar
este patrón, voy a crear una función
aquí abajo en la parte inferior
para Obtener dirección. Entonces la función Get direction va a devolver un vector dos. Y en este caso, vamos a usar la carga para conseguirlo Así que devuelva la entrada de
punto de carga de guión bajo. Dirección de puntos. Y así es como
resolvemos la dirección, pero simplemente siempre podemos usar la función
de dirección G para manejar eso. Entonces, si llamamos, digamos, obtener dirección en diez lugares
diferentes, pero cambiamos la carga. Así que en realidad
ya no
usamos un loadout o tal vez el loadout
no usa una entrada, entonces solo tenemos que entrar
aquí una vez y cambiar Entonces tal vez la carga tenga una referencia
directa a la dirección, así que simplemente la cambiamos así, y luego volvería a funcionar Pero en realidad necesito
cambiar esto un
poco porque no vamos
a usar la dirección. Vamos a usar la
dirección de orientación porque recuerda, la dirección es la entrada en bruto. Puede ser vector punto cero, pero nunca vamos
a lanzar
una lanza a los
pies del personaje en este estilo de juego Así que en realidad queremos
Enfrentar aquí, y lo llevaremos
a Importar revestimiento de puntos. Así que realmente vamos a
resolver la dirección a la que se
enfrenta el personaje y en su lugar. Bien, así que tomemos esto Ponte
enfrentando y donde lanzamos, solo
haremos elenco para
ponernos enfrentados en su lugar. Y movemos a nuestro
personaje, ya
lo vas a
ver, podemos lanzar en la dirección
correcta, y esto debería incluir también
diagonales, así Bien, entonces esa es la mitad de lo que
necesitamos que se haga ahí mismo. Ahora, también necesitamos rotar
cualquier proyectil que instemos. Entonces, consigamos ese ángulo de
rotación. Entonces, dentro del elenco, bajo donde creamos la escena del pacto
para el proyectil, hagamos el ángulo de rotación de VR Y vamos a tomar
el vector get facing. Vamos a convertir
eso a un ángulo aquí, y creo que eso es en resplandor. Si hago clic derecho
y hago símbolo Lou, podemos ver devuelve el ángulo del
vector con respecto
al eje X positivo en radianes Entonces eso sería cosas como Pi divididas por dos tipos de cosas. Bien, pero queremos
girarlo para que la lanza u otros proyectiles estén orientados hacia la derecha por defecto
como nuestro Entonces, si está mirando hacia
arriba y el sprite, queremos rotar
ese Pi dividido por dos o como 90 grados así que vamos a agregar Hi, que es una constante
dividida por dos, y eso hará que sea de manera que esté mirando hacia la derecha por defecto Sin decirlo, es
realmente
más una cosa de prueba y
error aquí Pero vamos a conseguir esa rotación. Entonces vamos a después instancia del proyectil y
dijimos que es posición global, hagamos proyectil dot Rotate y esta función toma Entonces tenemos nuestro ángulo de rotación. De verdad, debería cambiarle el nombre para
que sean anuncios rotados. Así que voy a
recopilar dos veces ese Control R, y diremos rotar
anuncios para resplandor,
reemplazar todos, y eso
se ve mucho más limpio ahí Así que guarda y corre, y ahí tenemos nuestras lanzas apuntando en la dirección correcta Y esto también debería funcionar con esencialmente cualquier proyectil Siempre y cuando esos proyectiles estén orientados hacia arriba por
defecto, si no lo hacen, entonces puedes rotar este
sprite individualmente en la escena de los proyectiles hasta que
estén estén Entonces ahí tenemos nuestra puntería y rotaciones para
los proyectiles Y para mostrar una cosa más,
si dejo ir la dirección, entonces nuestra dirección
es ahora vector 20, pero seguimos disparando
a la derecha porque frente nunca se establecerá
en vector dos punto cero. Y es por eso que usamos el revestimiento en lugar de la entrada de
dirección en bruto. Bien, ese es un gran
paso hecho ahí mismo.
19. Añadir efectos de sonido y música: Agreguemos algunos
efectos de sonido a nuestro juego. Primero, voy a empezar por tener un efecto de sonido de lanzamiento, y luego tal vez cuando los enemigos
lleguen a su estado de muerte, tenemos la opción
de hacerlos tocar
allí también un efecto de sonido. Probablemente me mantendría alejado de los sonidos de hit porque va
a
haber varios enemigos recibiendo golpes en
cada segundo, y eso
acabaría siendo, creo, demasiados efectos de
sonido a la vez. No querrías abrumar demasiado a
tu jugador. Entonces comencemos
con esos dos. Entonces para el jugador arma lanza, digamos en el arma a D, agregaremos en un reproductor de sonido Así que en Export var audio
player of type or audio stream player two D.
Queremos que sean dos D porque estos proyectiles existen dentro del mundo del juego TD, por lo que tiene sentido
afectar el audio
basado en el posicionamiento espacial de la cámara y el
proyectil y todo Entonces tomaremos el reproductor de audio y tendremos que
ponerlo debajo aquí. Entonces para agregar nodo reproductor de audio, vamos a acercar aquí y clic
derecho en
Arma lanza, agregar nodo hijo Entonces queremos que el reproductor de
stream dos D, agregue eso en debajo de ahí. Y queremos asignar un stream audio que podamos reproducir aquí. Entonces averiguaremos los efectos de sonido. Voy a colapsar todas las carpetas. Vamos a entrar en el audio. A ver. ¿Qué estaba usando?
Creo que teníamos, como, efectos de sonido Blal Bien, déjame ponerme los auriculares aquí para que no salga
por el micrófono. Bien, entonces dentro de una, creo
que iba con slash 04, así podríamos
hacer doble clic en eso, ir a la parte superior derecha y previsualizar Sí, creo que eso es lo que
estaba usando en mi proyecto demo. Entonces tomemos el corte
y pongamos eso en
el arroyo aquí Entonces ahora solo podemos decirle a
este reproductor de flujo de audio que
reproduzca cada vez que
lanzemos un proyectil Así que vamos a entrar en arma corriente. Y cuando tengamos el
proyectil lanzado, diremos que si el reproductor de
audio no es nulo, entonces le diremos que reproduzca
su clip de audio actual Así que aquí abajo, después que nos instancia el
proyectil, vamos a decir, yo reproductor de audio entonces vamos a
decir reproductor de audio sí reproducir, y eso es básicamente
todo lo que tenemos que hacer La razón por la que tenemos esta condición aquí es
que para algunas armas, posible que en realidad no quieras
que reproduzca ningún audio, así que simplemente nos saltaremos
esa opción aquí. Ahora bien, una cosa que quiero señalar aquí es
que estamos dando responsabilidades
extras
a este guión de armas. Por lo que ahora el arma dos D no
sólo se encarga de
instanciar los proyectiles, sino también decirle
al reproductor de audio reproduzca cuando se instancie el
proyectil contratando su propia referencia a la carga de armas y
creando un Entonces están
pasando algunas cosas ahora, no
creo que
esto sea abrumador y un problema para el juego, pero es algo
a tener en cuenta. Si nota que sus scripts asumen demasiada responsabilidad, entonces es posible que desee
considerar
dividirlos en múltiples nodos
con diferentes scripts y hacer que funcionen juntos como piezas
individuales en
lugar de un mega script gigante. Pero
aún no estamos ahí. El guión tiene sólo 50 líneas de largo. No es realmente un problema. Si tuvieras tal vez dos
o 300 líneas de código, probablemente
llegaría al punto que necesitarías algunos
subobjetos, yo pensaría. Pero no te
preocupes demasiado por eso. La mayoría de los guiones de este
curso son bastante simples. Solo quiero que ustedes
sean conscientes de eso en el
futuro que un guión puede
volverse demasiado monolítico, y eso puede ser problemático
a la larga Tenemos un
arma de lanza. Necesitamos asignar el reproductor de audio para
que realmente reproduzca audio. Así asignar y luego reproductor
de flujo de audio. Ahora bien, si tocamos, deberíamos
obtener nuestros efectos de sonido. Bien, sí, ahí
vamos. Cada vez que instancia un proyectil Bien, ahora queremos
tocar un efecto de sonido cuando nuestros orcos mueren Entonces entremos en la escena orca. Bien, da click en el orco, agrega un nuevo
reproductor de AudioStream Si queremos, podría
cambiarle el nombre a esto para que sea un reproductor de audio de muerte. Podríamos decir. Bien, entonces
ahora nos gustaría encontrar un efecto de sonido de
muerte adecuado. Jugando un poco con
él, creo que creo que el enemigo
Death 01 es demasiado. Incluso flash oh dos es un
poco demasiado también. El caso es que va a
haber enemigos cayendo como moscas
en este tipo de juegos. Entonces necesitamos algo muy sutil o tal vez incluso ninguno en absoluto. Creo que estoy
buscando algo más como el Step grass 03. Ahora bien, eso puede sonar
un poco raro, pero creo
que cualquier cosa que
sea más larga que eso va a ser demasiado para ver cómo va, puede incluso eliminar esto por completo. Así que asignemos la hierba Step oh tres a la corriente aquí, y para decirle que reproduzca ese efecto de
sonido en la muerte, vayamos al reproductor de
animación. Abajo en la parte inferior izquierda, seleccionaremos la animación de
muerte. Y agregaremos una nueva
pista, agregaremos pista aquí, llamaremos al método en el reproductor de audio
Death, y haremos clic derecho al
inicio de esta animación, insertaremos la tecla, y queremos reproducir. Así que es como que estamos
escribiendo un guión cuando estamos definiendo estos fotogramas clave de
animación, excepto que tenemos la línea de tiempo, así podemos decir exactamente cuándo queremos que
reproduzca esa animación, y es muy fácil moverlo
a un punto diferente
en el tiempo simplemente
arrastrándolo a un fotograma clave
diferente Así que podrías escribir todo
esto escribiendo código de script GD si quisieras y simplemente
saltarte el reproductor de animación Pero obviamente, el
jugador de animación hace que sea mucho más
fácil hacerlo visualmente. Bien, entonces ahora si tocamos, deberíamos conseguir que toquen ambos efectos de
sonido. Para que puedas escuchar
cuando los orcos bucean, sí
toca ese
pequeño efecto de sonido Es un poco tranquilo,
pero tal vez esté bien. Si pensamos que las lanzas
son demasiado fuertes en comparación, incluso
podríamos tomar el reproductor de secuencias de
audio spears y bajar un poco el
decibelios de volumen aquí Y dale play y
ejecutarlo una vez más. Incluso puedes editar esto
mientras el juego se está ejecutando. Así que podríamos simplemente dejar
esto abajo. Bien. Se puede ver que
ya es mucho más silencioso. Mar, una de las
cosas buenas de cado es que no tienes que cerrar necesariamente el juego para cambiar
tus propiedades. Y vamos a golpear a un enemigo. Bien. Y la diferencia de volumen entre esos es un
poco menos pronunciada. Entonces probablemente sea bueno ahora. Como un poco de
bono para este video, si quieres agregar música,
vamos al mundo, vamos al mundo, y agreguemos en un reproductor de
audio strem, reproductor flujo de
audio dos
D, solo la nota predeterminada Entonces stream player aquí, y luego elige este, reproductor
Audiostream Bien, entonces con nuestro reproductor
AudioStream, vaya a la derecha,
y vamos a querer que esto esté en reproducción automática Y creo que para hacerlo loop, en realidad
tenemos que cargarlo desde el audio MP threes primero. Entonces volvamos a cerrar todo
en la parte inferior izquierda, vamos a Audio, y tenemos la canción box jump
del pack Th Red Hearts. Entonces vamos a llevar eso
a la parte superior derecha. En realidad no es P tres. Es un punto OGG, pero ambos formatos para música
son compatibles con KDO, por lo que funcionará bien Y luego queremos tomar
esto y comprobar Loop on. Pero en realidad tal vez necesitemos
hacer eso en la parte inferior izquierda. Así que haz doble clic en el OGG aquí. Bien, y luego
revisa el bucle aquí. Y cuando llegue al final, debería hacer un bucle de todo el
asunto. Bien, así que eso es bueno. Bien, entonces lo último
antes de jugar el juego, voy a tomar el volumen DB y poner esto en negativo 20 porque creo que
probablemente va a ser bastante ruidoso, de lo contrario. Entonces, vamos a darle a Play
y veamos cómo va. Bien. Para que podamos escuchar la música, y
sigue siendo bastante ruidosa. Entonces voy a llevar
esto a negativo 30. Tal vez incluso negativo 40. Sí, eso probablemente sea un
poco más apropiado. Entonces ahora tenemos el audio. Tenemos la música, y tenemos un efecto de sonido Enemy
Death. Así que eso es algo básico ahí para efectos de sonido de
audio y
música dentro del juego, y podemos seguir
adelante a partir de ahí.
20. Sistema de combate Singleton: Bien, entonces el
proyectil básico que daña y combate
funciona en este momento, pero realmente no
sabemos cuánto daño se está infligiendo a los enemigos
en el contexto del juego Entonces, una forma en que podríamos hacer
eso que también
mejoraría visualmente la jugabilidad
sería el texto de combate flotante. Así que cada vez que uno de
estos personajes recibe daño en la caja de daño, podemos comunicarnos
con, digamos, un sistema de combate a instancia, texto de combate
flotante en la posición en que recibían daño cada vez que reciben daño. Entonces esto significará que
habrá muchos números flotando
alrededor
de la pantalla, pero creo que eso funciona bastante
bien para el estilo de juego. Está muy basado en la acción, y queremos comentarios
inmediatos cada vez que estamos
dañando a los enemigos. Y también queremos
ver los beneficios de subir de nivel nuestras habilidades, así
como nuestro personaje
se hace más fuerte. Para crear nuestro sistema,
vamos
a querer hacerlo como un objeto
Singleton,
es
decir, que hay una referencia a
esta clase o a este sistema a
lo largo del juego Y si lo configuramos como carga automática, siempre estará ahí
en segundo plano, y será fácilmente
referenciable por También puedes implementar patrón
Singleton en
el propio script, pero lo haremos a la manera Gada, que es un poco más simple
y fácil de entender Entonces en la cima aquí,
solo voy a crear una nueva escena. Lo crearemos como otro nodo, y este será un nodo base. Si son dos aquí, puede cambiarle el nombre para que
sea Sistema de combate. Entonces hagamos click derecho sobre él, adjuntemos un script, sistema de combate. Podemos guardar eso ya sea
en la raíz o podemos crear una carpeta
de sistemas en la que guardarla, que probablemente
sería mi preferencia, y la crearé ahí dentro. Ahora queremos guardar este sistema de combate en
la carpeta de sistemas. Entonces sistema de combate
punto TSC guarda eso. Y ahora hagamos que sea
una carga automática para que este script de nodo pueda ser referenciado a través de nuestro juego con
solo usar el nombre. Entonces iré a la configuración del
proyecto del proyecto. Entonces tenemos a Globals aquí. Y queremos agregar un
nuevo TSCN como global. Entonces da click aquí, ve a
Sistemas y luego haz TSCN. También puedes ver
que puedes seleccionar un script de punto GD como sistema
de combate, y lo que eso haría es
crear una nueva instancia
del script de nodo en tu juego tan pronto como se lance
el juego Pero si usas el punto TSCN, entonces obtienes la ventaja de poder usar variables de
exportación porque esta es una
copia muy específica del sistema de combate Si hago doble clic en eso aquí y agrego esto como nombre de nodo del
sistema de combate, entonces ahora tenemos este sistema de
combate como Singleton global
y lado de nuestro juego Y la diferencia
entre cargar automáticamente
un script punto GD y cargar
automáticamente el SEN directamente es que si
hacemos algo como Exportar var spawn count,
integer igual a diez, entonces podemos establecer esto
por aquí, entonces podemos establecer esto
por aquí Pero si instancia
un script que aún no se ha definido como
una escena o un nodo, entonces no tendría
ninguna capacidad de
personalizar propiedades
como esa de antemano. Ahora, estoy seguro de que hay
formas de sortear eso, pero esa es una ventaja
de usar punto TSE Bien, entonces tenemos
nuestro sistema de combate. Vamos a querer algún tipo
de función de reporte de daños. Entonces solo voy a sacar eso como
un borrador. Aquí. Digamos función. Digamos reportar hit.
Creo que eso tiene sentido. Digamos que tenemos un
objetivo al que le pegaron, y podemos decir que no hay
dos D simplemente podría ser cualquier cosa en el juego
que se pudo golpear. Generalmente, eso
sería como un
cuerpo de personaje o un cuerpo estático. Pero solo usaremos la
clase base para mayor flexibilidad. Y entonces tenemos aquí
la cantidad de daños. Entonces P daño es un entero. Esto volverá nulo. Y luego en este sistema de combate, vamos a instancia de nuestra escena
para el texto de combate flotante. Entonces subamos aquí a
la cima y podemos decir en Export var escena de texto de
combate flotante. Y esta será de
tipo escena repleta. Y aquí abajo en Report Hit por ahora mismo,
solo haremos un pase. O si quieres, incluso puedes hacer un error push y decir
no implementado. Esto te daría un
poco más de retroalimentación si
alguna vez te olvidas de implementar un script en lugar de
solo que ejecutaría la función y pasaría para que no hubiera ningún error, pero tampoco
haría nada. Entonces creo que esto es
un poco mejor durante el desarrollo, en realidad. Ahora saltemos a
nuestro guión HRT Box two D. Entonces Control P, HRT Caja dos
D. Y luego dentro de aquí, podemos hacer referencia
al sistema de combate Bien, entonces el informe de
puntos del sistema de combate golpeó, y queremos el objeto que el
controlador de estadísticas está manejando. Entonces no creo que
el controlador de estadísticas en realidad tenga una
referencia a eso todavía. Si echamos un vistazo a la escena de los
orcos muy rápido, hagamos clic en el Controlador de
Estadísticas Podemos ver que
no hay nada por aquí en el lado derecho para obtener
una referencia al Oc. Podríamos simplemente hacer eso como un tipo de
referencia get parent o podemos
convertirlo en una variable de exportación. Si quieres asegurarte de que la conexión es más absoluta, entonces yo iría con en la exportación. Porque eso significaría
que si por alguna razón mueves el controlador de estadísticas
hacia abajo un nivel, como tú lo padre
a otra cosa, entonces Get parent
ya no devolvería al orco Entonces, si usamos en la exportación, podemos asegurarnos de que
devuelve el c. Podríamos decir algo así como
cuerpo o carácter, tal vez incluso objeto,
manteniéndolo más genérico. Y entonces este
solo puede ser el objeto para el que
este controlador está
administrando las estadísticas, y lo asignaré en la
parte superior derecha al orco aquí Ahora bien, si volvemos
a la caja Hurt, podemos usar aquí el objeto dot
controller stat, y luego podemos pasar en
el daño P daño. Bien, así eso le dará
al sistema de combate todo lo que necesitamos saber sobre dónde colocar el texto y cuánto daño
asignar al texto.
21. Animar texto de combate flotante: Ahora necesitamos el propio texto de
combate flotante. Así que vamos a crear una
nueva escena por aquí. Haga clic en más y haga la interfaz de
usuario. Y vamos a
hacer que el nodo base simplemente sea como texto de
combate flotante. Pero el texto real lo
asignaremos como etiqueta hijo. Y esto nos ayudará cuando estemos usando el reproductor de animación para animar porque
no queremos cambiar
la posición raíz Solo queremos cambiar
la posición de los textos con respecto a la raíz del control de texto
flotante Combat. Entonces, haz clic derecho aquí, agrega un nodo
hijo, busca etiqueta. Y luego hagamos clic derecho sobre el texto de Combate
flotante Reproductor de animación
Adhild Bien, creo que eso es
lo que necesitamos aquí, así que controlemos a S. Y podemos salvar esto. A
lo mejor creamos una carpeta para UI. Esto es una especie de UI todavía. Así que vamos a crear una nueva carpeta. Voy a escribir la interfaz de usuario. Bien. Y luego flotante combate texto punto TSC y puede ir
justo ahí Así que golpea a salvo. Bien. Y ahora necesitamos un guión adjunto
a nuestra raíz aquí. Haré clic derecho sobre el texto
flotante de Combat, adjuntaré un script, y lo
crearemos en la carpeta UI, texto de combate
flotante punto gD Vamos a querer
una referencia a la etiqueta para poder
manipularla aquí. Así control var etiqueta etiqueta. Entonces asignaremos la etiqueta aquí. Y queremos crear algún
tipo de función inicializada. Si has usado Gado,
probablemente sepas que
hay una función subrayado
y tejer aquí Esa función se utiliza para cuando se está
creando un nodo en la escena. Pero en este caso,
tenemos que esperar hasta que el objeto ya
haya sido creado. Entonces es por eso que necesitamos crear. Entonces, si has usado
Gadot por un tiempo, tal vez
sepas que hay una función de subrayado
y
una función de TI Entonces esta es una
función anulable donde puede
ejecutar código antes de que se
hayan establecido
todas las propiedades para su Puede usarlo para pasar parámetros
opcionales para establecer
esas propiedades cuando
esté creando un nodo a partir de una llamada a una función en lugar de existir dentro de una escena empaquetada
como aquí, que es lo que suele hacer, simplemente
configuraría la escena y luego la instancia
de una escena a ritmo Entonces eso en realidad no
es lo que queremos hacer. No estamos tratando de personalizar
la función inicializada. Estamos tratando de hacer
correr el texto de combate
flotante cuando
ya está en escena. Entonces yo solo quería hacer
esa distinción ahí. Bien, entonces lo que queremos hacer en el script de texto de combate flotante es tener la opción de poner
el texto en la etiqueta, y simplemente
lo haremos directamente con una especie de función más
delegada aquí con texto conjunto de funciones. Entonces pondremos el
texto en la etiqueta, pero lo haremos operando a través del nodo raíz texto de combate
flotante. Así que establece el texto, y
diremos P text, que es una cadena,
volveremos void, y tomaremos texto de punto de
etiqueta y lo
pondremos igual a texto P. Entonces una razón para hacer esto es
que nuestro Bien, así que, por supuesto, vamos
a querer establecer esto cada vez que instancia la escena de texto de
combate flotante. Entonces puedes dar un nombre de
clase aquí arriba para que podamos obtener fácilmente
ese método de texto conjunto. Entonces nombre de clase, texto de combate
flotante, vamos a golpear Controles ahí. Y ahora en nuestro sistema de combate, cada vez que denunciamos un golpe, queremos ejemplificar nuestra escena de texto de combate
flotante. A ver, digamos que el texto Vara es
de tipo texto de combate flotante. Y lo conseguimos instanciando la escena de texto de combate flotante Entonces entra y luego crea una instancia. Bien. Y luego queremos
agregar eso de niño. Y ahora no queremos agregar
realmente el texto como hijo del objetivo P porque
cuando el objetivo P se
elimina de la escena, como se reproduce la animación de muerte, también
eliminaría
sus nodos hijos como el texto de combate flotante. Entonces porque tenemos
este sistema global,
el sistema de combate
para manejar el texto, creo que podríamos salirnos con la suya con solo hacer add child en
el propio sistema, y luego agregamos el nodo de texto. Ahora necesitamos establecer
la posición global a la posición del objetivo P. Entonces texto Posición global es igual a p punto objetivo posición
global. Y si este bit no funciona o nos encontramos con otros problemas, entonces podemos obtener una referencia a,
como, una capa de lienzo, la interfaz de usuario real y la posición ahí bajo algún tipo
de padre similar a lo que estábamos
haciendo con un proyectil, así que solo necesitamos un padre
para contener todo el texto Pero la posición
debería estar donde el enemigo recibió daños
es la idea aquí. Ahora queremos tomar el texto
y queremos establecer su texto. Así que establece el texto en una
cadena de P daño. Entonces P daño es un número entero. Lo convertimos en una
cadena diciendo STR y luego envolviendo el
daño P entre paréntesis Y luego establecemos el texto
a ese valor de cadena. Entonces, si configuramos aquí la escena de texto
flotante del sistema de combate, así que ahora estoy mirando la escena Singleton,
el sistema de combate, podemos ir por aquí
y podemos
cargar rápidamente nuestro texto de combate flotante Entonces tenemos esa referencia a la escena
repleta de
aquí a la derecha, así que debería ser instanciate vamos a darle a Play y
darle una Bien, entonces vamos a hacer
que se golpee el daño. Bien, sí, eso es
lo que esperamos. Y ya ves, muy importante cuando la orca se
quita de la escena,
el texto no se quita a sí mismo Bien, entonces ahora solo manejamos la animación para el texto de combate
flotante. Entonces lo hicimos en el reproductor de
animación. Crea una nueva animación
en la parte inferior. Nuevo. Y veamos. Podemos
llamarlo como queramos. Voy a ir con flotar hacia arriba, y luego necesitamos agregar
algunas propiedades para animar. Así que agregue la etiqueta de
pista de propiedad de pista, específicamente la etiqueta porque queremos esa posición de desplazamiento. Entonces busquemos posición aquí. Bien. Ahora, no podemos ver nada porque no hay
texto predeterminado en la etiqueta, así que voy a hacer clic en la
etiqueta, y solo diré DEF por defecto aquí También es posible que queramos
asignar un tema con una nueva fuente predeterminada que se ajuste
un poco mejor a nuestro juego Pixar Entonces podemos hacerlo haciendo clic
en el texto flotante de Combate. Yendo al tema en
el lado derecho. Hacer nuevo tema, ampliar esto, seleccionar una fuente por defecto, y voy a elegir lo que
ya instalamos
al inicio del
proyecto cinco X siete, que se puede ver es
una buena fuente Pixar Entonces y luego si queremos reutilizar este tema,
que probablemente hagamos. Haré clic derecho y guardaré
esto en el proyecto, y la interfaz de usuario suena bien. Entonces solo diremos tema del juego. Dot TRS por ahora. Bien, si cerramos
eso, puedes ver que ahora está referenciado
por el nombre del archivo. Bien, ahora, un par de cosas. En el nodo raíz, el texto de combate
flotante, podemos ver que básicamente
tiene esta caja gigante. En realidad no necesitamos
que sea tan grande. Así que ve a maquetación. Y luego en lugar de
Anchors preset full rect, cambiemos eso para Entonces ahora el control es solo
este pequeño punto de aquí arriba, y la etiqueta es de su
propio tamaño de niño. Entonces otra cosa sobre el texto de combate
flotante. Yo quiero tomar el mouse
y cambiar el filtro para ignorarlo solo para que clics
del mouse sigan
atravesando en la pantalla, incluso si están tocando
este texto de combate flotante, quiero que se ignoren
los clics del mouse. Entonces, si hay alguna
interfaz de usuario en la pantalla, esto no interferirá con
presionar el botón UI. Eso es bastante importante. Y ahora volvemos a nuestro reproductor de
animación, y vamos a fotogramas clave de la posición Entonces voy a hacer zoom
en la parte inferior. Hagamos clic con el botón derecho del ratón en el
fotograma clave de la posición, y vamos a moverla a donde queramos que esté la posición
inicial Entonces el 00 es donde nuestro
enemigo recibió daños. Creo que solo quiero asegurarme que comience
en algún lugar por encima de eso. Entonces voy a w
a mover el texto. Lo voy a mover hasta aquí, y luego fotografiaremos
la posición aquí Así que ve al diseño en
el lado derecho, y luego ve a transformar
y fotograma clave la posición Entonces lo tengo en negativo
15 píxeles en la Y. Y entonces podemos ir a ¿
cuánto tiempo queremos que dure esto? A lo mejor medio segundo. También puede habilitar el ajuste
si eso ayuda Bien, entonces 0.5 segundos. Y luego vamos a moverlo aquí arriba. Así que algo así
y luego
fotografíalo de nuevo en el lado derecho, solo usando el botón de fotograma clave Bien, y ahora se va a animar entre
estos dos puntos Entonces, si voy al
inicio y juego, se
puede ver que va a
animar ese movimiento de posición También podemos cambiar la duración completa
a 0.5 segundos. Y entonces si nos gusta,
podríamos simplemente tenerlo ure al final
haciendo add track
call method track track on the floating
combat text root. Y luego haga clic derecho aquí, inserte y escriba quarre Bien, eso asegurará que el texto se limpie después se haga en esta escena sin tener que personalizar
nada más, en realidad Podemos simplemente llamarlo
desde la animación. Ahora bien, esto probablemente funcionaría, justo ahora mismo, pero
es realmente básico. Vamos a probarlo. Solo
asegúrate de que funcione. Bien, sí, yo no
toqué la animación. Entonces eso es porque
no configuré Autoplay aquí. Así que en la parte inferior derecha
del
reproductor de animación , Reproducción automática en carga Bien, ahora pulsamos Reproducir de nuevo, y estamos recibiendo nuestra animación. Bien, así que eso funciona a
un nivel muy básico. No está nada mal.
Pero mientras estamos aquí, ¿por qué no hacerlo
más interesante? Entonces puedo agregar una pista en la pista de
propiedad de la etiqueta, y vamos a hacer, digamos, escala. Bien, entonces esto nos
permitirá hacerlo más grande o más pequeño a
medida que avance el tiempo Así que vamos a enmarcarlo
como es a la hora 00. Digamos alrededor de
0.15 segundos o
supongo que estoy chasqueando a 0.16 67 Aquí realmente no importa. Y puedes cambiar tu
ajuste en la parte inferior,
derecha, por cierto, si quieres tener un ajuste de
fotogramas clave más personalizable Así que vamos a etiquetar y
luego transformar la escala. Tomaremos su
tamaño y lo subiremos. Entonces tal vez como 1.5
o tal vez incluso dos. Podemos comenzar con eso y
escalarlo si es necesario. Entonces voy a fotograma clave esto. Entonces ahora va a pasar
de 1.0 a 2.0 tamaño. Y luego cuando se está desvaneciendo, queremos que vaya muy pequeño Así que vamos a llevarlo a, digamos, tamaño
0.1, y luego enmarcarlo clave. Bien. Entonces ahora si jugamos nuestra animación, es
algo así. A lo mejor la escala es
un poco demasiado grande en este segundo fotograma clave, así que solo la llevaré
a digamos 1.5 Creo que eso es correcto. Hit play. Bien, eso funciona bastante bien. Y también podemos tomar la
posición y compensarla tal vez a la derecha cuando esté llegando a
ese punto de tamaño pico. Entonces tomemos la posición
aquí con el modo de movimiento W y lo movemos hacia la derecha o algo así
y luego lo enmarquemos con llave. Bien, y ahora volveremos a jugar. Así que ahora podemos ver
cómo sale el texto a la derecha y luego de
vuelta a la parte superior izquierda. Otra cosa que
podríamos hacer sería
cambiar el color o
el Alfa con el tiempo. Así que agreguemos una pista en la pista de
propiedad de la etiqueta, y haremos que este
auto modular. Por lo que sólo afecta a esta etiqueta, no a ningún nodo hijo. Entonces voy a auto modular
en la etiqueta. Vamos a hacer clic derecho en insertar
una clave al inicio. Entonces este será nuestro
blanco estándar con Alpha completo. Vayamos a 0.15 o donde sea que nuestros
marcos para llaves estén encajando aquí e insertemos una llave 0.0 1667 para mi. Y luego cambiemos
el color a rojo o algo así porque
esto es por texto dañado. Y luego vamos
hasta el final aquí. Haga clic derecho en insertar una clave, y la cambiaremos a
digamos cero Alfa. Puede jugar. Entonces ahora
es algo así. Creo que podría tener
más sentido si
intercambiamos el primer
fotograma clave y éste Entonces voy a arrastrar
esto en la línea de tiempo. Voy a tirar de la izquierda
por aquí al punto
0.0 1667. Esto
va por aquí. Entonces ahora empezará en
rojo y pasará a blanco. Y podríamos hacer que termine
con un color blanco también. Entonces voy a dar click aquí,
ir al valor y cambiarlo a 255
para el verde y el azul. Por lo que termina blanco aunque
totalmente transparente. Si juego algunas veces aquí, se
siente muy degradado. Quiero decir, realmente es
porque estamos
atravesando un color a
otro color a lo largo de
un periodo de tiempo Entonces el gradiente sería
así de izquierda a derecha. Al igual que, va de rojo a
blanco a medida que avanza a
través de la pantalla, excepto que en cambio lo estamos
haciendo con el tiempo ahora Así que depende de ti
cómo te gusta estar aquí. Podrías simplemente cambiar
esto para que sea rojo, también. Entonces es solo rojo todo el tiempo. Lo único que cambia
es la transparencia. Entonces tendrías que establecer
el tercer punto clave del marco también, algo
así. lo mejor nos gustaría que se
oscurezca con el tiempo en su lugar, así podríamos tomar los valores aquí y
hacerlo como un rojo oscuro, algo así y
ver cómo va eso. Sí, eso se ve
bastante bien, supongo. A lo mejor el rojo es un
poco demasiado vibrante, así que podría tomar el inicial y hacerlo
así como así. Y tal vez pueda ser un poco
más brillante en la cima. Intentemos, bien, de más oscuro a brillante, y luego
a oscuro otra vez. Entonces, eso parece funcionar bastante
bien. A mí me gusta. Esto es puramente una cosa artística de
preferencias personales. Así que en serio, lo que
quieras, ve con eso. Bien, así que vamos a jugar
y probarlo, y vamos a
tener nuestro texto de daño cuanto golpeemos a los enemigos. Y me parece que
simplemente se mueve demasiado rápido. Entonces tal vez necesitamos duplicar la duración de esta animación. Entonces, si hacemos clic en el reproductor de
animación, podemos simplemente mover estos
fotogramas clave a lo largo, y esta es una de las
enormes ventajas de usar un
editor de animación de fotogramas clave en lugar de, ya
sabes, codificarlo duro Simplemente es más fácil
iterar y
hacer pequeños cambios para ajustarlo para que esté donde
quieras que esté Entonces tomemos estos
fotogramas clave para Kframe. Ponlo al final aquí en 1.0. Esto también debería ir a 1.0. Y puedes arrastrar una caja
sobre varios fotogramas clave y moverlos todos
a la vez así Así que puedo arrastrar una caja aquí, y movemos esto a,
podríamos intentar como 0.5
segundos, lo que sea. Bien. Ahora, eso es bastante lento ahí. Entonces tal vez queremos que esto
sea más como carga frontal. Vamos a traer eso por allá. Hit play. Bien.
Es decir, no estoy segura. Tendremos que darle una oportunidad y ver cómo se
ve realmente en la pantalla. Parece que lleva
demasiado tiempo desvanecerse. Entonces tal vez esto sí pertenezca más como ahí. Un poco
más adelante. Y tal vez 1.0
segundos es demasiado largo. Sólo voy a arrastrarlo ahí. Entonces, cualquiera que sea este
punto de fotograma clave sea 0.8 segundos, esa será la
duración del clip A lo mejor el texto
también es demasiado pequeño. Entonces creo que una forma en
la que podemos hacernos una idea es poner una copia en la
escena mundial para que podamos verla
aquí mismo como es. Bien, entonces ahí está nuestro texto Daf. Creo que
en realidad podemos escribir clic aquí y hacer niños editables, y luego podemos hacer clic en el reproductor de animación y simplemente
probarlo y ver aquí Si cambiamos a
flotar, ¿funciona eso? Sí, como que lo hace. Bien. Sí, esto ayuda
mucho. Para que puedas ver realmente cómo se verá en la jugabilidad
real, porque aquí tenemos la escena del
mock up. Bien, entonces tal vez
tomemos la posición aquí, y voy a bajar
esto un poco. Y parece que
aquí también
podemos fotogramas clave , así que eso es bueno Entonces, ¿esto realmente obtiene
el 28 negativo 31? Hagamos que se
desvanezca un poco más rápido. Así que nunca lo he probado
de esta manera, específicamente. Parece que puedes
fotogramas clave en la etiqueta, pero no puedes ajustar el reproductor de animación directamente cuando estás editando
desde esta otra escena Así que aquí hay
un poco de intercambio. Podría cambiar el auto
modular en el primer fotograma. Y fotograma clave ahí.
Bien, entonces eso funciona. Eso actualiza el reproductor de
animación. Y luego puedo saltar a la escena de texto de combate
flotante. Y quiero tomar
el color modular y simplemente mover eso
hacia la izquierda mucho más Entonces se pondrá rojo más rápido, pero realmente no me gustó cuando estuvo rojo todo el tiempo. Bien, y luego iré aquí y agregaré otro fotograma clave. Y en esto, voy a hacer que
sea total transparencia. Por lo que estará visible en
la pantalla por más tiempo. No se desvanecerá hasta cerca del final de
la animación completa. Juguemos y lo
intentaré una vez más. A lo mejor aquí también quiero que su
color sea blanco también. Entonces voy a hacer eso. Así que solo
tienes un destello de rojo. Una última cosa en
la parte inferior derecha, si tomas el modo de
interpolación aquí, puedes cambiarlo a cúbico Y voy a hacer
eso por la posición, la escala y las propiedades auto
moduladas Entonces, si miras
muy de cerca aquí, pone un poco de curva en los
lados izquierdo y derecho para eso. Entonces, si eso está funcionando como
otros editores de línea de tiempo, lo
que creo que sí, entonces eso va a significar
que va a ser una curva de
facilidad de entrada y salida en lugar una transición lineal para
la animación aquí. Entonces probemos eso aquí y
veamos si ese es el caso. Eso es lo que
esperaría viniendo de otras cosas como el editor de video
DaventirSolt Y sí parece
tener esa flexibilización aquí. Así que lo volveré a cambiar muy
rápido solo para comparar. Llevamos eso a lineal. Sí, ahora la velocidad es
consistente. Entonces estaba escribiendo mi suposición. Así que eso nos puede dar un
poco más de un empujón a la animación porque tiene sus momentos lentos y
sus movimientos rápidos ahora Si golpeamos play, vamos a probar
eso una vez más aquí, y creo que eso funciona
justo por ahora. Entonces voy a golpear play.
Lo probaremos. Siento que la animación
es un poco larga aquí. Solo necesita tener
ese momento de reventar donde podamos leerlo claramente Bien, así que una
vez más, voy a acortar la animación
solo un poco aquí Tirando todos los
fotogramas clave a 0.7 ahí. La animación termina en 0.7. Juguemos una
vez más y lo probemos. Creo que lo voy a terminar
después de esto. Bien, entonces el desvanecimiento ahora
es muy rápido. Bien, y luego para la
posición cuando se está desvaneciendo, quiero mover eso también Entonces déjame arrastrar esto por
aquí para que pueda verlo. Haga clic en la etiqueta, cerdo
tipo de tal vez ahí. Voy a fotograma clave la posición, y luego arrastraré este punto
hacia atrás hacia la derecha Creo que esto solo hará que la animación sea un poco más sutil. Bien. Sí, así que ahora
cuando se está desvaneciendo, no
se mueve tan lejos Y creo que eso es un
poco más suave de ver. Así podríamos seguir
así por mucho tiempo. Creo que entiendes la idea. Simplemente
personaliza la animación a lo que creas que la haría sentir bien en términos de color, escala, transparencia,
posicionamiento, etcétera Las cosas principales para este
tutorial, aunque, en cuanto a código, son solo asegurarse de que tengas el sistema de combate.
Es carga automática. Le dices que
reporte el daño, y luego en ese reporte de daño, instancias el texto de combate, y agregas eso no como un hijo del nodo objetivo
que recibió el daño, sino como algún nodo de sistemas o simplemente un nodo persistente que
nunca va a quitarse. Y eliminas el texto de combate
flotante en su animación
llamando a Q libre. Y esa es básicamente la esencia todo lo demás es
más detalle artístico
22. Movimiento enemigo P21 con seguimiento del jugador en Godot 4: Los proyectiles ya
tienen la capacidad dañar y matar
a un enemigo, pero nuestros enemigos en realidad no
caminan hacia el jugador Entonces, para que los orcos se muevan
hacia el jugador, primero, necesitan una
referencia para el jugador Sería un
poco complicado tener una referencia directa entre
el orco y el jugador inicialmente porque
no existen en la misma
escena cuando comienza el juego Cuando engendramos enemigos
en el mundo del juego, vienen de
la escena repleta Entonces no existen
aquí hasta que en
realidad son puestos en escena
por el sistema de desove Entonces lo que podríamos hacer en cambio
es tener un recurso de referencia, podríamos llamarlo contexto de jugador, donde el jugador
se pone en el recurso, y luego cada orco va
a hacer referencia a ese recurso para recoger en el objetivo del jugador tan pronto
como se genere
en el mundo del juego Esto tendría
algunos beneficios extra de poder intercambiar,
digamos, el
objetivo del jugador en todos
los enemigos cambiando
el recurso una vez. Incluso podríamos hacer que
el sistema de combate establezca la referencia tan pronto como generen una copia del orco
en la escena del juego Por lo que el sistema de desove
podría esencialmente elegir qué jugador
va a perseguir cada orco, y eso puede tener algunos beneficios
adicionales sobre solo convertirlo en una referencia pura
de diez, que ciertamente podrías hacer, en este caso, por el Pero eso también te ataría
estrictamente a más de un juego de un
solo jugador, lo cual está bien para este curso. Pero voy a tratar de
mostrar cómo se puede lograr con el método del recurso. Entonces en la parte inferior izquierda
de nuestro sistema de archivos, vamos a colapsar todo. Y vamos a entrar en personajes, y voy a hacer click derecho
aquí, crear un nuevo guión. Llamemos a este jugador contexto. Y para heredas,
hagámoslo recurso. Bien, cree el nuevo guión y asegúrese de abrirlo en el editor de guiones le dará el contexto del reproductor de nombre de clase. Bien, entonces esto es solo
configurado para ser esencialmente una referencia compartida a un
jugador específico dentro del juego. Entonces lo que necesitamos aquí
va a ser jugador var. Y si tenemos una clase de jugador,
vamos a hacer que se extienda eso. Entonces var player es de tipo player, y eso en realidad podría ser
todo lo que realmente necesitamos aquí. Para ese recurso. Así que vamos al guión del
jugador ahora, y dentro de
player, voy a exportar una referencia al contexto. Entonces vamos a hacer un contexto var de
exportación, y voy a llamar a esto de
tipo player context, controles para guardarlo. Y podemos ver en el momento mismo tenemos un slot para recurso. Así que vamos a crear
nuestro nuevo recurso. Y después quiero
hacer click derecho sobre él y guardarlo en el proyecto. Lo guardaremos en
digamos personajes. Podríamos ponerlo en jugador
si queremos, entonces ¿por qué no? Y entonces lo llamaré jugador Contexto aquí punto TRS,
que es para recursos También es posible que desee
mover el contexto del jugador en GD al directorio del jugador de la
diagonal del personaje Bien. Y ahora nuestros
orcos necesitan un objetivo Para que podamos ir al orco NPC. Puede hacer clic
aquí si es necesario. Diremos en Exportar var target
es un contexto de jugador tipo. Si lo necesitabas, también
podrías hacerlo como un contexto objetivo si solo
necesitas dar un paso más genérico para esto, pero solo
van a tener un objetivo. Así que supongo que hacer más
específico llamándolo el contexto del jugador
podría ser un
poco mejor aquí para
nuestro caso específico. Pero siéntete libre de
convertirlo en un
contexto objetivo si
quieres que los enemigos vayan tras objetos inanimados o
PNJ o algo así Y esto va a
sostener la referencia al objetivo
del jugador que persigue
este NPC Entonces, pongámoslo
directamente en el inspector. Entonces haga clic en OC y luego
en el lado derecho, necesitamos darle
el contexto del jugador. Entonces voy a hacer clic aquí.
Carga rápida, contexto del jugador. Y notarás
que aunque el orco y el jugador sean dos escenas completamente
separadas, podemos hacer que hagan
referencia al mismo recurso y a nuestro proyecto El recurso existe
en el sistema de archivos, por lo que podemos hacer referencia a
eso dentro de nuestras escenas empaquetadas individuales. Entonces, cuando realmente se les agregue a la misma escena mundial del juego, ambos
tendrán
la misma referencia. Entonces el jugador se va a establecer como el jugador
en el contexto del jugador, y luego todo lo demás, los NPC van
a leer de eso Y así es como se
van a relacionar
entre sí a través de este
contexto intermediario. Entonces el script de NPC no va a hacer nada
directamente aquí mismo Vamos a tener eso
instalado en el estado de Chase. Pero lo último que tenemos que
hacer antes de llegar
al estado de persecución va
a ser volver a la escena del jugador y
dentro del jugador listo. Primero, queremos
afirmar que el contexto no nulo porque es un
poco necesario para nuestro juego Así que afirma contexto por lo que
el recurso de contexto necesita establecerse aquí
para que el jugador pueda hacerse el jugador
del contexto Y entonces vamos a tomar contexto punto jugador igual a uno mismo. En realidad, esto
va a salir al aire todos modos en cuanto no
tengamos contexto porque
esto no puede ser nulo. Por lo que esta afirmación puede que
ni siquiera sea necesaria. Podemos simplemente cortarlo ahí
y reducir la redundancia. Entonces, mientras tengamos esta línea y el
jugador cargue primero, se establece
el jugador en el
contexto, y luego cargamos en
todos los demás NPCs, podemos hacer que usen
su estado hace para avanzar hacia el jugador ahora Entonces dentro de Ok,
vamos a ir al estado de Chase. Entonces, en el
estado de Chase, necesitamos
obtener esa referencia
al jugador. Entonces podemos conseguir eso como una
referencia al orco, y entonces el orco tiene el contexto del
jugador aquí Entonces hay algunos pasos
quitados. Entonces vamos a ver. A lo mejor vamos a decir algo así como VR target, nodo dos D aquí. Entonces tenemos esta variable local. Y luego cada vez que entremos, el estado de Chase obtendremos una
referencia a ese objetivo. Incluso puedes hacerlo en configuración
si solo quieres que sea una cosa única.
Lo pondré en Enter. Así que cada vez que
ingresemos al estado, obtendremos el nuevo objetivo
del contexto del jugador. Por lo tanto, el objetivo de subrayado es igual al agente
punto objetivo jugador de puntos aquí Porque no sabemos cuál es
el tipo de agente de NPC, no
sabemos que
tiene el objetivo y
no sabemos que el
objetivo tiene un jugador Bien, entonces este bit es un poco
frágil porque básicamente hace la suposición de
que el agente es un NPC, y hace la suposición de
que el objetivo está establecido, y lo convierte en la suposición de
que el jugador sigue siendo la propiedad en
ese contexto de jugador para obtener el objetivo de Entonces esta línea específicamente
podría romperse
con bastante facilidad si cambias algunas de
tus otras clases alrededor. Es posible que desee simplemente
configurar algunas afirmaciones aquí también para ser solo señales de alerta
temprana Entonces podríamos decir afirmar el agente punto objetivo y tal vez afirmar agente punto
objetivo punto jugador Cambiemos esto de punto de agente Target a punto de agente
Target es un NPC Bien, y creo
que ya es suficiente. No cubre todos los casos, pero si cambiáramos esta clase por
otra cosa completamente diferente, creo que estas dos líneas
atraparían eso. Vamos a presionar Play y a ver si seguimos siendo buenos o si
tenemos un problema aquí. Por lo que se esperaba
que el agente fuera un NPC. A lo mejor lo que quiero es
agente Target como NPC. Podría estar usando
la palabra clave enlazada allí. Entonces aquí, en realidad
quiero comprobar que el agente es un NPC El punto de agente Target
es el contexto del jugador. Entonces nos aseguramos de
que el agente sea un NPC para que podamos
operarlo en él. Y ya no tenemos problemas
. Entonces eso es bueno. Y lo último que solo
tenemos que hacer es poner en el movimiento hacia
esa ubicación objetivo, y lo vamos a hacer en
función de actualización de subrayado Entonces vamos a poner en práctica
eso. Bien, entonces tenemos que conseguir la posición
objetivo. Así var Posición objetivo. Bien, entonces eso
va a ser asignado desde subrayado
punto objetivo Posición global Y entonces tenemos la
posición de nuestro agente. Así var posición de agente. Eso va a ser igual al punto de
agente Posición global. Entonces un agente técnicamente puede
ser un nodo regular, creo, y por
eso no aparece aquí. Posición de agente Savara. La razón por la que no puede
inferir el tipo es porque no sabemos con
certeza que el agente tiene esta propiedad de posición
global Entonces sí necesitamos
declararlo ahí como un vector dos. Bien, y luego queremos
obtener la dirección entre estas dos ubicaciones. La dirección de Savara
va a ser igual a la posición objetivo menos
la posición de agente Y luego normalizamos
este vector para obtener sólo una dirección. Por lo que normaliza el
valor XY a una escala de 1.0. Ya no va a tener nada
como la distancia. Simplemente va a ser
la dirección del par, que se parecería mucho
si estás haciendo input dot get vector
para la entrada del teclado. Eso también sería en una
escala 0-1 tanto para X como para Y. Bien, ahora que
tenemos la dirección, solo
tenemos que movernos en la
velocidad que estamos asignando Entonces cada uno de nuestros
personajes va a tener una velocidad en el juego, y vamos
a obtener esta velocidad de nuestro controlador de estadísticas. Entonces creo que una buena forma de configurarlo sería
usar el Blackboard Entonces, si hago clic en Enemy HSM, podemos pasar
al plan Blackboard, y vamos a administrar, y
agregaremos una variable Veamos las estadísticas. Esto puede ser una ruta de nodo, y luego vamos a
asignar el controlador de estadísticas. Entonces ahora podemos usar eso en, digamos, nuestro guión de Chase
y obtener la velocidad de él. Entonces, en la configuración, queremos
obtener ese controlador de estadísticas. Entonces podríamos decir var,
underscore stats es un controlador de estadísticas, y diremos que las estadísticas de subrayado sean iguales a Blackboard dot Git var, y estamos buscando
la Entonces a partir de ahí,
queremos obtener la velocidad. Entonces var velocidad aquí abajo
en la parte inferior otra vez, que es un flotador
va a ser igual a subrayar estadísticas punto Obtener velocidad O si queremos que eso sea
aún más sencillo, solo
podríamos decir velocidad de punto. Entonces ahora necesitamos una velocidad de tiempo de ejecución
para nuestras estadísticas de personajes. Entonces entramos en el controlador de
estadísticas, y vamos a crear una propiedad de
velocidad aquí. Entonces para la velocidad, un flotador
es igual a 100.0. Entonces esta es básicamente
la velocidad de carrera para el personaje en tiempo de ejecución. Todavía no hemos establecido ningún recurso de
definición para controlar básicamente cuáles serán
las estadísticas iniciales de cada personaje como el orco o dama pondrá en un
esqueleto Así que solo estamos
construyendo esto paso a paso. Entonces ahora en el Chase State,
tenemos nuestra dirección, tenemos nuestra velocidad,
tenemos nuestro Delta, así que solo necesitamos mover al
personaje una cierta cantidad. Entonces, cuando estás moviendo un cuerpo de
personaje dos D, hay al menos dos
formas de hacerlo. Una sería llamar a
Move y slide, y eso estaría en el NPC Entonces este agente es cosa de
NPC aquí arriba, creo que en realidad
sería mejor si hiciéramos Var NPC de tipo NPC Y en cambio, decimos, subrayar NPC
iguala agente como NPC Y entonces afirmamos que
este NPC no es nulo. Entonces esto asegura que
el agente sea un NPC, pero también tenemos una referencia
al NPC para que podamos usar
sus funciones de clase Así que eso hace que sea más
fácil bajar aquí y decir cosas como NPC dot
MOV y deslizar Puedes usar esto, y
esto también tendría la capacidad de deslizarse
a lo largo de cualquier colisión
que encuentren los enemigos Pero vamos a hacer que nuestros
enemigos ignoren colisión para este juego en parte
porque te permite apretar más
enemigos en la pantalla, y también en parte
porque
lo hace simple pero en realidad
voy a hacer npc dot
translate aquí Por lo que esto te permite moverte sin tener
en cuenta la colisión. Entonces tiene la desventaja de tus personajes no
van a poder deslizarse bordes como el borde del agua o un árbol o cosas así que
se están interponiendo en el camino Pero también tiene la ventaja de hacer que el movimiento sea lo más
simple posible, lo que significa que puedes
meter más enemigos en la pantalla a la vez. Y creo que tal vez
esto podría decirse que encaja un poco más al estilo de
un vampiro sobreviviente Así que sólo vamos a hacer que nuestros enemigos sean cerebrales muertos simples. Entonces pc dot translate, solo lo
estamos moviendo en una
dirección por una cantidad. Entonces hacemos tiempos de dirección tiempos
de velocidad Delta. Ahora bien, eso funcionaría bien, pero es posible que desee
sacar ese bit a una variable
más arriba
y guardar nuestro movimiento, que es de tipo vector dos, y lo pondremos
igual a este bit aquí. Entonces hacemos las matemáticas fuera
de la llamada a la función, y luego lo llamamos en movimiento vector dos
una vez que tenemos eso. Esto también
ayudaría con la depuración porque puedes establecer un
punto de interrupción allí y luego te
mostraría a
qué salió
realmente el valor de movimiento antes de llamar a Mientras que, de lo contrario, si
solo pones esto ahí, no
sabrías
lo que está pasando en la llamada de traducción a menos
que saltes aquí. Así que un poco más limpio,
un poco más fácil. Bien, así que voy
a golpear play, y vamos a ver
dónde estamos. Tenemos a los orcos corriendo
hacia el jugador, y donde quiera que esté el jugador
en la pantalla, van a
tratar de ir a eso,
que es exactamente lo que
esperaríamos Ahora bien, sí se mueven
bastante rápido, así que podría entrar en
Stack Controller y tomar la velocidad predeterminada
a algo así como, digamos, 40.0, y en juego Bien, y creo que eso es un
poco más apropiado. En la mayoría de los casos, el enemigo
debe moverse más lento el jugador para que al
menos el jugador tenga la
oportunidad de evitarlos. Podemos ver que todos están apilados uno encima del otro. Bien, entonces vamos a golpear
play, y veremos que los orcos van a
correr hacia el jugador Estos árboles no tienen
ninguna configuración de colisión, pero aunque lo
hicieran, seguirían corriendo
por el cuerpo del jugador. Ahora, el jugador sigue
colisionando también con los orcos. Y eso es porque
los orcos todavía tienen forma y cuerpo de colisión, y el jugador se mueve
usando mover y deslizar Así que nos toca a nosotros a donde
queremos ir desde aquí. Podríamos mover a todos los orcos a una capa de colisión diferente
usando colisión aquí Y probablemente lo
haría ahora mismo. Vamos a configurar algunas capas de
colisión. Así que edita los nombres de capa. Diremos que uno es mundo, dos es jugador, tres es enemigo, cuatro es proyectil, y eso debería ser bueno
por ahora. Eso lo cerraremos. Así que queremos mover a nuestros
enemigos a la capa enemiga, y apagaremos la
máscara para que en realidad
no estén buscando chocar
con nada en este momento Entonces ahora si golpeamos
play, nuestro jugador podrá caminar justo a
través de los enemigos, pero aún así colisionaría
con cualquier otra cosa Entonces, en realidad, no me gusta que se
apilen entre sí. Entonces, a pesar de que
Translate sería la función más rápida de
ejecutar aquí para el estado de Chase. Y este es definitivamente
el conjunto de líneas de código que va a ser el bloque de
rendimiento para el proyecto porque estás
teniendo cientos de potencialmente incluso miles de enemigos tratando de moverse
al mismo tiempo usando
este script de actualización. Y recuerden, casi todos los
enemigos van a estar en el estado de Chase todo el tiempo hasta que sean
realmente derrotados, y solo son
derrotados por un segundo. Entonces estás hablando todo está en
el estado de Chase al mismo tiempo que
la actualización
se ejecuta en cada fotograma. Entonces esta es la parte donde si necesitas optimizar
algo, esta sería la misma. Vamos a agregar la colisión de
nuevo para los orcos. Haremos que choquen
consigo mismos, y veremos si eso solo nos
da un mejor resultado El hecho de que los orcos estén uno encima del otro no es realmente lo ideal Entonces volveremos a poner eso. Entonces, en lugar de hacer
NPC dot translate, lo que hacemos es decir subrayar NPC Velocity va a ser
igual a este bit
sin Entonces me voy a
deshacer del Delta y diremos nueva velocidad. Bien. Y luego establecemos la vieja velocidad a
la nueva velocidad. Y luego en lugar de
llamar a NPC dot translate, llamamos npc dot move and slide Una vez más, quiero
iterar esto toma aproximadamente el doble de
potencia de procesamiento de mis pruebas Entonces, si pudieras tener
5 mil enemigos en pantalla al mismo tiempo antes de
que te pongas muy mal de lag, ahora serán alrededor de 2 mil 500. Pero si puedes tener a
los enemigos espaciados, tal vez no necesites 2.500
enemigos en la pantalla
al mismo tiempo porque todos ocupan una posición completamente
diferente. Entonces tal vez este es el camino a seguir. Entonces vayamos a la
orca, y la haremos para
que enmascara al enemigo También chocará
con el jugador aquí. Entonces está mirando al
jugador, al enemigo. Y vamos a convertirlo también en el
mundo, pero no en los proyectiles. Bien. Y luego queremos ir
al jugador ahora que en realidad estamos trabajando con diferentes capas de colisión, y estableceremos su capa de
colisión que está bajo colisión
Objeto dos D a jugador. Y entonces queremos que
choque con el mundo. Y en realidad, creo que solo eso. Pensándolo de
nuevo, los orcos, a lo mejor no quiero que
choque con el jugador Quiero que el jugador
específicamente pueda
atravesar enemigos para que
realmente pueda escapar. Entonces los enemigos
chocarán con
los enemigos y con el mundo, y vamos a golpear play a partir de ahí Incluso podríamos apagar
el mundo en algún momento. Depende de lo que
queramos. Bien, entonces vamos a ver. Parece que los enemigos no
se están apilando uno
encima del otro, lo que en realidad probablemente sea bueno. No ocuparán
exactamente el mismo espacio. Si queremos que estén
aún más espaciados, solo
aumentaríamos el
tamaño de esa forma de colisión. Aquí, si hago una pausa el juego
muy rápido y vamos a Editor formas de colisión visibles, y podemos volver aquí dentro. Oh, tenemos que reiniciar el
juego para eso, supongo. Bien, reiniciaremos, y luego podremos ver
las formas de colisión. Entonces esta de aquí abajo, esa es la forma de colisión del orco El grande es el radio de golpe, así que podemos golpearlos alto, pero solo pueden chocar a los pies porque así es como definimos
las formas de colisión antes Pero sí, con esta configuración,
estarán un poco más espaciados entre sí.
Y creo que me está gustando.
23. P22: Genera enemigos en una curva de tiempo: Puedes ver a nuestros enemigos trabajar. Van a tener un poco de
colisión entre ellos. cual, ya sabes, después de ver esto es definitivamente
el camino a seguir, más que el método de
traducir. No obstante, todavía solo tenemos
cuatro orcos al mismo tiempo. Queremos poder engendrar a
un montón más tíos, y si vamos por
ese estilo de superviviente, queremos que
engendren fuera de la pantalla y luego vayan hacia el jugador Así que casi en círculo, necesitamos que solo
aparezcan fuera de la pantalla y luego simplemente enjambre al jugador
en el centro de la pantalla Entonces necesitaremos un
sistema de desove para poder hacer eso. Vayamos al mundo, y agregaremos aquí un nuevo nodo
del sistema. Haré clic derecho en Agregar
un nodo hijo como nodo, y luego cambiaré el nombre de
este para que sea sistema de desove o
SponnorSystem,
si Haga clic derecho sobre él,
adjunte un guión. Entonces lo llamaremos
sponsorsystem punto gD y lo voy a guardar
en la carpeta de sistemas Y luego para nuestro sistema spawner, vamos
a necesitar declarar un
montón de propiedades diferentes que van a ser barras de exportación puedas
personalizarlas en el inspector Entonces, antes que nada, necesitamos
el margen de spawn, que es un float,
y lo tendré por defecto en diez.
Olvidé lo lejos que hay. Bien, entonces el margen de generación es la distancia mínima fuera la pantalla que los
personajes pueden generar Eso es en píxeles. Me llamarán así
para ser personajes en realidad y personajes ahí
arriba también. Podríamos tener un mundo en el
que engendremos PNJ, no necesariamente solo enemigos Por lo tanto, ayuda ser más genérico
cuando no estás seguro del uso final de tu
guión porque
en realidad podrías querer que sea más flexible que solo
hacer enemigos. Bien, a continuación, queremos
el engendro Rango Extra. Bien, entonces en Export
VR span rango extra, voy a hacer que esto vaya a 100. Bien, entonces esta es
la distancia adicional que un enemigo podría generar lejos del borde de la pantalla además
del margen de lapso Entonces, si tu margen de generación es diez y tu rango extra es de 100, entonces eso significa que la distancia de
píxeles del borde de la cámara
va a ser de diez a 110 píxeles Entonces necesitamos las definiciones para nuestros enemigos que
vamos a engendrar Entonces esto debería ser
básicamente una configuración que diga lo que puede engendrar
bajo qué condiciones Así que digamos en la exportación
var definiciones aleatorias, que es una matriz de definición de
desove Bien, ahora no hemos
definido esta clase. Va a ser
un tipo de recurso. Es una definición que configuramos en el editor que
usamos durante el juego. Entonces un recurso es el
tipo perfecto para ese tipo de datos. Bien, entonces eso nos va a dar un error
porque no
tenemos definido el nombre de
clase de definición de desove Hagámoslo. Ahora mismo. Voy a entrar en la raíz de nuestro
proyecto y el sistema de archivos. Digamos, tal vez esto pertenezca a los sistemas
porque es parte del sistema de
desove Voy a hacer clic derecho,
crear una carpeta, y diremos desove Y luego dentro de
aquí, voy a hacer clic derecho, crear un nuevo script, y voy a decir aquí engendrando definición de
subrayado, que es de tipo recurso Bien, crea eso y
luego abre ese guión. Bien, y tenemos que
dar un nombre de clase, definición de
desove
aquí en la parte superior, y nos preocuparemos por
configurarlo un poco más tarde Entonces, para continuar con
el sistema de desove, necesitamos un padre para donde
realmente engendramos nuestros objetos Así que en Exportar var spawn parent
es un nodo dos D referencia, el padre para cualquier objeto
generado por el sistema Y entonces queremos la frecuencia. Entonces voy a hacer de
eso una curva para que
podamos controlar el temporizador. A medida que avanza el tiempo
simplemente usando una curva y luego
muestreando desde la curva Entonces, en lugar de establecer como
diez períodos de tiempo diferentes, después de 30 segundos, se generan
cada 0.5 segundos. Y luego después de 60 segundos, spa cada 0.4 segundos. Sólo podemos tenerlo como una curva. Y luego, no importa
cuándo esté desove, solo obtendrá su siguiente
cantidad de temporizador de esa curva Entonces, si vas a
tener muchos valores, es más fácil
definir una curva con
una pendiente en lugar de
ir uno por uno y ser como si X entonces Y en como un estilo más
de diccionario. Entonces voy a decir exportar
var span frecuencia, que es de tipo curva. Bien. Volveremos a
eso en el inspector. Bien, lo siguiente que
vamos a querer es una variable de tiempo de ejecución. Voy a llamarlo
var random span stats. Y esto va a
ser de tipo diccionario. Quiero dar el tipo de
clave de diccionario y un tipo de valor. Y el tipo de valor
son las estadísticas de spawn. Entonces esto va a corresponder
el tipo de desove con las estadísticas para el desove en una proporción
uno a uno en proporción
uno a uno Entonces esto es específico del tiempo de ejecución, y esto es específico del editor. Y las estadísticas de spawn van a
hacer un seguimiento de cuándo
es la
última vez que realmente
generamos un objeto y cuántas veces hemos
generado usando Así que vamos a crear nuestro objeto de
estadísticas de generación. Haré clic derecho en desove
y crearé un nuevo script. Lo llamaremos estadísticas de desove. En realidad va a tener
este extender ref contado. Ahora podemos saltar a span Stats, y aquí arriba, le voy a dar
salpicaduras de nombre de clase Y las dos cosas que
quiero rastrear aquí son el recuento de engendros, que es un entero que comienza en cero y el último tiempo de generación, que es un flotador, y lo
iniciaremos en Enfinit Esta será la última vez que se generara el objeto. Bien, entonces ahora en nuestro sistema de
desove, tenemos esta relación Entonces, cuando iniciamos
el sistema de desove, queremos tomar las definiciones
y queremos crear un nuevo span stats para
cada una de las definiciones Entonces esto maneja
los datos de tiempo de ejecución. Esto maneja los detalles del editor para nuestra configuración uno a uno aquí. Entonces, si queremos
obtener las estadísticas de span, solo
podemos hacer referencia a
la definición de span, e inmediatamente escupirá las estadísticas de span que
corresponden con eso Y así es en pocas palabras
como funcionan los diccionarios. Tienes una clave, y te
dará un valor, y es muy
útil para relacionar dos objetos diferentes entre sí. Así que vamos a configurar nuestra función de
sistema listo. Entonces digamos que la función subrayado listo va a devolver void Y queremos decir para definición
en definiciones aleatorias, queremos tomar las estadísticas de spawn
aleatorias, y queremos asignar la clave de
definición a nuestro valor, que va a ser
una nueva estadística de spawn Entonces spawn statts punto n Bien. Y ahora tenemos uno de estos objetos para
cada definición, y están vinculados
en uno a uno de definición de desove como clave y span
stats como el valor Entonces ahora se vuelve
muy fácil
buscar las estadísticas de spawn
para la definición Bien, y digamos que el siguiente tiempo de generación va a ser igual a la frecuencia de
engendro, que es la curva, y
probamos en la curva
el tiempo transcurrido desde que comenzó
el juego Entonces necesitamos algunas
variables más aquí arriba, en realidad. Vamos a necesitar
el tiempo transcurrido var,
que es el tiempo desde
que el sistema de desove ha entrado en el mundo del juego Podemos crear una variable de temporizador. Entonces VarsPawtr es un flotador
de tipo cero, cero. Dado que este va a
ser un temporizador interno, está bien
tener un nodo que administre su
propio seguimiento del tiempo. Así que intentaremos hacerlo con
un sistema span en lugar crear un
objeto temporizador real en el mundo del juego. Entonces el sistema de desove
va a manejar su propio tiempo para
esta instancia Y entonces el
próximo tiempo de desove del spa
va a ser básicamente
cuánto tiempo estamos esperando
para este próximo spa Vamos a configurar la función de
temporizador aquí, proceso de subrayado de
función, y eso va a ser Delta como
parámetro, devuelve void Vamos a tomar el
tiempo transcurrido y sumar el Delta, que es el tiempo desde
la última llamada de proceso Así que el tiempo transcurrido
más equivale a Delta. Y luego queremos
tomar el temporizador de spawn y plus es igual
al Delta también, ya que estamos haciendo un seguimiento de cuánto tiempo desde que ocurrió el
spawn Y diremos que el
temporizador de desove es mayor o igual
al siguiente tiempo de desove, entonces vamos a
hacer un spa aleatorio Entonces lapso aleatorio aquí,
y luego después de eso, tomaremos el temporizador de engendro Y en lugar de establecer
eso directamente en Zal, voy a menos es igual al siguiente tiempo de desove porque podría
haber un
poco de tiempo de resto, especialmente si llegamos a intervalos de tiempo de lapso realmente
pequeños Entonces creo que es un poco mejor hacerlo más
preciso así. Y luego diremos que
el próximo tiempo de generación
va a ser un muestreo
de la curva de frecuencia Así es igual a muestra de punto
de frecuencia de desove, y estamos muestreando
el tiempo transcurrido. Entonces básicamente en la curva XY, es una gráfica donde X es
cuánto tiempo ha transcurrido desde que el
sistema entró en escena Y entonces Y es cuánto tiempo
esperar para el siguiente lapso. Entonces, sea cual sea el tiempo transcurrido, habrá un nuevo
valor que podamos obtener de la curva para establecer
nuestro próximo tiempo de generación en Bien, unas pocas líneas más, y hagamos nuestra función de engendro
aleatorio, hasta
ahora span aleatorio Tipo de devolución de vacío. Entonces, lo que tenemos que hacer es obtener nuestra definición de desove
que queremos engendrar Entonces esa va a ser una selección
aleatoria basada en una ponderación de cada una de las definiciones para determinar
qué objeto va a
ser span o no spawn Bien, voy a pasar
aquí por ahora mismo porque la lógica para el
desove se va a
complicar un poco
más Yo sólo quiero
hacerlo para que por lo
menos podamos verlo funcionando en el mundo del
juego por ahora mismo. Así que de vuelta en dos vista D, tomemos el
sistema spawner y asignaremos este bon parent al nodo
enemigo. ¿Bien? Entonces así,
deberían ser enemigos. Esta frecuencia de enlace
va a ser una nueva curva. Así que vamos a seguir esta curva, y podemos definir valores. Entonces, si puedes acercarte
aquí, eso te ayudará. El dominio Min en el dominio
Max va a ser básicamente cuántos segundos
en el juego lo tenemos. Entonces podrías decir algo como 300 segundos o 120 segundos. Por mucho tiempo
que pienses que debería ser el nivel, eso sería lo que te
gustaría hacer el dominio máximo. Entonces, si tienes un tiempo final para tu nivel y
luego después de eso, el nivel termina, entonces eso
sería perfecto para el dominio
Max aquí. El valor X Y, lo que queremos obtener siempre que
muestremos el valor X. Entonces, ¿cuánto tiempo debe
estar entre los engendros? Tal vez dos como el valor
máximo sería entonces subimos aquí a la curva y dejamos clic
para establecer un punto, y simplemente
controlamos eso. Entonces, en general, al
inicio de un nivel, querrías menos
engendros que al final Entonces, si como que sacamos
esto aquí arriba y decimos, tal vez solo cada 1.5
segundos, se genere un personaje, y luego pasamos hacia
la derecha y dejamos
clic a la izquierda y tiramos hacia abajo
este punto de fotograma clave a algo como esto
donde podemos decir cada tal vez no 0.2 Oh, quizá alguna vez 0.2 segundos. Así que cada 0.2 segundos,
un enemigo puede engendrar. Y como que tenemos esta
curva de aquí a aquí. También puedes hacer clic
en los puntos, y hay un ajustador de curvas si necesitas ponerte un
poco elegante con esto Entonces ahora mismo, si lo muestreamos, digamos a los 75 segundos
del nivel de juego, eso significaría
que el tiempo de generación
sería de aproximadamente 1.2 aquí Podemos ver eso desde donde el
XY se cruza en la línea. Entonces de igual manera, si íbamos
hasta el 225, entonces sería
aproximadamente medio segundo entre la frecuencia de desove enemiga Entonces la dificultad se vuelve
más dura a medida que avanza el nivel. Y solo podemos ajustar
esto. Incluso puedes establecer un tercer punto en el medio
si necesitas así. Tal vez lo necesites para aplanar por un tiempo y
luego ponerte muy duro Control E para deshacer. Y creo que
puedes hacer click derecho sobre un nodo para
eliminarlo de la gráfica. Lo más probable es que dos
puntos vayan a ser lo suficientemente buenos
porque puedes controlar eso con los
mangos si necesitas
cambiar esta tasa a cambiar esta tasa a que se vuelve más difícil.
Pero
podríamos hacer eso. Ahora, personalmente voy a
tomar este camino por aquí a la izquierda
porque en nuestras pruebas, realmente no
quiero
probar pasados 2 minutos. Solo quiero que sea de
ritmo rápido para que pueda mostrar cómo va
a funcionar más adelante Pero en tu juego real, siéntete libre de tener una curva de desove
mucho más larga
y más dibujada Entonces ahora mismo, después de
120 segundos aquí, sólo
va a quedar
plano para el resto. Y eso está bien
para mí ahora mismo. Bien, ahora vamos a crear una definición de
desove. Aquí arriba. Vamos a añadir uno. Necesitamos crear un nuevo recurso para
la definición de desove Así que nueva definición de desove, haremos clic derecho y guardaremos eso Vamos a entrar en
personajes, enemigos. Y puedo poner esto en la
misma carpeta donde está
el orco porque vamos
a llamarlo desove orco Definición o simplemente desove de orcos. Creo que el desove de orcos está bien. Dot TR, sí, lo guardamos. Pero claro, esto aún no tiene nada asociado con ello. Así que tenemos que agregar en qué escena
empaquetada en
realidad vamos a
instanciar cada vez que
engendremos Bien, entonces en la
definición de desove, guión. Vamos a agregar exportar
la vR la escena, que es un tipo de escena empaquetada. Y también podemos agregar
un peso var de exportación, que será un flotador de 1.0. Entonces tenemos la escena para
engendrar y la cantidad de preferencia para
seleccionar esta escena como la elección aleatoria de spawn Entonces, cuando seleccionamos aleatoriamente, podríamos tener como tres tipos, y cada uno de ellos tiene
un peso diferente. Entonces, si uno tiene un peso de tres y el otro
tiene un peso de uno, entonces el que tiene
un peso de tres tiene tres veces las probabilidades de ser seleccionado como el que
tiene un peso de uno. Y esa es solo una forma en que
podemos hacerlo un
poco más sesgado en
la aleatoriedad Entonces no es del todo aleatorio. Es que cada elección
tiene un peso para ello, y el peso
determina las probabilidades. En el esquema de la selección
aleatoria. Por lo que hacemos clic en sistema de
desove ahora. Ok el desove ahora va
a tener una referencia de escena, así que cargamos rápidamente nuestra escena Ok Bien, ahora eso
nos da lo que necesitamos. Entonces, para el
spawn aleatorio, voy a hacerlo lo más simple posible
ahora mismo
obteniendo la primera definición
en la lista y luego
instanciando Hasta ahora instancia, que
será un no dos D es igual a las
definiciones aleatorias en la posición cero. Y vamos a
conseguir la escena, y vamos a instanciar Bien, entonces ahora tenemos a nuestro Oc. Esa es la posición cero
y el desove de orcos. Entonces tomaremos eso
y lo agregaremos
al padre aleatorio o
al padre spawn Así que engendrar punto padre Ad
hijo de la instancia, solo
vamos a tener la instancia ir a la posición 00 por ahora mismo Nos preocuparemos por su
posicionamiento aleatorio más adelante. Y entonces podemos ver que la gestión de
span ya está manejada aquí fuera de
la función random spawn Entonces, honestamente, eso
en realidad podría ser todo lo que necesitamos. Para propósitos de prueba,
voy a tomar esto y hacerlo como 10
segundos por aquí, solo para que podamos ver realmente la rampa
de desove si funciona, y vamos a golpear play.
Entonces veamos. ¿Tenemos algún
personaje viniendo a las 00? Oh, sí, sí, puedo
verlos ahí mismo. Bien, entonces aquí están nuestros orcos. Se puede ver que está desove cada vez más rápido medida que pasa el tiempo Entonces ya básicamente
alcanzamos el pico de desove de orcos, y nuestras lanzas pueden simplemente
atravesarlas porque nuestra lanza
no tiene conteo máximo de golpes, por lo que es muy fácil ganar Pero puedes ver cómo la
curva lo hace para que podamos aumentar
fácilmente el
desove a medida que pasa el tiempo, y esa es solo una
característica genial que realmente me gusta mucho Es mucho mejor trabajar que
definir en como
a los 10 segundos, ahora la tasa de generación es 1.0, y a los 20 segundos, ahora es 0.9 Así que ahora puedes simplemente todos
los valores para todo el tiempo, básicamente ser manejados
por esta curva, y simplemente es mucho más
fácil editarlos. Pierdes precisión,
pero se vuelve mucho más sencillo darte una idea general de lo que
necesitas para estos valores. Y aún puedes, ya
sabes, dar clic y establecer valores absolutos. Entonces en puntos aquí,
puedes ver que puedes establecer las posiciones XY exactas para esos puntos si necesitas
ponerte realmente técnico. Pero en la mayoría de los casos, como dije, sólo dos puntos en una curva
van a ser lo suficientemente buenos. Entonces todavía hay mucho que agregar
al sistema de desove, pero este es un
comienzo bastante bueno para lo que necesitamos
24. P23 Aparejo fuera de pantalla con desplazamiento calculado: Bien, entonces ya tenemos
nuestro desove funcionando. Pero el problema es
que los personajes solo
están desove en
el punto 00 donde en
realidad queremos que se generen fuera la cámara donde quiera que esté mirando nuestra
cámara Así que siempre parece que
vienen de algún lugar
muy lejano, pero en serio,
solo vienen de un poco lejos de
lo que podemos ver. Y luego
van a nadar al jugador lugar de desovar
en el punto 00 Así que vamos a trabajar en eso. Bien, entonces en nuestro script de sistema de
llave, vamos a volver a entrar en
él en un lapso aleatorio Entonces en este momento el engendro aleatorio no
es muy aleatorio. Trabajemos en desovar
al enemigo fuera de la pantalla. Así que necesitamos obtener una nueva ubicación para donde estamos
generando la instancia Entonces aquí abajo, agreguemos
en una posición de desove var. Entonces ese va a
ser un vector dos. Y vamos a conseguir eso de
Obtener posición de engendro fuera de cámara. Entonces queremos generar una posición de
span que esté
fuera de la cámara. Entonces eso va a
involucrar algunas matemáticas y la ventana gráfica actual
de la propia cámara Así que vamos a crear nuestra función, Obtener posición span, fuera de cámara. Entonces lo primero que
tenemos que hacer es conseguir la cámara TD que está
actualmente activa, lo que nuestro verdadero
jugador humano está
mirando en la pantalla para que podamos quedarnos fuera
de eso cuando engendremos Entonces nuestra cámara va a
ser igual a Get viewport. Entonces básicamente, estamos
viendo lo que el jugador
puede ver actualmente, y vamos a conseguir
la cámara dos D que el jugador está usando
para ver la ventana gráfica Entonces tenemos acceso a esa cámara tal vez incluso tenga
sentido marcar esto como una cámara dos D. Así que podríamos tener una
revisión de guardia si nos gusta aquí, diciendo que si la
cámara es nula, lo
que probablemente nunca debería
suceder, pero en teoría, si pudiera, entonces
queremos empujar un error de
que no hay cámara, no
hay cámara dos D que
se encuentran en viewport Tal vez eso podría ocurrir si
por alguna razón estás usando una cámara de tres D y simplemente no
hay una cámara dos D. Supongo que eso
haría que desencadenara un error. Entonces es posible. Bien, entonces si eso ocurre, entonces hay un
problema importante en el juego. Sólo devolvemos
vector punto cero. Eso pasa y vamos a empujar el error y dejar que el
desarrollador se entere, Oh, por qué no hay
cámara en el juego. Bien, pero asumiendo que
tenemos una cámara, en realidad
podemos hacer las cuentas. Entonces primero, queremos obtener la posición central
de la cámara. Vamos a hacer VR camera
center es un vector dos, y queremos que la
cámara doc
posición global para eso.
Sí, así como así. Y entonces queremos el
tamaño de la cámara. Entonces, qué tan grande es la cámara en la dimensión X y
la dimensión Y. Entonces ese debería ser
otro vector dos. Entonces diremos que el tamaño de la cámara VR del vector dos va a
ser igual al vector dos, y obtenemos el tamaño de la ventana gráfica Así que consigue el tamaño de punto de la ventana gráfica, y luego queremos
dividirlo por la cámara Zoom Bien, entonces la razón de
eso es que nuestra cámara, especialmente en un juego de
dos D Pixar, si hago clic en la cámara
dos D aquí arriba, y luego miramos por
aquí en el Zoom, entonces puedes ver que nuestro Zoom realidad
puede tomar la
ventana gráfica y
escalarla en cuatro o cinco veces para que podamos ver bien
nuestro Pixar Por eso tenemos que asegurarnos que incluso si estamos
viendo, como,
digamos, 12 80 por 720 píxeles, si acercamos
un factor de cinco,
entonces el tamaño de nuestra cámara en realidad
se reduce a esos nuevos
valores basados en el Zoom Entonces es por eso que necesitamos
hacer ese ajuste. Entonces, a continuación, tenemos
la cámara VR rect, que es una rect dos
tipo D o rect dos Y esta es una forma
rectangular que representa los límites
de nuestra cámara Se basa en el tamaño. Entonces, para las matemáticas aquí,
estamos construyendo un nuevo rectángulo
haciendo Rectángulo dos
y luego paréntesis Y nuestro primer parámetro es el centro de
la cámara menos el tamaño de la cámara. Y luego multiplicamos
eso por 0.5. Y luego para la
segunda dimensión, solo
tenemos el tamaño de la cámara. Así que eso nos da la caja rectangular
apropiada que representa la
cámara en pantalla. A continuación, queremos
seleccionar aleatoriamente una arista de la que vamos a usar para
generar a los enemigos Entonces nuestra cámara es una caja, así que tiene cuatro bordes, y básicamente podemos engendrar a
nuestros enemigos arriba, abajo abajo, a la
izquierda o a la derecha Entonces solo queremos elegir
uno de esos bordes, y como queremos
igualar la distribución, simplemente lo
haremos al azar.
Y entonces no hay esperas. Entonces, en esencia, solo
debería significar que vienen de todas las
direcciones de manera bastante consistente. Así que si decimos var edge, y vamos a tener
que ser un valor entero, y va a ser igual
a Rand I para entero. ¿Le vamos a dar
cuatro por ciento? El signo de porcentaje aquí
significa resto, entonces es el resto
de dividirlo por cuatro, lo
que significa que o bien
será cero, uno, dos o tres, y esos
representan nuestros cuatro bordes. Bien, entonces necesitamos una compensación. ¿Qué tan lejos del
borde queremos
realmente engendrar a nuestro enemigo No queremos que
engendren directamente en el borde porque entonces
sería visible en la pantalla cuando se instancie
en el mundo del juego, y eso se vería un
poco funky Entonces digamos var offset, y eso va a ser
un float creo aquí, igual a span underscore
margin plus random float Bien, así que básicamente estamos generando un flotador aleatorio
aquí y vamos
a multiplicar eso por
el rango extra span. Entonces F aleatorio puede ser 0-1 0.0. Entonces un valor de cero veces nuestro rango
extra de span nos va a dar una
distancia extra de desove de cero Y si es 1.0, va a dar 100 porque eso es lo que
tenemos establecido la propiedad span extra
range. Y si tenemos
algo en el medio, entonces vamos a obtener
algún valor de píxeles 0-100 Además de nuestro margen de span, dándonos la compensación total. Bien, entonces vamos a decir
var spa position, y eso va a ser
asignado a un vector 20 aquí. Cero todas las tapas la
constante, más bien. Bien. Agrega algunas líneas más. Y diremos si el borde es
menor o igual a uno, entonces estamos tratando eso
como la parte superior o inferior. Entonces tomemos nuestra ventaja y haremos una
declaración de coincidencia con ella para que
podamos calcular la posición del hijo en
función de qué borde
estamos usando realmente. Entonces digamos match edge,
y default, vamos a
empujar un error manejado. Número de borde, porcentaje
s borde porcentual. Entonces tener eso es algo
de ayuda si olvidamos, por alguna razón, poner
en uno de los casos. Ahora podemos hacer coincidir
el entero de borde un valor Enum si queremos ser un poco más descriptivos verbalmente aquí Entonces, si vamos aquí arriba,
voy a declarar una enumeración, digamos
enum edge, y vamos a
tener top como cero,
abajo como uno, izquierda como
dos, y derecha como tres Bien, entonces ahora, si bajamos aquí y hacemos coincidir el
borde con esos valores, podríamos decir edge dot
top, si no me equivoco. Aguanta un minuto. Parece que aquí hay un
pequeño problema. Aún así, necesito poner signo
igual aquí para el rect de la cámara. Bien,
así que eso va a funcionar. Ahora podemos bajar
aquí a donde
estábamos haciendo la coincidencia de Enum, y realmente queremos
poner en el código aquí Entonces la posición de generación
X para la parte superior va a ser igual a un
flotador aleatorio de un rango Entonces decimos Rnf rango de subrayado, y vamos desde el
rectángulo de cámara punto posición punto punto X a cámara punto posición punto X
más cámara tamaño punto punto X. Así que para un rectángulo tutti, la posición X siempre
va a estar Entonces, si le agregas la
talla X a eso, entonces llegarías aquí del
lado derecho. Entonces, si vamos a ir
por la cima, queremos posicionarnos en algún lugar
entre aquí y aquí. Entonces por eso tomamos
el valor aleatorio de la posición y luego la
posición más el tamaño. Así que eso nos permite llegar a algún lugar entre
esta línea aquí mismo. Y entonces tenemos que hacer la posición
Y, por supuesto. Así que la posición de generación Y va
a ser igual a la cámara Rect. Posición de punto, punto, Y. Menos el desplazamiento. Entonces estamos restando el desplazamiento porque cuando
restas un valor de Y, realidad
estás
subiendo en Entonces tenemos la posición Y, que es la parte superior
de nuestro rectángulo. Entonces, déjame sacar
pintura aquí mismo. La posición Y está aquí
arriba, ¿verdad? Más específicamente,
sería el valor Y el que nos lleve al
punto 00 en el rectángulo. Entonces tomas el offset, que va a ser algún valor
aleatorio aquí arriba. Entonces nuestro enemigo va a estar especie de desove en esta zona, en términos generales
, y
esto se basa en lo que sea que el desplazamiento Y se
generó aleatoriamente para ser Entonces tenemos nuestro margen de diez píxeles, y luego tenemos
110 píxeles aquí como nuestro área de margen extra más, y luego nuestros enemigos pueden engendrar en algún lugar dentro de
aquí por el valor máximo Bien, ojalá,
eso tiene sentido. Y luego simplemente hacemos
lo mismo para todos los demás bordes. Así borde punto inferior. Va a ser precisamente
esta línea de aquí arriba. Y entonces la posición de span Y va a ser un
poco diferente. Así que queremos spawn
position punto Y es igual cámara rect punto posición punto Y más la cámara rect
dot size punto Y. Así que eso nos lleva la
parte inferior del rectángulo Porque ahora estamos
agregando el tamaño Y, que nos tira hacia abajo
a esta zona inferior. Y luego solo le agregamos
el offset a eso. Entonces más offset y
nota que estamos sumando el offset porque
queremos ir más abajo debajo de la caja de la cámara, pero en la parte superior,
restamos el offset Eso es muy importante. Ahora solo hacemos lo mismo con
la izquierda y la derecha. Así borde punto a la izquierda, que es nuestra enum de dos Y eso va a ser
posición de generación punto X igual, cámara rect punto posición punto y menos el desplazamiento porque
vamos a la izquierda en nuestro cuadro, así que queremos
desplazar hacia la Eso es todo para la posición de
spa X, y es POS de spa, no
posición de spa. Yo lo abrevié. Entonces spa post Y ahora
va a ser igual a, y tomamos un rango F aleatorio entre el rectángulo o cámara, punto posición punto Y. Así que esa va a ser
la parte superior de nuestra caja. Y entonces el otro lado de aleatorio va a ser
el fondo de nuestra caja. Así que esa va a ser
cámara destrozada punto
posición punto Y más cámara
naufragio tamaño punto Y. Así que cuando añadimos el tamaño, una vez más, vamos
bajando al fondo Entonces nuestra posición de span verticalmente para izquierda y derecha está
en algún lugar de esta línea aquí mismo. Y luego finalmente, borde
punto derecho todas las tapas. Va a tener la posición
span X de cámara Rect punto posición punto X más la cámara dimensionamos
punto X más el offset Entonces lo mismo.
Tenemos una caja por aquí y una caja por aquí, y queremos
compensar a la derecha
o a la izquierda si
estamos desove a la izquierda o a la derecha Déjame
verificarlo dos veces. Bien, posición X más tamaño punto X más desplazamiento. Bien, eso parece correcto. Por supuesto, lo
probaremos en juego. Y entonces la posición de span Y debería ser la misma
porque todavía estamos lidiando con esa vertical recogiendo un punto aleatorio
entre aquí y aquí y aquí y aquí para una para la generación izquierda y
derecha. Bien, entonces ese debería
ser básicamente nuestro código de posición span. Y luego queremos
devolver la posición span. Entonces esta función
está bien tal como está. No está tan mal. Si se
volviera un poco más grande, probablemente simplemente sacaría
esto a otra función. Honestamente, podríamos
porque sentí la necesidad de poner este
comentario en el código. Entonces si quisiera,
podríamos decir función,
guión bajo, calcular el engendro
final, que volverá
en un vector dos Y luego ponemos eso aquí en lugar de ponerle por defecto al vector dos y poner
todo esto aquí abajo Y cortamos esto a
nuestras nuevas funciones, así que lo estamos refractando. Y entonces obviamente
vamos a requerir algunos parámetros para entrar en esta función
para que funcione. Entonces primero,
necesitamos, digamos,
cámara rect, que
es un rectángulo dos, y luego necesitamos el tamaño de la cámara, que es un vector dos Control S. Y luego queremos devolver la posición
hijo dentro de aquí Entonces la posición de desove var
es un tipo de vector dos. Bajamos al fondo y
regresamos a la
posición de spa fuera de aquí. ¿Bien? Aquí arriba, queremos
pasar esos parámetros, así que rect de cámara y tamaño de cámara Y entonces necesitamos esto por aquí. Por último, también
necesitamos el offset. Así que pasa en el offset aquí arriba. Bien. Y entonces necesitamos
offset como parámetro. Así que offset, y creo que ese
fue un vector dos también. ¿Bien? Entonces, ¿Control S en realidad
era solo un flujo? Oh, era una carroza. Bien.
Entonces un flotador unidireccional. Y una vez que guardes ese, la
mayoría de estos errores
deberían desaparecer. Así que tenemos que coincidir en el borde, y luego tenemos que regresar. También podríamos poner en
ese parámetro de borde. Así borde, que
va a ser de tipo. De hecho, podríamos
usar la enumeración aquí. Debería funcionar bien
porque el entero puede simplemente asignarse automáticamente a
una enumeración por lo que sé Entonces si subimos hasta aquí y luego
pasamos al borde, Bien, eso va a entrar
aquí y
va a funcionar como enumeración,
que es algo así como con lo que
esperamos que la empareje aquí abajo Entonces, para pasar un poco por
enumeraciones, una Enum es básicamente una
lista de valores con nombre que corresponden con la
posición entera dentro de esta Entonces el cero porque esta es la primera es la posición cero. Entonces es como el primer
elemento de una matriz. Casi se podría pensar
en ello así. Y luego abajo es uno, la izquierda
es dos y la derecha es tres. Creo que algunos lenguajes
permiten asignar valores enteros
personalizados a un Eenum No sé si
puedes hacer eso en GdCrip pero esa es
básicamente la idea Si no te metes con eso,
entonces cero es solo top. Uno es justo abajo, dos está justo a la izquierda, y
tres es justo. Pero lo que esto
te da la ventaja de hacer es que cuando
creas una función como esta, en lugar de decir
cero, uno, dos, tres, cual es muy oscuro para lo que eso realmente
representa, ¿qué es un cero Simplemente puedes reemplazar
eso con edge dot top, que es el valor de cero, pero es mucho más claro
para alguien que lee el código lo que realmente se
supone que representa eso. Bien, vamos a ver. Así que tenemos nuestra
posición Get spawn fuera de cámara, y la teníamos aquí
en lapso aleatorio Así que ahora realmente necesitamos establecer la posición para la instancia. Entonces la posición global de instancia va a ser igual
a la posición de engendro Esa parte es fácil. Vamos a presionar Play y a ver si
realmente funciona. Porque eso era
un poco de código. Bien, entonces nuestros personajes no están
apareciendo en la pantalla. Los veo venir
de fuera de la pantalla. A ver, o cualquiera que venga
de abajo y de la derecha. No veo ninguno viniendo
de arriba ni de la izquierda, y eso
me preocupa un poco. Entonces voy a ver si puedo encontrarlos. Bien. Y pienso lo que
debemos hacer para probar eso. Voy a cerrar el juego
ahora mismo es bajar aquí y nos faltaban
en la parte superior y la izquierda. Entonces agreguemos un punto de interrupción
aquí y un punto de interrupción aquí. Entonces, si, de hecho, los
personajes están tratando de
engendrar desde arriba y por la
izquierda, entonces esos deberían golpear Y entonces podemos comprobar los valores que en realidad están pegando. Entonces me olvidé de parar en el juego, así que va a golpear
automáticamente este punto de interrupción Pulsa Play y mira si podemos
conseguir uno de la izquierda. Bien, ahí sí vi uno
viniendo de arriba, en realidad. Bien, y uno viene
de la izquierda, supuestamente. Entonces parece que va
a ir, ¿verdad? A lo mejor si subo un montón la tasa de
desove, será más fácil de ver seguro Entonces vayamos al mundo. ¿Tenemos el sistema de llave? Yo sólo voy a tomar esto aquí mismo. Voy a
recordar el valor. Así que fue 0.66 y 1.5, y solo voy a caer de
esta manera para que podamos obtener algunos
desove muy rápido por ahora mismo Vamos a golpear Play, y
voy a probar. Así que solo veremos a
un montón de tipos desovar muy rápido o deberíamos Y si, bien, eso
se ve mayormente correcto. ¿Podemos conseguir a un tipo del
fondo que queda por aquí? Porque yo también quiero
que eso ocurra. Bien, sí, sí,
finalmente, finalmente. Tenemos a un par de tipos por allá. Bien, entonces creo que
está funcionando bien. Si hay un problema, es
posible que las matemáticas no
fueran una doble verificación
para ser correctas, pero creo que va
como se supone que debe hacerlo. Si no, es un
poco difícil de decir. Pero sí, sí
los veo venir de todas direcciones. Entonces
creo que estamos bien aquí. esta matemática
sería algo muy Sin embargo, esta matemática
sería algo muy
fácil de equivocarse, así que lo pondré en pantalla una
vez más si necesitas
verificar dos veces. Entonces tenemos nuestra posición de engendro. Lo estamos obteniendo de la posición de
generación G fuera de cámara. Esa es nuestra función aquí mismo. Entonces obtenemos el centro
de la cámara desde la posición global de la cámara, el tamaño de la cámara, es
desde el tamaño de la ventana gráfica, y luego lo divides
por el zoom de la cámara El rectángulo de la cámara
se construye desde el centro de las cámaras menos
el tamaño de la cámara por 0.5, y luego el valor Y para
eso es solo el tamaño de la cámara. El borde es entero aleatorio, y obtienes el
resto de cuatro, lo que te dará de
cero a tres. El desplazamiento es el margen de span más F aleatorio multiplicado por
el rango extra de span. Entonces esto es en algún lugar 0-1
punto con puntos decimales, y luego agregamos el rango
extra span como algún
porcentaje de eso Calcula el lapso final usando todas esas propiedades que acabamos de
configurar el rect de la cámara, el tamaño de la cámara, el
desplazamiento y el borde Así que llevamos eso aquí. Coincidimos en el borde. Entonces cero, uno, dos y tres. Y luego para el valor X
en la parte superior e inferior, hacemos un rango aleatorio
entre el lado izquierdo y el lado derecho. Usando esa matemática. Para la posición Y, tomamos la posición Y en la parte superior y luego restamos el desplazamiento
o para la parte inferior, agregamos el tamaño para
llegar al fondo, y luego sumamos el desplazamiento Y luego para izquierda y derecha, hacemos lo mismo a la inversa. Entonces para X, hacemos el
lado izquierdo menos el offset, dándonos más a la izquierda. Y luego para el lado
derecho, agregamos el tamaño a la posición
X para obtener el lado derecho, y luego agregamos el offset para ir más a la
derecha de eso. Entonces para la posición de span Y, hacemos un rango aleatorio
entre la posición, que es la posición cero Y, y luego la posición más tamaño, lo que nos da la posición de
esquina inferior en el eje Y. Y así eso hará que el
spa izquierdo y derecho quede en algún lugar entre la parte superior de nuestra pantalla verticalmente y la parte inferior
de nuestra pantalla verticalmente. Pero la posición está
desplazada fuera de la pantalla, así que en realidad no los
veremos desovar Y devolvimos
la posición span podamos usar eso en
esta otra función, y eso es más o menos
va a terminar eso.
25. P24: aparejo de un enemigo al azar con condiciones de peso y tiempo: Nuestro desove fuera de la pantalla
está funcionando, esencialmente. Hay un par de cosas que
quiero limpiar,
y luego
procederemos a agregar un enemigo esquelético para que
podamos seleccionar aleatoriamente
qué enemigo
vamos a engendrar
en función de un sistema de espera Entonces vamos a cerrar el juego. Y antes que nada, podemos
ver aquí esta etiqueta, la instancia de
texto de combate flotante. no necesitamos eso porque
ya terminamos de editar
la animación. Entonces voy a
borrar ese nodo. Y luego en el sistema de desove, para la demostración,
tomé de esta manera
más bajo de lo que era antes Entonces por aquí en el primer punto, quería traer eso de
vuelta al original, que fue como, creo que fueron 0.66 segundos originalmente,
y luego 1.5 Voy a hacer que
0 segundos y luego 1.5 segundos como periodo de
desove Así que en realidad podemos simplemente
bajar aquí y escribir 1.50. Presiona Enter, si quieres
ser preciso con la configuración, y puedes ver que
el punto mientras seleccionado muestra 0 segundos, y luego 1.5 segundos
como el tiempo de generación 0 segundos es el
tiempo transcurrido aquí, si recuerdas. Creo que estos cuatro enemigos de trabajo, solo
podríamos sacar
de la escena. Entonces voy a borrarlos. Entonces voy a
seleccionarlos, golpear golpear Bien. Puedes presionar play solo para probar que todo
sigue funcionando, y deberíamos conseguir que los enemigos que se
generen fuera de la pantalla
viniendo hacia nosotros. No tenemos puedes
golpear play si quieres verificar dos veces y solo asegúrate que los enemigos
sigan desove Simplemente no necesitamos a
esos enemigos iniciales
porque los enemigos van a venir después de que comience el juego. Nosotros sí queremos darle al
jugador un par de segundos para, ya
sabes, conocer los controles y así sucesivamente Bien, entonces para crear
al enemigo esqueleto, primero
clonemos al orco en mí. Entonces voy a
buscar orco y el proyecto. Bajamos al punto orco TCN. Voy a hacer click derecho
y clonarlo, así que duplique. Lo llamaré esqueleto punto TCN. Y luego busquemos en
el proyecto
esa escena de esqueleto que
acabamos de crear. Haga doble clic en él. Y
luego vamos a acercar aquí. Entonces voy a tomar
el sprite aquí y cambiarlo por el sprite
esqueleto Así que vamos a
cargar rápido a la derecha, y vamos
a buscar ídolo, y debería haber
uno para el esqueleto. Es posible que necesitemos acercarnos un poco. Debería haber uno aquí
para un enemigo esqueleto. Y luego en la parte superior
derecha, podemos cargar rápidamente, y es posible que tengas que acercar
un poco para encontrarlo, pero escribe inactivo y buscaremos la hoja de sprite esqueleto Puede que sea un poco
difícil de ver, pero voy a seleccionar
este de aquí mismo. Si no puede encontrarlo, no
dude en simplemente
navegar por el
sistema de archivos y encontrarlo. Probablemente esté en la carpeta base del
esqueleto. Bien, ahora cambiemos el nombre del nodo
raíz a esqueleto. Y vamos
a necesitar configurar el reproductor de animación para
asegurarnos de que esté reproduciendo las animaciones del esqueleto inactivo
y luego el esqueleto de Ron y la muerte
del esqueleto también. Entonces vamos al reproductor de
animación. Y luego en la parte inferior
derecha, básicamente
necesitamos cambiar la textura
para cada uno de estos. Entonces la textura de reinicio irá a la parte superior derecha y luego
cargará rápidamente la
hoja de sprites Idle que acabamos de seleccionar En este momento
ya está preseleccionado, así que podemos seleccionarlo. Y es posible que
desee jugar y
asegurarse de que enciende
el reinicio al esqueleto y luego cambiar la textura para las
otras animaciones también. Entonces Idle vamos a hacer click en la textura, ir
a la parte superior derecha. Carga rápida, elige la
hoja de sprites por tercera vez. Bien, y pulsa Play. Y luego asegúrate de que esté
jugando correctamente. Se ve bien. Vamos a la animación
de la muerte. Selecciona la textura aquí. Y como hay muchos
fotogramas en la parte superior derecha, es un poco difícil ver
realmente lo que está pasando, incluso más difícil que
la animación ociosa. Entonces creo que sería más fácil simplemente navegar
hacia el arte y luego encontrar pack libre de
rastreadores de píxeles, entidad,
mobs, tripulación de esqueleto, muerte base, y luego simplemente arrastrar
la hoja de la muerte hacia la parte superior derecha así Bien, pulsa play y asegúrate que está jugando correctamente. Entonces parece que aquí hay ocho
fotogramas de animación. Entonces sí necesitamos acercar
un poco así y
asegurarnos de que los fotogramas H se coloquen
en la parte superior derecha en ocho. Bien, entonces pulsa Play. Sí.
Bien, eso parece correcto. Y ahora necesitamos agregar en los fotogramas clave séptimo y
octavo Así que haga clic derecho sobre el marco a los 0.6
segundos y haga la tecla de inserción, haga clic en él, vaya
a la parte superior derecha, cámbielo a seis, haga lo mismo
al 0.7. No se puede chasquear ahí porque
necesitamos extender la animación. Así que haz la animación de
0.8 segundos de duración. Da click en 0.7, S ese
fotograma clave y cambiarlo a siete para la octava posición es lo que queremos.
Bien, vamos a golpear Play. Juega una vez más.
Ahí está nuestra animación. Ahora mueve el
estado de muerte terminado
al final en 0.8
segundos así, y ahí está nuestra animación de muerte. Bien, entonces
queremos correr. Debería ser más rápido. Haga clic en la textura. Y luego en la parte inferior izquierda, donde dice esqueleto base, elige la carpeta de ejecución, la
hoja de ejecución sobre la parte superior derecha. Deja caer eso. Pulsa play, y podemos ver que está
reproduciendo nuestra animación de carrera. Tiene los mismos marcos de edad, así que eso es todo lo que necesitamos para cambiar. Bien, eso es lo básico
de nuestro esqueleto. Podemos ir al controlador de
estadísticas. Aparte de asignar estadísticas, es como velocidad de carrera
y HP y así
sucesivamente para nuestro esqueleto y
unos valores personalizados para nuestros orcos y CD que
es la configuración básica allí para nuestros dos personajes Así que volvamos al mundo, y luego vamos a tener
el sistema spawner, Así que tenemos nuestras definiciones aleatorias
aquí a la derecha. Queremos agregar otra definición
aleatoria, y luego vamos
a crear una nueva. Así que nueva definición de desove. Digamos que el peso
para el esqueleto es 0.5 así que obtendremos la mitad de
esqueletos que orcos Y carguemos rápidamente la escena del
esqueleto, ¿de acuerdo? Y luego solo revisaremos
el script del sistema patrocinador. Entonces ábrelo, y veremos aquí
la selección aleatoria. Entonces en estos momentos
no está generando la escena de selección
aleatoria. Es solo seleccionar el
primero de la matriz. Así que o necesitamos
un poco de código o una función con el fin elegir qué escena
realmente vamos a instancia. Así que vamos a acercar,
y voy a decir var scene es una escena repleta, y vamos
a querer seleccionar el spawn aleatorio de
una lista de definiciones
abarcables aleatoriamente. Entonces diremos
definiciones aleatorias, salvo eso. Y luego necesitamos crear esta función de
spawn aleatoria seleccionada Entonces voy a hacer función, Control V para pegarlo adentro. Y entonces vamos a
decir P definiciones es una matriz de vamos a ver cómo
lo llaman definición de desove Y vamos a devolver
una sola escena repleta. Entonces, si las definiciones P están vacías, entonces podemos devolver null porque no hay nada
para seleccionar. De lo contrario,
calculemos a partir de
todos los pesos totales y luego generemos
aleatoriamente un valor entre cero y
el peso total para determinar qué escena
estamos seleccionando realmente. Entonces eso es selección aleatoria, pero es selección
aleatoria ponderada. Entonces digamos que si nuestro peso total es un flotador, comienza en 0.0. Y luego para definición
o definiciones D y P, vamos a tomar
el peso total, y vamos a
aumentarlo por el peso de definición. ¿Bien? Entonces lo hacemos
para cada definición. Ahora tenemos el peso total, y necesitamos generar un valor entre cero y
el peso total. Hasta el momento, digamos que el
valor aleatorio es un flotador. Y vamos a tomar
F. al azar Así que esto es de cero
a un punto oh, todo incluido,
incluyendo decimal, y va a ser
veces el peso total. Entonces eso
nos dará un valor aleatorio entre cero y
el peso total. Y entonces digamos que V
comprobó el flujo de peso es de 0.0. Entonces este es el valor de peso que hemos intentado pasar antes de
golpear el valor aleatorio. Una vez que alcancemos el valor aleatorio, devolveremos cualquier escena o cualquier definición
sne en la que estemos actualmente Entonces, para la definición
en las definiciones P, vamos a decir que
el peso comprobado
más es igual al peso de
punto de definición. Y si el peso comprobado
está por encima del valor aleatorio, entonces devolveremos la escena. Así devuelvo definición punto CM. Bien. Y luego si
llegamos al final y todavía no hemos
golpeado nada, eso es un problema, así
podemos empujar un error. Bien, entonces aquí estoy
empujando un error. No se pudo
encontrar una definición en porcentajes de valor ponderal, donde el peso
total verificado fue Porcentaje Y luego estoy reemplazando
esos porcentajes por
el valor aleatorio y
el peso comprobado Entonces este tipo de muestra lo estábamos comprobando, a
dónde llegamos, y es indicar que en realidad no
encontramos una comprobada que estuviera
por encima del valor aleatorio, lo que siempre debería
suceder porque el valor aleatorio sólo puede
subir al peso total. Entonces esto no debería ocurrir, pero si lo hace, tenemos
un mensaje de error. Y luego al final
aquí, solo podemos decir return null porque no
fue capaz de encontrar
una definición adecuada. Entonces esto tiene más sentido. Probablemente inmediatamente
romperá algo indicando que
algo necesita
ser arreglado en las matemáticas
en esta función. Una vez más, quiero recalcar que
esto nunca debería suceder. Si nuestra matemática es correcta. Bien, entonces seleccionamos el spawn aleatorio de
nuestra lista de definiciones, y eso maneja el peso
y los cálculos aleatorios Entonces, si ejecuto el juego
ahora como están las cosas, entonces deberíamos estar recibiendo la mitad de
esqueletos de los orcos Pero veamos. ¿Los
conseguimos a los dos? Porque deberíamos
conseguir los dos. Entonces tenemos algunos orcos desovando. Bien, entonces en realidad
resulta que el código
funcionaba perfectamente bien
para el spawn aleatorio selecto Simplemente me olvidé de usar la escena. Entonces queremos tomar
la escena aquí. Y en lugar de la
definición aleatoria cero instanciar, simplemente
hacemos instanciar enviado Bien, ahora podemos volver al spawn aleatorio y eliminar
ese mensaje de depuración de Prince ¿Bien? Y si jugamos,
debería funcionar bien. En realidad, debería
usar el que seleccionamos aleatoriamente en lugar siempre el
primero en la matriz. Entonces deberíamos conseguir la mitad
de esqueletos que orcos, pero
ahí está Y a medida que pasa el tiempo, verás un montón más orcos
luego verás esqueletos por la espera.
Bien, así que eso es bueno. Y esa es básicamente
la idea ahí. Bien, entonces lo último
para esta parte, posible
que quieras
retrasar cuánto tiempo hasta que una definición de enemigo pueda
realmente generar en el juego Por ejemplo, al inicio,
tal vez solo tienes orcos, pero luego después de un tiempo,
puedes agregar esqueletos Entonces ya tenemos
el tiempo transcurrido. Entonces, si decimos una hora de inicio
y finalización en términos de tiempo transcurrido cuando se puede generar una
definición,
entonces podemos controlar
cuándo pueden desovar los orcos y cuándo pueden desovar los Entonces, si entro en definición de
desove, podemos agregar una var de exportación aquí
o tiempo de inicio un float, y esto puede ser 0.0 por defecto Y luego la hora de finalización
también por defecto eso será 0.0. Entonces lo que queremos hacer
con estos dos es empezar a crear como un método can
be spawned Entonces podríamos decir que
la función puede ser spawn, que por supuesto va a
devolver un verdadero falso booleano Y para ello, en
realidad queremos pasar en el tiempo transcurrido porque
eso es parte de la condición Tenemos que comprobar qué hora
es en el juego o tiempo desde que
realmente se ha creado el sistema spawner , Y luego lo
usaremos para verificar si el tiempo transcurrido está dentro de
la hora de inicio
o la hora de finalización Entonces, si P el tiempo transcurrido es
anterior al tiempo de mirar fijamente, entonces volveremos falso Si el tiempo de finalización
no es igual a 0.0, o mejor dicho, si el tiempo de finalización
es mayor que 0.0, creo que es un
poco más fácil de leer. Entonces queremos verificar si
realmente se ha pasado la hora de finalización. Entonces, si el tiempo de finalización es
cero, solo lo estamos ignorando. Entonces y P el tiempo de transcurrir está
por encima del tiempo de finalización, luego volveremos falso De lo contrario, hemos pasado todas las condiciones para que
podamos volver verdaderas. Entonces eso es básicamente
todo lo que necesitamos
hacer para un generador basado en el tiempo,
y solo verificamos si
se puede generar y solo verificamos si
se puede Y si no se
puede generar, lo
eliminamos de la lista que consideramos para la selección
aleatoria Harías algo
muy parecido. Si también quieres, digamos, tener un número máximo
que puedan ser engendrados, simplemente
pasarías el número que se
ha generado y
comprobarás si ese está por encima o igual al número máximo
que permitiría
la definición de desove Eso sería útil
para algo así como un jefe que solo puede engendrar una vez Entonces solo puedes verificar, Oh, puede engendrar una vez. ¿
Cuántas veces engendra? Es uno o
mayor que no lo engendrar. veremos si
volvemos a eso, pero esto debería ser todo
lo que necesitamos para escribir ahora. Así que ahora, de vuelta en el sistema
spawner, queremos básicamente filtrar spawnb de Así que voy a
crear una función filtro spawnb que
va a tomar una matriz
de definiciones P definiciones, y eso es arma. Esa es la definición de
desove Y luego devolveremos
nuestras definiciones filtradas. Así que devuelve una matriz de definición de
desove. Así que creamos nuestra lista
filtrada aquí. Var filtró matriz de definiciones de
desove, y eso va a ser
igual a una matriz vacía Y luego para las definiciones DF
y P, comprobaremos si se
puede generar DEF Supongo que necesitamos el tiempo
transcurrido aquí, pero esa es una variable local Entonces solo podemos pasarlo
directamente a esto. Así que el tiempo transcurrido, como en
no necesitamos ponerlo como parámetro
a esta
función porque es
parte del estado del objeto,
que es el sistema de desove Entonces, si se puede generar, entonces lo agregaremos a
la lista filtrada Así filtrada definición de pluma de punto. Y luego al
final, solo volvemos filtrados así que aquí en span aleatorio, hacemos var spanable y eso va a ser
igual a filter spanable, que va a tomar nuestras definiciones
aleatorias
como parámetro Y luego, en lugar de
seleccionar spawn random de definiciones aleatorias, seleccionamos spawn random de nuestra variable expandible filtrada. Bien, ahora eso nos da la habilidad en el sistema de
desove, si pasamos a las definiciones de
desove,
podemos decir hora de inicio, hora Digamos que los orcos siempre
están activos. Pero luego para el desove de esqueletos, no
podemos desovar esqueletos
hasta los 15 segundos, pero luego una vez que podemos
desovar esqueletos, tenemos un peso de dos,
así que terminamos viendo muchos esqueletos en cuanto son capaces de Entonces podemos jugar. Y si
todas las matemáticas se revisan, deberíamos ver
nada más que orcos inicialmente Pero luego después de 15 segundos, podría ser útil tener, terminar tiempo de
juego o algo para ver
veremos si necesitamos eso. Entonces después de 15 segundos, podemos ver que los esqueletos van a comenzar a
desovar porque
ahora se les permite ser abarcables porque ha transcurrido el tiempo
de inicio de 15 Bien, entonces ahora puedes ver que empiezan a entrar
los esqueletos. Entonces tenemos nuestra segunda
ola de enemigos, y podríamos simplemente hacer
los esqueletos Entonces la dificultad
avanza a medida que
avanza el juego porque agregamos enemigos
más duros. Y, por supuesto, en
el sistema de desove, aumentamos la
tasa de desove, así Entonces se puede ver
cómo funcionaría eso. Esa es la naturaleza de controlar
básicamente el desove aleatorio de
nuestro sistema de desove Eso es la mayor parte de lo que
realmente necesitamos aquí. Buen trabajo manteniéndose al día
con todo hasta el momento. Bien, entonces podríamos
hacer un par de retoques aquí y allá más
adelante si es necesario, pero en su mayor parte,
ese es nuestro sistema spawner Entonces ahora deberíamos
empezar a trabajar
en desarrollar
un poco más el combate y hacer que nuestros enemigos realmente
puedan dañar a nuestros jugadores sería un buen siguiente video.
Así que vamos a partir de ahí.
26. Configuración de la caja hurtbox y la caja de éxito enemigo P25: Parte de nuestra
mecánica básica de combate va a ser configurar la capacidad para que los
enemigos golpeen a nuestro jugador, lo que va a
implicar configurar una caja de golpe para los enemigos cuando se
encuentren con el jugador, y necesitamos asegurarnos de que el jugador tenga una caja de
Hurt, también. Y probablemente
agregaremos un
tiempo de invencibilidad solo para asegurarnos de que no
recibimos demasiados golpes cuando somos acosado por un enemigo
como ese. Bien, así que en nuestro jugador, crearemos nuestros nodos Hurt Box. Entonces haré clic derecho
en la ruta del jugador, agregaré un nodo hijo, y busquemos HRT Box
dos D. Enter, agrégalo Asignaremos el controlador de
estadísticas, que aún no hemos agregado
a nuestro reproductor, que podamos hacer clic derecho sobre el jugador, agregar un nodo hijo, controlador de
estadísticas. Bien. Y luego queremos
hacer algunas tareas. Entonces objeto para el controlador SAT va a ser el jugador root. Y luego en cuadro HRT, queremos asignar
el controlador stat Entonces nuestra caja HRT, se puede
ver por la señal de advertencia, también
necesitamos una forma de colisión Así que vamos a hacer clic derecho sobre él
y darle un nodo hijo. Forma de colisión dos D. Y
luego en la parte superior derecha, haremos esto probablemente
como una forma de círculo. Bien, así conseguimos que aparezca esta forma de
círculo. Queremos
reducir esto al tamaño que queremos para poder recibir
daños para nuestros jugadores. Entonces, dependiendo de cómo
queramos hacerlo, podríamos hacerlo
un poco más pequeño o poco más grande que
nuestra forma de colisión. Voy a ir a lo grande por ahora, y luego podemos
encogerlo si es necesario para el equilibrio del juego o
la sensación de las cosas. Entonces eso ya nos
da la posibilidad recibir daño al jugador. Ahora tenemos que darle a los enemigos la capacidad de infligir
daño al jugador. Entonces en nuestra escena orco, hagamos clic derecho sobre Orco,
agreguemos un nodo hijo, golpeemos la casilla dos D. Y entonces esto va a
necesitar una forma de colisión. Entonces haz clic derecho,
agrega un nodo hijo, forma de
colisión dos D, y
luego en la parte superior derecha, lo
haremos una forma de círculo, y luego
lo reduciremos a donde queremos que el orco
pueda golpear objetivos Así que lo haré
un poco más grande que la forma de colisión principal
para la colisión real. Entonces en nuestro RT Box dos D,
si verificamos el guión, podemos ver que
obtenemos la señal
de hit del hit box
golpeando una casilla RT. Entonces, para infligir daño, en realidad
necesitamos otro guión para infligir daño en la señal
golpeada y siendo emitida. Antes de eso, sin embargo,
agreguemos las capas de colisión para nuestra caja de
impacto y nuestras cajas de daño. Por lo que el hit box dos D en la capa de colisión va a estar enmascarando para
la capa del jugador. Entonces máscara de la capa dos porque
esa es la capa del jugador. Para las capas en las que existe
esta caja de cadera, solo
podemos apagar la capa uno, o podríamos establecer la capa tres
para enemigo si queremos. Pero probablemente
voy a apagar monitoreable porque esta
es una caja de cadera unidireccional Solo necesita detectar. Si encuentra una caja de cadera, no
necesita
ser
monitoreada por otros nodos dentro del
juego, al menos actualmente Así que vamos a
jugar y voy a hacer lo contrario para su
Caja dos D. Por aquí, vamos a
apagar el monitoreo, y vamos a
tomar la colisión. Vamos a hacer
la capa como jugador. Eso es muy importante la capa dos aquí, podemos apagar la máscara. Entonces dentro de
aquí, voy a click
derecho debajo de Hit Box dos D, y voy a
agregar en un nuevo nodo, agregar nodo hijo. Este
será un nodo dos D. Y cambiemos el nombre de esto para que sea algo así como ataque de colisión. Entonces, cuando el orco choca con otro enemigo usando
este golpe Caja dos D, va a hacer todo el daño
como daño de colisión Muchos juegos clásicos
tienen este tipo de cosas que un enemigo simplemente se encuentra
contigo y recibes daño. Así que tendremos que hacer click derecho aquí y crear un nuevo script. Entonces pongamos ataque de colisión en enemigos. Creo que
eso es apropiado. Crear. Voy a renombrarlo Nombre de
clase
ataque de colisión aquí arriba en la parte superior, Vamos a exportar una referencia
a la casilla Hit. Entonces Hit Box es del tipo Hit Box
dos D. Y luego en listo, función bajo puntaje
listo, regresa nulo. Vamos a tomar Hit box, y vamos a conectarnos
a la señal de acierto. Entonces punteó, punto conecta, y
vamos a conectarnos al hit. Entonces ahora necesitamos, digamos, el daño var at export aquí, que va a ser un entero. Podemos por defecto a diez. Entonces, consigamos la
devolución de llamada para el hit
con el guión bajo de la función de golpe al hit Ahora necesitas hacer
click derecho sobre Hit y verificar los parámetros de la señal. Entonces tenemos la
caja de Hurt dos D aquí. Bien, así que eso también nos dará
acceso a las estadísticas. Entonces, dentro del
ataque de colisión, saltemos hacia atrás. Entonces tenemos el cuadro P Hurt, que es un tipo Hurt Box dos D. Esto volverá nulo, y luego vamos
a golpear al jugador. Bien, entonces al golpear P
Hurt Box dos D, queremos tomar la caja P HRT, y queremos
tridar daño a la misma, y vamos a
pasar el Y entonces eso es más o menos
ahí porque ya lo
escribimos en la caja del daño. Entonces la caja Hurt ya
maneja reportes. Yo ya maneja la
configuración del HP, que este emitirá la señal para el HP cambiando
si necesitamos eso. Y hace el cálculo. También hace la guardia para asegurarnos de que
podamos dar en el blanco. Entonces simplemente tiene sentido que
usemos esta lógica donde. Siempre y cuando tengamos ataque de
colisión, asignamos la caja de impacto
aquí arriba y establecemos nuestro daño. Podemos ver si eso va a funcionar. Entonces solo intentaré
encontrarme con un enemigo y ver si nuestro jugador recibe
el daño por encima de él. Bien. Solo necesito estar
segura Oh, bien, si. Ahí vamos. Nuestro jugador
fue golpeado por diez. Sabemos que es el jugador
y no el enemigo porque la lanza
actualmente hace 100 Ahora, actualmente,
parece que hay un problema, que es
ese enemigo que ya está muerto parece que todavía
puede golpear al jugador. Ya tardó 100.
Fui al Estado de la Muerte, y el ataque de colisión aún
estaba habilitado. Así que podríamos manejar
eso de algunas maneras. Una sería que
solo revisemos el
controlador de estadísticas y nos aseguremos de que el controlador de pila en el orco el HP esté por encima de cero o
el orco siga vivo De lo contrario, simplemente
ignoramos por completo este ataque. Esa sería una manera decente. Otra forma sería que
lo pusiéramos en estado de muerte, y luego deshabilitamos
todas las cajas de aciertos cuanto nuestro orco
sea considerado muerto Creo que esa es quizá
demasiada responsabilidad
para el estado de la muerte. Entonces creo que le pertenece
un poco mejor aquí en el ataque de colisión. Entonces, lo que haremos es exportar una referencia a
nuestro controlador de estadísticas, exportar V stats stat controller. Entonces lo que vamos a decir en él es, si no las estadísticas puntan en vivo, entonces
vamos a regresar. De lo contrario, haremos daño. Entonces básicamente, mientras
el personaje
no esté vivo, no puede atacar, pero si está vivo,
entonces consideraremos válido
el daño de colisión si
conseguimos esa conexión. Entonces ahora si volvemos a
entrar en juego aquí, podremos caminar
hacia un enemigo que acababa de ser derrotado y
no recibir daño de él. Bien, entonces necesito cronometrar
esto bien. Bien, me encuentro con ello y
vemos que le pegamos a esto, pero me olvidé de establecer las estadísticas. Entonces podría ser un buen
momento para una afirmación. Así que aseveran las estadísticas. Entonces es necesario establecer la estadística
para que
verifiquemos si el
personaje está vivo. Y entonces esto
básicamente ya requerirá que tengamos el error de soda de caja de
golpe, si olvidamos
configurarlo en el inspector. Bien, tan cerca ahí.
Haga clic en Ataque de colisión. Vamos a asignar las estadísticas. Vamos a entrar en juego. Haremos esto una vez más. Encuentra un orco Y se puede ver
que no recibimos
daños si el orco ya
había sido
derrotado, una vez más Sí, parece estar
funcionando bien.
27. Temporizador de invencibilidad de un jugador P26 y definiciones de estadísticas personalizadas: Bien, entonces lo último
para este video, queremos configurar un periodo de
vulnerabilidad, específicamente para nuestro reproductor. Entonces en Stat Controller, podemos entrar aquí. Así que en el controlador SC, podemos crear un temporizador de invulnerabilidad Entonces digamos aquí abajo V Tiempo
invencible y
podemos por defecto esto a 0.0 Será tipo flotador. Entonces es el momento
después de ser golpeado que el objeto
no puede dañarse. Bien, entonces con nuestro
tiempo invencible por defecto a cero, eso va a estar
bien para Sin embargo, para un jugador de cuatro horas, sí
queremos tener
nuestro valor personalizado para el tiempo Invencible. Y probablemente también
queremos poder personalizar cosas como el HP, la velocidad, Max HP, etcétera Así que realmente estamos llegando
al punto en el
que necesitamos establecer algún tipo
de definición de estadísticas, donde podamos definir cuáles van a ser
las estadísticas iniciales para cada
personaje. Entonces, si pudiéramos crear
un nuevo script para eso, que va a parecerse mucho
a nuestra definición de armas, donde solo estamos
definiendo propiedades sobre el personaje
y su bloque de estadísticas. Entonces, en la
foto del personaje, bien, haz clic en Crear un nuevo guión, y lo llamaremos Definición de
guión bajo Stat Esto se extenderá desde el recurso
y haga clic en Crear, ¿de acuerdo? Y luego busca
ese script que acabamos crear Definición de Stat, haz
doble clic en él. Y vamos a subir
aquí a la cima. Así nombre de clase stat definición. Entonces esto definirá las
estadísticas predeterminadas para un tipo de objeto. Entonces, las estadísticas
que queremos van a estar básicamente reflejando lo que
tenemos en el controlador de estadísticas Así que vamos a entrar en el controlador de
estadísticas, y en realidad voy a
copiar estos sobre por ahora mismo en nuestra definición de
estadísticas. Voy a quitar
todo este código setter. Porque solo queremos
definir puramente exportar propiedades editables que básicamente no ejecuten
ningún código extra Son solo datos puros los que se guardan dentro del
GIDOEditor esencialmente Entonces no necesitamos vivos, y vamos a querer un valor predeterminado para los HP y FenciBT
HP y MAX HP Así que vamos a exportar todos estos a la exportación para MaxHP
en la exportación para HP Por aquí, lo
haremos a la exportación por velocidad y a la exportación para el tiempo de
invencibilidad También podrías querer
darles algunos comentarios. Así MaxHP
salud máxima para el objeto,
HP, iniciando la salud para
el objeto actual Bien, y eso será todo. Entonces ahora necesitamos una forma para nuestra definición de estadísticas se cargue en el controlador de estadísticas. Podrías poner
una función de carga en
la definición stat, lo que convierte
el recurso en un poco
más que solo datos de pares. Bueno, podríamos ponerlo
en el controlador y algún tipo de
método de estadísticas
inicializadas donde sepa sobre
el tipo de definición stat, y luego puede
cargar todos los valores de un objeto de ese tipo Entonces lo voy a hacer de esa manera. Y eso va a significar que
vamos a necesitar crear una nueva función aquí
abajo en la parte inferior. Dado que el controlador stat
va a necesitar
llamar a initialize en la definición
stat de todos modos, porque este es el
nodo que
manejará el nodo cuando esté listo
para establecerse Entonces, de cualquier manera,
habría alguna dependencia
menor de
la definición stat. Entonces crearé la
función, configuraré estadísticas, y esto tomará
una definición P, que es una definición stat. Bueno, regresa tipo void y
déjame agregar algunas líneas aquí. Entonces, en las estadísticas de configuración, simplemente
reflejaremos la definición en este nodo. Max HP va a ser igual
a p definición MxHP. HP va a ser igual
a p definición punto HP. Veamos qué más velocidad
va a ser igual
a p definición velocidad de punto, y el tiempo invencible
va a ser igual a P definición punto Invencible T. Así que ahora
solo tenemos que hacer Entonces, bajo el tiempo invencible, agregaremos el
subrayado de función listo, y diremos configurar estadísticas
con Entonces necesitamos exportar una definición en el nodo para
que podamos realmente hacer eso. Así que arriba en la parte superior, haremos Exportar VR La definición de Stat
es una definición de tipo stat. Bien. Y luego solo usamos
esto en cuanto estemos listos. Así que configura las estadísticas con
la definición de estadísticas. Eso va a
cargar todas las estadísticas en nuestro valor de tiempo de ejecución. Y esto nos permite
personalizar los valores para las estadísticas base de nuestros personajes usando algo que podamos
configurar en el editor. Entonces, si hacemos clic en el controlador
Stat, nos dirigimos a la parte superior derecha. Puedo crear una nueva
definición de estadísticas aquí para nuestro Oc. Y digamos que el Mx
HP debería ser de 40 y 40, y la velocidad es de 25. Entonces guardamos esto ahora en la
carpeta donde tenemos los orcos. Da clic en
Definición de estadísticas, guarda como, y podemos ponerlo en
la carpeta del enemigo. Así que Ok Estadísticas. Suena como un
nombre perfecto ahí. Guárdalo. Bien, y así es como
Ok Stat definición. Entonces cuando se cargue, se
va a cargar con estos valores tan pronto como
el personaje esté listo. Bien, entonces eso es básicamente
eso para el orco. Ahora, también quiero
copiar esta configuración de hit box sobre el esqueleto, también. Entonces voy a Control C, a
pasar a esqueleto,
Control V, pegarlo adentro. Podría tomar el ataque de
colisión, y solo voy a aumentar
el daño a, digamos 25. Asignemos las estadísticas
al controlador de estadísticas, y la forma de colisión
que es la misma funciona bien. Utiliza las mismas capas de colisión. Es piedra en mí tratando de golpear
al jugador. Entonces todo lo demás está
configurado y simplemente bien. Y luego tenemos que
configurar el controlador de estadísticas. Entonces controlador de estadísticas aquí,
vaya a la parte superior o derecha. Y crear una nueva definición de
estadísticas. Digamos que el esqueleto tiene más como digamos más
como 50 de salud, 50 de salud, una velocidad
de 40 está bien. Entonces haremos clic derecho en Guardar como, y diremos las
estadísticas del esqueleto punto TRS, guardar Ahora tenemos
que hacer eso por el jugador. Vaya al jugador, haga clic
en el controlador de estadísticas, vaya a la parte superior derecha, haga
una nueva definición de estadísticas. Ahora, aquí nos quiero en
la época invencible. Digamos que un personaje
es invencible por 0.2 segundos después de ser golpeado Le daremos al
personaje una velocidad base de digamos 100 y
el Max HP tiene 100. Creo que voy a dejar
eso como inicio. Así que haga clic derecho sobre la definición
stat. Guardar como, y lo
guardaremos en la carpeta Reproductor. Playerstt punto TRS, pulsa Guardar. Y ahora los personajes deberían tener
cada uno estadísticas diferentes. Lo último que tenemos que hacer es en realidad usar el temporizador de
invencibilidad Entonces en St Controller, necesitamos activar Invincible
con una llamada al método Así que vamos a crear un
conjunto de funciones Invencible aquí, que devolverá el tipo void Y entonces tendremos
una variable local para si es invencible o no Entonces variable invencible
es un booleano. Esto va a ser
default a false. Si es cierto, el objeto
no puede recibir daños. Bien, para que pueda ser golpeado, queremos decir
que el personaje está vivo y no invencible Entonces estoy usando esto con las palabras clave en
lugar del símbolo lógico. Supongo que hace que sea un
poco más fácil de leer, en cierto sentido. Entonces, si el personaje está
vivo y no invencible, entonces el personaje puede ser golpeado Y queremos
invencible es igual a verdad, pero también queremos
iniciar un temporizador aquí Y diremos que esto
es igual a un nuevo temporizador, igual temporizador punto nuevo. Y luego agregamos eso como hijo
a este objeto, temporizador de
invencibilidad, y nos
conectaremos a su Entonces invencibilidad temporizador
punto tiempo de espera punto conectar
en Invencible Timeout en Entonces Control mira esto y
pégalo aquí abajo. Función sobre el tiempo de
espera de invencibilidad. Esta obertura y vacío. Y diremos que
invencible es igual a falso. Bien, entonces ahora tenemos que
poner en marcha el temporizador. Tiempo de invencibilidad o inicio, y diremos que el tiempo
es el tiempo invencible Eso debería manejar la
lógica de si podemos o no
podemos golpear porque el personaje
es invencible o Bien, así que para set invencible, podríamos comprobar cuando HP está
configurado que si el HP cayó, entonces queremos activar
la Pero creo que lo que podría dejar clara
nuestra intención es
crear una función de toma de daño en esta definición, también. Entonces podríamos hacer algo así
como función, recibir daño, y
pasemos un a P daño t aquí. Nos ta y anulamos, y
esto va a tomar HP y ponerlo a P daño. Y luego queremos poner al
personaje en invencible. Incluso podríamos decir si el
tiempo invencible es mayor que 0.0, entonces estableceremos Sobre este objeto. Y el HP en realidad
va a igualar menos el daño aquí porque
queremos tomar su
valor actual y actualizarlo. Entonces esto todavía llamará a los
iguales en vivo HP es
mayor que cero aquí. Si lo quieres, incluso
podrías hacer get live sea solo una función
que verifique esto, lo cual también estaría bien, en lugar de hacer
esta configuración anterior. Pero ya teníamos eso. Funciona bien.
Nosotros iremos con eso. Así que ahora, cada vez que
infligimos daño, realmente queremos llamar a take damage en el controlador de
pila. Entonces averiguaremos dónde
estamos infligiendo daño, como el proyectil
podría tenerlo. Bien, así que aquí
podemos ver que todo vuelve a la caja de Rt. Entonces hagamos clic derecho
y saltemos a esto. Y en lugar de configurar
el HP directamente, vamos a decir stat
controller dot take damage, and we pass in the P damage. Así que podemos cortar esta línea, y en realidad no necesitamos
calcular esto porque ese cálculo
se
maneja automáticamente en el controlador de estadísticas. Entonces este tipo de más
ilustra nuestro punto que si nuestro
controlador de estadísticas recibe daño, podría estar haciendo otras
cosas como establecer invencible en el personaje
porque nuestro personaje recibió Ni siquiera es solo que
cambiamos el valor de HP. Es específicamente que tomamos daños de una fuente dañada. Bien, así que vamos a darle a Play y
veamos si todo se junta. Tendremos que recibir daño
de algunos enemigos, y luego querremos asegurarnos que en realidad solo podamos recibir daño una vez cada
cuarto de segundo. Entonces, si disparo por aquí, necesitamos algunos
enemigos más para que esto funcione. Incluso podría ser más fácil si
inhabilito los proyectiles. Bien, entonces me voy a
encontrar con estos tipos. Solo debería ver que los
daños ocurren una vez. Bien, 25. Creo que está funcionando. Si paso por todos estos. Sólo veo que los daños
surgen de una vez a la vez. A VLC seguro, sin embargo, necesito apagar
el proyectil Entonces voy a eliminar
temporalmente el arma de lanza de la escena aquí. No hace
falta que hagas eso. Sólo estoy demostrando. Bien, entonces sólo voy a ir a caminar sobre los enemigos. Bien, entonces solo nos
dañamos una vez. Ahora bien, esta cosa de
golpe de colisión sólo se está incurriendo al ingresar al área Entonces, si nos paramos
encima del enemigo, todavía solo
nos golpean una vez. ¿Bien? Se puede ver a pesar de que hay un montón
de tipos pegándonos, sólo
nos golpean una vez cada cuarto de
segundo más o menos, así. Y nuestros personajes ya están hechos, así que no nos pueden pegar más.
28. P27: Implementación de daño periódico en las cajas de éxito enemigas: Soluciona el problema en el que
la caja HIP solo puede dañarse una vez después de otra área. El HipXTD entra en este hit box, pero no cuando
persiste dentro de él Podemos establecer un temporizador dentro
de nuestra caja de cadera en D para seguir comprobando si la caja HIP todavía
está dentro del área, y luego podemos seguir
infligiéndole daño periódicamente. Bien, así que una vez que emitamos el hit, también
puedo agregarlo a las áreas de
tracto y al guión. Entonces digamos var targets, que va a ser una matriz de Hurt box two D, que actualmente no
es nada. Y vamos a decir que
después de golpear, hacemos objetivos
anexar, el área P. Bien, ahora necesitamos conectarnos
a la señal del área izquierda. Así que el área salió punto conectar. Y vamos a usar la
devolución de llamada en el área salida. Bien. Así que funcionan
en el área que salió. Obtenemos el área P. Entonces queremos verificar que
si se trata de una casilla HIT dos D. Entonces las áreas de
tipo área dos D. Bien, entonces verificamos si el área P es Hurt casilla dos D, entonces
continuaremos. Ahora vamos a verificar si el punto de
objetivos tiene área P, entonces lo vamos a
borrar de los objetivos. Targetst borra el área P. Bien, entonces ahora los objetivos
solo van a existir mientras la caja de Herir objetivo persista
dentro de nuestra área de caja de impacto Podemos verificar en cada periodo de tiempo si necesitamos volver a
dañar al enemigo. Bien, entonces podríamos hacer eso
con algo así como, digamos que tenemos temporizador
opcional, así que en Export var timer timer timer, y luego nos conectaremos a
la señal de tiempo o tiempo de espera Así temporizador punto tiempo de espera punto Knect y vamos a decir en Bien, entonces volveremos a poner esa
llamada aquí abajo, funcionar a tiempo o TO. Esto volverá nulo, e
intentaremos golpear esa zona. Entonces, en el tiempo o tiempo de espera
para Target y objetivos que sí golpeamos punto un Mt Target Entonces, si los objetos siguen en el área después de haber
hecho su golpe inicial, entonces después de cada tiempo o periodo,
volverán a ser golpeados. Así que vamos a Ok y
veamos nuestro hit box dos D. Bien, y tal vez queremos
ser un poco más claros sobre para qué sirve
este temporizador. Entonces digamos que esto es
en realidad un temporizador de daños, y actualizaré la
propiedad lista. Bien, entonces ahora para
nuestro temporizador de daños, queremos hacer click derecho sobre
hipbox dos D, agregar un temporizador Y vamos a decir para esto que
hacemos como 0.25 segundos. Esto será autosrt, y luego solo necesitamos hacer
referencia a eso en el Hip Box dos D. Voy a renombrarlo para que sea temporizador de
daños para que los
nombres coincidan también Así que haz clic en Hit Box dos. Asigne el temporizador dañado. Ahora eso se va
a conectar a la señal dentro del guión. Y por cada objeto u objetivo que esté en la zona
cuando transcurra el temporizador, va a desencadenar eso Y debido a
que esto no es un disparo, automáticamente
va a hacer bucle. Entonces, cada 0.25 segundos, va a seguir
haciendo esto y
va a verificar los objetivos
cada vez. Entonces eso probablemente sea
bueno ahí. Solo necesitamos el esqueleto para
tener lo mismo. Voy a controlar C copiar este temporizador al esqueleto. Y vamos a Control V
pegarlo en la caja de la cadera dos D. Vamos a asignarlo en el
cuadro de Hit dos D y la parte superior derecha, asignar el
temporizador dañado, guardar y ejecutar. Bien, y podemos ver que en
algunos de los hipbox dos Ds específicamente como el proyectil
el proyectil de velocidad, no tiene
esto Entonces tenemos que tener
claro que decimos, Si el temporizador está dañado, entonces nos
conectamos a su señal. Entonces esto es opcional,
y escribí un comentario ahí para que quede claro sobre
ese temporizador opcional para emitir
periódicamente señales de golpe
en los objetivos dentro la caja de cadera dos áreas D después de que haya transcurrido
un tiempo establecido Bien, volvamos a correr. Y solo veremos si un orco puede realmente dañarnos dos veces. Bueno, eso va a ser un poco duro con
las lanzas ahí Desactivemos la
lanza, también. Entonces, desactiva el arma lanza
o retírela temporalmente. Volvamos a la escena. Bien, y busquemos un orco
que nos dañe algunas veces. Bien, entonces aquí tenemos nuestra k. Veamos cuántas veces
podemos recibir daños. Sí, definitivamente podemos ser golpeados varias veces por el mismo orco Y eso probablemente sea demasiado rápido, honestamente. Así que vamos
a sumarnos a eso abajo. Primero, voy a controlar Z para volver a agregar el
arma de lanza Vamos al orco y voy a establecer su tiempo de
peso en 0.5 segundos. Y si parece que
el jugador recibe demasiado daño ya que múltiples
enemigos se agrupan sobre él, aún
puedes aumentar
el temporizador de invencibilidad, lo que el número máximo de golpes
por segundo caería 5-4, dependiendo de si lo
logras a 0.2 o 0.25 segundos de temporizador.
Sin embargo, desea ajustar
29. Derrota a un jugador P28: personaje se queda sin HP, necesitamos cambiar
a un estado de muerte, y parte de eso va a ser evitar que los ataques
continúen, también. Y eventualmente,
pondremos un juego sobre pantalla, pero vamos a conseguir que llegue al final
del
estado de muerte por ahora mismo. Entonces, en la escena del jugador, tenemos nuestro estado de movimiento. Queremos poner en estado de muerte, y creo que en realidad podemos
ir a la escena org, e incluso
podríamos copiar y reutilizar esto. Si miro en el guión del estado de la
muerte, no
veo nada al respecto,
eso
realmente sería un problema
excepto tal vez el trimestre
aquí al final. A lo mejor solo queremos notificar a un sistema de juego que el
personaje ha sido derrotado. Así que sólo voy a copiar el guión. Iremos al jugador. Voy a dar click aquí y añadir un nuevo nodo estatal del limbo Digamos jugador derrotó al estado. Entonces jugador derrotó estado, haga clic
derecho, adjunte un guión, y luego lo crearemos en la carpeta del jugador.
Voy a pegar esto. Cambiaremos el nombre de la
clase aquí arriba al estado de jugador derrotado. Bien, comprobemos el nombre de la animación y asegurémonos de
que esté en el reproductor de animación. Entonces la muerte del jugador de animación, tenemos eso ahí.
Bien, así que está bien. Si entramos en el estado de muerte, entonces vamos
a querer agregar una pista llamada Method Track en nuestro estado de
jugador derrotado. Y si vamos hasta el final aquí, vamos a habilitar el chasquido en la parte inferior derecha
también, si eso ayuda Así que encaje a 0.6, y luego haga clic derecho
y ordene una clave, y llamaremos terminado
en el guión. Bien, entonces estoy tentado a usar el sistema de
combate ya existente y luego hacer algo como reportar
derrotado al jugador La derrota del jugador es más de restablecer el juego o
anunciar que se acabó el juego Entonces no es realmente una función
del sistema de combate. Entonces, en aras de la
separación de preocupaciones, en realidad
puedo crear un nuevo nodo para manejar la gestión
del juego, y eso
eventualmente podría incluir guardar y cargar, también. Ya veremos. Entonces, si
vamos a la raíz de nuestro proyecto y sistemas, me
gustaría crearlo aquí. Voy a hacer clic derecho y
crear un nuevo digamos, guión, y
lo llamaremos game manager dot gD Creo que eso funciona como un nombre. Bien. Y en game manager, lo
dejaremos como nodo
porque vamos
a hacer de esto un
Auto oad Singleton ¿Por qué no solo usamos un juego de reporte de
función terminado, así esto podría llamarse desde cualquier lugar siempre y cuando hagamos
referencia al administrador del juego Y cuando informemos de juego
terminado, vamos a imprimir, que va a imprimir
cadenas a la consola, y vamos a decir, juego
sobre jugador derrotado. Y luego, reemplazaríamos
esto con UI para que podamos cambiar a un nuevo juego
o ver el juego por encima de las
estadísticas, etcétera Pero esto al menos
demostrará que está funcionando. Bien, entonces queremos tomar
el manager del juego y crear una escena para que podamos editar las variables de
exportación si
alguna vez las necesitamos. Entonces voy a escribir
haciendo clic en Sistemas, crear una nueva escena. Este será el
manager del juego punto TsCN. Voy a hacer click derecho aquí, cambiar su tipo de nodo a un nodo. Arrastraremos el guión del
administrador del juego sobre él. Bien. Y luego
queremos guardarlo, ir a Configuración del proyecto. Dentro de Globals,
queremos
cargar automáticamente el anuncio de TCN de punto de
administrador de juegos de sistemas, y ahora es un símbolo de administrador de juegos
referenciable a nivel mundial referenciable Entonces, si queremos usar eso, solo
podemos volver
a nuestro jugador y
el jugador derrotó
estado y terminó. En lugar de hacer cola gratis,
dejaremos ahí al personaje. Y diremos que el manager del juego informe de
punto sobre el juego, y eso es todo lo que tenemos que hacer. Una razón para no
sacar al jugador de la escena es que como están
las cosas en estos momentos, todos los enemigos
dependen de la existencia del jugador para que
puedan seguir moviéndose. Entonces, en cuanto saques
al jugador de la escena, entonces todos los guiones enemigos
van a empezar a romperse. Ahora bien, si quieres encarnar eso
completamente y permitir que el personaje sea removido de la escena del juego, entonces solo necesitarás verificar básicamente cada ejecución de, digamos, la escena c chase aquí. Solo necesitarías
asegurarte de que el objetivo sigue siendo válido, y si no es válido, entonces solo
regresarías. Entonces eso podría ser
algo así como si objetivo de
subrayado es igual a nulo, entonces regresas, y entonces eso solo significará
que simplemente no se mueve en absoluto Entonces, ya sabes, por diversión, en realidad
podríamos ir a jugador y en el estado
jugador derrotado. De hecho podemos agregar en
el agente punto q gratis, y solo podíamos ver
cómo funcionaría eso. Entonces, si solo agrego
en ese cheque que Targets Not null para
la escena de persecución, ¿
se va a romper o va a funcionar aquí? Entonces vamos a darle una oportunidad. Veamos si nuestros enemigos pueden seguir funcionando sin ningún jugador en la pantalla. Bien, entonces vamos
a ser derrotados. Todavía no he configurado la
transición para el jugador HSM Entonces en player HSM, vamos a crear otra
función, configurar transiciones Bien. Entonces esto va
a requerir que agreguemos una transición de estado de movimiento a
estado derrotado, y eso va a ser en
el evento derrotado. Bien, así que definamos
los de aquí arriba para el jugador HSM en
export var move state, que es un estado limbo en
export var estado derrotado,
que es un estado limbo Y luego crearemos una
constante para derrotados, que va a
ser un nombre de cadena igual a y citas Bien, ahora necesitamos actualizar nuestros nombres de variables aquí
para agregar transición. Entonces carcasa de serpiente para
esas variables. Y solo deberíamos poder
pasar de mover a
derrotarlo en realidad porque no
tenemos ninguna
mecánica de resurrección en el juego. Entonces una vez que derrotamos,
se acabaron los juegos, y eso va a estar bien. Siempre podrías
agregar una transición regreso si tienes alguna
forma de resucitar. Ahora queremos llamar a las transiciones de
configuración
dentro del HSM de configuración, configurar transiciones allí y podemos manejar
la transición
conectándonos a la señal de estadísticas del
jugador Entonces después de afirmar que
los jugadores no son nulos, queremos conectarnos a la
señal en el jugador Entonces esa realmente va a ser la señal en el controlador de
estadísticas. Podría hacer referencia
directamente al controlador SAT o conectarse al controlador de estadísticas a través del reproductor aunque aún
no tiene esa configuración. Entonces supongo que en este caso, sería un poco más directo solo hacer
referencia a un extra en Exportar estadísticas de realidad virtual del controlador de
estadísticas Bien, y luego aquí abajo diremos estadísticas Alive cambió punto Connect, y estará en Alive cambiado. Así que vamos a crear esa función
en la parte inferior y callback. Y esto va a
tener el valor P, el nuevo valor del vivo. El S de retorno nulo. Entonces, si el valor de P es igual a falso, entonces queremos despachar
el evento derrotado. Bien, así que eso
manejará desencadenar la transición de mover a estado derrotado si
estamos en el estado de movimiento Si terminas sumando un
montón de otros estados, también
existe la opción
de hacer cualquier estado aquí. Entonces esto hará que sea para que
si los personajes derrotados, entonces de cualquier
estado, solo puedas hacer una transición directa
al estado derrotado. Eso en realidad podría
ser preferible pensar a largo plazo porque tal vez
agregarías algún tipo de estado de ataque donde juegas
una animación diferente. Aún querrás poder cambiar
inmediatamente a derrotado en lugar de simplemente
poder pasar de movimiento a derrotado cuando ocurra este
despacho. De lo contrario, si despachas cuando el personaje
no está en estado de movimiento, entonces puede que nunca vaya
al estado de muerte. Entonces creo que esta sería generalmente la forma
preferible de hacerlo. Bien, entonces ahora tenemos que asignarle todo en el inspector. Así que asigne el controlador de estadísticas, asigne el estado de movimiento y asigne el derrotado
30. P29: Prueba y mejora del comportamiento cuando un jugador es derrotado: Para hacerlo más rápido, voy a dar click
en Stats Controller. Tomemos el HP y lo
pongamos en diez, y voy a golpear play. Entonces, si nuestro personaje
es golpeado una vez, cambiaremos inmediatamente
al estado de muerte. Bien, entonces busquemos a un orco. Bien, ahí vamos. Bien, entonces
golpeamos al estado derrotado. Pero podemos ver que el
agente no tiene estadísticas porque no requerimos
eso en el personaje. Entonces, si solo
queremos ser consistentes, entonces sí, podemos agregar
estadísticas al jugador. Creo que está bien hacer referencia a las
estadísticas a través del jugador porque generalmente
entenderíamos que el jugador
va a tener estadísticas, especialmente en un tipo de juego de
rol También, podemos deshacernos de esa variable de
velocidad aquí mismo. Se puede ver que el
jugador sigue usando la velocidad del guión base en lugar de la velocidad
de las estadísticas. Entonces sí, vamos a obtener una referencia
a en Export var stats, que es un controlador de estadísticas. Bien. Y luego cuando
tenemos velocidad, queremos usar estadísticas de velocidad de punto. ¿Bien? Y vamos a copiar esto y reemplazarlo ahí
abajo también. Así que consistentemente usándolo en nuestro proceso de física
para el jugador. ¿Bien? Si asignamos las
estadísticas y el inspector, podemos hacerlo ahí mismo. Y entonces si nos fijamos en el HSM, ya no
necesitamos una referencia
directa a las estadísticas porque ya
la tenemos a través del jugador Entonces podemos hacer
player.stats.ai cambiado, y nos conectaremos al
vivo cambiado a través de Así que solo siendo un
poco más consistente sobre cómo hacemos las cosas
a través de nuestros guiones, aunque ambas opciones, por
supuesto, funcionan, ya sea que lo hagas directamente
al controlador de estadísticas o
a través del reproductor. Entonces entremos al modo de juego
y
hagamos que un personaje sea derrotado aquí. Entonces los personajes eliminados, y lo que va a pasar
es cuando se creen nuevos personajes nuevos NPC, afirmamos que el jugador objetivo necesita existir,
pero no Bien, entonces, en realidad, solo
vamos a eliminar esta afirmación
porque podemos tener personajes engendrados en el mundo del juego y
no tener un objetivo Entonces, si esto es nulo, creo que esto
en realidad podría seguir funcionando. Y entonces
no habrá blanco porque el
personaje ya está muerto. Y luego entramos aquí. Cuando target es nulo, entonces no
hacemos nada por el estado de Chase.
Entonces voy a golpear play. Bien, entonces ahí está eso. Los
enemigos simplemente se detienen. Sí. Bien, para que veas
que dice tratar de asignar instancia previamente
liberada Entonces lo que sí necesitamos aquí
es una comprobación más. Vamos a decir que agente punto objetivo punto jugador no es igual nulo,
entonces vamos a asignarlo. Bien, eso parece estar bien ahora. No más errores.
Ahora, los personajes siguen corriendo en su lugar. Así que incluso podemos poner
en un estado inactivo para los enemigos si queremos
que sea un poco más creíble porque
han terminado su trabajo, así que ahora solo están
sentados por ahí Entonces, lo que realmente podríamos
hacer aquí en Update es despachar un evento. Digamos que este es
el evento inactivo. Bien, entonces vamos a despachar a Idol del
estado de Chase, ¿verdad? Entonces ahora si vamos a Ok Enemy HSM, queremos agregar una transición del estado Chase
a un estado inactivo Entonces digamos agregar transición. Estado de persecución a estado inactivo. Y eso será bajo
el evento Idle. Bien, entonces necesitamos un estado inactivo. Entonces lo haré en Exportar
var estado inactivo, que es un estado Limbo aquí Vamos a hacer clic derecho en Agregar en un
nuevo nodo hijo Estado del limbo. Bien, y esto va a ser muy similar al estado
de la muerte. Voy a ir al Estado de
la Muerte y copiar todo aquí arriba en
el nuevo estado del limbo Entonces este va a
ser el estado inactivo aquí. Haga clic derecho, adjunte un
guión, Estado ídolo. Y vamos a controlar
V pegar eso en sólo renombrar este estado inactivo. Si iba a
crear más estados, probablemente
comenzaría a
pensar en crear un
estado de animación base en este punto. Pero en serio,
no es tanto código. Estamos duplicando aquí, así que
en realidad no es un gran problema. Y esta es la
forma más sencilla de manejarlo. Al menos a corto plazo hablando. Bien, entonces con el AlpiPegado
para el estado Idol, solo
quiero cambiar el nombre de la
animación aquí a Ya obtiene la
reproducción de animación de la Pizarra. Nosotros sí queremos cortar esta
parte sobre poner al agente para que ya no esté
vivo porque eso no es cierto. Básicamente solo esto.
Tenemos una animación. Obtenemos el juego
de animación desde la Pizarra, y cuando entramos,
jugamos la animación Y la animación
está inactiva por aquí. Entonces ahora en Enemy HSM, solo
queremos asignar
el estado inactivo Aparte de eso, esto debería
manejar la transición. Nosotros sí queremos tomar
la transición al estado de
muerte y cambiar
esto a cualquier estado. Entonces, ya sean los personajes al
ralentí o persiguiendo, podemos hacer la transición a la muerte si ocurre
el suceso de muerte.
Eso es importante. Y luego solo queremos
asegurarnos de que
copiamos el estado
inactivo al esqueleto. Pégalo aquí y
asígnalo en el HSM enemigo. Así que asigne
a la derecha, estado inactivo. Y aparte de
eso, debería ser bueno. Entonces voy a golpear
play, y ya
veremos si podemos conseguir que nuestro
personaje sea derrotado. Bien, entonces aquí
vamos. Nuestro personaje cambió al
ídolo y eso es todo. Por lo que ya no necesitan un objetivo. Ya no
persiguen a un objetivo. Simplemente están al ralentí
en su estado inactivo.
31. P30: creación de una escena con una Pickup2D: Ahora vamos a
pasar a crear recolecciones
EXP para que
nuestro jugador pueda ganar
puntos de experiencia y subir Entonces van a haber bastantes pasos
involucrados con esto. El primero va a ser crear nuestro guión básico de recolección,
un guión de recolección de recolección, y luego asegurarnos de
que nuestro personaje realmente
pueda
adquirirlos y luego asignar el impulso de XP a la experiencia actual del
jugador. Entonces comencemos por crear el juego real dos
D world pickup. Entonces voy a crear
una nueva nota aquí. Usaremos dos escenas D, y voy a
renombrar esta para que sea pickup dos D. Todo
derecho haga clic sobre ella, y vamos a cambiar el
tipo para que sea una base de Área dos D. Y ahora si hacemos clic en el botón de script
adjunto, entonces obtendremos una pastilla
dos D que extiende Área dos D.
Digamos carpeta Objetos, y luego voy a crear una nueva
carpeta dentro de aquí. Lo llamaremos camionetas. Entonces puedo guardar la
camioneta debajo del cuadrado dos d punto GD dentro de
aquí, crear el guión Y en la parte superior,
vamos a darle el nombre de clase pickup dos D. Vamos a guardar esto en
las pastillas de la carpeta Objects Pickup tdt TACN. Así que
guarda eso ahí. Entonces este va a ser un nodo
físico mundial que represente un objeto general
que puede ser
recogido y aplicado a un personaje
de una forma u otra. Entonces eso podría significar aplicarlo
directamente a las estadísticas o en algunas
otras circunstancias, podría significar que lo
recoges y lo
agregas al inventario de un
personaje. No vamos a tener un
inventario para el juego, pero tendremos la
capacidad de agregar niveles a la carga del arma o crear
una nueva carga de arma para
un nuevo tipo de Para el pickup dos
D, queremos crear una función T para que podamos sacar el objeto del mapa del juego y aplicarlo a los personajes. Entonces digamos función Tr tomar, que va a necesitar un objetivo. Entonces P target es un no dos D, y queremos devolver Boolean si esto fue
exitoso o Bien, entonces voy
a empujar un error
aquí el cual dice que es
una función virtual, implementar un script extendido. Ahora, en Gudo 4.5, van a tener clases
abstractas, lo que hace que la configuración de esto más concreta porque agregan algunas palabras clave adicionales para ello Pero como estamos en Gudo 4.4, que es la versión
estable actual, simplemente lo
haremos a la antigua manera, que básicamente
significa que tenemos que recordar que cuando extendemos nuestra clase
pickup dos D necesitamos
anular manualmente esto con una nueva versión de la función nosotros mismos Con los mismos parámetros
y tipo de retorno. Para TriTek, vamos
a devolver false porque estamos tratando de tomar un objeto
en esta clase abstracta, que es la camioneta dos D. Así que para las diferentes
camionetas en el mundo del juego, queremos que todas tengan
su propia forma personalizada de aplicar al jugador
o Así que tendremos que implementar un script de extensión
personalizado
para cada uno de ellos, L uno para EXP y luego
uno para una recolección de armas, o podría haber
una recolección de actualización. Entonces esos van a
funcionar un poco diferente, así que todos necesitan su
propio método tritak Bien, entonces tenemos nuestro guión
pickup dos D aquí. Hagamos clic derecho y
agreguemos un nodo hijo. Necesitamos una forma de colisión. Entonces, para la forma de colisión aquí, iré a esta
forma en la parte superior derecha, y hagamos que sea
una forma de círculo. Así que probablemente también quieras
defecto sprite aquí también. Así que voy a hacer click derecho
aquí, Agregar un nodo hijo, y queremos obtener un sprite Entonces, para un objeto
que solo va a reproducir una animación una y
otra vez, sin cambios ni nada,
creo que
Sprite animado dos D es una
mejor opción ahí Por ejemplo, si una moneda está
girando en el mapa una
y otra vez y solo
quieres que reproduzca esa animación de forma automática, entonces Sprite two
D animado es perfecto para Entonces seleccionaremos eso
y presionaremos Crear. Ahora, para los íconos del juego, puede
que ni siquiera sean
realmente una animación. Pero si vamos a hacer de
esta la plantilla por defecto, quiero abrirla como posibilidad. Entonces, para nuestro Sprite animado, pasamos a la
animación por aquí Crearemos un nuevo
recurso de marcos Sprite y lo abriremos Entonces tenemos una
ventana de animación diferente en la parte inferior izquierda. Así que podría simplemente cambiarle el nombre
a Idol, si quiero. Entremos en el arte. Queremos entrar en los íconos de
Raven Fantasy, y la hoja completa de Sprite, veamos esto y veamos
si hay algo que queramos Entonces, para acceder a esto correctamente
desde esta ventana de animación, hay este icono
Marcos de anuncios de Sprite Sheet Así que da click sobre esto. Después
ve a Íconos de fantasía artística, hoja de Sprite de
otoño, 16 por 16 De verdad, te vendría bien uno
más grande si quieres. A lo mejor sólo voy a
usar el 32 por 32. Entonces como un poco más de
resolución y ábrelo, y solo puedes seleccionar
los iconos que quieras. Bien, ahora para
que esto se corte correctamente, necesitamos el
número correcto de filas y columnas en nuestra hoja de
sprites aquí O si sabes el
tamaño de cada icono, creo que puedes simplemente
ir al tamaño por aquí y solo poner 32 30 Si. Bien, esa es definitivamente
la forma más rápida de hacerlo. Cuando cambies uno,
calculará automáticamente el otro. Entonces tenemos 16 horizontales. Realmente, esas son las columnas, y luego 128 verticales
son las filas. Entonces, en lugar de calcular eso, solo
sabemos que cada
uno es 32 por 32. ¿Bien? Ahora podemos fácilmente simplemente escoger
el icono que queramos de esto. Para que puedas usar lo que
quieras como una gema EXP, creo que en
el proyecto de plantilla, estaba usando esta de aquí. Así que una especie de gema azul.
A eso le agregamos un marco. Y esto se reproduciría automáticamente si solo
verificamos la
reproducción automática ahí abajo, pero puedes ver que esto ni
siquiera necesita
jugar realmente Y probablemente sea un poco más performante si
desactivamos la reproducción automática. Entonces es solo mostrar
este fotograma
y no intentar ni
siquiera hacer un bucle de nada. Pura suposición de mi parte, pero vamos a tener
ese conjunto ahí. Y ese será nuestro
pico predeterminado para Pickup two D. Así que para el nodo raíz pickup
dos D, probablemente también queremos
configurar las capas de colisión. Entonces no creo que tengamos una capa
específica para camionetas. Entonces agreguemos una
nueva capa de colisión. Solo hazlo la capa
cinco y di pastillas. Bien, cerca. Y luego
queremos, claro, poner la pastilla en la capa cinco, y apagaremos la máscara. Desactivaremos el
monitoreo porque esto va a ser
recogido por algo. No es monitoreo para camionetas. Permite que el jugador que está recogiendo el objeto
haga la detección. Entonces esto es solo monitorear
un tazón con la capa cinco. Y esa es la
escena base para nuestra camioneta
32. P31: Implementar un sistema de captación de experiencia con herencia: Lo que podemos hacer en
la parte inferior izquierda es buscar de nuevo la recogida. Esto debería mostrar
la carpeta de camionetas, y queremos hacer
clic derecho en Pickup two D y hacer una escena
heredante Entonces eso está en la cima aquí,
nueva escena heredada, lo que significa que estamos creando una nueva escena
basada en esta escena, por lo que hereda todos los mismos
valores predeterminados de nuestro padre Entonces creamos esa nueva escena, y verás que algunos de
estos nodos se vuelven naranjas, lo que significa que estos en
realidad se basan fuera
de la escena padre. Puedes saltar al padre
haciendo clic aquí mismo. Para que puedas tener
escenas dentro de las escenas. Y queremos renombrar el nodo
raíz para digamos EXP pickup dos D. Porque queremos ser específicos
sobre lo que estamos haciendo. Y guardemos esto
como una nueva escena. Entonces XP pickup tod
punto TCN, guárdalo. Y luego hagamos clic derecho sobre el nodo raíz y
extendamos este script. Bien, así que esto nos
va a dar nuestro guión EXP Pickup two D, que se extiende desde la camioneta dos D. Y luego subiremos
aquí a la parte superior y diremos el nombre de la
clase EXP Pickup two D. Así que queremos
dar una variable por cantidad de EXP que
realmente vamos a recoger cada vez que el personaje use
Tri take en la camioneta. Así que en Export VR
va a ser un entero, y eso lo haremos por defecto a uno. Y ahora, si nos fijamos en
el script pickup two D, queremos tomar esta
función e
implementarla correctamente en nuestro script
heredador Así que voy a copiar
esto, y
vamos a pasar a
EXP Pickup dos D. Voy a pegarlo
y vamos a escribir nuestro verdadero método tri take. Entonces el pickup EXP va
a aplicar la experiencia
al objetivo si el objetivo
realmente tiene experiencia. Entonces digamos que si ptarget
dot stats es igual a null, entonces vamos a
devolver false aquí De lo contrario, podemos decir que var stats es igual a ptarget dot stats Y como no
sabemos lo que realmente significa esta
variable de estadísticas en
el contexto de cada script, vamos a asignarle el bombo del
controlador de estadísticas directamente Entonces, una vez que se cumple la condición, que este es un objetivo
que tiene un bloque de estadísticas, podemos decir estadísticas punto experiencia
más igual experiencia, y luego volveremos verdadero. Entonces, después de
recoger la experiencia, no
queremos que la recolección vuelva
a ser utilizable, así que diré monitoreable
es igual a false, y luego dejaremos cue
free en el objeto Entonces, cuando te pongas libre, va a
haber algún periodo de tiempo antes de
que finalmente
se elimine de la escena. Así que queremos asegurarnos de que nada más entrando en él en ese cuadro singular pueda recoger
accidentalmente la camioneta
EXP por segunda vez. Entonces me estoy convirtiendo en falso monitoreable aquí para que
nada más pueda detectar Apenas como una salvaguardia, y luego retiramos de la
escena por completo. Así que esta parte de
aquí, probablemente en realidad quiero reutilizar
en todas mis camionetas Voy a cortar esto en pickup dos D y luego
decir función remove, que devolverá void, y solo voy a hacer
este paso de wrap up. Entonces ahora, si
vuelvo a la recolección de EXP, solo
llamo remove, que se
obtiene de la clase base. Entonces esta función
ya está escrita en la clase base, y
podemos reutilizarla aquí. Entonces, como, si,
en cualquier momento
implementamos trillado si
queremos rehacer eso, solo
podemos hacer eliminar aquí Y para que esto
funcione, necesitamos agregar
las estadísticas experimentadas
a nuestro control de estadísticas. Entonces en el controlador set, voy a crear
esa propiedad EXP. Bien, entonces vamos a
tener experiencia Vara y el suelo por defecto
a cero como un entero. Bien, y algo así en línea
con la toma de daños, donde llamamos al conjunto invencible por separado
de configurar el HP, en realidad
podría preferir
no hacer un setter Más bien hacer la función de experiencia
publicitaria, y le daremos una cantidad. Entonces P cantidad, es un entero
y vamos a volver vacío aquí. Por lo que queremos llevar la
experiencia más equivale a P cantidad. Y luego como a hacer,
verificar para subir de nivel. Y también podemos decir
impresiones experiencia aquí. Así que obtendremos la
experiencia total a medida que estamos recolectando elementos
del mapa en la consola. Y luego para actualizar la recolección
EXP para eso, quiero hacer estadísticas punto agregar
experiencia experiencia. Bien, entonces estamos siendo
un poco más explícitos. Entonces esta función implica
cualquier cosa relacionada con experiencia que
necesite cambiar al agregar experiencia
va a ocurrir, lo que significa que
verificaríamos un nivel arriba y así sucesivamente. Y supongo que esto
tendría algún beneficio. Como si pudiéramos cambiar el valor de la
experiencia sin activarnos
automáticamente
o verificar si tuviéramos la
necesidad de eso más adelante En lugar de hacer siempre
eso, pase lo que pase, como hicimos con el setter HP, donde siempre
actualiza tu vida Ambas formas de hacer las cosas
son válidas hasta cierto punto. Se trata de cómo quieres expresar
tu intención aquí. Y ¿quieres ocultar el hecho de que establecer la
experiencia
también desencadenaría un subir de nivel poniéndola en un setter de
experiencias, o quieres
ser más explícito con la función add experience
33. P32: Configurar Collector2D y arreglar las animaciones del reproductor: Para obtener la experiencia en nuestro controlador
de estadísticas desde el Pickup two D, necesitamos nuestro nodo colector
dos D, que va a ir
por ahí recolectando pastillas para nuestro jugador Entonces vayamos a la escena del jugador. Voy a hacer clic derecho sobre el jugador. Añadimos un nodo hijo. Busquemos un Área dos
D. Así que esta área dos D, voy a renombrarla
por aquí para que sea coleccionista dos D. Y luego hagamos
click derecho adjuntar un guión. Entonces el guión irá
podría ser en caracteres, así que de hecho
lo pondré en caracteres. Podría haber un
caso en el que realmente hagamos que un enemigo pueda
recoger objetos, pero no quiero que sea
completamente específico del jugador. Entonces voy a poner ahí el guión. Vamos a crear. Después
en la parte superior izquierda, le
daremos el nombre de
clase colector dos D. Lo que nos
importa para el área
colectora dos D es cuando una camioneta
entra en el espacio. Entonces diremos que la función subrayado listo va a devolver void, y diremos área ingresada
punto connect en área ingresada A continuación vamos a crear la función
callback guión bajo en el área ingresada va a recibir un área P área dos D como parámetro
y retorno void Entonces si el área P es un pickup dos D, entonces haremos P area dot
Tri take on our root node. Entonces nuestro nodo raíz es nuestro jugador. Podríamos exportar nuestro nodo
raíz aquí en export object root es
el nodo dos D, supongo. Y entonces vamos a enviar
ese objeto root aquí. Como el objeto TriTek, el que queremos atravesar Ahora, en nuestro inspector, firme aquí al jugador, y eso podría
ser realmente todo lo que necesitamos. Así que agreguemos una copia de nuestra camioneta EXP
al mundo del juego. Vamos a meter unos cuantos, de verdad.
Entonces voy a hacer clic derecho sobre Mundo. Vamos a crear un nodo dos D.
Voy a cambiar el nombre de estas pastillas, y luego agregaré un par de
pastillas al Entonces uno, dos, tres, y luego pondré todo esto en el padre
de las camionetas Podemos ver que estos
son bastante grandes. Eso está bien por
ahora, pero probablemente los vamos a reducir
por el resto de nuestro juego. Entonces antes de que estos
vayan a funcionar, solo
recuerdo que no
hemos montado el colisionador en el jugador Para el colector dos D,
haga clic con el botón derecho en un nodo hijo, y queremos la
forma de colisión dos D aquí. Entonces, a la derecha, agrega una nueva forma de círculo y encoge eso a tal vez
por ahí, un poco más grande que la forma
normal de colisión. Ve al colector TD y
toma la colisión. Vamos a enmascarar en la capa de
pastillas y luego
desactivar la capa de máscara un mundo y la capa de
colisión un Este debería ser un script solo de
monitoreo. Y acabo de
notar que debido a que estos fotogramas brillantes
son de diferentes tamaños para nuestras animaciones, no
están alineando correctamente
en el centro. Al igual que, el ídolo se ve bien, pero correr es tal vez un
píxel a la derecha, y luego la muerte es un poco
incorrecta ahí también. Entonces, una forma en que podemos arreglar esto para asegurarnos de que
todos estén correctos es asignar una propiedad position
a cada uno de los SprikeFrames, lo
que parece que
en realidad ya hice aquí para la posición de muerte Así que Idle tiene su propio valor. Déjame ver qué pasa si
realmente elimino esas propiedades de
posición. Entonces hazlo por la muerte
Idol y corre, ¿de acuerdo? Y luego lo eliminaremos para el reinicio también si está ahí. Bien, entonces, sí,
parece que
necesitamos personalizarlo de nuevo. Bien. Entonces
comencemos con la carrera. Lo colocaré aquí
mismo en negativo 30 y fotograma clave eso
en esa animación Iremos a Idle. Le
pegaré a W y lo moveré hacia abajo. Entonces es como justo por
ahí, negativo 13 y fotograma clave. Bien,
vamos a correr. Vayamos a Idle. Parece que Idle
sigue siendo un píxel bajo, así que voy a moverlo
hasta 14 negativo, fotograma clave Creo que eso es lo que
teníamos antes, pero voy a sacar la
carrera y moverla una a la izquierda también y enmarcarla clave. Entonces ahora si cambiamos
entre inactivo y correr. Bien, eso en realidad
se ve correcto ahora. Vamos a morir
y moverlo por aquí a la derecha
y enmarcarlo clave. Entonces eso son diez píxeles
a la derecha. Y ahora cambiamos a inactivo. Bien, la muerte es demasiado un píxel
a la derecha. Entonces eso necesita ir a un nueve
negativo, marco clave lo. Entonces tenemos ocioso. Bien,
entonces tenemos que ir dos pixeles más a la izquierda para la muerte y enmarcarlo clave. Entonces ese es un ocho, y luego
el inactivo es cero para X. Bien, todos estos
parecen que están haciendo fila ahora. Bien. Entonces aquí están
los valores reales. Ocho negativos 14 por la muerte. Ídolo es cero negativo 14. Ejecutar es negativo uno
y negativo 30. Y luego el reset, que
debería coincidir con el ídolo, que es cero, negativo 14. Por lo que el reinicio
bajará a negativo 14. Negativo 14 está justo
ahí, Keyframe it. Bien, y eso debería arreglar
cualquier problema de animación que
estemos teniendo con
esas hojas de sprites Bien, ahora de vuelta al colector
dos D. Asegúrate de
apagar la capa uno y la máscara
para la capa uno, también. Bien, y ahora podemos presionar
play y ver si
realmente podemos recoger
esos pequeños íconos. Entonces sí conseguimos ese. Comprobemos la salida. ¿ Conseguimos la experiencia? Sí, lo hicimos. Tenemos una experiencia
ahí. Vamos a ir aquí abajo. Obtenemos experiencia dos. Ahora bien, esta experiencia tres, por lo que podemos confirmar que
nuestras recogidas están funcionando en función de la salida de
nuestra consola Y nuestro personaje quedó
derrotado en el fondo. Pero eso es bueno
eso demuestra que
ese juego sobre sistema
en realidad estaba funcionando, también.
34. P33: crear una mecánica de caída del enemigo y redimensionar las pastillas: Nuestras camionetas. Ahora,
queremos asegurarnos de que los enemigos realmente los dejen caer
cuando sean derrotados. Probablemente también rápidamente
queramos cambiar el tamaño de la camioneta dos D porque es el
doble del tamaño de nuestro jugador en este punto Entonces en EXP pickup dos D, puedo o cambiar
el sprite animado a la versión 16 por 16, lo cual es conveniente porque ya
tenemos eso, o puedo tomar el nodo
y escalarlo Entonces puedo hacerlo como 0.50 0.5. Y entonces esa sería una
forma de hacer que se encoja. Pero si ya sabemos que el tamaño no va a ser
consistente en nuestro juego, podría estar teniendo
más sentido entrar en la escena base
de pick up dos D, cambiar el sprite animado Y luego agregamos el mismo icono, pero del paquete 16 por 16. Así que entra en los iconos del arte hoja completa de
Sprite, 16 por 16. Támalo como 16 por 16 porque esta es la hoja de sprites
más pequeña Y luego controlaremos el carrete de ratón de
metal, acercaremos el zoom, encontraremos el sprite, lo agregaremos y eliminaremos el grande Entonces selecciona cero y elimina eso, y luego bajará al
fotograma cero. Guarde eso. Y luego de vuelta en esta escena,
puedes guardarla también, y debería ser buena
en la cosmovisión Bien, entonces ahora es el tamaño
apropiado. Bien, así que vamos a
entrar en la escena de los orcos, y agregaremos la
capacidad de soltar objetos Entonces aquí, queremos un
guión que vaya a
manejar elementos que
podamos dejar caer en el juego,
y es manejar elementos que
podamos dejar caer en el juego, posible que queramos
seleccionar aleatoriamente de una lista de elementos, y podemos ponderarlos
de la misma manera que lo hicimos con
la espera del desove enemigo Entonces voy a hacer clic derecho sobre el estado de muerte ya que esto
va a estar directamente ligado al estado de muerte en el sentido de que
soltamos artículos al morir, y voy a agregar un nodo hijo. Así que haz aquí un nodo regular. Entonces cambiaremos el nombre de esto para
que sea algo así como gotas. Haga clic derecho, agregue un script, y luego por aquí, lo
crearemos. Entonces le daremos las gotas de nombre de
clase. Entonces le daremos las gotas de nombre de
clase. Bien, y en nuestro script de caída, vamos a querer básicamente una lista de elementos que podamos soltar. Entonces, digamos que en Export VR, iremos con las definiciones de caída, y esta será una matriz
de definición de caída. Así que tipo de seguir el
mismo patrón de antes, donde tenemos un recurso
definido por el editor, podemos repetirlo nuevamente
así en el sistema de archivos, vamos a querer ir
a algún lugar como la carpeta de pastillas de Objetos hacer clic derecho
y
crear un nuevo script Y voy a llamar a
esta definición de caída. Y esto se extenderá desde el
recurso. Crea eso. Ahora podemos abrir la definición de
caída, darle el
nombre de clase drop definition. Y vamos a querer
en la escena Export VR, que es una escena repleta. Entonces, ¿qué estamos
cayendo en el mundo del juego, la caída real del artículo? Entonces, debido a que es una escena repleta, realmente podría ser cualquier cosa que tenga un nodo en su raíz. Podrías dejar caer enemigos
si quisieras. Entonces este empaque solo
lo hace flexible. Bien, y luego a continuación
queremos un peso. Así que el peso var de exportación es a flote. Eso lo haremos por defecto a 0.1, y ese es un comienzo decente. Entonces volveremos a entrar en el script
drop, y tenemos nuestra variedad de definiciones de drop para que
podamos hacer clic en drops. Y si no puedes ver la matriz aquí
arriba y el
inspector por aquí, solo
puedes ir a Project
y volver a cargar el proyecto Bien, entonces ahora si
revisas al inspector, debería aparecer ahí
siempre y cuando no
tuvieras ningún error. Entonces crearemos nuestra
primera definición de caída. Entonces nueva definición de caída, y podemos hacer de este un
gimnasio EXP con un peso de uno, si queremos. Carga tan rápida. Y vamos a buscar
la camioneta EXP dos D enter, y eso lo configura. Entonces nuestro orco
solo va a
poder soltar las gemas EXP, y eso está perfectamente bien
para nuestro enemigo básico Entonces queremos funcionar podemos
llamar a nuestro estado de muerte o nuestra animación que
sería capaz de generar las
gotas en el mundo del juego. Entonces podríamos decir función
drop si quieres, podrías pasar un
número de veces aquí, como P veces es un entero, y eso puede por defecto a uno, y esto devolverá void. Entonces podríamos decir cuatro veces en rango cero a P veces
incrementando en uno cada vez Entonces esto significa que empezamos en cero, subimos una vez hasta
llegar a P veces. Entonces, si P times es uno, esto se ejecutará una vez
porque hará cero, y luego golpeará
P veces y se detendrá. Entonces vamos a hacer el colon ahí. Bien, y luego después de
hacer el loop, necesitamos generar
una gota cada vez. Por lo que probablemente
sería mejor calcular el peso total una vez y luego lo
usamos dentro de aquí. Entonces vamos a generar el peso. Entonces antes de generar las gotas, diremos cuatro definiciones de DF y
drop. Acumularemos
el peso total, por lo que necesitamos una
variable por encima de esto. Hasta el momento, el peso total, hay un flotador
comienza en cero, cero, y eso va a
ser peso total más
igual al peso del punto DF.
¿Bien? Entonces tenemos eso. Ahora, dentro de este bucle de cuatro en la parte inferior, lo estamos
pasando cada vez. Queremos obtener nuestro peso
seleccionado entre cero y
el peso total. Así que es como repetir
la misma lógica que otras aleatorización que hemos
hecho en este curso Entonces digamos var peso seleccionado va a ser igual al rand F, que es 00-1 0.0, y vamos a multiplicar ese
valor por nuestro peso total, lo que
nos dará nuestra selección Entonces ahora para cada una de las gotas para definición en las definiciones de
caída, agregaremos el peso hasta el momento. Hasta el momento, el peso actual, que es un flotador
y comienza en cero, cero, diremos que el peso actual más
es igual al peso de definición. Bien, así que eso nos da
lo que estamos hasta el momento. Si esto es mayor que
el peso seleccionado, entonces queremos devolver este drop o agregarlo a una matriz drops. Entonces, si el peso actual es mayor o igual
al peso seleccionado, entonces este es el que queremos agregar
a una matriz Así que vamos a crear una matriz
aquí arriba del bucle cuatro, y diremos var drops es
una matriz de definición de caída. Ahora, cosa clave aquí, esto puede tener múltiples copias de la misma definición de caída. Es una matriz, no
algo más como un conjunto hash. Para que podamos tener la misma caída dos o tres veces si es necesario,
lo cual es importante. Decir gotas punto añadir
la definición, y luego salimos
de ese bucle de cuatro, y luego va
a ir de nuevo aquí Entonces, una vez que llegamos a donde
el peso actual es igual o mayor que
el peso seleccionado, elegimos la gota, y
volvemos a hacer un bucle por cada vez que
necesitemos para esta configuración de caída. Entonces ahora tenemos todos
los descensos aquí abajo, así que queremos
emplearlos en el mundo del juego. Entonces digamos cuatro gotas en gotas. Vamos a crear una
instancia que va a ser igual
a drop dot
visto punto Instanciate Y luego vamos
a agregar eso de niño
a algún padre dentro
de nuestro mundo de juego. Entonces en el mundo, podríamos simplemente reutilizar este
nodo de camionetas si queremos Para que pueda tomar camionetas. Vamos al nodo
aquí arriba en la parte superior derecha, y voy a añadir un nuevo grupo. Entonces diremos camionetas. Voy a hacer esto global. Entonces, para cualquier cosa que sea un artículo para
ser recogido del mundo, lo
agregaremos
como su grupo de nodos. Entonces, cuando está en un grupo de nodos, es muy fácil de encontrar
dentro de nuestro script Y en realidad podemos
obtener ese
nodo de pastillas tan pronto como nuestro orco se cargue, así sabremos si
hay algún problema Así que vamos a decir var pastillas padre, y eso va
a ser el nodo dos D, y vamos a decir
función subrayado y eso va
a ser el nodo dos D,
y vamos a decir
función subrayado
ya. Déjame acercarme aquí. Pickups parent
va a ser igual a Gtree dot Obtener primer
Nodo en grupo, y estamos
buscando esas recogidas
así que en los grupos de nodos de aquí en los grupos
de nodos del
inspector,
puedes ver las recogidas ya
hay una,
y esto está asignado a este nodo puedes ver las recogidas ya
hay una,
y esto está asignado a este Entonces, mientras el nodo de
pastillas exista en nuestro mundo de juego actual,
funcionará bien Podríamos ir un pequeño
paso más allá y sacar esto a una variable
constante. Entonces vamos a decir
grupo de recogida aquí, todas las mayúsculas, y luego grupo de recogida constante
es un nombre de cadena igual a, y voy a decir ampersand, Control V, pega la Entonces, siempre y cuando tengas un nodo en el grupo de camionetas
para esto y hayas asignado ese nodo
al grupo dentro de tu proyecto de juego y
exista en la escena, entonces esto funcionará
perfectamente bien No hace falta obtener
ninguna referencia directa, lo cual sería complicado
porque el orco no existe en la escena hasta que
se ha engendrado Entonces esta es una manera decente de obtener
ese nodo padre al que podamos padre. Si queremos estar seguros incluso
podemos decir, como, afirmar las recogidas padre
y no es igual a null,
y luego diremos que debe
haber un padre para que los artículos Bien, eso está bastante
claro. Bien, entonces instanciamos cada una de las escenas y luego
queremos
agregarlas de niño al padre de
las camionetas Así camionetas padre Achildestance. Y la ubicación en la que queremos que esté la
gota va a estar basada en el
nodo dos D. Así que
en realidad necesitamos tomar gotas y cambiarlo a un
nodo dos tipo D. Entonces aquí abajo, podemos decir que posición global de
Instance
va a ser igual a la
posición global desde el guión. Bien, entonces eso significa de
vuelta en nuestra escena org. Entonces ahora queremos
cambiar este tipo de nodo, voy a hacer click derecho
y cambiar el tipo, buscar gotas, y
deberías verlo aquí. Haga doble clic. Bien,
da clic en gotas. Asegúrate en el
inspector, todavía tienes ahí tu definición de caída
para el EXPJM Y probablemente necesitamos
sacar esto de
los nodos HSM aquí Ya que este es un nodo dos D, queremos que sea hijo
de nuestro nodo principal dos D, así que traeré esto
aquí arriba como hijo del trabajo. Y eso
probablemente debería ser bueno. Así que tenemos el artículo o lo que sea que estemos dejando caer obtener instancia
en el mundo del juego. Se convierte en un hijo
del nodo del grupo de pastillas, y luego le damos la
posición de este nodo de gotas,
que cae es solo un desplazamiento, si lo hay, de la posición de los orcos No necesitamos
cambiarlo, pero podríamos simplemente tener un default como cero, cero
ahí. Eso está bien. Y ahora podemos o bien
llamar gotas de
la animación de la muerte
o del estado de muerte. Entonces si voy al reproductor de
animación aquí y abrimos la
animación de la muerte, veamos. Estado de muerte. Entonces vamos a ver. Estamos llamando estado de muerte
terminada. Podríamos simplemente poner las gotas cuanto el orco empiece a morir Creo que esa podría ser más
la forma en que van la mayoría de los juegos, donde se ve el bucle antes de que despunten
de la escena Entonces en una pista,
método de llamada en el nodo drops. Entonces aquí abajo en el primer
fotograma. Vamos a acercarnos. Bien, haz clic en Insertar
una llave. Nosotros hacemos gotas. Se puede ver el
trabajo de parámetros en el reproductor de animación. Entonces, en la parte superior derecha, tenemos nuestro nombre de método drop.
Tener el argumento. Entonces el primer argumento y el
único argumento es int value. Entonces, ¿cuántas veces
queremos llamar a gotas? Podríamos decir 50 por diversión, y vamos a golpear Play y ver
si eso realmente funciona. Entonces esto pondrá muchas de estas gemas EXP en
escena si está funcionando, pero al menos
definitivamente sabremos si funciona. Entonces veamos qué
pasa. Bien, creo que todos simplemente
engendran en el mismo lugar Entonces voy a repasar eso. Y si, ya ves que
recogimos 50 gemas.
35. P34: generar posiciones aleatorias de caída de artículos: Ly, cuando el orco deja caer
50 de estos artículos, están todos apilados
uno encima del otro, si
verifico la salida Así que ahí conseguimos 50 XP. Y creo que lo que
nos gustaría hacer es que cuando se genera el objeto, o le damos
un desplazamiento o
hacemos que se aleje del objeto Está bajando de un poquito. Entonces creo que la
forma más rápida de hacer esto sería generar una posición de
desplazamiento aleatoria, y esta será un
cierto número de píxeles lejos del personaje
en una dirección aleatoria Así que solo podemos agregar esto
para el script drop. El tope, voy
a a exportar nuestro drop Max distancia,
que será un flotador. Y vamos con diez
píxeles por defecto. Esto va a representar qué tan lejos del nodo drops. Ese es este
nodo específico en el que estamos trabajando en el que el
objeto puede generar, y esta es una cantidad máxima, por lo que puede ser 0-10
píxeles Así que aquí abajo,
voy a crear una nueva función. Lo llamaré función, subrayado, get span, offset Y esto pasará
en una distancia P max, que es un flotador, y podemos por defecto eso a la distancia máxima de
caída. Entonces no tenemos que
pasar un parámetro. Simplemente puede ser eso por defecto. Y luego queremos volver
al vector dos como el offset. Entonces, para obtener un desplazamiento final,
necesitamos la dirección, y luego la magnitud,
la magnitud está justo aquí en
la distancia P max. Entonces digamos que var direction va a ser un
tipo inferido del vector dos, y vamos a
crear un nuevo vector dos, así que envuélvalo entre paréntesis
aquí, necesitamos una X y una Y. Entonces para conseguirlo,
básicamente necesitamos generar una dirección aleatoria entre uno
negativo y 1.0 Entonces voy a decir rand F, y creo que necesitamos rango
aquí porque queremos
ir negativo 1.0,
no cero a uno. Así rando rango F en
negativo 1.0 a 1.0. Y entonces tenemos que hacer eso
por segunda vez para que podamos copiar esta línea para
el valor Y hasta aquí abajo. Y luego quiero normalizar el vector para que
sea una dirección pura. Bien, entonces ahora conseguimos nuestro offset. Entonces var offset va a
ser igual a la dirección
multiplicada por la distancia P max. Y luego devolvemos el offset,
y eso es básicamente todo. Así que tomamos Get
spawn offset aquí, y cuando estemos estableciendo
la posición global,
vamos a hacer la posición global más
GitsPawnOFSET El valor por defecto es
drop Max distance, así que solo podemos usar eso
como predeterminado aquí. Así que en realidad no
necesitas pasar en drop Max distancia,
pero podrías. Entonces solo sería el
valor anulándose a sí mismo. De cualquier manera, va a ser lo mismo, pero tienes la opción
de dejarlo en blanco, y entonces ese valor simplemente
quedará por defecto aquí
abajo. Creo que
eso es todo lo que necesitamos. Así que vayamos al modo de
juego y veamos si esos 50 artículos realmente caen
en diferentes ubicaciones. Así que vamos a golpear play,
y vamos a entrar aquí. Le dispararé una flecha
o lanza al orco. Y podemos ver que todos
engendran en direcciones aleatorias Pero en realidad cometí un error. Entonces no queremos normalizar
el vector porque quiero que el porcentaje de la distancia pueda
ir 0-100% Bien, entonces porque
normalicé el vector para la dirección, siempre
va a darte la distancia
máxima completa aquí. Th solo será la dirección
pura. Pero lo que en realidad quiero es que
cuando tome esa dirección, será algún porcentaje
de la distancia. Y en realidad podríamos
querer llamar a esto más como un vector aleatorio. Y luego bajaremos para
compensar aquí abajo y más allá de eso. Entonces cuando esté tomando la X, estará en algún lugar
0-100% de la distancia
en la X multiplicada por la distancia P max y
lo mismo para la Y. Así que esto le dará
una especie de posición más aleatoria dentro
de un círculo imaginario Si tuviera que crear
una forma de colisión, se
vería así para
las posibles ubicaciones de lapso. Así que entremos al modo de juego, y debería ser más correcto ahora cuando bajemos los 50
artículos al mismo tiempo. Entonces ahí tienes. Todos se generan
aleatoriamente
dentro de ese círculo. Nunca vamos
a dejar caer 50 artículos al mismo tiempo. Entonces este tipo de
parece un poco funky. Pero si hay como
dos o tres gotas, creo que va a funcionar bien. Entonces para demostrar,
iré al reproductor de animación, y cuando hagamos la muerte, tomaré aquí la
función de gotas y
cambiaremos su valor de argumento de
cuántas gotas a algo
más como tres. Creo que eso es más realista. Vamos a tocar, y luego
entraremos aquí. En la mayoría de los casos,
creo que la mayoría de los enemigos sólo
van a dejar caer un elemento. Pero si decidimos
bajar tres, entonces al menos podemos ver que tienen
diferentes posiciones, y es obvio al
menos ver dónde están. Bien, así que quiero
terminar esto simplemente cambiando
las gotas a una. Cada uno o solo
dejarán caer un EXP hacia arriba.
36. P35: implementa un área de gravedad de una pastilla: Es un poco tedioso
si tu jugador tiene caminar sobre todas y cada una de las
recogidas que quieras agarrar, sobre
todo cuando
vas a estar esquivando a todos estos enemigos orcos que
atraviesan Entonces, lo que queremos agregar va a ser un área de gravedad de
recolección. Entonces, en nuestra escena de jugador, lugar de agregar
el área de gravedad a nuestro nodo colector dos D, voy a crear un nodo de dos áreas D
separado para la gravedad específicamente. La razón de eso es porque la colisión forma dos D
aquí para
recoger realmente los artículos va a ser un área diferente a la
que está aplicando gravedad. Entonces eso sería un poco
confuso con el
coleccionista dos D, teniendo aquí dos formas de área. Entonces vamos a
crear un nuevo nodo. Voy a hacer click derecho sobre
jugador agregar un nodo hijo. Esto sería en el área dos D. Lo
agregaremos
aquí en la parte inferior, y voy a renombrarlo
para ser decir pickup gravedad dos D porque esto es específicamente para artículos en el
mapa que se pueden recoger. Bien, así que vamos a hacer clic derecho
sobre el jugador agregar un nodo hijo. Vamos a
buscar el área dos D, y podría
llamarlo algo así como área de
gravedad dos D. Pensé en
llamarlo pickup gravedad dos D, pero queremos hacer el guión un poco
más genérico porque puede
haber casos en el camino
en los que realmente
quieras que la gravedad aplique
a algo
que no es una camioneta, y manejando la gravedad
específica de la camioneta solo es manejado por
la forma de colisión. El manejo del hecho de que
es para apuntar a camionetas solo es administrado
por las capas de colisión Entonces, todo lo que tienes
que hacer para que sea destino a las recogidas es elegir la máscara cinco aquí
para la capa de pastillas, y apaguemos la capa uno para
donde existe encendida y
hagamos que solo monitoree Bien, entonces esa es nuestra configuración. Entonces solo necesitamos en
el área de gravedad
aplicarlo a todos los objetos dentro
de aquí que detecte. Entonces, dentro del
área de gravedad, haremos clic derecho. Antes de pasar
del inspector, sin embargo, si nos fijamos en esta sección de
gravedad, es una gravedad construida en el área
dos D, pero la cosa es que se aplica
al cuerpo rígido dos Ds, que son
objetos físicos completos en el juego, y no queremos 1.000 cuerpos
rígidos flotando
alrededor de la pantalla. Entonces, en lugar de usar
la física estándar para controlar la
gravedad en nuestras pastillas, solo
queremos un guión simple solo
vamos a hacer que llegue
donde sea que esté el centro del
jugador Y no tratar con
cuerpo rígido dos Ds en absoluto. Entonces, esencialmente, es una optimización
del rendimiento. No necesitamos física completa
para cada uno de nuestros artículos de recolección. Simplemente existen para ser
recogidos por el jugador. Por lo que chuparlos
directamente al jugador está perfectamente bien. Entonces voy a hacer click derecho
sobre Gravity Area dos D y adjuntaremos un guión. Por supuesto, voy a llamar a
esta zona de gravedad dos D. Vamos a crear
ese nombre de clase. Por supuesto,
área de gravedad dos D. Bien, entonces mientras un objeto
está dentro de la zona, queremos rastrearlo y aplicarlo
consistentemente
un movimiento,
básicamente trasladando
otro nodo dos D a través la pantalla hacia el
punto central de esta área dos D, el área de gravedad dos D. Así que
vamos a tener una variable local Lo llamaré objetivos, y esto será una matriz
de nodo dos D está bien. En función lista, queremos conectarnos
a la señal de esta área dos D. Así que
vamos a decir área ingresada punto conectar, subrayado en área ingresada También nos conectaremos al área de salida
del área salió punto connect
en el área salida Tenemos que crear
esas funciones ahora. Función subrayado
en el área ingresada, y esto nos va a dar
área dos D como parámetro Entonces área P área dos D, estamos intentando anular aquí. Bien, entonces, ¿qué vamos
a hacer con la zona de aquí? Vamos a moverlo hacia el punto central de
nuestra área de gravedad dos
D. Esto va a funcionar bien con la
camioneta porque las áreas de recolección están en
su raíz en
el área dos D. Así que cualquier cosa debajo de ella va a ser movida automáticamente hacia el centro por lo que
sí requerimos que tenga ese tipo de configuración. De lo contrario,
necesitarías una referencia al nodo padre de la escena. Cualquiera que sea tu base de tu escena de recogida es
el objeto o nodo, más bien, que necesita moverse. Así que ten en cuenta eso.
Debido a que estamos haciendo todas las camionetas
específicamente así y las pastillas son
exclusivas de la capa cinco, funcionará
bien tal Si quieres estar extra seguro
y quieres limitarlo
a solo scripts de recolección,
entonces podrías, por supuesto, verificar si el área P
es de tipo pickup dos D. No parece ser
necesario como lo es ahora mismo, pero eso es algo
a tener en cuenta. Entonces voy a poner
un pequeño comentario ahí
arriba sobre lo que acabo de decir. Bien, y ya que el
área P recoge así. Voy a trabajar bien como está. Entonces diré objetivos
puntean un bolígrafo, área P. Recuerde, el área P área dos
D es de tipo nodo dos D, así que eso funciona bien aquí arriba. No hay necesidad de ser
más específico que eso porque solo necesitamos acceder
al nodo
dos funciones D. Entonces en área salida, función, subrayado en área Área P área dos D, devuelve void, entonces
vamos a decir blancos punto borran área P. Ahora, para anotar sobre
la función erase, si el objeto que
intentas borrar de la matriz no existe en la matriz, entonces
esto no hará nada. Si borra, entonces
lo eliminará. Así que en realidad
no es necesario verificar si ya está
en la matriz. Porque si no
existe en la matriz, entonces esto ya
simplemente no hará nada. Entonces no hay necesidad de
verificar dos veces. Derecha. Y entonces necesitamos
un proceso de física. Entonces digamos función
subrayado proceso de física, y vamos a decir para el
objetivo en objetivos, queremos
traducirlo a través de la pantalla
hacia el punto de área de
gravedad central Necesitamos una velocidad en la parte superior a la exportación la
velocidad de gravedad lejana es un flotador. Si recuerdo, esto
va a
salir a píxeles por segundo. Entonces voy a probar algo así como 50.0. Entonces necesitamos
calcular la dirección
entre el objetivo y nuestro punto central de área de
gravedad. Hasta ahora la dirección va
a ser igual al
punto objetivo posición global punto
dirección dos posición global. ¿Bien? Y luego solo necesitamos
calcular nuestra cantidad de mudanza. Entonces var mover va
a ser igual a dirección tiempos gravedad,
velocidad, tiempos Delta. Como estamos usando translate, necesitamos factorizar
eso directamente aquí para el vector de movimiento final. Podemos decir que este es
un factor dos D, si eso lo deja más claro. Y luego queremos
tomar el objetivo y traducirlo a través de la
pantalla por el desplazamiento de movimiento. Este es esencialmente nuestro guión de
gravedad justo ahí mismo. Lo último que creo que
necesitamos es agregar una forma de colisión a
nuestra área de gravedad. Entonces haga clic derecho en el área de
gravedad a D, agregue una forma de colisión a
D. Vaya a la parte superior derecha, una nueva forma de círculo
y haga esto bastante grande para que tengamos el área donde
realmente va a aplicar gravedad
hacia el centro. Bien, para que pueda jugar, y entraremos aquí
y podrán ver que nuestros objetos se
chupan hacia el centro Entonces ahora mismo, la
gravedad es lineal. Es posible que queramos
darle una curva para
que cuanto más se acerque
al punto central, más rápido en realidad va a animar esa traslación
hacia el centro Entonces si vamos al área de gravedad
dos D, y dentro de aquí, voy a decir en la exportación, digamos curva de efecto de
tipo curva. Eso lo guardaremos. Después en el inspector,
editemos esta
curva de efecto, nueva curva. Y entonces queremos que X o el dominio
max aquí sea básicamente la distancia
desde el centro. Y entonces el valor aquí
va a ser qué porcentaje de la velocidad máxima quieres
aplicar en base a esa distancia. Entonces digamos que
la distancia es como 100 aquí para
el dominio max. Cuanto más cerca esté más cerca
queremos llegar a 1.0. Entonces vamos a tomar el primer punto
y moverlo aquí arriba a 1.0. Voy a acercar aquí
para que puedan ver. Y entonces sólo voy a tirar un
segundo punto hacia abajo así. Bien. Entonces, si llega
a la distancia 100, va a ser muy
débil en ese punto. Y eso se mediría
en píxeles, claro. Entonces entonces con esa curva, queremos volver
aquí y ajustar el movimiento muestreando esta curva. Así que vamos a obtener el modificador de curva, y eso va a ser igual
a la muestra de punto de curva de efecto. Y necesitamos muestrear
con la distancia desde nuestro objetivo hasta el centro de
gravedad. Así que la distancia vara va a ser punto objetivo Posición global, distancia de
punto a la posición
global. Bien, entonces simplemente
pasamos esa distancia al muestreo del
modificador de curva, y luego tomamos
el modificador de curva y lo multiplicamos por el Delta. Entonces este será algún valor
entre 0.0 y uno. Y eso debería afectar la
gravedad basada en esta curva. Cuanto más cerca está,
más fuerte es. Y por aquí, se debilita. Siéntase libre de personalizar
una curva si necesita cambiar un poco la forma de la
animación. Bien, entonces voy a tocar aquí y vamos a probar
eso como que fuera. Es un poco difícil de
ver porque tal vez hice que la
distancia máxima aquí fuera demasiado grande. Entonces lo que puedes hacer
es verificar la forma de colisión y
ver cuál es su radio. Entonces 27 pixeles. Así que básicamente estamos haciendo una
curva de hasta 100 píxeles, pero el máximo de este radio
es de 54 píxeles, 27 por aquí. Oh, en serio, no, no, no, 27 pixeles porque es el centro
al punto exterior, ¿verdad? No el diámetro, claro. Si, tal vez quiera tomar el radio aquí y
solo hacer que sea 30 pixeles, un buen número par, y luego vamos
al área de gravedad. Y luego tomemos
el punto de la curva aquí y movamos esto a
30 píxeles, también. Bien, así que eso va a ser como nuestra distancia máxima en
esta forma de aquí. No hace falta que
sean perfectamente 30. Al igual que, aproximadamente aquí para que podamos ver la forma un poco mejor. Bien, ahora si le pego a play
y vamos por aquí, debería ser un poco
más preciso. Bien, ahora se puede
ver que la gravedad aumenta de
verdad a
medida que se acerca, así que es lenta por
fuera, casi demasiado lenta Así que en realidad podría levantar
esto un poco, y puedes ajustar la forma de la curva tirando de
las asas, lo que necesites hacer.
Verás, eso me gusta. Vamos a golpear play una
vez más sólo para probar. Y si, creo que eso es lo
correcto para la gravedad. Entonces ahí tienes.
Escala de gravedad. Cuanto más se
acerque a jugar tu objeto, más rápido se mueve y absorberá todos los elementos de
recolección o
realmente cualquier área que marque en la capa de máscara aquí Que en este caso,
ahora mismo son solo camionetas, pero podrías hacerlo
con otras áreas
37. P36: cómo crear una interfaz de usuario con barras de progreso HP y EXP: Bien, entonces aunque el
combate principal está funcionando en el juego, podemos recoger elementos
como camionetas EXP, pero no tenemos ninguna indicación
de UI de lo que está pasando No podemos ver el nivel de nuestro
personaje, nuestro HP, nuestra barra EXP. Así que vamos a
empezar trabajando en barra
EXP y añadiendo
un contador de niveles a, digamos, la parte superior
izquierda de la pantalla. Y vamos a hacer
eso en un nuevo nodo. Entonces voy a subir aquí a la sección media,
agregar una nueva escena. Y queremos que esta
sea una interfaz de usuario. Entonces voy a llamar a
este jugador UI. Vamos a guardarlo en la
carpeta UI. Y guárdala ahí. Después voy a hacer clic
en la interfaz de usuario del reproductor, y agregaremos,
digamos, un contenedor de panel. Entonces esto esencialmente
va a ser el fondo de
nuestra interfaz de usuario de jugador principal. Ahora, dices que la interfaz de usuario del jugador se extiende por
toda la pantalla por defecto. Así que queremos entrar en el
diseño de la derecha
y cambiar el preajuste de Anclajes de
completamente destrozado a la parte superior izquierda Bien, ahora, eso va a
reducir el tamaño aquí básicamente a nada. Y luego queremos
hacer dimensionamiento de contenedores, ampliar en
relleno horizontal y vertical. Entonces debajo de nuestro contenedor de panel, queremos hacer clic derecho
y agregar en un nuevo, digamos, un contenedor de caja en V. Un contenedor VBox organiza
sus hijos verticalmente. Entonces, si pones dos elementos aquí, el que está directamente
debajo de él irá encima del otro en
cuanto a su disposición visual. Así que vamos a hacer clic derecho
sobre el contenedor VBox, y ahora quiero un contenedor HBox Entonces nuestro contenedor HBox, el primero,
irá de izquierda a derecha, y este estará encima de cualquier otro contenedor
HBox infantil Entonces nos ayuda a
diseñar las cosas casi como una
grilla, pero no exactamente. Bien, y luego de niño
para el contenedor HBox, queremos agregar en una barra de progreso de
textura para que puedas buscar Progreso
y lo encontrarás aquí mismo Esto le permite,
en la parte superior derecha, establecer texturas para
la textura inferior, la sobretextura y
la textura de progreso. Entonces a medida que los valores
se llenen, en realidad mostrará más o menos de la textura de
progreso, y luego debajo de ella
estará la textura base, que se muestra en el
fondo siempre. Bien, y luego
además de eso, queremos una etiqueta a
la derecha de esto. Entonces voy a hacer clic derecho en
contenedor HBox, agregar una etiqueta. Una etiqueta básica debería
estar bien aquí. Siempre podemos cambiarlo a
una etiqueta de texto enriquecido más adelante. Bien, y ahora para esta barra de progreso de
textura, queremos ir a buscar el
arte para nuestra barra de progreso. Así que minimicemos todo en la parte inferior derecha y
ampliemos la carpeta de arte. Vamos a la GUI de Crimson Fantasy. Y creo que fue
bajo GI Sprite aquí. Entonces en la parte superior derecha por debajo, voy a crear una nueva
textura de atlas y luego expandirla. Y vamos a arrastrar a GI Sprite
al atlas aquí. Así podemos ver el atlas completo, estilo de arte gótico
bastante genial pasando aquí. Y podemos seleccionar lo que
queremos que sea nuestra subtextura. Entonces el bajo textura
va a ser básicamente nuestro bar donde
esté completamente sin llenar Entonces, si edito región, puedo acercarme aquí, y seleccionaré esto,
pero aquí mismo, así, ese puede ser nuestro
bajo textura golpear cerrar. Y luego para la
etiqueta digamos que cero de 100 HP por
ahora mismo, solo como un simulacro. Entonces ahora tiene sentido cambiar
el nombre de este contenedor HBox, algo así como la pantalla HP Y vamos a duplicarlo, y luego voy a cambiar el nombre del
segundo para que sea EXP display. Ve a la barra de progreso de textura. Y en texturas, vamos a seleccionar
una diferente de Editar región. Entonces veamos qué es lo que nos
gusta aquí como barra EXP? Podríamos usar este
básico de aquí, pero creo que
en realidad podría ser un poco útil si pudiéramos
ver diferentes trozos Entonces con este, podríamos
ver de siete lo cerca que estamos de subir de nivel
realmente. Pero notarás tan pronto como cambie el valor
aquí para este, el superior también se
actualiza automáticamente porque estamos usando un recurso de textura de
atlas compartido. Entonces lo que realmente
tenemos que hacer aquí, voy a cerrar es hacer clic derecho sobre esta textura y
luego hacer única. Entonces, cuando hagas eso, esta
textura será única. Tenemos que volver al
primero y arreglarlo, clic
derecho y luego
hacer Unique, y necesitamos cambiar el HP
de nuevo a su textura HP. Entonces por aquí,
seleccionaremos esa ganga de HP, y ahora podemos ver que estas
son dos cosas separadas. Bien, entonces ahora hagamos también
el relleno para el top one. Voy a ir a progresar
aquí, nueva textura Atlas, y luego podremos cargar rápidamente desde el menú desplegable,
nuestro sprite GUI Y ahora queremos editar región, y queremos agarrar la barra de salud
llena aquí. Bien, entonces eso se verá algo
así y golpeará Cerrar. Ahora que tenemos
esa textura establecida, si vas a, digamos, valoras aquí y escribas 50, verás que parte de la barra de
salud ya está llena. Pero también ves que
con esta configuración, esto puede deberse en parte a el corazón está
ocultando cosas, pero en realidad no
parece que esté
reflejando con precisión el 50% de
tu salud total aquí cuando el valor es 50. Entonces, para sortear eso,
lo que estaba haciendo es cambiar el valor de los hombres para que
sea algo así como negativo 20 para compensar esto
a la derecha. Entonces ahora puedes ver que hay cuatro trozos de salud
visibles de ocho De modo que ese valor de 50 mucho más sentido cuando se tiene ese desplazamiento negativo de 20 ahí. Así que tal vez solo necesites personalizar eso. Entonces, obviamente, cuando
caracterizas la salud cero, va a mostrar cero es el valor que
estará por aquí. Pero lo que realmente importa
es como el 50 de cada 100 aquí y el 100
de cada 100 allá. Entonces solo para asegurarnos de que valemos 100 por barra de salud completamente llena
, y eso se ve bien.
Podemos decir 20. Todavía podemos ver nuestra salud. E incluso a las cinco o diez, bueno, supongo que a las cinco, no
tenemos que verlo necesariamente. Pero como a las diez,
todavía podemos ver una pequeña astilla. Creo que, como es
ahora mismo, es bastante bueno. Así que en realidad podemos simplemente
dejar ese defecto como 50. Y trabajemos en la textura de visualización
EXP. Simplemente haga clic derecho sobre
la base debajo de la textura aquí,
copiemos , y luego
haga clic derecho sobre el
progreso vacío y péguelo. Entonces queremos hacer
clic derecho aquí y hacer que esto sea único y cambiarlo
al valor que necesitamos. Entonces Editar región, y queremos agarrar esta
versión rellena de esa barra. ¿Bien? Y podemos escribir 50
por el valor para las pruebas. Bien, y entonces podemos ver que está
a mitad de camino lleno.
Entonces eso está bien. No necesitamos hacer
un valor mínimo negativo en esta versión de la textura. Aquí hay un pequeño
problema donde
nuestra barra de progreso
para la XP es roja, igual que la de arriba. Entonces, lo que realmente
queremos hacer es
que esta porción metálica esté
teñida de un color diferente Entonces, cómo podemos hacer eso es
yendo aquí al tinte
del progreso y cambiando eso a más como un
verde, algo así. Pero se puede ver
que eso en realidad tiñe toda la textura Entonces, lo que queremos hacer es hacer
clic derecho en la textura inferior, controlar la copia y luego
pegarla en la textura superior. Bien, entonces ahora solo los píxeles que no existen
en el bajo y sobre van a verse afectados por el cambio de
textura de progreso. Entonces, sea cual sea el color
que
quieras que sea el progreso, puedes simplemente cambiarlo a eso simplemente
manipulando el tinte aquí Puede cambiar la
oscuridad, y eso
probablemente sea lo suficientemente bueno
para tu barra de XP, para ser honesto, como la solución
más simple sin usar un
shader ni nada Entonces si vamos a la etiqueta ahora, queremos cambiar
esto para decir EXP. Así que cero de 100 EXP. Bien, y luego
queremos
centrar verticalmente estas barras de
progreso de textura. Creo que puedes seleccionar
ambos al mismo tiempo si mantienes presionado
Control y haces clic izquierdo
y luego vas al
dimensionamiento del contenedor de diseño y lo cambias de relleno vertical a centro de contracción. Sí. Bien. Y entonces eso
básicamente toma estos, y se centra con respecto
a los otros elementos como esta etiqueta de aquí a
la derecha. Así que eso quedará bien. Entonces solo queremos
reducir el texto. Entonces, lo que podríamos
querer hacer en realidad, es simplemente ir a la interfaz de usuario del jugador
en la raíz aquí y cambiar su tema si
cargamos rápidamente desde el
menú desplegable nuestro tema de juego. Entonces va a tener
esa fuente pixel art, que ya es por defecto,
un poco más pequeña. Bien, lo último para
terminar nuestra maqueta, probablemente
queremos un contenedor de
margen como aparente para el contenedor de
panel Entonces haga clic derecho sobre las raíces, interfaz de usuario
del jugador, agregue un contenedor de
margen. Entonces, busque el margen, y luego tire del contenedor del panel debajo de eso. Entonces ahora en el contenedor de
margen, puedes ir a sobrescrituras de tema
en las constantes correctas, y puedes personalizar un Entonces iré con cinco para
todos los márgenes de dirección. Bien, algo así. Entonces ese es probablemente un margen
suficiente, pero en realidad me equivoqué
el pedido. El contenedor del panel pasa por
debajo de la interfaz de usuario del reproductor, y luego el contenedor de margen pasa por debajo del contenedor del panel, y luego el
contenedor VBox pasa por debajo de eso Bien, entonces el punto es que
queremos que el contenedor del panel estire la
imagen de fondo hasta los bordes aquí, y luego queremos que todo lo demás quede
contenido dentro de eso. Entonces es por eso que el contenedor de
margen tiene que estar dentro del contenedor de
panel, para que el
contenedor de panel pueda
estirarse más que el contenedor de
margen. Es sólo una
cosa de ordenar. Entonces eso va a ser bastante decente. Pongámoslo en nuestro mundo. Entonces, en nuestra escena mundial, vamos a crear una
capa de lienzo para poner debajo la interfaz de usuario. Entonces, haga clic derecho en agregar un nodo de capa
Canvas ahora. Bien, y la razón por la
que tendrías una capa de lienzo aquí es que
te da un área de renderizado separada de todo lo
demás en la escena. Por lo que la interfaz de usuario se
renderizará de manera completamente independiente del mundo del juego Toti Y eso sería importante
si tienes, digamos, luces de juego
Toti, y
no quieres que eso
afecte en absoluto a la interfaz Quieres que esos se
renderizen por separado. Entonces las luces para el
mundo son diferentes a si tienes alguna luz para la interfaz de usuario, eso
sería algo aparte. Y solo las
administras por separado. Así que ahora voy a querer
agregar la interfaz de usuario del reproductor aquí, así que filtra tus archivos, busca Player Underscore UI, si eso es lo que
diste como nombre, Dragon suelta la escena
en la capa Canvas, y va a aparecer
ahí mismo en la parte superior izquierda de nuestra UI Antes de presionar Play, asegúrate interfaz de usuario
del jugador esté debajo de
la capa Canvas. Eso va a ser importante
para que no se renderice
también en el mundo del juego, sino como parte
de la pantalla. Entonces está ahí en la parte superior izquierda. En realidad es bastante pequeño. Eso es bastante hilarante,
si soy honesto. Podemos mejorar
la interfaz de usuario aquí o podemos
hacerla más grande en la escena base Entonces tal vez lo que solo
quiero hacer es tomar la capa de lienzo aquí y simplemente
vamos a transformar, aumentar la escala
a, como, cuatro X. Se
puede alejar.
Busca la caja forrada púrpura. Es posible que en realidad
tengas que esconder, como, el mundo terrestre para
que eso realmente lo vea. Bien, ahí. Entonces tenemos aquí
la caja morada. Esta es la zona portuaria de vista completa. Entonces tu UI aquí es algo
con respecto a eso. Entonces a escala cuatro veces, creo que eso funciona bastante bien. Ahora volveré a mostrar la tierra
y la hierba. Vamos a golpear Play. Y veamos si la interfaz de usuario está ahí
muy bien en la parte superior izquierda. Y creo que ese tamaño en realidad
es bastante decente. Eso me gusta mucho. Vamos a ir con eso por ahora, y luego trabajaremos en
guionarlo.
38. P37: cómo implementar un sistema de UI basado en estadísticas con señales: Entonces, para que esta interfaz de usuario funcione realmente, necesitamos conectarla
a señales que se van a relacionar con nuestro bloque Sp de
carácter. Entonces eso significa que necesitamos como señal
cambiada de EXP o una señal cambiada de
HP. Queremos asegurarnos de que
actualizamos eso. También tenemos otro problema
menor, que es que básicamente esta interfaz de usuario es muy grande en el
área de pantalla donde se encuentra actualmente. Así que quiero agregar rápidamente en
un script donde solo pueda hacerlo para que la capa Canvas se muestre
automáticamente
cuando comience el juego, pero opcionalmente podemos simplemente desconectarnos cuando seamos un editor. Por lo que no quiero
tener siempre que activar
manualmente la visibilidad. Lo que voy a hacer es
hacer clic derecho sobre la capa Canvas por
aquí, adjuntar un guión. Entonces esto solo sería
lienzacapa punto GD. Vamos a guardarlo en la carpeta
UI Bin. Crear. Y sólo voy a decir función
subrayado listo. Va a volver vacío, y luego diremos
visible, es igual a verdad. Y eso es todo
lo que necesitamos para eso. Así que ahora podemos ocultarlo
cuando estemos
mirando nuestra vista de mapa
aquí y presionar Reproducir. Y aún así debería aparecer tan pronto
como comience el juego. Así que ahora podemos ocultarlo
de nuestra vista de mapa aquí, presionar play, y
aún así se mostrará tan pronto
como comience el juego. Entonces en la
esquina superior izquierda, ahí está. Así que eso será útil
mientras estamos editando. Otra forma en la que podrías manejar
esto sería tener una escena completamente separada para tu interfaz de usuario de
Canvas cuando estés editando eso, luego tu escena mundial,
y
las combinas en
una escena padre. Cuando realmente cargues el mundo del juego,
eso estaría bien. Y tal vez esa sería
la solución a largo plazo. Pero esto es solo una solución realmente
agradable, rápida y fácil. Así que trabajemos en conectar nuestra interfaz de usuario de jugador a
las estadísticas del jugador. Así que saltemos a la escena de
la interfaz de usuario del jugador. Voy a hacer clic derecho en la interfaz de usuario del jugador. Y adjuntar un guión. Entonces el playi dot gD puede extender Control
y dentro de aquí Solo vamos a una R de
exportación y
diremos contexto del contexto del
jugador. Como ya
creamos ese recurso, es súper fácil de usar. Y el inspector de
aquí arriba a la derecha, simplemente carga rápidamente el contexto
del jugador. Y si recuerdas desde
antes en el curso, el jugador se va a establecer
automáticamente ahí, así que podemos simplemente agarrar las estadísticas de puntos del jugador de puntos de
contexto, y boom, tenemos una
referencia a las estadísticas. Solo necesitamos señales para actualizar la pantalla HP
y la pantalla EXP. Bien, para que podamos
buscar las estadísticas. Veamos,
controlador de estadísticas punto GD. Si saltamos a ese guión,
tenemos un vivo cambiado. Vamos a crear algunas
señales para HP cambió, Max HP cambió y la
experiencia cambió. Bien, entonces la señal Mx HP cambió. Y se puede ver que esto es
un montón de estadísticas que
vamos a cambiar con
un tipo muy similar. Podríamos querer pasar el
objeto que se estaba cambiando, el valor antiguo, el nuevo valor y la cantidad de cambio. Así que en realidad podemos crear
una clase para encapsular todos para cualquiera de nuestras estadísticas
que van a cambiar Y este es un sistema de juego muy
basado en estadísticas, como
sobreviviente,
cierto, porque
podrías tener reducción de enfriamiento, podrías tener velocidad de
movimiento del jugador, HP, poder de ataque, todo
este tipo de cosas extra. Y esas son todas estadísticas que
podrían representarse dentro de un objeto que
podemos pasar a un evento. También es mucho más fácil
si solo tienes un parámetro para que envíes ese parámetro
y luego lo
reciben como una pieza
en lugar de tres o cuatro. Entonces, para mostrar lo que quiero
decir, vamos a crear un nuevo script en nuestro sistema de archivos. Así que voy a
colapsar todo, y luego entraremos en digamos objetos porque los
objetos tienen estadísticas. Entonces voy a hacer clic derecho,
crear un nuevo script. Entonces estos van a
ser datos que van en una señal para cada vez que
una estadística cambió. Así que un nombre bastante claro
sería stat cambiado datos punto gD. Nosotros creamos eso. Bien, y
abramos ese guión. Entonces stat cambió los datos. Nombre de clase, datos cambiados de estadística. Y esto en realidad va
a extenderse desde ref contado, que es un objeto que cuando
ya no se le hace referencia, automáticamente se
eliminará del juego. Entonces referencias. Y en lugar de extender no, esto en realidad va a
extenderse desde ref contado, que es un objeto Gadot que realiza un seguimiento de cuántos
objetos lo están haciendo referencia Y cuando ya no hay objetos que lo hagan
referencia, básicamente
se pondrá en cola para su eliminación, por lo que no es necesario liberarlo
manualmente. Simplemente será recogido
y eliminado por el motor. Eso, por cierto, también
es el valor predeterminado para cuando no
extiendes desde ninguna clase, esa también es la
clase predeterminada. Bien, entonces nuestra estadística cambió los datos, queremos darle una función de
inicialización, así que la función subraya un Y cuando creamos
un NIT para un objeto, podemos pasar cualquier
parámetro que necesitemos Entonces voy a decir P objeto, el objeto que estamos
afectando con nuestro cambio de estadísticas. Entonces no hay TD, el valor P Nu, que supongo que será un
entero para ahora mismo. Podría haber una
estadística flotante, en cuyo caso, podría
cambiar este
tipo a una variante para admitir tanto
integer como float. Pero no creo que en este momento en realidad vaya a
haber carrozas en el juego para estadísticas como
experiencia y HP Los hemos convertido en un entero
concreto, lo que probablemente sea
preferible de todos modos. Entonces, el nuevo valor que
estamos pasando, y luego queremos el viejo valor. Y cuando tenemos el
nuevo y el viejo valor, podemos
calcular automáticamente el cambio. Entonces pongamos en el estado
propiedades para este objeto. Voy a decir var objeto
va a ser un nodo dos D, el var nuevo va
a ser un entero. El var viejo va
a ser un entero. El cambio var
también es un número entero. Entonces cuando inicializamos
la función, simplemente
tomamos los
parámetros y
establecemos las variables locales
a esos valores Así que el objeto va a
ser igual al objeto P. Un nuevo va a
ser igual a P Nu, viejo va a ser
igual a P viejo. Ahora que tenemos el
nuevo y el viejo set, nuestro cambio va a ser igual
al nuevo menos el viejo, creo que es a menos
que lo tenga al revés. Bien, entonces si el valor antiguo es
30 y el nuevo valor es 20, entonces el cambio va
a ser negativo diez, que es lo que queremos aquí. Entonces sí, nuevo menos viejo. Entonces, esencialmente, lo que estamos
haciendo aquí es que estamos pasando estos cuatro parámetros a la señal como un objeto de datos
cambiado St. Y luego en el receptor de señal,
la función de devolución de llamada, podemos acceder a todo lo que
hay dentro de St cambiado a theta simplemente haciendo St
cambió el objeto punto de datos, punto nuevo
punto punto Cage Y tal vez no
necesitemos todo eso, pero lo tenemos accesible. Además, si alguna vez agregamos otra
cosa aquí como var Cookie, que es una textura mar
o algo así, entonces no necesitamos agregar
esto como un parámetro extra. Está contenido dentro
de esta clase. Así que puedes modificar este objeto sin
tener que cambiar tus devoluciones de llamada o el parámetro de
envío de señal porque solo estás
enviando un objeto Ojalá, eso
tenga sentido. Es más fácil de modificar
a medida que avanzas. De todos modos, tenemos nuestros datos de
estadística cambiados. Entonces, si volvemos a nuestro script de controlador de
estadísticas, ahora podemos crear nuestras señales. Entonces Max HP cambiado
va a tener los los datos de la
estadística cambiados. Bien, y luego solo hacemos señal para la otra señal,
HP cambió datos, datos cambiados de estadísticas, cambió la
experiencia de señal. La estadística de datos cambió los datos. Ahora bien, la razón por la que
pondría una señal para cada uno de estos es porque en
el guión de recepción, podemos elegir qué estadísticas realmente nos importan. Entonces, por ejemplo,
la pantalla EXP aquí solo se preocupa por
el cambio de experiencia. Entonces solo vamos a
conectarnos a la señal de experiencia cambiada y tal vez una señal de
cambio de nivel también para actualizar la etiqueta de nivel si eso va
en la misma área de visualización. Entonces tenemos esas señales.
Sólo tenemos que emitirlos. Entonces lo que estaba haciendo
antes con, como, el setter HP aquí, si solo vas a
emitir el valor cambiado, creo que ese es el uso aceptable de un conjunto así que emitimos que el valor cambió y simplemente lo convertimos en una propiedad
observable Entonces voy a decir aquí,
cada vez que configuramos el HP, solo diremos que HP
cambió punto am HP. Ahora bien, si nos estamos poniendo HP 100 cuando ya son
100 una y otra vez, podríamos querer saltarnos
esa emisión de señal, así podemos decir si HP
es igual al valor, entonces simplemente
regresamos porque no necesitamos
actualizar en vivo aquí. No necesitamos actualizar el HP porque es del mismo valor. Entonces siguiendo ese patrón, básicamente
voy a hacer lo
mismo con MAX HP. Entonces vamos a hacer colon.
Siguiente línea, valor establecido. Si Mx HP es igual
al valor, volvemos. De lo contrario, Max HP equivale a valor, y emitimos Max HP cambiado. Oh, pero aquí abajo, olvidé que esto en realidad no es
solo el valor de HP aquí, sino que en realidad necesitamos crear el objeto de datos cambiado de estadística. Los datos son iguales a los datos de stat
cambiados punto nuevo. Y vamos a pasar en esta referencia de objeto aquí arriba
para el controlador stat. Entonces objeto, y luego hacemos el nuevo valor de HP y el valor antiguo, que
necesitamos obtener primero. Entonces antes de establecer el nuevo valor
en HP, justo antes de eso, hacemos var Viejo es igual a HP, y ahora ponemos el viejo aquí, y pasamos los datos a
la emisión de señal. Entonces HP cambió punto MMI con los datos, y eso es
todo lo que tenemos que hacer Y ahora va a tener
esas cuatro propiedades de datos dentro de ese objeto
en lugar de solo una, pero aún así se ve
súper limpio porque solo
estamos enviando un objeto. Bien, ahora en MX HP, queremos volver a hacerlo. Entonces vamos a decir var
Old es igual a Max HP, y luego haremos datos
lejanos iguales stat datos
cambiados punto u. Así lo hacen el objeto, el Max HP y el viejo, y luego emitimos el HP cambió señal con los datos,
y eso es todo. Bien, entonces siguiendo
el mismo patrón, una vez más,
aquí abajo en la experiencia, valor establecido de
dos puntos, todavía
podemos protegernos contra si la experiencia es
el mismo valor por si acaso. Entonces, si la experiencia es igual
al valor, volvemos. De lo contrario, obtenemos lo
viejo igual a la experiencia, y luego la experiencia
es igual al valor. Y entonces los datos de Vara
son iguales a stat datos cambiados punto w. experiencia objeto viejo, y emitimos experiencia
cambiada con los datos. ¿Bien? Y podría agregar esto. Oh, sí, bien, olvidé la D ahí
en la parte superior para la señal. Control STA, y
eso debería ser bueno.
39. P38: Guiones de pantallas dinámicas HP y EXP para la interfaz de usuario del jugador: Entonces tenemos la configuración de la señal, y tenemos nuestro contexto
aquí y la interfaz de usuario del jugador, que nos va a permitir tomar esas señales
del bloque de estadísticas. Pero realmente no necesitamos
hacerlo directamente
en la interfaz de usuario del jugador. Tenemos que hacer eso en la
pantalla HP y la pantalla EXP. Así que quiero crear scripts para la pantalla HP y la pantalla
EXP aquí abajo. Entonces voy a hacer clic derecho sobre la
pantalla de HP, adjuntar un script, y podemos poner eso en la interfaz de usuario, así hp display punto GD Genial. Simplemente podemos hacer que
esto se extienda desde contenedor. Realmente no nos importa
qué tipo de contenedor
es porque puedes crear una
pantalla usando otros tipos. Tal vez exhibas tu HB verticalmente en
lugar de horizontalmente. Por lo tanto, puede usar una clase base
diferente, como contenedor en
lugar de contenedor HBox, y aún así puede hacer el nodo real en contenedor
HBox Así que solo mantener las cosas
flexibles es la idea aquí. Y voy a decir
nombre de clase HP display. Bien, entonces en nuestra pantalla HP, necesitamos una referencia a las estadísticas del controlador del jugador. Podríamos exportar el contexto
del jugador y luego obtenerlo directamente aquí
para cada una de las pantallas. Sin embargo, si configuramos
cosas así, para cada uno de tus componentes
sub UI, si cada uno de ellos tiene una
propiedad de exportación que tienes que establecer, entonces se vuelve muy
difícil
arrastrarla a la escena para
reutilizarla porque entonces
tienes que, como, clic
derecho sobre ella y hacerla
editable y asegurarte asignar todas las propiedades
individuales
como contexto de jugador A cada nodo sub UI directamente. Entonces otra opción, que
podría ser preferible, es hacer que la interfaz de usuario del jugador raíz maneje inyectando
el contexto del jugador o lo que es relevante de él, el controlador de estadísticas en
cada uno de sus nodos sub UI. Y luego solo necesitas
asegurarte de que la interfaz de usuario del reproductor
conozca sus subcomponentes, como la pantalla HP
y la pantalla EXP Pero luego dejas que la
interfaz de usuario del jugador se encargue del trabajo pesado. Entonces, cómo se vería eso en el contexto de nuestra pantalla HP, sería que necesitemos nuestro controlador de estadísticas
local. Entonces, si nuestro controlador de
estadísticas de guión bajo. Entonces hacemos esto local, ¿verdad? Y luego crearemos una
función setter para que podamos configurar el controlador de estadísticas
desde la interfaz de usuario del jugador Entonces digamos estadísticas de conjunto de funciones, y esto va a tomar un controlador de estadísticas de
guión bajo P Cual es el controlador
stat tipo. Volveré nulo. Pongo el guión bajo P para
parámetro para que
quede muy claro que esta variable es un
parámetro de la función En caso de que tenga otro controlador de
estadísticas aquí, no
habrá confusión entre nuestra referencia local al estadísticas y
nuestro alcance de función,
P controlador de estadísticas de guión bajo Así que vamos a usar esta función set
stats para hacer eso. Entonces, las estadísticas de subrayado son iguales a P controlador de
estadísticas de guión bajo Bien, entonces tenemos nuestro método
de establecer estadísticas. Asigna las
estadísticas a las estadísticas, que aquí es privada
por el guión bajo Hover, esto es guion GD, así que no es realmente privado Simplemente está marcado que
no debes acceder a esto desde
fuera de la clase, pero aún así puedes técnicamente. Entonces tenemos a nuestro setter de
estadísticas aquí. Queremos conectarnos
a la señal ahora. Entonces esta es la pantalla HP. Y quiero decir estadísticas
Hp colgó punto Connect, y vamos a decir en HP cambiado Y también podemos decir estadísticas de
subrayado MXHPhanged Y esto solo puede estar en el
guión bajo en Max HP cambiado. Entonces, técnicamente, ambas señales
tienen los mismos parámetros, así que podríamos usar una función de
devolución de llamada si quisiéramos Pero para mantenerlo flexible, tal vez habría algún código que nos gustaría
hacer de otra manera, dependiendo de si es
MaxHP o el HP cambió, solo
voy a tener dos callbacks aquí, así que función En Max HP cambió, que va a
tener los datos P, la estadística cambió los datos,
este vuelco vacío Y lo que queremos
hacer es refrescar LUI. Así que voy a crear una función de
actualización aquí, y luego vamos a hacer
lo mismo para en HP cambiado. Así que podemos simplemente copiar esto
aquí abajo y luego
quitar el bit Max. Así que borra cuatro veces.
Bien, eso es todo. Ahora necesitamos una función de actualización. Entonces diremos función refresh. Y ¿qué queremos
hacer en la pantalla HP? ¿Siempre que cambia el HP? Queremos actualizar el valor del deslizador y queremos
actualizar la etiqueta de texto. Entonces queremos básicamente
obtener el porcentaje saludable para el porcentaje de salud, y eso va a ser un
flotador igual a digamos, subrayar estadísticas punto HP, dividido por subrayado
estadísticas punto MAX Bien, entonces con el
porcentaje de salud, podemos asignarlo a la barra de progreso de
textura. Entonces puedes ver ahora necesitamos una referencia a la barra de
textura aquí abajo. Así que la única vez que vamos
a configurar la referencia a
la barra de textura es
como la primera vez que estamos creando esta escena de pantalla
HP. A lo mejor guardamos esto en una escena
separada en nuestro proyecto, y la escena principal que realmente
ponemos en el mundo es la escena de la interfaz de usuario
del jugador. Pero creo que es
perfectamente razonable exportar la
barra de textura y la etiqueta aquí. También hay otras formas de
agarrarlos. Pero ese es el método que usaré. Entonces voy a decir en
export var progress es una barra de progreso de textura. Y luego en la exportación
var label es una etiqueta. Entonces, cuando nos
refresquemos, podemos tomar el progreso
y tomar la etiqueta, y diremos que el
valor del punto de progreso es igual al porcentaje de salud. Entonces déjame ver. Eso debería
ser en una escala 0-100 Y este cálculo
en realidad
te va a dar un 0.021 0.0 Entonces queremos multiplicar
esto por 100 para obtener un porcentaje real así que por 100. Y no estoy seguro del
orden de las operaciones aquí. Entonces solo voy a envolver
esta parte para asegurarme de que
esto se ejecute antes de
esto con certeza Bien, y entonces el
valor de progreso va a ser nuestro porcentaje de salud
0-100 como flotador Entonces necesitamos establecer el valor de
texto en la etiqueta. Así que el texto del punto de etiqueta va
a ser igual a la cadena. Podríamos simplemente decir en
cotizaciones HP, porcentajes,
fuera de con porcentajes de
barra hacia adelante, y luego reemplazamos
esos valores con un signo de porcentaje y
lo pasamos en una Entonces los valores que vamos
a usar van a ser los HP actuales y los HP MX. Entonces, en otras palabras, las estadísticas de
subrayado puntean HP y las estadísticas de subrayado
puntan MAX Entonces, si quieres que esto
sea personalizable, podemos cortarlo
con Control X y reemplazarlo con algo
así como plantilla de texto de salud. Entonces aquí arriba en la
parte superior, podríamos decir en barra de
exportación
La plantilla de texto de Salud va a ser igual a, y luego Control V pega eso. Esto todavía tiene estos por ciento
como símbolos para reemplazar. Así que todavía hacemos el porcentaje de plantilla de
texto de Salud, y luego
la matriz de los dos valores en orden, que es subrayar
estadísticas punto HP, y luego subrayar
estadísticas punto máximo Bien, entonces eso
actualizará la barra, y nosotros actualizaremos el texto. Entonces también queremos llamar a esto
cada vez que establecemos las estadísticas. Entonces voy a decir refrescar aquí para asegurarnos de que
después de establecer las estadísticas, actualicemos inmediatamente
ese texto, también. Necesitamos dos puntos aquí arriba
para terminar esa función, y eso es bastante bueno. Ahora en el
lado derecho para el guión, sí
necesitamos asignar el
progreso y la etiqueta. Así que asigne la
barra de progreso de la textura y asigne la etiqueta. Asegúrese de seleccionar
los que están debajo de la barra HP. Ahora, eso va a ser
bueno para la pantalla HP. Casi queremos el mismo
guión para la pantalla EXP, pero hay un
par de diferencias. Entonces voy a controlar A, Control C para copiar
todo en este guión. Pasaremos a
la pantalla EXP. Haga clic derecho, adjunte guión. Exp display dot gD me
suena bien. Sin embargo, cambiaremos el tipo heredado
aquí a contenedor, y luego solo seleccionaremos todo
y lo reemplazaremos con un
Control V pegándolo Ahora necesitamos cambiar el nombre de la
clase a la pantalla EXP. Nuestra plantilla HealthText. Vamos a seleccionar
ese Control R para reemplazarlo con plantilla de texto
EXP. Esta plantilla de texto Salud,
seleccione el texto. Puedes hacer doble clic sobre él
para seleccionar todo. Y luego haz Control R. Aquí
abajo,
vamos a reemplazar plantilla
de texto
Salud por la plantilla de texto EXP, reemplazar todas, y luego
queremos cambiar este HP aquí
mismo a EXP como
nuestra plantilla predeterminada. Lo último que tenemos que hacer
es cambiar la conexión de la señal a la
experiencia cambiada. Podemos deshacernos por completo
del cambio Max HP, y luego reemplazar este nombre de
función aquí mismo en el cambio de
HP para que pueda
seleccionarlo, Control R, y luego aquí abajo,
queremos reemplazar eso en EXP cambiado o experiencia cambiada, lo que sea que tenga
sentido para usted. Vamos a reemplazar eso.
Deshágase de los datos cambiados en
Max HP aquí
para concluir esta parte. No actualicemos todavía la barra de
progreso, así que voy a comentarlos. Así que por ahora, vamos a hacer
zoom aquí y voy a reemplazar la plantilla de texto de experiencia con underscorestes
dot experience, y voy a poner la experiencia
por aquí de nuevo, Entonces dirá como uno
de uno o dos de dos, pero al menos podemos
verlo funcionando. Ahora en la parte superior derecha,
asegúrate de asignar el progreso. A la barra de progreso de textura, la etiqueta a la etiqueta. Entonces solo necesitamos la
pantalla HP y la pantalla EXP para
llamar a su
función set stats desde la interfaz de usuario del jugador. Así que dentro del script de la interfaz de usuario del
reproductor, vamos a ExportVRHP display
de tipo HP display en Export var EXP display
de tipo EXP Y luego la función
subrayado listo, vamos a llamar a hp display dot set Stats al
contexto dot play dot stats, y necesitamos obtenerlo
dos veces para que incluso podamos decir var stats de stat Controller, luego configuramos eso
igual a este bit Entonces voy a cortar
eso, ir por aquí, igual signo, pegarlo. Entonces establecemos estadísticas sobre las estadísticas. Hacemos lo mismo
con EXP display XP display dot set Stats. Y luego hacemos estadísticas. Lo último que necesitamos es
asignar la pantalla HP y la pantalla EXP y el inspector para que
tengamos esa referencia. Así que haga clic en la interfaz de usuario del jugador, vaya a la parte superior derecha,
asigne la pantalla HP. Y asignar pantalla EXP. Ahora, realmente, la pantalla HP y la pantalla EXP pueden ser
y probablemente deberían ser sus propias
escenas independientes de las que instancia una copia
en nuestra interfaz de usuario del reproductor. Así que voy a
hacer clic derecho en la pantalla de HP, y vamos a
guardar la rama como una escena dentro de nuestra interfaz de usuario, y luego hacer clic derecho en la pantalla
EXP y hacer lo mismo. Guardar rama una escena
dentro de la interfaz de usuario. Así que ahora podemos saltar a estos
y personalizar individualmente estas pequeñas pantallas según lo necesitemos en el contexto de nuestra interfaz de usuario de jugador
mayor. Entonces tenemos escenas dentro de escenas, y luego tomamos nuestra escena de interfaz de usuario de
jugador, y la ponemos en
el mundo del juego,
que es invisible en
este momento porque la interfaz de usuario de Canvas es golpeada.
Pero sí, ahí tienes. Y si estamos en juego, veremos si algo se
vincula correctamente. Bien, así que establece estadísticas
y la pantalla HP es nula porque olvidé
asignarlas en el inspector. Se puede ver aquí mismo
estos son nulos en listo, lo que significa que se me olvidó
eso en la exportación. También porque esto es verificar, no
necesitamos ninguna aseveración
porque aquí está algo implícito que
esto se requiere ahora Así que salta a la escena del jugador, haz clic en la interfaz de usuario del reproductor, asigna la pantalla HP
y la pantalla EXP. En fin, ahora podemos jugar,
y lo volveremos a probar. Entonces tenemos diez de cada 100 HP. Si recuerdo haber
mirado las estadísticas, nuestro Max HP era 100 y
nuestro HP base era diez, lo que obviamente nos golpearon aquí. Puedes ver las
actualizaciones de HP a cero. La barra de progreso de EXP aún
no funciona porque
necesitamos configurar nuestros
requisitos de experiencia de nivel E, lo que va a crear, como, toda
una jerarquía
de nivelación. Pero intentemos muy rápido, poniendo el HP en
50 en nuestro reproductor. Entonces iré a la escena de nuestro jugador, y luego miraré dentro
del control de estadísticas aquí. Y pondremos los HP
en 50. Déjame ver. Si hago eso ahí mismo, ¿
puedo volver a tocar al juego? No, porque los jugadores
ya se retiraron, creo. Pero por hit play, deberíamos ver la actualización de la barra HP aquí con el
valor de progreso correcto, pero no lo hace. Muestra el valor correcto de HP, pero tenemos que arreglar la pantalla
HP muy rápido. Bien, entonces en la pantalla HP, déjame ver qué
estaba pasando aquí. El valor de progreso es igual
al porcentaje de salud. Déjame establecer un punto de quiebre
aquí, y voy a presionar Play, y veremos qué
es lo que realmente está configurando eso para que el porcentaje de
salud sea 0.0. Ah, claro, porque estoy
dividiendo con enteros. Entonces cuando dividimos
por dos enteros, vamos a obtener un entero, que va a ir
automáticamente al piso de cero. Pero
eso no es lo que queremos. En realidad queremos que
devuelva un flujo. Entonces, lo que podríamos
hacer como una solución rápida aquí es simplemente decir flotar en el Mx HP. Entonces ahora esto va a ser un entero dividiendo por un float, que devolverá un float. Si golpeamos play, entonces deberíamos ver el valor
correcto ir ahí. Entonces ahora podemos ver
por ciento de salud 50. Si pulsamos play, la barra se
muestra correctamente ahí. Menos la compensación para
el valor. Entonces déjame ver. ¿He compensado el valor
ahí, pantalla HP? Tenemos la
barra de progreso de textura, y por alguna razón, es hasta 00 aquí, pero quiero que esto sea negativo
20 para que cuando el valor
sea 50, se muestre correctamente en
el medio ahí. Se puede ver ahí mismo esto
es como cuatro de 8 barras. Y el valor de aquí es 50. Debo haber desestablecido
eso en algún momento, pero el tipo de solución hackish
para eso es que solo haces el valor mínimo más hacia la izquierda para que 50
termine en el Porque si esto es
cero por aquí, entonces 50 en realidad termina
como, la tercera barra. Mira, me aseguro de que el
valor de tus hombres sea negativo 20 ahí, y eso debería funcionar
para la pantalla HP. Bien, entonces prueba final aquí, golpeamos la
barra de progreso de juego estableciéndose en 50. Puedo deshacer ese
punto de interrupción, golpear play. Y podemos ver que nuestra barra de progreso de
salud está correctamente en el
medio, ahí mismo. Nuestro HP nos está mostrando 50
de 50. Vamos a ser golpeados. Puedes ver nuestras caídas de HP, la interfaz de usuario
refleja eso de inmediato, incluida la barra de progreso. Entonces todas nuestras señales se están
conectando correctamente. Estamos configurando la
experiencia ahí, y solo necesitamos agregar
nuestras definiciones de nivelación que
podamos
subir de nivel a nuestro personaje. Antes de que terminemos completamente con el video de nuestra función
set stats, aquí
hay una falla, que es que si alguna vez reiniciamos
las estadísticas con estadísticas establecidas, y una ya está configurada aquí, terminaremos con señales
duplicadas Entonces queremos decir aquí, si las estadísticas de subrayado no son
nulas antes de que llamemos a set Stats, entonces queremos desconectarnos
de las señales, así podemos decir estadísticas de subrayado
punto MXHphanged punto El subrayado en MAX HP cambió. Y lo mismo para
el HP regular. Entonces solo copiamos eso
y hacemos SATS HP cambió, y luego en HP cambió Esto es más de solo
hacerlo robusto. Nunca pretendo configurar el controlador SATS
en algo diferente, pero por si acaso lo haces, esto asegurará
que no cause un error horrible donde
tengas dos señales conectadas para dos controladores
stat diferentes, pero en una pantalla HP Ahora, haz lo mismo un poco más en el EXP uno también. Entonces, si nos fijamos en
la pantalla EXP, solo
voy a pegar eso y cambiamos el nombre de
la señal. Entonces la experiencia sats cambió, y luego en EXP cambió aquí Bien, así es como debería ser
eso. Subrayar la
experiencia de SAT cambió desconexión en la
experiencia Bien, entonces eso debería ser bueno para si alguna vez cambiaste
el controlador SATS Solo quería demostrarlo para que fuera un poco más completo.
40. P39: depuración y optimización de UI y scripts de Pickup: Quería aclarar
algunas advertencias y errores. Hasta el momento me he estado metiendo en la consola
con el proyecto. Entonces, si has estado copiando
la palabra clave por palabra, es posible que te hayas topado con
estos mismos problemas. Así que recoge dos D
donde dice que no
puedes usar monitorable
es igual a false, normalmente porque está bloqueado y tienes que esperar a que se aplace
el set Entonces, si haces doble clic en
eso, te señalará que en
la función remove, estaba tratando de establecer
monitorable a false Bueno, en realidad solo voy
a eliminar el monitoreable es igual a false aquí porque
cuando Qu libre, se elimina al final
del fotograma actual Cuando llamas a set deferred, se elimina al final
del marco actual Entonces, hacer que no sea monitoreable
al mismo tiempo que liberes no va
a ayudar en nada El punto era
hacerlo para que si dos objetos trataran de
tomarlo al mismo tiempo, que no recogiera dos veces. Sin embargo, lo que podríamos hacer si
quieres estar extra seguro. No obstante, si quieres estar
extra seguro y recoger dos D, vamos a darle un var recogido. Y esto será un booleano
que establece en false por defecto. Entonces solo estoy insinuando que ahí
es un booleano. O sea, si quieres
declararlo con seguridad, entonces puedes hacerlo.
Entonces esto es escogido. Y si tratamos de tomar cuando esto es cierto, entonces lo permitiremos. De lo contrario, volveremos falso. Entonces, lo que voy a hacer con Tr take es que voy a hacer
esto realmente guardia, y luego tendremos una función de toma
separada, que será lo que realmente implementan las
pastillas, como la función virtual,
lo que hacen actualmente Entonces quiero hacer
función, subrayar T, y esto no va
a devolver nada,
así que ese es un tipo de retorno de vacío Y tomaré este error de empuje
y lo traeré aquí abajo. Entonces voy a
volver verdad aquí ahora. Voy a cambiar esto para que sea subrayado T. Así que llamamos a
la función virtual, y luego vamos
a guardarnos contra recoger una segunda
vez aquí arriba Entonces diremos,
elegí, devolvemos falso. Bien, entonces ahí está nuestra guardia. Y de lo contrario, llegamos hasta aquí. Después de tomar, lo hacemos
escogido es igual a verdad. Y lo estoy poniendo aquí
para que no tengamos que preocuparnos por ese booleano
y las clases heredadas Solo tenemos que preocuparnos implementar la función take. Entonces creo que esta es
una mejor configuración. Funcionará bien
con ir quarter, y siempre y cuando nos fijemos escogido
a true después de llamar estamos seguros de que no va a
recoger por segunda vez porque
tenemos esta guardia aquí. Entonces ahora solo necesitamos actualizar
nuestros otros scripts de recolección. Así que busca pickup. Creo que hasta ahora
solo tenemos pickup EXP. Entonces voy a hacer doble clic en eso. Vamos a renombrar
esto para subrayar Toma el tipo de retorno es nulo Y en lugar de
devolver falso aquí, si las estadísticas son nulas,
empujaremos un error. Entonces error de empuje. El porcentaje no tiene controlador de
estadísticas. Ese va a ser el objetivo de
porcentaje P. Entonces reemplazamos esto con
un nombre de nodo ahí. Y entonces no
volvemos al fondo. Nosotros solo llamamos remover.
Y tenemos que asegurarnos de que coincidimos con la firma de
los padres. Así que probablemente necesite pasar el objetivo P
al script padre. Bien, así que subamos. Y si, queremos pasar ese objetivo P. Entonces P target vamos a eliminar el guión bajo ahí porque en realidad lo estamos
usando ahora Y entonces aquí hacemos subrayado
P target es un nodo dos D. Ahora eso debería limpiar los errores en nuestro
EXP Pickup dos D. Y sólo para verificar,
entraremos en modo play Bien, entonces las otras
advertencias, vamos a eso. En la mayoría de los casos, estos son
solo parámetros no utilizados. Entonces, en el caso de algo
como pickup dos D, ves que el objetivo P no está usado, así que solo quieres marcarlo
con guión bajo para que
quede marcado como
no utilizado intencionalmente Pasemos al siguiente aquí. Nunca se utilizó el tamaño de la cámara. Así que el tamaño de la cámara se utilizó realmente para crear
el rect de la cámara Así que en realidad no es
necesario aquí porque en esta función de cálculo
final spawn, la usamos para el sistema spawner crea el rect de la cámara, y luego se
extrae el tamaño de eso Así que en realidad podemos eliminar tamaño de la
cámara como
parámetro, cortar eso. Y luego donde lo
llamamos aquí arriba, solo quitamos el tamaño
de la cámara como parámetro también, y lo simplificamos
a tres parámetros. Entonces ese sería un
buen caso donde esa advertencia realmente
nos ayudó. Y luego, aquí siguiente, si tienes una actualización que
no usa el Delta, que sería el caso si haces movimiento y deslizas porque mover y deslizar no
necesita hacer el Delta, estableces la velocidad,
y luego mover y deslizar automáticamente
maneja con el Delta. Entonces subrayamos el Delta
y ya está ahí. Y este script drop,
el nombre drop aquí está sombreando
el nombre de la función Así que podríamos cambiar el nombre aquí a algo
así como drop instance. Y luego donde sea que
usemos caer debajo de él, como aquí mismo, decimos
drop instance en su lugar. Solo quiere asegurarse de que si usa una variable localmente, no
tiene esa variable
también declarada fuera del alcance en
la base de clase, como las variables locales. Y no quieres que tenga el mismo nombre que un nombre de
función también. Entonces en cada una de estas señales de
estadísticas cambiadas,
las callbacks para eso, solo
estaba refrescando
cada vez que cambia el valor, y en realidad no necesito usar los datos P para estas
funciones directamente Así que solo
subrayaría ambos una vez más en el script de visualización
EXP Haga clic ahí y subraye eso, y eso debería deshacerse de todas las
advertencias y errores actuales Y le pegaré a Play.
Bien, no hay errores para.
41. Sistema de nivelación P40 con experiencia y progresión de estadísticas: Salud y experiencia ahora, necesitamos agregar algún
tipo de mecánica de nivelación, y necesitamos tener
una estadística de nivelación en nuestro controlador de estadísticas para
poder manejar
la subida de nivel de nuestro jugador y posiblemente también de
otros personajes, pero definitivamente para el jugador. Así que vamos a entrar en
el controlador paso a paso, y voy a añadir aquí
una nueva variable. Vamos a decir que va a ser
un entero igual a cero, y vamos a tener una configuración similar para experimentar aquí abajo
donde solo tendremos un valor de satur donde vamos a decir que el nivel
I es igual al
valor que vamos a devolver, lo contrario, simplemente repetiremos
el mismo patrón emitiendo la señal por nivel
cambiado para que podamos
responder a eso en nuestra UI Entonces vamos a decir var
viejo es igual a nivel, y vamos a decir nivel
es igual a valor. Digamos que var data
es igual a stat datos
cambiados punto u nivel de
objeto old, y emitiremos una señal de
nivel cambiado. Con los datos. Ahora, necesitamos
crear esa señal, por
supuesto, así que el nivel de copia
cambió hacia arriba en la parte superior. Crearemos datos cambiados de
nivel de señal, datos cambiados por
estadísticas. Entonces ahora podemos suscribirnos
a eso si lo necesitamos. Ahora podemos
implementar completamente agregar experiencia. Así que cada vez que
añadimos experiencia, también queremos comprobar si estamos
listos para el siguiente nivel. Pongo eso aquí en lugar del setter de experiencias
porque no
quiero demasiados efectos secundarios
aleatorios estableciendo la experiencia, así que quiero llamar
explícitamente al método ad experience, que sube de nivel si se alcanza el
umbral Bien, entonces para hacer eso, vamos
a necesitar crear un objeto de definición de
nivel. Así que vamos a crear un
nuevo script para eso. Todo entrará en
digamos personajes. Haga clic derecho aquí,
haga un nuevo script, y lo llamaremos definición de
nivel. Así definición de nivel punto gD. Se va a extender
desde el recurso, crear. Haga doble clic para abrirlo y le daremos una definición de nivel de
nombre de clase. Extenderá el recurso,
y esto
definirá un nivel arriba
para un personaje. Entonces, lo que aquí necesitamos va a ser el umbral de la
experiencia. Entonces, en Export VR, diremos que se necesita experiencia. Y esto será un entero. Podríamos por defecto a
algo así como diez. Y probablemente también queremos algunas estadísticas que
vamos a subir de nivel. Entonces, por ahora, solo
comenzaremos con HP y lo mantendremos simple, pero harías estadísticas
adicionales aquí más adelante mientras trabajas
que se convirtieron en mecánicos. Entonces en Export var HP, diremos que es un
entero, por defecto a diez Y podríamos decir que este es el HP
de bonificación por subir de nivel. Entonces llegaste a este nivel, tu
personaje obtiene tanto HP. Ahora bien, ¿cómo aplicamos nuestros
cambios de estadísticas al personaje? Podrías hacerlo uno
a la vez manualmente, pero una forma más inteligente sería crear un método
para hacerlo por ti. Entonces digamos que la función aplique, y vamos a aplicar esto a un controlador de estadísticas, digamos. Entonces P estadísticas de un controlador de estadísticas. Entonces volveremos
nulos con esto. Por lo que queremos básicamente
actualizar los conjuntos. Entonces P stats dot HP plus
equivale a la cantidad de HP. Y antes de eso, también
queremos aumentar el MX HP. Entonces p stats dot MX
HP plus equivale a HP. Es importante que
hagas los HP MAX antes los HP porque los
HP actuales están tapados en los HP MAX. Entonces, si un personaje de salud completa
aumenta su HP en diez, en
realidad no
ganará la salud a menos que el MAX HP se actualice primero. Tan importante ordenar ahí. Y esa puede ser nuestra definición básica de
nivel por ahora. Entonces en control de estadísticas,
sería un lugar digno para definir nuestras definiciones de nivel. Entonces voy a decir en la exportación VR subir
de nivel las definiciones. Y esto es una matriz
de definición de nivel. Bien, entonces
para verificar el nivel arriba, necesitamos obtener el siguiente
nivel en la secuencia. Entonces hagamos una función para conseguir nuestro siguiente nivel si hay uno. Entonces aquí abajo en la parte inferior,
digamos función,
subrayado, obtener el siguiente nivel Que devolverá una
definición de nivel o nula. Y esto va a devolver las
definiciones de nivel de punto Git, y vamos a
llegar a nivel de índice. Entonces, la razón por la que estamos
llegando a nivel de índice es porque level es en realidad el
segundo lugar en la matriz. Entonces, si nuestro personaje
es el nivel uno, actualmente
estamos
en el índice cero, y queremos mirar
el índice más uno, que es nivel porque el
nivel comienza en uno. Bien, entonces para manejar nuestra
experiencia add subir de nivel, primero
necesitamos obtener la
siguiente definición de nivel para el siguiente nivel. Entonces, al igual que el nivel más uno, necesitamos subir esa
definición de nivel en la parte superior. Así que vamos a en Export, no en cierto modo, sino en realidad
un diccionario aquí. Entonces en las
definiciones de nivel Export VR, diremos. Y este será un diccionario de enteros que se asignen
a definición de nivel Entonces el entero es el nivel
que estamos tratando de alcanzar, y la definición de nivel son los cambios de estadísticas que
tendrían si existe. Entonces, antes de subir de nivel
o tratar de subir de nivel, primero
tenemos que ver si
realmente hay un nivel definido. Así que en la parte inferior, vamos a crear otra
función privada función subrayado obtener siguiente nivel, y esto va a devolver
una definición de nivel o null Entonces vamos a devolver nuestras definiciones de
nivel punto GET en el nivel más uno. Nuestro nivel actual más uno, queremos conseguir eso y
queremos devolver nulo. Si no lo encontramos. Entonces, si devolvemos null, entonces saltaremos la subida de nivel. Entonces en esa experiencia,
hagamos VR siguiente
va a ser una definición de nivel
igual para obtener el siguiente nivel. Entonces si next es nulo, simplemente
regresamos o incluso
podrías empujar una advertencia. En realidad, sí, vamos a
empujar una advertencia. El personaje no puede
nivelar hasta por ciento un nivel por ciento más uno porque ese nivel no
tiene definición definida. Entonces podríamos decir cadena de
nivel más uno por aquí
al final y terminarlo con otro paréntesis.
Bien, eso va a funcionar. Entonces, tomamos el nivel más uno. Estamos tratando de subir de nivel al
nivel dos si estamos en el nivel uno, y estamos señalando que no
podemos subir de nivel porque
eso no está definido. Entonces tal vez quieras
tenerlo como advertencia, o si estás seguro no
puedes simplemente
comentarlo o eliminarlo. Lo dejaré adentro por ahora
para que al menos podamos ver cuándo no conseguimos establecer
una definición de nivel. Entonces el siguiente nivel es nulo, así que si next es nulo, entonces
volveremos porque no podemos subir de nivel. No hay un siguiente nivel definido. Así que simplemente saltamos por completo. Y luego queremos verificar si el requisito de
experiencia de siguiente nivel es menor o igual a
nuestra experiencia actual. Entonces podemos poner eso como parte
de una función de tres niveles. Así que suba de nivel tri, y diremos en el siguiente Entonces bajamos aquí y
vamos a tener nuestra función. Subrayar. Intenta subir de nivel. Subrayar porque es privado, y pasamos en la definición de
nivel siguiente O en realidad, ya sabes,
siento que esto debería estar contenido dentro de
esa función, realmente. Entonces esto va a devolver un booleano, y vamos a
tener esto aquí Así que solo obtenemos el siguiente nivel
dentro de esta definición. Y entonces no necesitamos
pasar un parámetro. Solo intentamos
subir de nivel después de sumar XP, ¿
verdad? Es justo así. Entonces, si no podemos
subir de nivel, devolvemos falso. Y luego queremos comprobar si la experiencia es mayor o igual a la
experiencia siguiente punto necesaria. Si ese es el caso,
entonces subiríamos de nivel. Pero voy a revertir eso.
Voy a decir si es menos de la experiencia necesaria, entonces volvemos falso. Bien, entonces estamos fuera de
la declaración if otra vez. Y entonces si llegamos hasta aquí, hemos pasado los cheques de guardia, así podemos decir nivel
más es igual a uno. Vamos a restar la experiencia necesaria de la experiencia
actual Entonces la experiencia menos
equivale al siguiente nivel. Oh, lo siento, siguiente, se necesita
experiencia de punto. Y luego aplicaremos las estadísticas del siguiente nivel
a nuestras estadísticas actuales. Entonces, después de restar el XP, hacemos el siguiente punto aplicar a self porque estamos trabajando dentro del script
del controlador stat, y luego volveremos true porque subimos de
nivel con éxito Ahora déjeme pensar en esto.
Creo que en realidad quiero que el nivel aumente después de que
se hayan aplicado
las estadísticas, así. Entonces, si vamos a decir, tener un personaje subir de
nivel, y luego les
damos las opciones
para las recompensas. Entonces, escogiendo una actualización
al subir de nivel, que es una mecánica central
y nuestro sobreviviente como, queremos hacerlo después de que se apliquen las estadísticas
base para que la interfaz de usuario siga actualizándose
básicamente en el mismo fotograma, pero justo antes subir de
nivel y emitir nuestra señal de cambio de
nivel, haciendo que la interfaz reaccione y nos muestre
nuestras opciones de actualización. Creo que ahí es importante
ordenar el cambio. Bien, entonces sí, entonces la señal de
nivel de cambio
va a ser emitida
aquí arriba por culpa del setter Y ese es básicamente
nuestro subir de nivel. Si por
alguna razón, desea
obtener la definición de
nivel actual, eso podría ser útil
fuera del script. Y éste podría incluso ser
útil fuera del guión. Entonces tomaré Obtener el siguiente nivel, y eliminaremos
el guión bajo para
pivting mover ese guión bajo
y probaremos Y agreguemos en una
función G nivel actual. Definición o tal vez simplemente obtener los niveles
actuales lo suficientemente claros. Y luego volveremos definición
de nivel. Entonces vamos a devolver las definiciones de
nivel punto GIT, y queremos devolver
el nivel o null. Bien. Entonces esos
podrían ser útiles para otros scripts que quieran investigar lo que está sucediendo
con el controlador de estadísticas. Por lo que
tiene algún sentido hacerlos públicos. Al no subrayarlo. Por eso. Bien, entonces
tenemos esta propiedad stat, y podemos subir de nivel
cada vez que nuestro EXP aumente, que debería ser automático
porque esta experiencia publicitaria va a ser llamada desde
nuestra recolección, nuestra recolección EXP. Entonces todo va a fluir muy bien si está funcionando bien. Excepto que ahora tenemos
que asegurarnos de que estamos conectándonos a
la estadística de nivel y
la señal de subir de nivel o la señal de cambio de
nivel, más bien. Y vamos a hacer eso
dentro de la pantalla EXP. Entonces tenemos que buscar en un proyecto
EXP y desplazarnos hacia abajo, encontrar nuestra escena xp display
dot tSCn, abrirla Bien, entonces ahora que nuestra
nivelación debería estar funcionando, necesitamos entrar en
la pantalla EXP, y tenemos que
asegurarnos de que esté mostrando la cantidad de EXP que
necesitamos para el siguiente nivel. Así que entremos aquí. Y cuando nos
refresquemos, queremos obtener el
siguiente nivel XP. Queremos cambiar este bit aquí
mismo a la XP Mx de las estadísticas si las estadísticas tienen un siguiente nivel al que realmente
podamos acceder. Entonces te deshaces de esa parte y
dices que VarnnXT va a ser
igual a subrayar las
estadísticas punto Entonces obtenemos el siguiente nivel, y si no hay siguiente nivel, entonces diremos que yo siguiente
es igual a nulo, entonces queremos cambiar el texto de punto de
etiqueta para que sea igual a, digamos, nuestra cadena de nivel máximo. Bien, entonces tenemos que
definir eso aquí
en exportar var max level string, y eso solo será
igual a algo como max level en todas las mayúsculas. Bien, de lo contrario, vamos a
establecer el texto a nuestro EXP, nuestro número actual
del siguiente número de nivel. Entonces hemos confirmado
que siguiente no es nulo, así que podemos reemplazar este bit
con la siguiente experiencia de punto Ned. Ahora bien, si ejecuto el juego, probablemente solo dirá nivel
Max porque no
hemos definido ninguna definición de
nivel. Si estamos en el nivel MAX, entonces también quiero
tomar la barra de progreso y establecer ese valor en 100. Entonces ahora si ejecutamos el
juego, actualmente, eso nos va a dar un
error porque no he fijado el progreso,
así que hagámoslo. Entonces, en nuestra pantalla XB, vaya a la derecha y
asigne la barra de progreso Bien, ahora podemos correr, y deberíamos ver una barra de progreso
completa. Estamos en el nivel MAX. Bien, entonces recoger XB ya no importa Todavía puedo tener una buena experiencia,
pero ya nunca va a subir de
nivel. Porque las definiciones de nivel
se asignan en el editor,
no durante el juego. Aunque podrías hacer eso, pero eso sería
bastante raro, ¿verdad? Como solo definir el
final del juego que
puedes subir de nivel hasta ahora el nivel 31, donde antes del 30 era el tope, no, eso es algo que
haces en el editor. 99.99% del tiempo. Entonces tenemos el
valor de progreso que se establece aquí. Vamos
a querer obtener un porcentaje entre nuestra experiencia y
la siguiente experiencia necesaria, y luego actualizaremos
el valor de progreso aquí para cuando podamos subir de nivel. Entonces nuestro progreso está a flote
y lo estableceremos igual
a la siguiente experiencia de punto necesaria dividida por
estadísticas de subrayado experiencia de puntos Ahora recuerda, estamos dividiendo
un entero por un entero, pero en realidad queremos
que sea un flotador. Entonces tenemos que tomar
uno de estos y lanzarlo como un flotador.
Así decir flotar. Y luego en estadísticas
punto experiencia, terminamos de envolverlo
con nuestros paréntesis Entonces hacemos eso, y esto ahora
debería darnos algún lugar entre
un 0.0 y un 1.0. Pero esto necesita ser
básicamente convertido en un porcentaje porque
nuestra barra de progreso por defecto tiene un valor
máximo de 100, así que estamos viendo porcentajes. O eso, necesitas escalar
el valor máximo a uno. Ambos son realmente válidos. Entonces aquí podemos simplemente envolver esto con otros
paréntesis y
multiplicarlo por 100 y eso debería
darnos nuestro progreso real Así que todavía nunca vamos
a acertar a esto porque
necesitamos definir algunas definiciones de subir de
nivel. Así que vamos a entrar en el jugador, y vamos a hacer clic en
el controlador de estadísticas. Aquí tenemos nuestras
definiciones de nivel. Entonces podemos agregar algunos valores clave de
diccionario. Queremos que aquí se defina el siguiente nivel de
dos. Entonces agrega dos y una nueva definición
de nivel. Dentro de aquí, podemos
decir que XB necesitaba diez HP diez. Eso está bien para comenzar.
Suma el par de valores clave. Es importante que
recuerdes darle a esto. De lo contrario no estará
en el diccionario. Entonces tenemos nuestro diccionario
con una clave en el nivel dos y una definición de nivel para subir de
nivel a nuestro personaje. Bien, un último pequeño
retoque que tenemos que hacer es asegurarnos de que nuestro jugador esté
por defecto en el nivel Así que vamos a entrar en el controlador de estadísticas y
donde tenemos nivel. Tenemos que
asegurarnos de que esto es uno. Así que de esa manera, cuando
verifiquemos el nivel más uno de dos, encontraremos esa definición de
nivel, y debería mostrarse
correctamente en la interfaz de usuario. Así que vamos a golpear Play, y vamos a
tener nuestro XB necesario aquí. La barra de progreso no se actualizaba, pero veamos cuando
obtenemos un EXP, eso sube, y se está
mostrando de diez. Y sí, error simple. Olvidé asignar el progreso al valor del punto de progreso. Entonces tal vez realmente
tenga sentido cambiar esto
a un nombre diferente. Estamos siguiendo una variable. Apuesto que si reviso
los errores aquí, se
puede ver que sí,
me ensombrecí esto con el nombre de la barra de textura de
progreso Entonces digamos por ciento nivelado
sería un nombre mucho mejor. Y luego diremos que el valor del punto de
progreso es igual al porcentaje nivelado. Y ahora estoy bastante
seguro de que debería funcionar. Juguemos. Entra ahí. Podemos ver por qué EXP
no amaba ahí arriba, y ahora está diciendo
uno de cada diez. Eso es interesante. Entonces
necesito establecer un punto de interrupción aquí para ver lo que esta mostrando Y entremos en modo de juego. Y podemos ver que está
diciendo 0.0 ahora mismo, pero vamos a
recoger uno y conseguimos mil. Otro simple error lógico, debería estar haciendo la
experiencia dividida por la experiencia necesaria.
Entonces invertimos esto. Tomaré la experiencia
necesaria y pondré esto por aquí, y luego cortaré la experiencia de puntos de
estadísticas y pondré esto
aquí a la izquierda. Todavía podríamos hacer que el flotador se funde a la
derecha. Eso está bien. Bien, así que volvamos a jugar. Prueba eso? Entonces, bien, ahora está mostrando 0% nivelado. Recogemos un artículo.
Ahí conseguimos el 10% ,
dos, tres, pero
debería ir hasta el final. Entonces quiero verificar el valor de
stop de progreso aquí y ver
por qué está ocurriendo eso. Bien, entonces aquí
tenemos un 40% nivelado. Por lo que el porcentaje nivelado es correcto. Así que en realidad podríamos
necesitar verificar la interfaz de usuario fuera del juego. Así que vamos a entrar en la pantalla
EXP aquí. Voy a probar poniendo
el valor a cero. Bien, eso es correcto.
100 es correcto. Va todo el camino
hasta la extrema derecha. Digamos 25 50, 75. Bien, eso parece correcto. Entonces llevemos el valor a cero. Bien, juega. Vamos a
probar eso un poco. Bien, quita el punto de interrupción. Entra en modo de juego, y
hagamos uno, dos, tres. Entonces, ¿eso es el 30%? A lo mejor es correcto, en realidad. Bien, entonces sacamos cuatro de
diez y luego cinco de diez. Bien, sí, estaba funcionando bien. Saquemos siete de
diez. Vamos en realidad solo al nivel de nuestro personaje
para demostrar que funciona. Bien, entonces sacamos nueve de diez, y luego tenemos el
esqueleto desove Podemos conseguir uno más,
diez de cada diez. Bien, viste que acabamos de
conseguir diez HP aquí, luego fuimos a cero
de diez para el EXP necesario. Entonces la parte sobre el siguiente nivel debería ser devolver
algo, pero no lo hizo. Entonces la razón que ocurrió así es
que nuestra experiencia
se pone a cero. Emite una señal, y entonces nuestro nivel cambiado
no conecta aquí Entonces después de cambiar el nivel, no
vuelve a refrescarse. Bien, entonces la solución
más simple es solo subrayar estadísticas nivel de
punto cambiado, y nos conectamos en el nivel
cambiado para refrescar de nuevo Para que podamos copiar esto
aquí arriba y desconectarlo. Así que vamos a crear nuestra función de
devolución en la función inferior, guión bajo en el nivel cambiado No vamos a usar los
datos, así que subrayamos los datos P. Stat cambió los datos,
volvemos nulo, y solo nos refrescaremos. Bien, de esa manera, después de que la
experiencia se ponga a cero, justo antes de que
aumentemos nuestro nivel, eso refrescará la interfaz de usuario, pero luego el nivel cambia
y actualizamos nuevamente la IU. Entonces, vamos a mostrar una vez más
que todo está funcionando como se pretendía. Así que solo voy a tener suficiente
experiencia para subir de nivel aquí. Entonces para y después, cinco, seis, siete, ocho, nueve. Los Skillsins en realidad no
dejan caer nada todavía. Lo arreglaremos
pronto. Y luego diez. Bien, entonces ahora muestra el nivel máximo, pero también aumentamos nuestro HP. Así que eso refrescó nuestra interfaz de usuario dos veces. Una vez cuando cambiamos nuestras estadísticas, disminuyendo la experiencia y otra vez cuando
aumentamos nuestro nivel, que ahora mostrará que el
siguiente nivel no existe. Así que mostramos el nivel Max en nuestra barra
EXP como esperaríamos. Entonces todo
parece estar funcionando.
42. P41: Configuración de umbrales y conexiones de señal para las recompensas por el aumento de nivel: Apunte ahora donde nos
gustaría agregar en un sistema de actualización tipo pícaro Así que subimos de nivel a nuestro personaje cuando nuestro personaje alcanza
un cierto umbral de XP, y luego llegamos a
seleccionar entre una de las
tres opciones de cómo queremos actualizar
a nuestro personaje. Y esto se elige
de una lista aleatoria de opciones disponibles. Entonces, por conveniencia,
antes de meternos en esto, quiero cambiar
el requisito de XP, ajustando el Nivel dos a uno, solo que podamos
activarlo muy rápidamente. Entonces si voy al reproductor SAN, abriremos player dot TCN, y luego vayamos
al controlador de estadísticas, creo que fue donde lo
estábamos definiendo Y la definición de nivel, tenemos el primer nivel
aquí establecido en diez XB necesarios Cambiemos eso
a uno muy rápido. Y entonces tal vez voy a añadir
en un par de niveles extra. Entonces podemos hacer un Nivel tres
aquí como la nueva clave, y luego hagamos
una nueva definición. Sólo vamos a hacer
que uno necesite diez. Entonces agregaremos ese par de valor
clave. Puedes agregar tantos
como quieras aquí. Entonces esto es básicamente solo una lista gigante de los
niveles que estamos tratando de
establecer aquí a la izquierda y la definición de subir de nivel de
estadísticas
a la derecha. Entonces el nivel cuatro,
podemos hacer, yo diría, 20 XP necesarios, y
aumenta HP en diez Y solo sigue adelante
como quieras. Entonces nivel cinco, digamos
30 X P y L nivel diez. Simplemente voy a
desenvolverlo así que no necesito
preocuparme por ello mucho
más tarde. Hagamos el nivel siete. Así que nueva definición de nivel. Digamos 50 XP,
agregaremos par de valor clave, siete, y haremos una nueva definición de
nivel a 100 XP y agregaremos eso en. Y creo que eso debería
ser bueno sobre todo para nuestro prototipo que tiene
siete niveles diferentes. Definitivamente es suficiente
como para probar cosas. Entonces tenemos esas definiciones de nivel
establecidas al subir de nivel, va a emitir
la
señal de cambio de nivel desde nuestro controlador de estadísticas. Entonces queremos conectarnos
a eso en nuestra nueva interfaz de usuario, que nos va a brindar la opción de elegir uno de tres elementos diferentes
o características de subir de nivel. Y queremos que el
juego se detenga mientras nuestro jugador está
tomando esa decisión. Así que vamos a crear una nueva interfaz de usuario. Voy a agregar un nuevo nodo de
control aquí, subir de
nivel la selección,
creo que es un nombre decente, y a esto le agregaremos un nuevo
script. Así nivel Uselección DotGd. Eso lo guardaremos en la carpeta
UI, por supuesto. Así UI, y luego abrir y crear. Bien. También, controlar como para guardar la escena junto a
donde está el guión. Entonces eso también está en la carpeta UI.
Yo sólo lo guardaré ahí. Bien, ahora vamos a
empezar a trabajar en el guión. Haré selección de
nivel de nombre de clase. Generalmente, a menos
que algo vaya a
ser muy específicamente un script de uso único que nada más
necesite hacer referencia, casi siempre
crearé un nombre de clase, si eso no estaba claro
en este punto. solo hecho de tener un nombre referenciable hace que trabajar entre
scripts sea mucho más fácil Bien, entonces la forma
más rápida de obtener la referencia al controlador de estadísticas
del jugador va a ser que lo adivinaste. El contexto
del jugador. Entonces agreguemos export var, el contexto, que
va a ser el contexto
del jugador aquí. Control S para guardar eso. Y luego en el inspector, vamos a cargar rápidamente el
contexto de un jugador de nuestro juego, y eso básicamente
nos da la referencia al jugador y por lo tanto
al controlador de estadísticas. Bien, y luego en función
subrayado listo, queremos ir al contexto
jugador punto estadísticas punto nivel Chang y conectarnos a eso
con el nivel del jugador cambiado, que será una nueva función que
creamos justo debajo Así que el subrayado de la función
en el cambio de nivel de jugador. Y esto va a tener el objeto de datos de cambio de
nivel. Entonces P data es cómo lo
llaman Estadísticas cambiaron datos. Así que solo queremos
proporcionar realmente la interfaz de usuario si los
niveles realmente suben. Puede haber algunas
circunstancias extrañas en las que
decidamos que el nivel podría
bajar en el futuro. Entonces, para protegernos de eso, diremos si P data dot
change es mayor que cero, que sabemos que está subiendo de nivel. Bien, entonces cuando el nivel cambia, solo
queremos responder a ello subiendo de nivel,
no bajando de nivel. Entonces vamos a decir, si el cambio de punto pdata es
menor o igual a cero, entonces solo vamos a
regresar aquí porque
no es una condición que
queramos manejar De lo contrario, vamos
a subir de nivel al jugador. Ahora, por ahora,
sólo voy a escribir el código para manejar
subir de nivel uno a la vez, porque en el contexto
del juego actual, esa es la única forma en que
sería posible. Entonces voy a escribir al
menos el prototipo
del guión para manejar solo
subir de nivel una vez a la vez. Si por alguna razón
recogiste un objeto de 1,000 EXP, y entonces eso activaría
tres o cuatro niveles arriba, esa podría ser una condición que
quieras manejar más adelante. Pero creo que eso es un poco innecesario aquí porque de todos modos
solo vamos a estar recogiendo
un XP a la vez. Pero para este guión por
ahora, solo vamos
a estar manejando un
nivel a la vez. Así que vamos a crear una función aquí. Voy a
llamarlo iniciar selección. Y entonces esta función,
que voy a poner por encima función iniciar selección nos
va a proporcionar unas tres opciones. También va a mostrar la interfaz de usuario. Así que sólo podemos comenzar
con un show call aquí. Y luego también queremos hacer
una pausa en el juego para que podamos decir obtener puntos de árbol en
pausa, es igual a verdad Bien, entonces ya que estamos
pausando el juego aquí, eso significa que va a pausar todos los scripts que estén establecidos para solo estén activos cuando el juego
no esté en pausa, que
es el predeterminado Entonces sobre la derecha
aquí bajo proceso de nodo, necesitamos cambiar
el modo aquí a Estoy pensando siempre para que siempre
pueda activar cosas
dentro del juego, independientemente de si
está en pausa o no Porque también queremos poder
abrir el guión cuando el
juego no esté pausado Por lo que será importante poder llamar a la selección de
inicio durante un juego
unpause Entonces creo que hacer esto
siempre tiene sentido. Pero definitivamente queremos que se ejecute mientras el juego está en pausa Posteriormente tendremos que
entrar aquí y generar una lista de recompensas que
vamos a mostrar al jugador. Primero tendremos que configurar la
interfaz de usuario un poco para eso. Y también queremos
asegurarnos de que esto se
pruebe hasta ahora para
que en realidad esté apareciendo. Hagamos clic derecho
en la
selección de subir de nivel y agregarle un par de componentes de
interfaz de usuario. Entonces comenzaré con, digamos, un contenedor de panel, y eso nos permitirá
verlo cuando aparezca en la pantalla. También, haga clic en la interfaz de usuario raíz. Y luego vamos
a cambiar, veamos, el diseño a la parte superior izquierda y el capreset por
aquí. Entonces ahí mismo. También quiero asegurarme de
que el mouse no detenga que pasar por los clics
, pero en realidad vamos a
ignorarlo por ahora mismo. Habrá cosas en las que
queramos hacer clic en la interfaz de usuario como botones
para hacer la selección, pero no queremos que la raíz
de la interfaz bloquee esas señales de mouse
y puerto. Entonces veamos si podemos conseguir que
esto aparezca al subir de nivel. Vamos a la raíz y voy a sumar en la selección de subir de
nivel. Así que suba el nivel de subrayado, y pondremos esto
debajo de la capa del lienzo Vamos a mostrar temporalmente la interfaz de usuario. Bien. Y vamos
a querer que realidad esté en el
centro de la pantalla. Así que sube de nivel la selección y ve al diseño
en la parte superior derecha, y vamos a
centrarlo por aquí. Entonces centro y si alejamos, entonces esto teóricamente debería estar en el centro de la pantalla Así que vamos a golpear
el Nivel dos y al juego, y veremos si eso realmente
está funcionando. Así que voy a ir por aquí. El juego hizo una pausa.
No lo veo aparecer, pero ese es un buen comienzo. Entonces al menos sabemos que
se está disparando en Lavote. Entonces estoy pensando lo que podría
estar causando el problema aquí es que la
escala de capa Canvas se establece en cuatro. Hagámoslo así. Bien, y luego quiero un
niño para la capa Canvas, que en realidad
usaré para el escalado. Hagamos clic derecho
sobre la capa Canvas y agreguemos en un nodo de control aquí. Entonces voy a tomar los otros nodos, y voy a hacer la raíz. Por lo que este nodo será la UI. Bien, también vamos a
necesitar tomar el control de UI, la raíz aquí que
acabo de crear. Y vamos a tomar
los anclajes preestablecidos y
hacer ese rectángulo completo Entonces ahora que se va
a estirar al tamaño
del punto de vista,
queremos asegurarnos de que el mouse esté configurado para
ignorar para
que esto
no bloquee las señales de la interfaz de usuario. Bien, y entonces si tenemos la selección de nivel arriba
aquí puesta al centro, en realidad
podemos ver que ese es el verdadero centro
del punto de vista. Entonces aquí está el nodo de control de
interfaz de usuario raíz, y luego esto está en el centro. Entonces si presiono Play ahora y
vamos a recoger un XP, entonces esto se
mostraría en el centro, aunque estaba
mostrando bit default. Entonces tengo que ocultarlo primero. Y ahora vamos a golpear Play. Nosotros vamos aquí, y ves que aparece además de hacer una
pausa en el juego Bien, entonces ese guión está funcionando. Tenemos que cambiar el tamaño de nuestra
HPUI aquí de nuevo. Así que en realidad voy a
hacer clic en la interfaz de usuario aquí y voy a aumentar
su escala directamente. Podría ser lo más
apropiado escalar
los componentes individuales en lugar de aplicar una
escala global a todo. Entonces podemos simplemente dimensionar nuestra selección de play up
apropiadamente. Entonces otra ventaja de tener la interfaz de usuario aquí es que si
queremos aplicar un tema a todo lo que hay debajo es que solo
podemos ir al tema en la parte inferior derecha y luego cargar
rápidamente el tema del juego. Entonces ahora todo va a estar
usando esa fuente Pixar, aunque no la asignemos directamente a la selección de subir de
nivel Entonces, a veces sí quieres control de grano
fino sobre
los temas individuales Si quieres un
tema personalizado para, digamos, la selección de subir de nivel, entonces simplemente
crearías uno
nuevo aquí abajo. Y creo que en los niveles
más bajos, anula
lo que
esté por encima de él. Así que básicamente puedes tener
una jerarquía de temas como esa porque no todo necesita anular
cada propiedad también. Puedes tener un tema principal, y luego para cosas muy personalizadas, como cómo se ve una barra deslizante,
puedes hacer que como un sub
43. P42 Cómo crear el diseño de la interfaz de usuario y el texto animado: Vamos a trabajar
en la construcción de
nuestra plantilla de interfaz de usuario para la selección de
nivel superior. Entonces ya tenemos
un contenedor de panel. Creo que deberíamos
estirar esto, así que voy a tirar de
la esquina inferior derecha
y mover esto un poco más grande. Vamos a necesitar
una interfaz de usuario mucho más grande para mostrar realmente nuestra selección. Ahora vamos
a necesitar un encabezado. A lo mejor mostramos un gráfico.
Al igual que, felicitaciones. Subiste de nivel
algo así. Entonces necesitamos tres pantallas
de columnas. Esos serán contenedores VBox, los cuales mostrarán nuestras opciones Entonces eso probablemente será
como un texto de título, un ícono, una descripción y luego un botón de selección. Y una vez que se presiona el
botón de selección, entonces la selección de subir de nivel
procesará la selección, la
aplicará al jugador, cerrará la interfaz de usuario y
reanudará el juego. Así que vamos a hacer clic derecho sobre
nuestro contenedor de panel, y voy a agregar
un contenedor de margen como el siguiente nivel,
agregar un nodo hijo. Entonces estamos buscando contenedor de
margen. Y luego en las
anulaciones de tema a la derecha, voy a tomar
estos márgenes y
ponerlos cada uno en cinco
píxeles por ahora Eso solo hará que se
vea un poco más agradable no todo esté
tan
agrupado. Hagamos clic derecho en el contenedor de
margen y ahora agreguemos un contenedor VBox Para que podamos organizar
todo lo demás verticalmente. Ya se puede ver
el contenedor de margen, tipo de extender los bordes
un poco hacia los lados. Queremos agregar a esto
probablemente nuestro texto de título. Entonces podemos agregar esto como
una etiqueta de texto enriquecido. Bien, haz clic en Agregar una etiqueta
secundaria de texto enriquecido. La razón para
hacerlo texto enriquecido en lugar de una
etiqueta regular es que los textos ricos, puedes hacer cosas como el código BB, lo cual es bueno si
quieres aplicar un efecto arcoíris o agitando
el texto hacia arriba y hacia abajo Entonces es simplemente
más potente que una etiqueta de texto normal. Estoy seguro que
técnicamente tiene, como, un costo de recursos
asociado a él, pero algunos textos animando en pantalla no te
van a quedar rezagados Entonces pongámoslo aquí subir de
nivel como el texto. Podemos ver que en
realidad no está apareciendo aquí abajo. Por lo tanto, necesitamos
retomar el contenido adecuado y verificarlo para que sea verdadero. Ahora nuestro texto va a
aparecer ahí en el centro. También queremos
centrar este texto, así cambiaremos la
alineación horizontal aquí al centro. Bien, ahora está centrada.
Pongamos un icono debajo de esto para que podamos mostrar un
gráfico de cuatro horas de nivel hacia arriba. Entonces voy a hacer click derecho sobre contenedor
vBox,
agregar un nodo hijo Digamos textura rack. Agrega eso y podemos
seleccionar una textura. Así que cualquier gráfico que queramos utilizar
de nuestro proyecto funcionará. A ver si podemos cargar algo
rápido. Entonces, si busco, digamos 64 por 64 para obtener la textura de mayor
resolución, tomemos de esos íconos, uno que queremos usar y
luego escalarlo aún más. Así que en realidad quería usar esto como parte de
una textura atlas. Entonces, si lo seleccionaste,
haz clic derecho en él y luego ve a Copiar. Y en el desplegable de
aquí arriba, haz textura atlas. Haga clic en la textura del atlas, y luego haga clic derecho en
pegar el final del atlas. Ahora podemos seleccionar qué icono
queremos usar de este. Así que cualquier cosa
que creas que se ve bien, hay muchas opciones. Y esta es la hoja de sprites de
64 por 64 texturas
del Pack de iconos. Eso fue obvio, así que uno de los tres activos artísticos
que tenemos para el proyecto. Así que algo como
estas espadas gemelas o la espada brillante
podrían funcionar bastante bien Cualquier cosa que sea como
una figura humana resplandeciente, como que implica,
Oh, subo de nivel Me puse súper fuerte, como, por ejemplo, específicamente
así, o en el proyecto base,
usé este, que es más un rayo,
pero también podría funcionar. Bien, entonces esta vez,
iré con aquella en la que parezca un haz de
luz gigante en lugar de un rayo. Y voy a acercar. Así que tenemos nuestro icono mostrando en
la textura rect El estiramiento no es
realmente como lo queremos, así que queremos cambiar
el modo stretch para mantener centrado el aspecto, creo que es la
mejor opción aquí. Y eso va a funcionar bastante bien, creo, siguiendo
nuestro ícono de subir de nivel, agreguemos en un bloque de texto, que le diremos al jugador, queremos hacer una
de las pocas selecciones. Entonces, hagamos clic derecho
sobre el Contenedor de vBux, agreguemos otra etiqueta
de texto enriquecido y luego haremos
algo similar Comprobar ajuste al contenido. Y luego para el
texto, diremos, elige una de las opciones de
subir de nivel a continuación. Como pretendemos que la fuente
Pixar aparezca aquí en nuestra pantalla real en lugar de ir al
mundo cada vez, para verificar cómo se verá
con el tema del juego real,
vayamos a la selección de nivel del
nodo de interfaz de usuario base, y solo asignemos el
tema aquí también Entonces en el inspector, carga
rápidamente el tema, y luego eso
actualizará nuestro texto. Entonces ahora puedes ver que
con esta fuente diferente, el texto realmente
encaja en una línea. Esa es una gran diferencia.
Vamos a hacer clic en la etiqueta de texto enriquecido dos,
y centrémoslo. Bien, a continuación,
tomemos este título y hagámoslo un poco
más interesante agregando un arcoíris y un efecto de
onda con el código BB. Así que revisa el código BB habilitado por aquí y ve al inicio
del texto en la parte superior izquierda. Vamos a poner
entre corchetes para código BB, arco iris y luego espacio FREQ para frecuencia es igual a 0.5
espacio SAT es igual a uno Esa es la saturación.
El valor del espacio es igual a uno, y luego termina los
corchetes, y obtendrás un
efecto arcoíris aquí a la izquierda. Ahora, para asegurarte de
que eso termine, vas al final del texto, y luego haces
corchetes Rainbow. Y ahí tenemos
nuestro efecto arcoíris animando en la ventanilla Y también podemos cambiar
la configuración aquí. Entonces, si quieres que
sea menos vibrante, intenta llevar la
saturación a 0.5, y ahora tienes un
arcoíris más manso apareciendo ahí arriba. A mí me gusta eso,
así que me lo quedaré. Ahora, agreguemos también
el efecto de onda. Así que vuelve a presionar home para ir
al inicio de nuestro cuadro de texto, o simplemente podrías hacer clic ahí
arriba en la parte superior izquierda Y luego hacer otros
corchetes, y vamos a estar
escribiendo WA VE para AMP de espacio de
onda para la
amplitud es igual a 50. Así de alto
va entre olas. Y entonces la frecuencia espacial
o FREQ equivale a dos. Esa es la frecuencia con la que
va a hacer una ola, y luego terminarla con el corchete
derecho. Bien, y entonces quieres ir
al final después
del arcoíris aquí arriba y
hacer onda de corchetes. Eso solo significa que si
agregas texto extra después de
eso, no va a tener el efecto
onda porque
terminamos el efecto
en nuestro bloque de texto. Entonces Control Z, podemos ver nuestro texto animando ahí.
Eso es bastante ordenado. Quizá queramos que
la amplitud baje un poco, así que la voy a reducir a 30. Entonces, si vemos nuestra animación, podemos ver que
el texto se anima más o
menos hasta la parte inferior o superior
de nuestra área de etiquetas Creo que si tenemos una
amplitud de 50 como lo hicimos antes incluso de que se
corte. Entonces eso no es lo ideal. Si
va demasiado hacia arriba o hacia abajo, podemos agregar algo de relleno a esta etiqueta específica
yendo a las anulaciones de temas Y luego queremos ir
a estilos normales y hacer una nueva caja de estilo vacía
porque no hay fondo. Expandir eso, ir a los márgenes de
contenido, y luego podemos hacer que
la parte superior y la inferior, unos pocos píxeles se desplacen. Entonces voy a intentar
hacer el top negativo tres y el inferior
negativo tres. Y entonces lo que podemos hacer es agregar un margen de contenido aquí
a la parte superior e inferior. Entonces lo haré como un dos píxeles en la parte superior y dos
en la parte inferior. Bien, y eso
básicamente va a estirar nuestra caja para que sea un poco
más grande de lo que hubiera
sido por defecto. Entonces esa es otra solución
si no querías simplemente
agregar un montón de
líneas nuevas en el cuadro de texto. Supongo que también sería
otra opción más rápida. Pero un poco menos
preciso, también. Entonces, finalmente, para esto, si queremos que el
texto sea más grande, podemos ir a sobrescrituras de temas y personalizar los tamaños de
fuente aquí. Entonces creo que queremos un tamaño de fuente
normal, y vamos a aumentarlo a 24. Bien, esa en realidad
se ve un poco borrosa. Vamos a probar 32, ¿verdad? Bien, entonces creo que para
esta fuente específica porque es Pixar hay números de escala
muy específicos en los que hay que establecer
el tamaño de píxel Entonces si dije que es
algo así como 22, supongo que no es como un múltiplo de ocho o 16, así que
no va a funcionar. Entonces hagamos 32 en su lugar para tener eso ahí para que
se renderice correctamente. Estas anulaciones, por
cierto, si lo deseas, también
podrías dedicar tiempo y personalizarlo y los
temas específicamente Pero si solo va a
ser uno como este, podría ser
más rápido asignar sus valores personalizados a
este encabezado específicamente. Solo si vas a tener
mucha interfaz de usuario en todo el juego y quieres
personalizarla en un lugar centralizado, entonces tiene sentido hacer mucha
tematización En lugar de solo
usarlo para fuentes, también
puede personalizar los tamaños de fuente o
agregar encabezado personalizado
44. P43: diseñar la interfaz de usuario y los ajustes finales de selección de recompensas: Bien, ahora
necesitamos crear nuestras cajas de selección verticales Entonces esa va a ser una sub UI. Voy a crear un
nuevo nodo aquí arriba. Esto será, digamos,
es una interfaz de usuario, pero haré clic derecho aquí y
cambiaré su tipo a
un contenedor de panel. Simplemente haremos de la raíz
aquí un contenedor de panel. Y este será un tamaño completo por defecto, expandiéndose por
todas partes. Cambiémosle el nombre para
que sea Selección de recompensa. Y voy a
guardarlo en la carpeta UI. Bien, ahora vamos
a la selección de Lavop, y voy a poner tres
de esos en la jerarquía Así que busca recompensa en el proyecto y deja caer
una de esas en VBox Lo duplicaré un
par de veces más. Y verás que el problema
inmediato es que hay tres, pero todos
son verticales. Entonces necesitamos otro contenedor
HBox para que vayan horizontales Entonces, haga clic derecho en el contenedor VBox y agregue un contenedor
HBox de nodo hijo,
y coloque las tres selecciones de
recompensa
debajo del contenedor y coloque las tres selecciones de
recompensa HBox Ahora deberías ver si haces
clic en el contenedor HBox es que cada uno tiene una
posición de desplazamiento el uno del otro Pero ahora mismo no se
extienden por la pantalla. Entonces tenemos que ir a la selección de
recompensas, y va a ser
diseño, dimensionamiento de contenedores. Queremos ampliar en horizontal. Y mientras estamos
en ello, vamos a hacer expandir también vertical. Control como para guardar, volver a la selección de subir de
nivel. Y ahora podemos ver que están algo así como en un sentido de columna. Cada uno toma un
espaciado uniforme del espacio
de izquierda a derecha, y se ajusta a nuestro contenedor
del panel principal. Entonces eso es más como
lo que estamos buscando. En la selección de recompensas,
hagamos clic derecho en la parte superior y agreguemos un nodo. Entonces esta va a
ser una etiqueta de texto enriquecido
en la etiqueta de texto Rch,
pongamos el texto Vamos a decir nombre de corchete, y voy a comprobar Fit content. Podemos acercar aquí para verla. Entonces, para la selección de recompensas, haré clic en Selección de recompensa, y tomemos el preset de anclaje
y tomemos el preset de anclaje
y hagamos arriba a la izquierda, ¿de acuerdo? Y luego aquí abajo, necesitamos
un contenedor de margen. Bien. Entonces si miramos aquí,
así que si miramos aquí, no
hay espaciado entre nuestras etiquetas y el
borde de este panel. Entonces agreguemos un contenedor de margen debajo de la selección de recompensa. Haga clic con el botón derecho en Agregar contenedor de
margen secundario
y, a continuación, convierta la
etiqueta de texto enriquecido en un elemento secundario de eso. El contenedor de margen hará constantes de sobrescritura de
tema, y digamos que tal vez tres
píxeles para los márgenes izquierdo, superior, derecho e inferior de
aquí a la derecha Ahora tomemos la selección de recompensa
raíz, y voy a cambiar
su preset de anclaje a, digamos, arriba a la izquierda. Pero también tomemos
la selección de recompensas y la extendamos
un poco para que al menos podamos ver con qué
estamos trabajando aquí. No lo necesitamos para estirar
toda la pantalla porque
eso es engañoso, pero sí queremos poder
ver nuestro contenido vertical. Y podemos ir a subir de
nivel la selección para ver cómo
va a quedar eso en cualquier momento después del redimensionamiento
y este contenedor de UI. Hasta ahora, se ve bien. Pero queremos centrar
ese título. Entonces voy a hacer clic
en Etiqueta de texto enriquecido, y vamos a hacer
alineación horizontal Centro. Además, para el
dimensionamiento vertical del contenedor aquí y el control, quiero hacer que comience el encogimiento. Así que eso asegurará que
no se expanda
más de lo necesario. Si vamos a subir de nivel a la selección, deberíamos ver nuestras etiquetas
centradas aquí. Bien, ahora necesitamos nuestro marcador de posición de
icono. Entonces haré clic derecho
en Contenedor de margen, agregaré una textura rect, y luego podremos seleccionar un
icono de nuestro proyecto Entonces hagamos nueva textura Atlas. Y aquí, voy a Quickload un ícono de atlas
del paquete 16 por 16 Vamos a hacer dit región y
seleccionar un marcador de posición. Entonces algo para subir de nivel, algo así
se ve bastante bien. Y voy a acercar.
Ahora tenemos que
asegurarnos de que esto esté
realmente organizado correctamente, así que vamos a
necesitar un contenedor VBox
debajo del contenedor de margen Entonces, haga clic derecho en el contenedor de
margen, agregue un
contenedor VBox clavado hijo y haga que el título y la textura sean hijos de Bien, ahora se
organizará correctamente. tenemos que asegurarnos de que
esto mantenga su relación de aspecto Sin embargo, tenemos que asegurarnos de que
esto mantenga su relación de aspecto, para que
no se vea raro. Entonces en el inspector para textuct cambiar el
modo stretch para mantener aspecto También se debe mantener centrado en el
aspecto. Bien. Ahí. Eso se
ve más apropiado. También es posible que queramos ir al diseño y establecer un tamaño
mínimo de icono. Entonces aquí, voy a tomar
el tamaño mínimo personalizado, y vamos a decir algo así
como 48 por 48. Bien, eso va
a ampliar eso. 32 por 32 está bien. Entonces eso solo significa que si tu
ícono es más pequeño que 32 por 32, automáticamente
escalará hasta ese tamaño. Bien, agreguemos un texto de
descripción, así puedo controlar C
la etiqueta de texto enriquecido y luego hacer clic en contenedor VBox,
controlar V, pegarlo Y vamos a poner
entre corchetes descripción aquí. Obviamente, podemos ver que eso es bastante grande para esta área, lo que es posible que tengamos que trabajar
en nuestros tamaños de fuente más adelante. Y luego, por último, queremos un
botón para seleccionar la opción. Entonces voy a dar click en
contenedor vBox, agregar un botón. Entonces aquí probablemente
solo vamos a querer un botón regular. Lo que sí te permite
tener un ícono, así podemos
cargar rápidamente un ícono de prueba, misma manera que lo hicimos antes, a menos textura, expandirlo. Carga rápida de la hoja de sprites de 16
por 16. Haga Editar región y
elija un icono. Entonces tal vez algo así como la espada con un símbolo de
subir de nivel tenga sentido. Bien. Ahora podemos ver
nuestro botón como un icono. Y luego en el
cuadro de texto, podríamos decir elegir indicando lo que
estamos haciendo aquí Ahora bien, si pasamos a nuestra ventana de selección de subir de
nivel, podemos ver nuestras tres partes
de la interfaz de usuario aparecer aquí abajo, tenemos tres botones que
conectaremos para elegir más adelante. Tenemos nuestro título animado. Y así es más o menos como
va a quedar nuestra plantilla. Es solo cuestión de proporcionar las opciones de selección, conectarlas a nuestro jugador y luego actualizar a nuestro jugador
una vez que hagan una selección. Solo va
a ser cuestión de poblar la lista
con qué opciones están disponibles y luego
aplicarlas al
jugador una vez que el jugador
haga su selección Bien, entonces podrías
notar que hay un pequeño problema en el que
a veces el borde de nuestros íconos se superpone con posiblemente
los íconos vecinos. Entonces para arreglarlo, podemos ir
a Selección de recompensas y verificar clip de filtro.
Para el botón. Entonces, cuando haces eso, si vas por aquí y
acercas y alejas, eso debería arreglar ese
problema ahí mismo para no
veas más píxeles
superpuestos. También, para el nivel de
selección en el mundo, podría estar técnicamente
centrado aquí. Pero se puede ver
que va hacia abajo
y hacia la derecha desde
ese punto central. Así que en realidad no va a
aparecer centrado en la pantalla. Para editar eso, creo que
sería una buena idea tomar nuestra capa Canvas y hacer clic
derecho en
guardarla como una nueva escena
en nuestro proyecto de UI. Entonces diré jugabilidad UI Canvas como nombre, y
luego lo abriremos. Bien, ahora, si miramos a Hue, podemos
ver mucho más claramente dónde
se colocan nuestros objetos en la pantalla y su tamaño relativo
al punto de vista, lugar de tener la visión del mundo
desordenada Entonces podemos ver, por supuesto, que
nuestra selección de jugadores, UI, tenemos que hacer clic en eso y
probablemente duplicar el tamaño. Entonces en escala, solo
tomaré la báscula y
haré que sea un dos. Eso podría incluso necesitar subir
a tres. Sí, escojamos
tres por defecto. Bien, entonces para manejar
este tema donde nuestro contenedor de panel
básicamente va hacia la derecha y hacia abajo en
lugar de estar centrado aquí. Queremos saltar a la escena de selección de
love up y luego ir al
contenedor de panel, creo. Y sobre la derecha,
tenemos que llevar el modo de diseño a los anclajes
y luego centrarlo aquí Sí. Bien, ahí. Ahora
tenemos lo que buscamos. Entonces esto básicamente hace que
todo lo que sea un subobjeto
centrado en ese punto de anclaje, donde si vamos ahora a
la interfaz de usuario de Canvas, va a estar
centrado correctamente. Bien, muy rápido, saltemos al guión para la selección de
Llevo. Y listo, queremos
ocultar nuestra selección de subir de nivel. Entonces voy a
escribir y esconderme aquí. Y eso asegurará que
cuando comencemos el juego, se ocultará por defecto. Vamos a golpear play. Vamos
a LeveOp recogiendo EXP Y ahí tenemos nuestro selector
LevelUp pop up. Tenemos tres botones para
elegir . Todavía no
hacen nada. Podemos decidir después que no
queremos pausar la música, como lo que
acaba de pasar, pero
aparte de eso, todo está funcionando. El juego está completamente en pausa
y nuestra interfaz de usuario se muestra.
45. P44: creación de un sistema de nivelación de armas para las actualizaciones de juegos: Para que nuestro sistema de subir de nivel funcione, en realidad
necesitamos
algunas actualizaciones para completar la lista aquí
para nuestro menú de nivel superior Entonces, en general, eso va
a ser mejoras de armas. Por lo que necesitamos establecer
un sistema de nivelación para nuestras armas también. Entonces, si miramos
la escena del jugador, tenemos el arma de
lanza predeterminada, y eso tiene una definición de
arma Así que la definición de arma se mantiene muy simple
aquí por ahora, pero vamos a necesitar
agregar una mejora de arma. Pero agregaremos
aquí una matriz o diccionario de
mejoras de armas para que podamos avanzar al siguiente nivel y realmente obtener cuánto daño se supone que debe hacer
esta arma en cualquier nivel dado para que
cuando lancemos nuestra arma, esté usando los ajustes
apropiados. Y eso también puede
incluir cosas como el tiempo de enfriamiento o cuántos
objetivos puede golpear un arma. Hay muchas propiedades
diferentes que puedes configurar para
tu sistema de armas. Entonces, si saltamos al guión de las armas de
lanza, podemos ir más allá de la definición
de armas Puedes ver aquí, ya
templé un método get cooldown, que va a regresar en
función del nivel,
el enfriamiento para el arma Entonces aquí, si
definimos nuestra matriz, y luego pasamos en el nivel
real del arma, entonces podremos recuperar el conjunto correcto de estadísticas para nuestra arma en
su nivel actual. Y luego también
necesitaremos generar un método get seen también. Por lo que actualmente, esto solo
está cargando la escena de la lanza directamente Pero cuando estamos
actualizando nuestra arma, posible
que agreguemos la opción de tener escenas de
proyectiles
completamente diferentes pero no
necesariamente queremos hacerlo en todos los niveles,
por lo
que podremos volver por defecto al
proyectil de arma original
y simplemente actualizar
las estadísticas en su
lugar necesariamente queremos hacerlo en todos los niveles,
por lo
que podremos volver por defecto al proyectil de arma original
y simplemente actualizar
las y simplemente actualizar
las Entonces vamos a llegar a eso
creando algo así como un nivel de arma o definición de
nivel de arma. Entonces voy a ir
al sistema de archivos, y bajaremos a las armas. Vamos a hacer clic derecho y
crear un nuevo script aquí. Y entonces lo llamaré
algo así como nivel de arma, que en sí mismo será un recurso. Así que vamos a crear eso.
Abre el guión de nivel de arma. Iremos a la cima y crearemos el nivel de arma de nombre de
clase. Entonces esto define las estadísticas para el arma en este nivel en
particular. Así que un arma puede tener
tantos niveles como quieras, y progresará en el
poder a medida que mejore. Entonces podemos poner
aquí algunas estadísticas a las que nos gustaría
poder acceder para un
nivel diferente del arma. Entonces uno obvio
sería el enfriamiento. Entonces podemos decir en la exportación var, enfriar, y esto
será un flotador, y podemos por defecto a 1.0. Bien, así que vamos a guardar
eso muy rápido. Voy a cerrar todos
mis otros guiones aquí, así que haga clic derecho y cierre todos para que podamos
ver lo que estamos haciendo. Bien, y luego abre el
nivel de arma y
la definición de arma aquí. Bien, entonces esos serían
los únicos dos con los que estamos
trabajando aquí arriba. Entonces queremos, yo diría, un diccionario, si queremos
ser consistentes con
nuestros niveles de jugador. Y en Export VR, niveles, que será un diccionario de entero y el nivel de arma. Entonces, para el tiempo de reutilización de Git, queremos obtener el
nivel, y luego
devolveremos el tiempo de reutilización
de las estadísticas de nivel Así que el nivel VR va
a ser igual a los niveles dot Git y vamos
a estar obteniendo el nivel P. Y devuelven null por defecto. Entonces ahora queremos eliminar
el guión bajo para el nivel P porque
finalmente estamos usando esta variable Ahora bien, no puede inferir
el tipo aquí, así que sí tenemos que darle el tipo de nivel de arma
concreta, y luego vamos a
devolver el enfriamiento de punto de nivel Bien, entonces haz clic derecho en el nivel de
arma y haz símbolo de Loup Bien, asegúrate de que
en realidad esté ahí. Entonces en obtener enfriamiento, va a encontrar
el nivel de arma Si no puede encontrar
el nivel de arma, en
realidad va
a equivocarse aquí. Pude vernos que estamos
usando mucho esta línea. Así que en realidad voy
a poner también aquí abajo una función Git nivel de arma. Lo cual va a tomar
un entero de nivel P, y esto va a
devolver un nivel de arma. Así que sólo podemos devolver esto. Y luego en cambio, lo
que podemos hacer aquí es decir, conseguir nivel de arma. Pasar el nivel p punto qual hacia abajo. Ahora bien, una buena razón por
la que haríamos esto es que si queremos
agregar posteriormente algún código, digamos que
no hay nivel de arma y queremos
por defecto al nivel anterior, o queremos error de porción. Podemos hacer todo eso dentro de esta función función de
nivel de arma G. Y luego en todos
los demás lugares que llamamos Obtener nivel de arma, todo ese código extra
va a ser pre manejado. Entonces esto simplemente lo
configura si
necesitamos hacer que la función se dañe, función g max hits, etcétera, entonces esto reducirá
nuestro código más adelante y lo centralizará
en esta Pero por ahora, sobre todo cuando estamos haciendo prototipos, creo que definitivamente quiero
saber de inmediato si
olvidé configurar un nivel de arma donde
esperaríamos que
haya un nivel de arma definido
en la definición de arma Así que en realidad estoy totalmente de acuerdo con que solo
arroje un error tan pronto
como intentemos llamar a punto quo
abajo en un nivel de arma nula. Entonces por eso lo voy a
dejar así por ahora. Bien, ahora saltemos al nivel de
arma y configuraremos algunas otras propiedades que
queremos modificar por nivel. Otro obvio sería el daño que un
arma puede infligir. Entonces en la exportación var daño, y en realidad podríamos
hacer daño a los hombres daño
MAX si queremos que
sea un poco más interesante. Entonces, si decimos en export
var men damage, y digamos que eso es un flotador, podemos por defecto que sea 10.0, y luego tenemos en
export var Max damage, que será un flotador. Y vamos a establecer
eso en 20 por defecto, cualesquiera que sean los números que creas que es un buen punto de partida,
vas a ajustar. Prácticamente siempre por cada recurso de nivel de
arma. Como he estado
mencionando, probablemente también queremos éxitos máximos. Así que en Export V max hits, y eso va a ser un entero. Lo pondré igual a 1.0. Ah, también, los hombres
dañan y MAX daño, olvidé que estamos tratando
con enteros en el juego, así que voy a cambiar
eso a entero Entonces voy a cambiar
eso a entero en ambos casos para que sea consistente. Por supuesto, podrías usar flotadores en combinación con enteros Pero creo que en
este caso, cuando
siempre queremos que el daño
no sea decimal, es mejor
ser consistente en todos nuestros guiones. Bien. Y entonces, de
igual manera, máximo hit dice que el entero no debe
tener un punto decimal ahí. Probablemente
vamos a querer también una variable de velocidad aquí en alguna parte. Así que exporta var speed, y eso será un flotador. Lo pondré a 100.0 como aproximadamente
píxeles por segundo ahí. Entonces un comentario rápido
ahí, también. Entonces ahora tenemos un
montón de propiedades. Queremos configurar
el recurso en nuestra definición de arma de lanza Bien, así que alejemos el zoom,
haga clic en el arma de lanza. Por aquí a la derecha,
tenemos nuestros niveles de armas, así que los configuramos. Entonces el nivel corresponde
no con una posición de matriz, sino con el nivel real
del arma. Entonces queremos comenzar en uno aquí. Y entonces queremos hacer
un nuevo nivel de arma. Bien, entonces en nuestro nivel de arma, estos podrían ser nuestros conjuntos base. ¿Por qué no solo agregamos
el par de valores clave,
y ese será el valor predeterminado
para nuestra lanza de nivel uno Vamos a sumar en dos y
después un nuevo nivel de arma. Y queremos aumentar
el daño aquí. Entonces voy a decir 15 a 25, y tal vez la velocidad
sea un poco más rápida, así que como 110 para la velocidad. El enfriamiento, podemos lanzar un poco más rápido, así que voy a decir 0.9, y los golpes MAX se
fijarán en uno todavía porque agregar un
golpe Max extra es un problema bastante importante. Eso podría ser como duplicar
tu daño de manera efectiva. Entonces agreguemos eso.
Y luego hagamos nivel tres, nuevo nivel de arma. Diremos 20 a 25
daños, la velocidad, tal vez 115, y luego
el enfriamiento sti 0.9, pero aumentamos los golpes
máximos a dos. Así que, como que puedes
hacerte la idea aquí. Casi siempre queremos que algunos
de los números suban. Debería sentir que cada nivel es una mejora sobre
el anterior. No necesariamente tenemos que
cambiar las actualizaciones
en un factor lineal. Entonces, por ejemplo, un nivel podría ser un aumento masivo de daño, pero la velocidad del
proyectil permanece igual En fin, agrega eso, y
seguimos adelante tantos
niveles como quieras. Bien, así que para
seguir adelante, hagamos cuatro. Pondremos un nuevo nivel de
arma aquí, y podría ayudar a expandir el nivel de arma anterior para que
sepas lo que necesitas para mejorar. Por lo que empezamos en 20 hombres daños. Hagamos 25 de vez en cuando 30 por el daño MX
y la velocidad, 120, el enfriamiento 0.8. El máximo golpea a dos. Agregar un par de
valores clave. Sólo sigue adelante. Bien, y acabo
de agregar una quinta por diversión. Entonces esa, puedes ver las estadísticas ahí mismo
si quieres copiar. Una estadística clave que en realidad
olvidé sería el número de proyectiles
generados Así que vamos a exportar proyectiles
var, y eso va a ser un
entero igual a uno Entonces, el número de
proyectiles a instancia por lanzamiento es una propiedad muy fuerte Entonces, si quisiéramos que un nivel
fuera extremadamente fuerte, entonces podríamos decir,
tal vez el nivel cinco. Tenemos dos
proyectiles por lanzamiento, y eso hará que el arma
inflija mucho más daño Ahora bien, no queremos que los
proyectiles aparezcan exactamente al mismo
tiempo
en la mayoría Una forma sería
compensarlos para que
puedas ver en dónde
van a desovar Otra opción que
podrías agregar
sería retrasar después de que ocurra un lanzamiento, cuánto tiempo antes de que cada
proyectil abarque Entonces se podría decir,
en
realidad agreguemos ambos como una opción. Entonces podríamos decir en Export
var offset o span offset. Va a ser una
carroza. Va a ser igual a cero, cero. Y luego en la exportación VR, retraso de
spawn es un float, y diremos 0.05 segundos. Así que eso va
a verse así. desplazamiento de engendro es
el desplazamiento máximo para la posición
instantánea del proyectil. Entonces, ¿a qué distancia del punto central
puede estar cuando genera Y entonces el lapso de retraso
será el tiempo y segundos para esperar entre tramos
adicionales de proyectiles, y debería decir, después del primero, ese es el valor
clave ahí Bien, entonces en el siguiente video, trabajaremos en tomar estos niveles de
armas y
hacer para que podamos seleccionarlos para subir de nivel dentro de nuestra interfaz de usuario.
46. Elementos de armas P45 para mejorar la potencia de tus armas: Bien, entonces para la siguiente
parte, necesitamos introducir la capacidad de nuestra interfaz de usuario de selección de nivel
para obtener el objeto para la mejora del
arma para
que podamos subir de nivel el arma que está realmente
activa en la jugada. Entonces, el primer paso de eso
va a ser crear una lista de opciones o
recurso dentro de nuestra selección de nivel superior que
usaremos para poblar
las opciones
aquí abajo en función de
una selección aleatoria de las opciones
viables disponibles Veo aquí en la
parte inferior izquierda que proyectiles están en
la carpeta de niveles De hecho voy
a trasladar eso a armas que simplemente tienen más
sentido. Entonces, como no hay nada
en la carpeta Niveles, voy a renombrarlo para que sea configuración porque lo que realmente
estamos haciendo es configurar una lista de mejoras de armas
u otras mejoras que podamos elegir
en nuestro nivel de juego. Y en realidad podríamos
diferir esto, dependiendo del personaje
o podríamos diferir esto dependiendo del nivel que
estemos cargando en nuestro juego, pero queremos tener la opción personalizarlo de cualquier manera. Entonces vamos a
crear un nuevo script, y voy a llamar a esto opciones de
nivelación punto gD Este será un recurso, por lo que podremos editarlo
en el GIDOEditor Y luego voy
a entrar aquí. Y digamos opciones de nivelación de
nombres de clase. Anteriormente en el curso,
introdujimos las camionetas. Ahora, esas camionetas solo existen actualmente como escena
en el mundo del juego, se recoge
e inmediatamente se agrega
el EXP a los jugadores Entonces no hemos tenido
la necesidad de un artículo específicamente porque ese
EXP solo modifica una estadística Pero si queremos
algo más complejo, como un impulso de salud o la
capacidad de subir de nivel un arma, entonces necesitamos una clase de
artículo más concreta dentro de nuestro juego, y prácticamente
todos los juegos de tipo RPG lo
van a tener en algún momento Así que queremos al exportar una lista de artículos que podamos
usar inmediatamente con nuestro jugador. Entonces voy a hacer la
exportación de artículos, y esta será una variedad de
digamos artículo por ahora mismo. Ahora, no hemos
creado una clase de artículo. Así que vamos a crear una carpeta en
nuestra parte inferior izquierda para los elementos. Voy a hacer clic derecho,
crear una nueva carpeta. Voy a llamar a esto artículos. Y luego dentro de aquí,
voy a hacer click derecho, crear un nuevo script. Y este será item dot
gD extendiéndose desde Resource. Bien, entonces dentro de aquí, haremos el artículo del nombre de la clase. Específicamente para un juego similar a un
sobreviviente, es posible que no necesariamente tengamos artículos que existan
en un inventario. Por lo que aún necesitan
aplicar de inmediato. Pero cómo se aplican
es más complejo que solo el EXBPickup siendo una asignación inmediata
de experiencia Entonces para hacerlo para
que podamos aplicar nuestros ítems a un
jugador o a un target, al
menos, voy
a crear una función. Vamos a decir función try apply, que va a
tomar un objetivo P, no dos D, y va
a devolver un Booleano Así que intenta aplicar porque
puede haber circunstancias en las que falla, y podría ser
útil
en algún lugar de nuestro código tener
esa retroalimentación de si
tuvo éxito o
también es posible que queramos una
función de
can apply para que podamos verificar con
anticipación si es realmente
viable o no. Entonces voy a decir función puede aplicar, y esto pasará
en el objetivo, no dos D y retorno de booleanos Entonces por defecto, voy a decir devolver falso aquí porque
este es un elemento base. No podemos aplicarlo, y yo
solo diré aquí también que devuelva
falso. Entonces solo lo pondré
en una advertencia de que no
podemos aplicar el
objeto base a un objetivo, y luego vamos a crear
nuestro artículo de arma porque eso es lo que
más nos preocupa primero. Así que voy a
hacer clic derecho sobre los elementos, crear un nuevo guión, y este va a ser un elemento de subrayado de
arma, va a heredar del ítem como la clase base,
así que vamos a Entonces artículo de arma aquí, vamos a ir a la parte superior y hacer nombre de la
clase elemento de arma
que es un nodo dos D. Esto va
a devolver booleano Entonces necesitamos una forma de acceder a la carga de armas del
personaje si tiene una Entonces, una forma sencilla que podríamos
ponerlo sería lejos la carga es igual a p target dot find child, y vamos a estar
buscando carga de armas ¿Bien? Y eso debería devolver
un tipo de carga de armas. Así que vamos a mover eso
en su propia función. Entonces función obtener carga
va a devolver la carga de
armas. Y entonces sólo vamos
a devolver esto en su lugar,
devolver ptarget punto Fine
Child armas de carga Entonces tenemos que pasar
el Ptarget aquí. Y entonces podemos inferir el tipo. Entonces voy a hacer dos puntos iguales, Obtener loadout en pTarget y luego volvemos si
eso existe o no por ahora Y luego queremos
comprobar si la carga tiene la definición de armas que actualmente
estamos tratando de aplicar Así que podríamos hacer en la
exportación VR definición. Y esta es una definición de
armas, una definición de arma, más bien. Bien, después de obtener la carga, queremos verificar si el arma existe en un
lado de la carga Si lo hace, entonces
vamos a ver si
hay espacio para subir de nivel o si ya hemos
alcanzado el tope de nivel. Entonces, dentro de la carga, necesitamos saber qué armas están realmente debajo de ella
dentro de este sistema Entonces listo, podemos obtener todas
las cargas preexistentes, y luego agregaremos un método
para que podamos agregarle uno
nuevo que lo
agregará a la matriz,
manteniendo la referencia a todos sus hijos
de armas Entonces digamos armas var aquí hay una matriz de arma dos D, y en función
subrayado listo, que vuelve vacío, queremos conseguir todos los niños
que son de tipo armas Entonces, para arma en encontrar hijos, y las citas vacías para la cadena del patrón
no coincidían por nombre Pero para el tipo,
vamos a hacer arma dos D, y la carcasa importa aquí porque ese es el tipo de nombre de
clase. Entonces esto sólo va a devolver a
los niños a través de arma
tipo dos D.
Y entonces podemos decir armas punto Penn arma Y ahora cuando empieza el guión, tenemos todas las armas
preexistentes. Podríamos decir que tenemos una
función agregar arma función, que tomará un arma
P arma P, que es un tipo de arma dos D,
más bien, Vitun vacío y
diremos armas Penn P Y queremos asegurarnos de que es hijo de esta arma. Entonces lo hacemos en una sola función. Diremos Agregar hijo de arma P. Eso va a ser bueno por ahora mismo. Entonces vamos a entrar en
el artículo de armas. Tenemos el loadout para que podamos
verificar si ya lo tiene. Entonces después de obtener la carga, queremos que el arma se
asocie a esta definición de
arma Entonces digamos, nuestra
arma va a ser
igual al arma LoadoUG, basada en una definición Entonces aquí vamos a
decir definición. Ahora, vamos a saltar a la
carga de armas y hagamos la función arma G,
basada en la definición Entonces P definición. Es
una definición de arma. Vamos a devolverle
un arma a D. Y digamos por
arma en armas, si la definición de arma es
igual a la definición P, vamos a
devolver esa arma. De lo contrario, devolvemos null. Ya que solo tenemos la necesidad de
buscar a través de unas pocas armas, tener un bucle pequeño como este
va a estar perfectamente
bien, no realmente un problema. Además, si quieres
limitar la cantidad de armas que un jugador puede tener, entonces podrías decir
algo más como en exportación VR Max armas es un
número entero de seis en la parte superior. Y luego podremos verificar
si también hay espacio. Entonces podríamos decir que
la función tiene espacio, y este será un tipo de retorno
booleano, y solo diremos
devolver armas punto si es menor que las armas máximas. Bien, entonces eso es solo una simple pequeña fuerza de función auxiliar. Ahora, de vuelta en objeto de arma, si tienen el arma, entonces queremos ver si
podemos subir de nivel. Incluso podría tener sentido declarar aquí el
arma tipo dos D, aunque ya se
infiere de la llamada a
la función de arma Bien, entonces primero que nada, si no
hay arma, así que si arma es igual a nula, entonces volveremos carga hacia fuera tiene espacio como si
podemos aplicar o no. Porque si el arma no
existe en el sistema de armas, solo
necesitamos ver si hay
espacio para agregar una nueva. De lo contrario, si hay un arma, entonces queremos ver si
podemos subir de nivel. Entonces entonces diremos arma de retorno. Podría ser algo así como C subir de
nivel o tiene siguiente nivel. Creo que tiene siguiente nivel
suena como un buen nombre para. Entonces ahora necesitamos esa función dentro de nuestras
armas al guión D. Entonces en armas a D, queremos
usar el nivel contra la definición y solo verificar
si hay un siguiente nivel. Así que abajo en la parte inferior, vamos a crear nuestra función. Entonces la función tiene siguiente nivel. Esto volverá booleano. Entonces digamos
función siguiente nivel, y ese será un nivel de
arma igual a
definición Obtener nivel de arma de nuestro nivel actual más uno, que puede devolver nulo. Por lo que vamos a volver siguiente
nivel no es igual a null. Porque si
hay un siguiente nivel, entonces podemos llegar al siguiente
nivel. Podemos subir de nivel. Si no lo hay, entonces ya sea
hemos alcanzado el tope de nivel o nos
olvidamos de definir un nivel. Entonces podríamos haber
definido el nivel siete, pero ¿definimos el nivel
seis cuando estamos en el nivel cinco? Porque cinco pueden ir a seis, pero no podemos simplemente saltar a
siete, al menos normalmente. Entonces eso debería manejar nuestras necesidades ahí para verificar
si podemos aplicar. Y luego si
vamos a aplicar, diremos función, aplique. Y déjame revisar la clase
base aquí solo para asegurarme, intentaremos aplicar. De hecho, podría
tener sentido copiar esto de nuevo. Bien. Y entonces vamos
a anular eso aquí abajo sólo por volver a declarar
la misma función Entonces primero, tenemos que conseguir el arma si
vamos a aplicar. Entonces el arma Var es un arma dos D, y esto va a ser igual al arma
LoadoUG de
nuestra definición Entonces, si el arma no está
ahí, entonces ya fallamos. Entonces si arma es igual a
nulo, volvemos cae. Pero también necesitamos volver a
conseguir la carga. Entonces las cargas Var van a ser inferidas tipo de
G loadout Así que estamos obteniendo la carga sobre el objetivo al que estamos
tratando de aplicar Entonces una vez que tengamos el arma, la
queremos lavo arriba. Entonces vamos a decir
arma punto tri subir de nivel, y eso volverá ya sea que
tengamos éxito o no. Entonces devolveremos ese valor. Ahora necesitamos definir
arma punto tri nivel arriba y arma dos D. Así que vamos a ir aquí
abajo y la función, función tri nivel arriba, y vamos a
devolver un Booleano Bien, entonces miramos hacia arriba en la parte superior de nuestra arma dos guión D. Podemos ver que tenemos el nivel y el nivel de arma existe en
la definición de arma para ser un poco más
eficientes y simplemente
poder acceder a lo que es nuestra información
actual. Una vez que ya hayamos nivelado, también
podríamos tener una
variable local Podríamos decir que nuestro
nivel de arma es un nivel de arma. Entonces en lectura, digamos que el nivel de
arma es igual a la definición punto
nivel de arma Git en nuestro nivel actual. Y luego cada vez que
subamos de nivel, también vamos a establecer eso. De esa manera, si necesitamos ver las estadísticas de nuestro nivel de arma
actual, entonces simplemente accedemos a
este valor aquí mismo. Entonces básicamente encontramos el
valor en nuestra definición una vez, y hasta que volvamos a subir de nivel, tenemos acceso a la información
en este nivel de arma. Bien, entonces ahora con TreveLu, queremos conseguir el siguiente nivel Entonces nuestras estadísticas
de siguiente nivel van a ser iguales a la definición obtener
nivel de arma en nuestro nivel más uno. Entonces, si las
estadísticas del siguiente nivel son iguales a nulas, entonces devolvemos false. De lo contrario, vamos a decir que nivel de
arma es igual
a las estadísticas de siguiente nivel, y decimos nivel más uno. Nivel más es igual a uno, y volvemos verdadero. Bien, entonces ahí está nuestra función de subir de
nivel. Bien, lo último
que vamos a hacer en este video para el
artículo de armas es en realidad crearlo. Entonces en artículos, haga clic derecho, cree un nuevo recurso, busque elemento de armas, presione Enter vamos
a poner eso en artículos. Entonces diremos artículo de lanza. Y si haces doble
clic en el elemento de lanza, puedes ver que tenemos un lugar
aquí para la definición Queremos que la definición sea exactamente la
misma definición que nuestra definición de armas de lanza Entonces, si haces clic en arma de lanza, puedes ver que tiene la definición de
arma Hagamos clic derecho aquí y
guardemos esto dentro de las armas. Entonces arriba en la raíz,
vamos a las armas, y ahí tenemos
definición de lanza Queremos hacer doble clic
y anular eso. ¿Bien? Entonces, aquí está nuestra definición real de arma de
lanza, y este es ahora un recurso
compartido Así que podemos hacer clic en el elemento Spear, y queremos cargar rápidamente
esa misma definición de lanza Por lo que ahora el objeto de lanza va a estar vinculado de esa manera con el
arma de lanza Para que podamos reutilizar
el arma lanza dos D. Vamos a guardar esta
rama como escena Haga clic derecho en Guardar sucursal como SN. Y pongámoslo en
la carpeta de armas como arma
lanza punto TCN Bien, entonces ahora
podríamos reutilizar eso en
enemigos o en cualquier
otro lugar que lo necesitemos. El punto clave es
que nos aseguramos estén usando la misma definición de
lanza que es muy importante o de lo contrario el objeto de
lanza nunca
podrá encontrar el
arma de lanza a través de la Bien, ahora ya hemos hecho
todo el trabajo de base. Entonces, el siguiente video,
configuraremos la interfaz de usuario y subiremos de nivel para que funcione
para mejorar nuestras armas.
47. P46: Crear un sistema de selección de artículos ponderado para las recompensas de subir de nivel: Entonces, en este punto, necesitamos
agregar una lista de elementos de arma a nuestra
selección de nivel superior que podamos elegir cuando
llenemos la ventana Entonces ahí va a ser donde entra el guión de la opción de
nivelación, donde para un
mundo de juego determinado o nivel del juego, solo
tenemos esta
matriz de elementos que
podemos asignar en la selección de subir de
nivel. Entonces en el script de
selección de subir de nivel, necesitamos al exportar
una VR para opciones, y esto va a ser
de tipo opciones de nivelación. Bien, entonces guardamos este script, y ahora si vamos a mirar el
inspector y dos vista D, así que haga clic en Level Up selección, y luego encima a
la derecha, podemos crear nuestras nuevas opciones de nivelación. Ahora bien, esto es algo que
probablemente sea muy específico de nivel. Entonces es posible que tengas un nivel uno donde tengas muchas opciones, y luego el nivel dos, tal vez
sea un poco más difícil, lo que restringes la lista de elementos, o incluso podría ser por clase de
personaje si decides ir por esa ruta de restringir elementos a personajes
específicos De cualquier manera, este va a
ser un recurso en el que quieras hacer clic
derecho y luego
guardar en el proyecto. Así que vamos a entrar, digamos, en la carpeta de configuración,
ya que
por eso pongo el script de
opciones de nivelación, y luego pondremos en las opciones de nivelación de nivel uno
y luego guardaremos, así que eso va a ser un punto TRS Y ahora podemos asignar
una matriz de ítems. Entonces voy a
aumentar esto a uno, y vamos a cargar rápidamente el objeto de arma
del objeto de lanza Y ahora esa es una de
las posibilidades que
podemos usar dentro de nuestro script de selección de
nivel superior. En nuestra jerarquía, queremos que la selección
de subir de nivel pase las opciones, digamos abajo a
este contenedor HBox, que podríamos decir es más
como la selección de recompensas Entonces, en términos de nuestra jerarquía, tenemos la opción establecida en el
nivel de selección de nivel arriba. Cuando abramos el menú
para subir de nivel a nuestro personaje, nuestras selecciones de recompensas
se van a poblar aquí abajo en
este contenedor de caja H. Entonces cada una de las recompensas que se
les permitió elegir van a aparecer
como una opción aquí abajo. Por defecto, eso serían tres. Pero realmente, depende cuántos artículos
tengamos disponibles. Entonces podríamos cambiar el nombre de
este contenedor HBox para que sea algo así como un contenedor de caja de
recompensas, y luego hacer clic derecho
y darle un script Entonces voy a adjuntar un script, y lo guardaremos en UI
slash Rewards Box Container La razón por la que estoy haciendo esto es porque cuanto más separes las diferentes funciones de tu interfaz de usuario general en scripts
separados más pequeños, más reutilizable
será cada uno de
esos componentes porque estás separando
las responsabilidades. Por lo que el contenedor de la caja de recompensas
va a ser el puramente responsable de
poblar las recompensas que van a pasar por debajo de él Así que vamos a hacer un contenedor de caja de recompensas de
nombre de clase, y luego vamos
a querer exportar una escena repleta para instancia de cada una de estas selecciones de
recompensas de. Entonces esos en realidad no
van a estar ahí. Y la base, esos
van a ser limpiados y
sólo instanciados cuando tengamos una recompensa para Así que vamos a crear una
función poblar y esto tomará
una lista de opciones Y también queremos
saber de cuántos artículos se
pueden seleccionar
a la vez. Entonces creo que las opciones de nivelación
serían un buen lugar para poner esa propiedad en
lugar de la propia interfaz de usuario. Así que hagamos clic derecho en Opciones de
nivelación, Símbolo de búsqueda. Y voy a decir en export var MAX
Underscore Choices, que va a ser un entero, y voy a por defecto eso a tres Y mientras estamos
por delante, sí quiero
hacer un gran cambio en
esta variedad de artículos. De hecho voy a
cambiarlo a un diccionario de artículos para que podamos aplicar
un peso a cada uno. Y eso
hará que si queremos
priorizar un elemento como
una opción posible, entonces podamos hacerlo
aumentando su tasa de caída manera efectiva dándole un valor flotante más alto o
un valor de flotación menor
para los artículos más raros Ahora, como cambié el
tipo de esta variable, eso significa que necesito
restablecerla en la selección de nivel. Entonces, si vamos a la selección de niveles y miramos nuestro
nuevo diccionario aquí, necesitamos dar el ítem. Tan rápido carga ese artículo de lanza
y luego dale un valor. Podríamos decir uno si quisiéramos. Entonces ahora este objeto de lanza tiene una
probabilidad de caer de 1.0. Y al igual que las otras
instancias en las que hemos hecho aleatoriedad con pesos, ese 1.0 es relativo al peso total de
todo lo demás en esta lista Entonces en este momento es
100% porque
solo hay uno más de 1.0 peso,
así que es uno de uno. Pero si agregamos cuatro elementos más, entonces sería un 20% de probabilidad. Y, claro, porque
estamos dando tres opciones, va a rodar tres veces. Una vez que seleccionamos un elemento
en nuestra lista desplegable, también se elimina de los pesos
generales. Si tuviéramos cinco opciones,
estaríamos tomando tres de ellas, tres opciones únicas,
debería decir. Así que vamos al contenedor de la caja
Rewards. Ahora tenemos cuántos
vamos a elegir realmente. Ah, y queremos
obtener el peso total. Lista de opciones,
asegurándose de que cada una esté disponible para ser utilizada
con el objetivo específico. Entonces hagamos otra
función para eso. Yo lo llamaré función,
generaré elecciones. Y esto
tomaremos las opciones P como opciones nivelación y el objetivo
P como un nodo dos D. Bien, así que antes que nada,
queremos obtener las opciones restantes
de la lista de opciones. Entonces, si nuestras opciones restantes van a ser iguales a, digamos, Poptionst peso del artículo
o peso de los artículos,
y vamos a
duplicar Bien,
entonces la razón por la que lo estamos duplicando
aquí es porque
queremos este diccionario de
artículos con sus pesos y vamos a
duplicar Bien, entonces la razón por la que lo estamos duplicando
aquí es porque
queremos este diccionario de
artículos con Para ser locales de esta
función específicamente, no
queremos meterse con el diccionario original
eliminando elementos de
ese diccionario. Todas las
opciones de nivelación deben permanecer en las opciones de nivelación
básicamente durante el resto del
juego porque esa es una definición de tiempo del editor, y estas son nuestras opciones
restantes de tiempo de ejecución. Entonces duplicamos la lista, y vamos a estar quitando
de ella después de hacer cada selección o después de
invalidar una opción potencial Entonces el duplicado aquí
es importante para
asegurarnos de que no estamos modificando
el diccionario original. Efectivamente. Ahora tenemos
las opciones restantes. Queremos filtrar todas las
opciones que no son válidas. Entonces, para la opción en
las opciones restantes teclas de punto, ¿por qué las teclas? Porque las claves de
este diccionario son los ítems y los
valores son los pesos. Por lo que en realidad podría ser útil declarar
el tipo aquí arriba, aunque se infiere
del peso de los artículos, es mejor si podemos
verlo en pantalla Entonces voy a decir
diccionario de ítem, y luego tenemos el peso. Oh, espera, el peso está a flote. Y ahí podemos ver muy claramente que el
artículo son las claves. Y el flotador es el valor. Para cada uno de estos artículos, queremos verificar, ¿puede
el objetivo aplicarlo? En realidad, podría ser mejor llamar
a este ítem por aquí. Para ítem de tipo item en opciones restantes teclas de
punto, podemos decir, si item dot puede aplicarse y
porque lo escribimos aquí, obtenemos acceso a las funciones en el menú
auto poblado Entonces queremos ver si podemos
aplicar eso a P target. Entonces, si no podemos aplicarlo al pre
target, invertiremos eso. Entonces, si no el ítem Doc puede
aplicar al objetivo P, entonces vamos a eliminar
el par de valores clave. Entonces cuando hacemos las teclas de punto, esto nos está dando una matriz. Entonces esta matriz está separada
del diccionario original
así que creo que
realmente podemos modificar ese
diccionario sin problema porque
ya tenemos la
matriz separada de claves aquí. Entonces este bucle aquí, si modificamos el diccionario, no
va a ser un problema. Normalmente, quieres tener
cuidado con eso. Al igual que, no deberías modificar una matriz mientras la
estás recorriendo,
pero en este caso, esta matriz está separada de
este diccionario, por lo que debería estar bien. Sin embargo, veremos con certeza cuándo ejecutamos
realmente el código. Entonces, si no podemos aplicar el ítem, entonces queremos
eliminarlo de la lista de opciones porque no
podemos usarlo. Así que las opciones restantes
eliminan puntos o Facilidad, sí. Bien, aquí se llama borrar. Y ahí mismo tenemos la llave. La clave es el ítem. Entonces
borramos el ítem de eso, y eso va a
eliminar eso como una opción. Entonces después de hacer un bucle de
todas las opciones, ya
hemos filtrado
todas las que no podemos aplicar Entonces ahora solo necesitamos hacer una selección basada en
el peso total, y después de elegir cada una, eliminamos de las opciones
restantes. Entonces nuestro peso total aquí va a ser un
flotador igual a 0.0, y necesitamos recorrer una
vez más las opciones
restantes. Entonces podríamos decir como cuatro
pesos a flote y
opciones restantes valores de punto entonces decimos peso total más
es igual a ese peso Entonces creo que esa es una forma bastante
clara de escribirlo. Entonces ahora hemos sumado el peso. Queremos hacer una selección
aleatoria entre cero y
el peso total y luego ver
cuál escogimos. Por lo que el peso aleatorio VR
va a ser inferido tipo de rand F veces
el peso total Así que lo hemos hecho algunas
veces en el curso hasta el momento. El peso total es
nuestro valor máximo. 0.0 es nuestro valor mínimo. Y al tomar básicamente 0.0 a una vez
el peso total, vamos a obtener algún valor entre cero y
el peso total. Bien, entonces ahora tenemos
nuestro peso aleatorio, y queremos elegir un artículo
de entre las opciones restantes. Y va
a haber un bucle aquí, por cierto, pero
podemos simplemente escribirlo
para un artículo primero. Bien, entonces ahora aquí cuatro
opciones en opciones restantes. Entonces vamos a decir
si el peso actual es mayor o igual
al peso aleatorio, entonces elegimos esa opción. Entonces ahora necesitamos, en realidad un peso
actual aquí también. Entonces nuestro
peso actual va a ser un flotador igual a 0.0. Entonces primero, queremos sumar en
el peso de la opción. Tan actual va
a ser más igual a las opciones restantes
en esta opción. Entonces ponemos en la clave
del diccionario. Nos da el valor, y en realidad
podría ser
una forma más segura para eso. Entonces podríamos decir, obtener opción. Y si no hay opción, el valor predeterminado es nulo. W nos daría un error aquí. Y tal vez eso es
realmente lo
que queremos porque esperamos que esté ahí. Es un gran problema si
bloqueamos el par de valores clave, y simplemente no existe. Así que sí, vamos a dejar
que eso sea justo como hubiera sido haciendo
la opción de corchetes. Efectivamente, es lo mismo
excepto que esta
función get te permite
aplicar una copia de seguridad predeterminada con una coma y luego una variante
predeterminada Entonces es un poco más
flexible, pero en este caso, sí
queremos una falla dura si
la opción simplemente no está ahí, porque definitivamente debería ser Bien, entonces agregamos
el peso actual. Queremos verificar si
el peso actual es mayor que
el peso aleatorio. Entonces, si el peso actual es mayor o igual al peso aleatorio, entonces vamos a agregar esto a la lista de opciones seleccionadas. Podríamos simplemente declarar las opciones
seleccionadas
aquí arriba en la parte superior. Entonces var selected es una matriz de item porque eso es lo que
necesitamos devolver al final. Así que vamos a añadir
la opción a la matriz
seleccionada Así que seleccionamos la opción de anexar, y luego tenemos que
eliminarlo de la lista de opciones Y en realidad, creo que
cómo voy a hacer esto es que vamos a establecer una variable
local aquí arriba. Entonces, si nuestra siguiente selección es el
ítem igual a nulo, haremos el siguiente seleccionado. Igual a esa opción
y luego romper. Entonces salimos
del bucle de cuatro. Ya no
necesitamos los cuatro bucles. Después de ese bucle, siguiente
seleccionado no es igual a nulo. Entonces vamos a la opción de agregar punto
seleccionado. De lo contrario, queremos salir
de todo nuestro bucle de cuatro. Entonces necesitamos un bucle cuatro
porque
lo vamos a hacer varias veces. Entonces veamos. Entonces pienso justo por
aquí, 44 veces en Rango,
cero, CP, opciones de
subrayado
puntean Max Choices con incremento de uno Entonces eso básicamente significa que
vamos de cero a las opciones máximas,
subiendo una cada vez. Cuando alcanzamos las
opciones máximas, detenemos el bucle. Entonces, si las opciones máximas son tres, esto va a
correr tres veces. Va a ser cero, uno, dos, y cuando llegue a tres,
va a ser igual a las opciones máximas. Voy a
detener el bucle cuatro. Bien, así que básicamente solo
tomamos todo eso y lo tabulamos, y ahora va a hacer un bucle de
todo este código, ¿verdad? Entonces como parte de
agregar la opción, también
queremos tomar
el peso total, y queremos menos es igual a cualquiera que sea el peso de las opciones Entonces diremos
opciones restantes punto obtener opción. Soy consciente de que esto está
llamando de nuevo a esto, pero eso no es
realmente un gran problema. Entonces esto va a obtener el valor de
flotación del peso. Lo quitamos
del peso total, y luego queremos
volver a subir aquí. Entonces también existe la
otra posibilidad, que es que no haya
nada seleccionado, lo que significa que
no queda nada por seleccionar. Así que podríamos simplemente hacer
ruptura temprana del bucle de cuatro. Entonces estamos hablando de
esto for loop aquí mismo. Y eso
probablemente me quede bien. Sólo tenemos que
devolver el seleccionado. Así que regresa seleccionado. Entonces
al final de esto, obtenemos hasta tres artículos. Para cada uno de esos elementos, queremos poblar la interfaz Entonces digamos VR aquí arriba, las opciones van a ser iguales para generar opciones
en las opciones P, y pasamos el objetivo
P para que
podamos verificar cada ítem contra su objetivo para
asegurarnos de que sea válido. Entonces tenemos opciones aquí ahora. Y luego queremos crear la escena de selección bbard y asignarle la elección aquí
abajo en la parte inferior Dado que este bit está realmente
fuera de este bucle de cuatro, queremos agregar el
siguiente seleccionado porque
establecemos siguiente seleccionado aquí igual a la opción para que podamos
usarlo fuera del bucle cuatro Así que queremos decir
siguiente seleccionado aquí, y queremos conseguir en el
siguiente seleccionado también. Entonces una cosa más que
olvidé hacer
aquí abajo es que después de
ajustar el peso total, también
me olvidé de
eliminar la siguiente seleccionada
de las opciones restantes. Entonces disminuimos el peso total porque estamos
eliminando la opción, y luego eliminamos
la opción de la lista real de la que
estamos seleccionando. Entonces, cuando vuelva a
subir aquí ahora para los siguientes cuatro bucles para
las opciones restantes, no
va a tener
esa opción ahí, y simplemente la
saltará por completo porque ya no está en ese diccionario,
que es lo que queremos. Para las opciones restantes, solo
queremos
recorrer lo que aún
es una selección posible, gluting selecciones que ya se
han hecho
48. P47 Selección de recompensa por codificación con propagación de señal: Desde nuestra función Generar
opciones, tenemos esta variedad de opciones. De hecho, podría
ayudarnos visualmente a declarar el tipo aquí mismo
en lugar de inferirlo. Entonces, como tenemos una matriz, queremos
recorrer la matriz. Entonces para cada elección, creamos una instancia de nuestra escena de selección de
recompensas, y luego vamos a aplicar
la elección a esa escena, básicamente establecemos la elección
en la escena y tenemos que poblar su sub UI con
todo lo que necesitamos Entonces, para elegir opciones, vamos a crear
una selección de recompensa, que actualmente es un control, y eso va a ser igual a selección de
recompensa
punto de escena Instanciar Entonces tenemos que agregarlo de
niño a este contenedor HBox. Así que agrega hijo de Selección de
recompensa. Y luego diremos la
selección de recompensa punto setHoce y pasamos en el
Choice en él Nuestra selección de Recompensas, puedes ver por aquí, actualmente no
tiene guión. Esta función no existe, así que necesitamos crear una
función en el guión, y vamos a hacer eso
dentro de la escena empaquetada. Entonces queremos hacer clic en
Abrir y Editor. Entonces entramos en la escena empaquetada
original para este elemento de la interfaz de usuario en particular. Entonces en Selección de recompensas, queremos dar click en
adjuntar un Nuevo Guión, y lo llamaremos
Uilashrewardselection Crea eso. Y lado de aquí. Le daremos el
nombre de clase Selección de recompensas que hará que sea mucho más
fácil rellenar automáticamente sus funciones Y lo que nos importa aquí
es la elección del conjunto de funciones, y vamos a
pasar en una elección. Y esa elección es un artículo. Recuerdo. Entonces esto
volverá nulo. Y a partir de ahí, necesitamos
poblar todos estos elementos. Así que voy a tomar
la etiqueta de texto enriquecido, y vamos a cambiarle el nombre
para que sea etiqueta de nombre. Cambiemos el nombre del texto
directo para que sea icono rect. Cambiemos el nombre de la
segunda etiqueta de texto enriquecido para que sea etiqueta descripta, y cambiemos el nombre del botón
para elegir botón Bien, eso va a dejar mucho más claro lo que
en realidad se supone que deben hacer estos. Ahora que ya tenemos esos
ajustes,
volvamos a entrar en el guión de selección de recompensas el guión de selección de recompensas y obtengamos una referencia
a cada uno de ellos. Ahora bien, la forma en que
lo he estado haciendo a través del curso, y creo que incluso en este caso, todavía prefiero es hacer una en export var y vamos a decir
algo así como etiqueta de nombre. Es un tipo de lo que
sea, etiqueta de texto enriquecido. Bien, y entonces
solo puedes asignarlo en el inspector. Sabemos
cómo hacer eso, ¿verdad? Pero esto significa que cada vez que
configuras una copia del script, tienes que establecer
manualmente las variables de exportación. Así que sólo para mostrar otra opción, se
puede hacer en on ready var, digamos, icono Rec y eso va a ser
una textura rect Y luego le das un
eco signo y
lo colocas en el camino a su nombre. Entonces si digo elegir botón, automáticamente
se poblará
aquí. Podemos seleccionar eso. Y creo que esto necesita un letrero de
$1 al inicio. Así signo de dólar contenedor de margen, barra diagonal VBox contenedor
barra Escoja botón Ahora bien, lo que esto significa
es que al estar listo, va a obtener automáticamente esta ruta de nodo y
asignarla al texto directo. Por lo que no necesitamos
configurarlo manualmente en el inspector. No obstante, aquí hay
un defecto importante, que es que para ello se requiere el camino hacia ese
ítem sea el mismo Entonces, si tu botón de elegir
se llama cualquier
cosa que no sea botón de elegir,
no lo va a encontrar. Entonces esa sería una razón por que podría preferir hacer una en Export porque entonces
si por casualidad
reordenas
tus nodos aquí, siempre y cuando todavía
tengas el conjunto de referencia, no
va a
romper tu script Bien, entonces es por eso que generalmente
no uso eso, y voy a volver a cambiar
a en Export var icon Rect, que va a
ser una textura Rect Y luego queremos en Exportar etiqueta de descripción
var, que es una etiqueta de texto enriquecido aquí en Exportar var elegir botón. Es un botón. Bien, y para la elección de conjunto, solo
devolvamos el pase por
ahora mismo para que el script pueda guardar y haga clic
en Selección de recompensa. Ve a la parte superior derecha y
asigna cada uno de esos. Entonces nombre etiqueta a etiqueta de nombre, icono Rect a icono Rec, descripción a etiqueta de
descripción Y debido a que tenemos
dos etiquetas de texto enriquecido, aquí
es donde tener nombres
informativos como etiqueta de nombre y
etiqueta de descripción realmente ayuda en lugar
de que ambas se llamen texto
enriquecido y etiqueta de texto enriquecido dos. Sólo quiero
señalarlo. Y luego finalmente elegir botón que asignamos al botón de elegir. Entonces ahora tenemos una referencia
a todos esos, y podemos
llenarlos fácilmente con información
de nuestro artículo. Bien, entonces ahora para
manejar la elección del conjunto, podemos hacer el texto del punto de la
etiqueta del nombre, y eso va
a ser igual al nombre del elemento. Entonces en este momento nuestra clase de artículo
no tiene nombre. La subclase de elemento de arma
tiene una definición, y esa definición tiene un nombre, pero es posible que queramos un nombre específico de
elemento, y creo que este sería el enfoque
más sencillo para crear un nombre de elemento
en la clase de elemento Entonces, si subimos a
item, podemos hacer en Export VR display name, que va a
ser un nombre de cadena, y por defecto
lo haré como elemento sin nombre Entonces esto es una especie de distinción
entre el objeto y la definición
del arma porque un objeto no siempre es
necesariamente un arma, por lo que podemos distinguir aquellos con dos propiedades separadas, al
menos por ahora Así que ahora volvamos
a la selección de recompensas, y elegimos pchoice
dot display name Permítanme echar un vistazo a la definición del ítem de
lanza, y podemos ver aquí Entonces, la definición aquí
está realmente establecida para ser más una definición
del arma, cómo sube de nivel y
su valor de daño. Entonces la descripción del artículo suena como algo
que debería estar separado porque podrías recoger una copia de ese
elemento en el mapa del mundo, y diría algo así como,
Oh, este es un artículo de lanza Agrega la capacidad de tener
el arma a tu jugador, pero no es la definición
del arma en sí. Entonces sí queremos
distinguirlos. Entonces podemos decir descripción
etiqueta punto texto va a ser igual a
pchoice dot description Ahora necesitamos artículo para
tener una descripción. Copiemos ese nombre, haga clic
derecho sobre el ítem, símbolo Lou. Y lo haremos en
Exportar var, bueno, y lo haremos en export
var paste in description, que es una cadena, y
eso va a estar en blanco por defecto. Bien, entonces ahora en la
selección de recompensas, eso se maneja. A continuación, queremos
hacer el ícono Rect. Entonces podríamos decir icon
rect dot texture va a ser igual
a pchoic Una vez más, el artículo se distingue de la definición de
arma. Debe tener su propio
icono que se pueda configurar. Así que voy a hacer en la
exportación VR icono textura. Bien, y tenemos
el icono de textura, así podemos volver a Selección de
recompensas. Ahora bien, quiero tener cuidado
aquí porque si intentas
poner el ícono pchoicto cuando no
hay un ícono de punto pchoico, entonces vas a estar obteniendo una referencia nula en cuanto
intentes hacer referencia Entonces puedes
verificar manualmente si el ícono
existe cada vez, o podrías cambiar esto a pchoic dot Get icon y solo
tener esa seguridad incorporada Pero entonces tenemos que agregar esta
función a la clase item. Así que vamos a hacer clic derecho en
Lo arriba el símbolo, y luego voy a crear nuestra
función G icono aquí abajo, función G icono, y esto va a devolver
una textura o nada. Entonces si icono, entonces volvemos icono, lo contrario devolvemos nulo. ¿Bien? Creo que es bastante simple. Este método nos da
seguridad en caso de que sea nulo, entonces simplemente devolveremos null en lugar de tener
un error inmediato. Entonces el último es un
poco más complicado aquí. Tenemos el botón de elegir. Cuando se presiona el
botón de elegir, queremos hacer la
selección con la elección. Entonces queremos que el botón
sepa sobre la elección. Y luego pasamos esa señal
del botón siendo presionado
todo el camino hasta nuestra selección de subir de nivel para que
podamos aplicar el efecto al jugador
y cerrar el menú. Entonces aquí en el nivel de
selección de recompensa, queremos vincular la señal
del botón que se está presionando con la elección que pasamos
aquí mismo, la elección del artículo, y lo emitiremos como una señal
en la selección de recompensa, y luego la
selección de nivel arriba se conectará a eso yendo
más arriba en la cadena y básicamente podemos saber en el nivel superior cuándo cualquiera de se presionan nuestros botones y luego se aplican los efectos a nuestro reproductor. Entonces vamos a necesitar hacer, digamos, botón de elección. Entonces vamos a necesitar hacer choosebton press dot Connect, y vamos a
conectarlo a una nueva función en Pero vamos a
atarlo con la elección P. Entonces, cuando
lo estamos vinculando, básicamente estamos pasando un parámetro extra a la devolución de llamada que esa función normalmente no
tendría Así que la función subrayado sobre recompensa presionada ahora
obtiene la opción P, que es un ítem, y
va a volver nula, y ahora podemos seguir pasando
esta elección por la jerarquía Entonces podemos tener una señal
arriba AR en la parte superior, que dirá señal seleccionada, que pasará en una
elección del ítem. Ahora solo necesitamos emitir
esa señal, así seleccionada. Punto I MIT, y
pasamos en la opción P, y ahora puede
subir la jerarquía. Entonces sí, normalmente, una pulsación de botón no
tiene parámetros
cuando la recuperas. Simplemente informa que se presionó
el botón. Pero al llamar a bind, agregamos en este parámetro extra cada vez que se presiona eso. Entonces ahora nuestro botón puede darnos esa información muy crítica de qué elección se estaba
tomando en realidad. Técnicamente hablando, también
podríamos establecer la variable de elección local
aquí, y luego presionada, podríamos simplemente pasar
la elección local para la
elección de artículos. Entonces, si configuro eso cuando fije la elección, eso también
funcionaría. Dos formas de hacer lo
mismo, pero ahora conoces una forma mucho
más genial de usar la encuadernación, por lo que
en realidad puedes agregar parámetros adicionales. Además, esto no requiere la selección de recompensa para seguir
manteniendo esa elección, aunque definitivamente podría, y no sería
problemático aquí. Bien, así que vamos a ir más
arriba en la jerarquía. Ahora, en nuestra
selección de Lavop, que vamos a ver. Tenemos el contenedor
Caja Rewards. Así que aquí es donde realmente estamos creando las
selecciones de recompensa. Entonces aquí, necesito propagar de nuevo
la señal hacia arriba. Entonces digamos señal seleccionada, que va a pasar en el ítem
choice así como así. Así que cada vez que poblamos con
nuestro menú de selección de recompensas, y ahora que
tenemos un nombre de clase, podemos y debemos cambiar
esto para la selección de recompensas Y vamos a conectar
eso a las Recompensas seleccionadas. Entonces aquí abajo, en la parte inferior, crearemos este guión bajo de la
función de devolución de llamada
en Recompensas seleccionadas Obtenemos el P Choice, que es el ítem que
devolvemos nulo, y solo vamos a
propagar eso hacia arriba Así seleccionado punto EMT. Vamos a emitir
con la elección P. Entonces eso va más allá
arriba de la jerarquía ahora. Así que eso es a nuestro nivel
de contenedor Rewards box. Ahora en la selección de nivel superior, solo
necesitamos conectarnos a
nuestro contenedor de cajas Rewards. Así que vamos a exportar var
nuestro contenedor Rewards, que es un contenedor de
caja de recompensas. Y en listo, queremos
conectarnos a su señal. Contenedor de recompensas punto
seleccionado punto conectar en Recompensa seleccionada. Subrayado de función
en Recompensa, seleccionado. Déjame acercarme
un poco aquí. Y vamos a tener nuestra opción P, que es el artículo, y
volveremos nulos. Así que vamos a pasar por ahora, y vamos a necesitar aplicar el efecto al jugador
y cerrar el menú. Volveremos a
eso en un segundo. Entonces tuvimos nuestro método de
selección de inicio. Lo que queremos hacer es básicamente restablecer el contenedor de la caja de recompensas. Nosotros sí queremos que se complete,
pero también queremos que borre cualquier artículo existente Entonces en el contenedor de cajas de recompensas, voy a tomar poblar y hacer ese subrayado
y generar elecciones. También haré guión bajo
para privado para que no
llamemos accidentalmente a
eso desde nuestra interfaz de usuario principal Entonces aquí tenemos que
subrayar porque estamos haciendo subrayado
generar opciones. Ahora vamos a crear la función que realmente vamos a llamar. Así opciones de configuración de funciones. Sí. Bien, eso tiene algún
sentido. Y vamos a
pasar en nuestras opciones P, que es opciones de nivelación, y vamos a
pasar en P target, que es nuestro nodo
dos D. Por supuesto, vamos a poblar con esas opciones y nuestro objetivo Pero antes de eso, también
quiero despejar este menú. Entonces, cualquiera de los cuadros hijos, necesito eliminarlos antes de
poblarlos, o necesito asegurarme de
que mi relleno reutilice la interfaz de usuario existente y luego los actualice
con las nuevas opciones Entonces, debido a que aquí solo vamos
a tener algunas opciones, sería un poco
exagerado
preocuparse demasiado por reutilizar todos los
posibles componentes de la subinterfaz Entonces la opción más fácil
a corto plazo definitivamente
sería simplemente aclararlo, que va a ser
para niño y Niños. Sólo vamos a
llamar a niño punto Q gratis. Entonces ahora aquí arriba en la cima, podemos despejar antes de poblar. Ah, y tenemos que terminar un tipo de devolución para
las opciones de configuración. Entonces volveremos nulos. Bien. Sí. Así que ahora, setup Choices, podemos llamarlo en nuestro script de selección de niveles. Entonces inicia la selección,
vamos a hacer recompensas Contenedor
punto Iniciar Selección, y eso va a pasar en
las Opciones y el objetivo, que es el jugador de contexto. Y este es el
nombre equivocado para el método. En realidad se configuró Choices. Bien, entonces iniciamos la selección.
Nosotros establecemos las opciones. Esperamos a que el jugador
básicamente elija una opción, y luego vamos
a recibir nuestra devolución de llamada Entonces en ese punto,
queremos cerrar el menú. Entonces podríamos decir recompensas
contenedor punto CE aquí. Y sí hice de eso
un método privado. Entonces en el contenedor de la caja de Recompensas, solo
eliminaré el
guión bajo aquí y aquí Bien, entonces ahora se
llama internamente, pero también de otros scripts. Entonces, si necesitas hacer
público un método, puedes hacerlo. Técnicamente, una vez más,
GD Script no le
impide llamar a un método con un
guión bajo en él Es solo la mejor práctica
para indicar la intención. Así que de vuelta al nivel de selección
en Recompensas seleccionadas, queremos aplicar el
efecto de ítem al jugador. Diremos p choice dot
Intenta aplicar al jugador. Entonces ese va a ser
el reproductor de puntos de contexto. Después limpiamos el contenedor
y cerramos el menú. Bien, entonces vamos a ver. Aquí
sólo haremos un escondite. Y eso podría ser
prácticamente todo lo que necesitamos. Así que un poco de limpieza aquí. Vamos al contenedor de la caja de
Recompensas, y bueno, déjame mostrar la vista de
dos D, en realidad. Aquí puedes ver que
tenemos estas tres cajas aquí. Tener esos en la
vista aquí está bien siempre y cuando los
liberemos antes de comenzar a usar cualquier cosa. Entonces, si vamos a Rewards
Box container on ready, voy a querer llamar a Clear. Así función subrayado listo. Llamemos claros a
esos elementos de la interfaz de usuario. Entonces eso significará que estos se
eliminarán y serán recreados cada vez que el contenedor de la
Caja de Recompensas aparece. Queremos que sea lo más
óptimo posible, reutilizar cada componente de UI es mejor que tener que
recrearlo a partir de una instancia Pero para algo
sencillo como esto, solo
vas a mostrar
una vez cada no sé, 30 segundos de jugabilidad, casi no
debería tener impacto, y en realidad no es gran cosa. Bien, entonces todavía tenemos
la selección de lanza aquí. Entonces, si realmente
tratamos de subir de nivel, deberíamos ver una selección. Definitivamente es hora de seguir
adelante y darle una prueba y ver si realmente logramos
que salga y funcione en absoluto. Así que vamos a golpear Play. Y ya
veremos cómo funciona. Bien, entonces
parece que me olvidé de poner el contenedor de recompensas aquí
en la selección de nivel arriba. Entonces vamos a subir de nivel la
selección. Haga clic en eso. Y en la jerarquía, necesitamos asignar el contenedor de recompensas contenedor caja de recompensas. Entonces esa es realmente la debilidad de las propiedades de exportación, ¿verdad? Si olvidas configurarlo, entonces realmente
no hay ninguna indicación ahí, aparte de que vas a golpear errores en algún
momento del código. Entonces no necesitamos una afirmación
ahí porque la conexión
a la señal
ya va a arrojar un error en
cuanto falle Vamos a cerrar, y
volveremos a correr. Bien, entonces vamos a
recoger nuestro artículo. Boom, solo tenemos una
opción para elegir. Entonces hemos nombrado ítem aquí. Creo que simplemente no puse
un icono o descripción, pero se puede ver que
el método Get icon, porque manejamos
el caso nulo, no nos va a
dar un error. Mientras que si hacemos referencia directamente la propiedad del icono de punto
porque eso era Nulo, arrojaría un error aquí. Si pegamos a elegir, ¿va
a aplicar al jugador? Entonces, vamos a enterarnos de eso. Se debe cerrar el menú. Sí, pero me olvidé de
retomar el juego. Así que tenemos que volver aquí
y asegurarnos de que después ocultar el menú o tal vez
incluso antes de ocultar el menú, diremos Geth punto pausado
es igual a falso Guardemos eso y
corramos una vez más. Entonces entramos aquí,
hacemos nuestra selección, vamos a elegir el artículo.
Boom, ya está ahí. Ahora bien, parecía funcionar, pero la verdadera prueba
sería que si tuviéramos una exhibición para nuestros niveles de objetos de
arma aquí
arriba, trabajaremos
en eso en un poco. Por ahora, lo mejor que se puede
hacer sería acercar, y vayamos a nuestro objeto de lanza Voy a golpear el nivel dos, y vamos a cambiar
el tiempo de reutilización a 0.1, porque eso será muy obvio si actualizamos a ese nivel Entonces volvamos a golpear play.
Iré a recoger nuestro artículo, presionaré a elegir, y vemos que el tiempo de reutilización
no se actualiza Entonces algo está un
poco fuera en el código. Entonces creo que en realidad el
problema
va a estar en el
arma misma. Voy a verificar aquí para
asegurarme de que en
realidad estamos asignando el nivel
hacia arriba, así que ahí el punto de interrupción Y déjame ver aquí listo, obtenemos la
definición de enfriamiento para el temporizador. Pero puedes ver aquí estamos fijando la hora
para el temporizador aquí. Pero te apuesto aquí abajo, en realidad no
reiniciamos
el temporizador a un nuevo valor. Entonces, sí, ese es un problema
muy claro. Tenemos que decir el punto del temporizador. De hecho, digamos que empezar va a ser el nuevo valor. Entonces tenemos que hacer lo del enfriamiento de
G. Necesitamos obtener el punto de
definición Obtener enfriamiento de un nivel actual Entonces definición, punto Consigue
enfriamiento de nuestro nivel. Lo que esto significa es que cada vez que
estamos reiniciando el temporizador, estamos obteniendo el
enfriamiento actual de nuestro nivel Entonces, si digamos a mitad de camino
disparando un proyectil, cambiamos nuestro tiempo de reutilización
porque nuestro nivel subió Entonces esto significa que la próxima vez que ese proyectil se lance
después de que se lance, vamos a reiniciar el
temporizador con nuestro nuevo valor Por lo que ahora utilizará la propiedad
Nivel dos. Y creo que ni siquiera necesito
tener este punto de ruptura. Estoy bastante seguro de
que ese es el problema. Sigamos adelante y golpeemos Play. Voy a seguir adelante
y recoger nuestra arma, golpear elige, y ahí tienes. Básicamente tenemos una lanza
de ametralladora porque nuestra lanza golpeó el nivel dos, y esto va a ser
completamente frenética de juego Entonces yo recomendaría al final, solo
cambiamos el
frío aquí abajo para nuestro proyectil de lanza de nuevo a 0.9 ahora que sabemos que funciona, y eso va a ser una
envoltura para este video
49. P48: aplicación de estadísticas de nivel de armas a instancias y espolvores de proyectiles: demostró que podemos mejorar
nuestras armas a través la selección
de recompensas al subir de nivel, pero debemos
asegurarnos de que cuando subamos de nivel nuestras armas
estamos usando todas las
estadísticas correctas para el arma, no solo la reducción de
enfriamiento. Entonces entremos en el
guión para proyectil. Y vamos a ver dentro
de aquí que aún no estamos usando las estadísticas
del nivel de arma. Estamos usando una velocidad incorporada, y el daño final
no se hace por ningún corte
de cálculo. Es solo pasar 100
como la variable local. Entonces, si has estado notando en la definición de nivel de arma, aún no está usando esas estadísticas, bueno, por eso Entonces, cuando creamos
el proyectil, tenemos que pasar también en el nivel del
arma Podríamos tener una función totalmente
separada para hacerlo, pero creo que en realidad podría ser más práctico solo poner las estadísticas de nivel de arma
en la función de lanzamiento. Por lo que la función de lanzamiento está pensada no solo para establecer
la dirección sino también configurar las estadísticas
específicas del proyectil, sino que el lanzamiento
también está destinado a configurar las estadísticas específicas de lanzamiento para este proyectil en función del nivel
actual del arma Entonces como perímetro extra, vamos
a querer pasar en el nivel P, que es un nivel de arma. Así que esas serán todas las estadísticas que
necesitamos traer aquí. Y en vez de en la
cima tener una velocidad aquí, voy a quitar y en cambio
vamos a decir var nivel de
tipo nivel de arma, y ahí es de donde vamos a sacar todas las estadísticas. Entonces, cuando estamos haciendo el proceso de
física y
necesitamos multiplicar por la
velocidad, haremos nivel. Velocidad de punto. Bien.
Vamos a agregar eso en. Y ahora en el lanzamiento, necesitamos establecer el nivel
igual al nivel P. Bien, así es como
ingresamos las estadísticas, y luego solo necesitamos
actualizar nuestras llamadas para lanzar. Pero
aquí hay otra información que es relevante. Entonces, antes que nada, cuando el
hit box golpea un cuadro rt, necesitamos sacar el daño
de las estadísticas de nivel. Entonces aquí necesitamos un cálculo de
daño aleatorio entre nuestros hombres el daño por el
arma y nuestro daño MAX. Entonces voy a quitar esta línea, y diremos var damage
va a ser un entero, y eso va a ser igual
a un rango entero aleatorio entre el daño mínimo
y el daño máximo. Entonces nivele el punto Min daño, y luego nivele el punto Max daño que maneja la
aleatoriedad aquí. Entonces tenemos
nuestro daño final. Solo diré que eso es igual
al daño en este momento, y luego pasamos nuestro
daño final a la caja de Hurt. Entonces ahora tenemos
daño aleatorio basado en el nivel y la velocidad que establece
el nivel, también. Entonces, si miramos un guión de
arma dos D ahora, vamos a obtener un error para lanzamiento de
proyectil punto porque
necesitamos pasar en el
nivel actual del arma dos D,
que está convenientemente configurado
aquí en el que está convenientemente configurado arma dos D.
Así que digamos coma, nivel de
arma aquí, y eso solo lo envía
desde el nivel de arma
a la instancia de proyectil Para que podamos probar esos cambios
ejecutando el juego ahora. Así que vamos a ir a buscar nuestro enemigo o a donde quiera
que tengan ganas de desovar Bien, ahí hay uno. Y
verás que tenemos daños aleatorios
entre nuestros hombres y MAX. Actualmente, se puede
ver que sigue
pasando por el enemigo,
ahí está nuestro nivel arriba. Entonces, en teoría, esto
debería ir un poco más rápido tanto en el
enfriamiento como en el daño. Se pueden ver los
daños allá arriba. Entonces, en su mayor parte,
eso parece estar funcionando. Pero aún quedan algunas
cosas que tenemos que ajustar, como cuántos golpes puede hacer antes de eliminar realmente
el proyectil Entonces en el golpe de hipbox, realidad
queremos incrementar
cuántos golpes hemos hecho, y si los golpes son iguales
a nuestros golpes MAX o mayores, entonces queremos liberar
nuestro Entonces aquí arriba en la parte superior,
vamos a tener un var hits, y esto será un entero. Va a comenzar en cero. Y cada vez que golpeamos el éxito. Voy a ir al inicio
aquí y decir var hit iguala P herido Box
dot Tri Damage. Y luego diremos, golpeo, luego golpea más es igual a uno. Y entonces también podemos
decir, I hits es mayor o igual al nivel Max hits, entonces vamos a
liberar sobre nuestro proyectil Entonces ahora esto puede liberarse si el temporizador transcurre por su básicamente persistencia
en la escena del juego, que necesitamos reemplazar
con la variable aquí, también, por cierto O si los
hits golpean sus golpes máximos, entonces se liberará
inmediatamente, también. Entonces entonces aquí arriba, también queremos decir que cuando
creamos el temporizador, vamos a agarrar
la propiedad del nivel. Entonces decimos nivel, y no
creo que
realmente lo hayamos establecido todavía. Entonces necesitamos, como, una duración. Vamos a crear una
estadística de duración cuatro nuestra arma. Bien, entonces nivelar la duración del punto. Eso significa que tenemos que
saltar al nivel de arma. Busca el símbolo, y vamos a crear la duración aquí
abajo en la parte inferior. Vamos a decir en la exportación var
duración va a ser un float igual a
digamos 5 segundos por defecto. Entonces ese es el
número máximo de tiempo que el proyectil puede persistir en el mundo del juego antes de su eliminación, asumiendo que no
se elimina por algo más como golpear o exceder
el número máximo de golpes Bien, así que sigamos
adelante y
volvamos a golpear play . Entonces voy a golpear play. Ahí está nuestro proyectil de lanza, vamos a esperar a que
aparezcan algunos enemigos vamos a esperar a que
aparezcan algunos enemigos.
¿Bien? Entonces tenemos eso. Y se puede ver, lo que es
muy importante, tan pronto
como un sujeto es golpeado, la lanza se quita sola Entonces ese es un cambio enorme. Y si subimos de nivel al nivel dos, debería seguir siendo
lo mismo,
pero nuestro daño sube. Y tratemos de ver
este proyectil, y desaparecerá
después de 5 segundos. Entonces 45. Bien, ahí se puede
ver a los proyectiles desapareándose del mundo
del juego Eso es muy importante
porque de lo contrario, posible
que nunca se eliminen, y solo estarían tomando recursos
del sistema sin motivo alguno. Entonces sí queremos que esos eliminen
automáticamente con el tiempo. Bien, ahora
también hay algunas otras propiedades de
nuestro nivel de arma, el retraso de generación, el
desplazamiento de lapso y los proyectiles Así que tenemos
que asegurarnos de que en nuestra arma a D, realidad
estamos generando
los proyectiles adicionales, los
estamos generando en relación con el desplazamiento y cualquier proyectil
adicional, tenga un retraso después de que se lance el
primero Y luego con el span delay, cualquier proyectil
posterior al primero, tiene un retraso antes de
que se genere. Bien, así que vayamos a las armas
a D. Así que cada vez que lanzamos, necesitamos los
proyectiles para engendrar Entonces necesitamos un
bucle de cuatro, digamos, cuatro índice en rango
cero a nivel de arma. Puntear proyectiles, y luego
incrementaremos en uno. Así que solo hacemos un bucle de
esto unas cuantas veces. Después de que se lance cada proyectil, vamos a esperar
Kit tree Create timer, y necesitamos ese punto de
nivel de arma Span Delay Bien. Y luego vamos
a esperar el tiempo de espera. Entonces, después del primer bucle, esperamos que se agote el corto
lapso de tiempo antes de crear
nuestra segunda instancia de proyectil por lanzamiento, y estamos creando proyectiles en función de
cuántos
proyectiles nos permita el Después, si quisiéramos, también
podríamos mezclarlo con, digamos, un bono del jugador. Entonces, si el jugador tiene más uno proyectiles para todas las armas, entonces tenemos una función para sumar esos dos números
juntos para obtener el número total de
proyectiles Entonces, finalmente,
necesitamos generar un desplazamiento aleatorio
basado en la distancia
de desplazamiento de nuestro nivel de arma. Entonces para nuestro desplazamiento, va a ser igual
a un vector dos, y luego vamos
a hacer un rango
F aleatorio para la X y la Y. Entonces rango F aleatorio, negativo 1.0 a 1.0, y luego rango F aleatorio, negativo 1.0 a 1.0. Y multiplicamos esto por el nivel de
arma. Desplazamiento de puntos. Entonces esto nos va a
dar un valor aleatorio entre la
distancia máxima negativa en el desplazamiento de span, y luego el
desplazamiento máximo positivo aquí para la X, y lo mismo para la Y
y la Y. positiva Así que esto técnicamente dará una forma cuadrada porque la X y la Y no se
afectan entre sí, por lo que puede ser negativo 1.0
tanto en X como en Y o positivo
1.0. Creo que está bien. Sólo estamos tratando de
tener un desplazamiento simple. Realmente no
importa demasiado si es un cuadrado o círculo a menos
que quieras que importe. Entonces voy a bajar aquí
al proyectil y
vamos a sumar en el offset Bien. Y entonces eso hará que cada vez que
engendremos el proyectil, tenga algún offset si
tenemos ese set en el arma Entonces si miro el ítem de
lanza, bueno, podemos ver que aquí
no tenemos ningún desplazamiento de span Entonces tal vez queramos
establecer uno. A ver. ¿Cuál sería el desplazamiento máximo de
píxeles que me gustaría hacer? A lo mejor como cinco. Y luego solo haremos
cinco por todos ellos. Entonces abre cada
nivel de arma, y haremos cinco. Entonces esto puede ser
positivo o menos cinco o cualquier cosa intermedia tanto
para X como para Y.
Y entonces voy a correr, y ya veremos como va esto. Así que vigila dónde están desove las
lanzas. Y puedes ver que
están un
poco compensados el
uno del otro, ¿verdad? Entonces no está estrictamente en la
misma posición cada vez. Y luego también lo hace un poco más interesante
para alguna varianza. Bien, ahora, lo que quiero hacer es tomar el arma
nivel uno para probar, y vamos a llegar a tres proyectiles,
y voy a
hacer este bondlay
0.05 segundos, que
ya y voy a
hacer este bondlay 0.05 segundos, que Así que vamos a jugar y ejecutarlo, y deberíamos conseguir como una
cadena de tres proyectiles Uno, dos, tres, uno, dos,
tres, uno, dos, tres. Entonces puedes ver aquí
uno, dos, tres. Oh, ahora, un pequeño problema aquí, se
puede ver que si giro después del lanzamiento del primer
proyectil, los otros proyectiles
también rotan cuando
son instanciados también rotan cuando
son Bien, entonces para esto rotar Rads, quiero calcular eso
fuera del bucle cuatro Yo sólo quiero hacerlo una vez. Una vez que se lanza el primer
proyectil, todos los demás deben quedar
bloqueados en esa dirección Así que sigamos adelante y golpeemos Play. Y ahora si me muevo
, pero giro, deberías ver que
los tres siempre
van a ir
en la misma dirección, que suele ser lo que
tú quieres, creo. Así que vamos a eliminar los
proyectiles adicionales para nuestro primero podemos mantener ese desplazamiento de engendro personalizado
para todos estos Si quieres, incluso podríamos establecer que un arma predeterminada
tendría un desplazamiento de span, pero eso depende de
ti si quieres volver atrás y personalizar esos valores predeterminados de nivel de
arma Déjame revisar el guión de nivel de
arma una vez más y ver si lo
hemos manejado todo. Por lo tanto, daño mínimo, daño
máximo, velocidad, proyectiles de
enfriamiento, golpes
máximos, desplazamiento, retraso y duración Sí, estamos usando todas las variables de
nuestro nivel de arma, y eso nos da bastante
personalización para cualquiera de las armas que
queremos crear.
50. P49 Construir un arma de tira giratoria: En este punto, ya que tenemos
un sistema de trabajo de subir de nivel, queremos tomarlo y
agregarle opciones adicionales. Entonces ahora sería un momento perfecto para agregar una segunda
arma a nuestro juego. Por lo que este será similar
al primero. Añadiremos una guadaña,
y la guadaña podrá
girar alrededor de la pantalla lugar de ir
directo como Entonces, si abrimos el
punto de lanza TSC y las armas, se
puede ver que
ya tiene la mayoría de los componentes que vamos
a necesitar para nuestro Así que solo voy a
duplicar de esta escena en la parte inferior derecha
haciendo clic derecho sobre la escena y
voy a duplicar. Entonces pongamos en
Syth aquí punto TSCN. Bien, entonces ahora puedo buscar Syth en el proyecto
y abrirla. Vamos a acercar el centro. Algunas de las cosas obvias que
queremos cambiar primero, el nombre del proyectil, entonces lo llamaremos Syth Y luego se debe
seleccionar el sprite de la
textura del atlas para el sprite de guadaña Entonces voy a hacer click
aquí, ampliar el at, y usaremos los
mismos sprites de madera Entonces, si recuerdo, hay un
buen Syth aquí que podemos usar. Entonces seleccionaremos
eso y golpearemos cerrar. Ahora puedes ver que
el hit box ya no sentido porque
tiene esta curva aquí. Entonces queremos hacer clic en
nuestra forma de colisión, y voy a parar aquí y luego expandirla hacia la
derecha algo así, o incluso podría hacerla más
como un cuadrado rectangular, si quiero cubrir
todo el borde de la pala. Entonces hagámoslo. Ahora bien, si nos
instancia de este proyectil, todavía
va a funcionar
casi exactamente como la lanza, donde sólo
va a ir Entonces, lo que realmente queríamos hacer es rotar alrededor
del punto central. Entonces eso va a significar que
necesitamos un desplazamiento, y necesitamos rotar
ese desplazamiento alrededor en un círculo y eso
nos dará nuestra animación de giro. Así que vamos a hacer clic derecho en el sitio. Voy a añadir un nuevo nodo dos D, y luego este nodo dos D será el padre del
Sprite y el hit box Así que vamos a mover los de aquí abajo. Y luego voy a renombrar
esto para que sea Rotator dos D, y hagamos clic derecho y
adjuntemos un guión a él Entonces armas Rotator
dos D está bien. Vamos a crear eso vamos a darle el nombre de clase rotador dos D, y luego queremos poner en un
par de propiedades aquí Entonces vamos a darle una velocidad
para este nodo rotador. Así que recuerda, este rotador
es hijo del objeto base. Entonces el objeto base va
a tener su propio movimiento, y entonces este sub objeto
va a estar controlando
la rotación específicamente. Entonces ambos se mueven
al mismo tiempo, pero son independientes el uno
del otro. Entonces a la velocidad var de exportación,
que es un vector dos, y voy a tener este
valor predeterminado a diez píxeles a la derecha y
cero en el eje Y. Entonces esto va a afectar
el movimiento en la pantalla. Pero también queremos que el nodo gire
físicamente también,
así que parece que nuestro
sitio está girando. Así que a la exportación var grados de velocidad de
rotación, eso va a ser un flujo,
por defecto lo voy a 360, lo que significaría una rotación
por segundo en este caso. Y luego solo
necesitamos actualizarlo sobre proceso o proceso de física. Haré proceso de física para ser consistente con otro
movimiento en el juego. Entonces digamos si nuestra cantidad va a ser igual a
grados a resplandor. Entonces vamos a convertir
estos grados
de velocidad de rotación una cantidad de resplandor. Entonces necesitamos los grados de
velocidad de rotación multiplicados por el Delta para obtener la cantidad de rotación desde la
última actualización del fotograma, y luego vamos a rotar por esa cantidad en luminosidad Entonces incluso podemos llamar a esta cantidad RDs si queremos tener claro que eso es una cantidad de resplandor y lo
haré un flotador también, solo para darle la
mayor claridad posible Bien, entonces necesitamos mover
físicamente el nodo, y eso va a estar
basado en nuestra velocidad aquí arriba. Entonces voy a decir que nuestra
jugada va a ser igual
a la velocidad multiplicada por Delta. Y luego llamamos a traducir
en movimiento cantidad, y ese es esencialmente
nuestro guión rotador Entonces, si necesitas
personalizar algún valor, tienes
aquí al inspector para asignarlos. Entonces ahora queremos
crear un arma dos D que pueda
instancia de nuestras miras. Entonces busquemos
el arma de lanza si incluso la
guardamos para el proyecto Entonces ahora busquemos
el arma de lanza. Vamos a abrir eso. Vamos a echar un vistazo aquí. Entonces este es el nodo dos D con un reproductor AudioStream que reproduce el sonido de slash cuando
instancia un arma Entonces quiero duplicar
esto y luego crear una definición de Syth
para nuestra arma Entonces, dupliquemos la escena del
arma de lanza como arma Syth. Entonces busquemos de nuevo a Syth. Haga doble clic en Abrir Syth, renombrar arma de lanza
a arma Syth Y luego a la derecha,
necesitamos crear una nueva definición. Entonces voy a acercarme aquí, nueva definición de arma, y
esta va a ser Syth Nuestro icono, solo podemos copiar del proyectil Syth real Entonces voy a ir a la
escena de Syth y luego vamos a hacer clic en el sprite y dar
clic derecho sobre la textura,
copiarla, ir
al arma guadaña,
y luego pegarlo en el icono con clic derecho Pegar Bien, ahora necesitamos definir
algunos niveles de armas aquí. Así que vamos a crear nuestro set. Empezaremos con el
nivel de arma uno, nuevo nivel de arma. Entonces, ¿cómo queremos que
funcione nuestra guadaña? A lo mejor la guadaña se mueve
más lento que un proyectil normal. A lo mejor es enfriarse es más largo, así que podríamos decir como 1.5. Antes de que Max golpee, lo
pondré a las cinco, para que la guadaña pueda golpear a muchos objetivos antes
de que se Por daños, también vamos a
golpearlo a 20 a 30. Y proyectiles uno. Bien, entonces agreguemos
ese par de valores clave, y luego haremos el nivel dos
con un nuevo nivel de arma. Expande el nivel
de arma uno para que pueda comparar. Y luego haré,
digamos, de 30 a 40 daños, velocidad de 55, enfriamiento de 1.4. Max hits de seis, y voy a
añadir ese par de valor clave. Hagamos el nivel tres,
así sucesivamente y así sucesivamente, quiera
hacer los números. Bien, así que aquí están los números con los que fui en el nivel de arma tres. Puedes hacer una pausa
si quieres copiar. Aquí tenemos arma nivel
cuatro, arma nivel cinco. Y arma nivel seis. Y creo que eso debería ser
suficiente por ahora mismo. Bien, así que si recuerdo, no
he establecido en la definición de arma
la capacidad todavía no
he establecido en
la definición de arma
la capacidad de
elegir tu escena repleta. Entonces en definición de arma, quiero agregar un G visto opciones. Entonces, por ahora,
lo haremos por defecto a una variable de exportación. Entonces voy a decir exportar escena de realidad virtual, y esta será una escena repleta. Bien, y luego en vez de que
Getsn cargue la lanza, queremos regresar escena Entonces, debido a que estamos usando
un método get seen, tenemos la capacidad más tarde de entrar y
cambiar si hay algunas escenas adicionales que queremos considerar pasar en
lugar de la base predeterminada. Pero esto debería ser bueno por ahora, pero en realidad no necesitamos una
segunda escena por el momento. Bien, entonces ahora
solo tenemos que
asegurarnos de que en la definición de
guadaña, carguadaña rápidamente Y luego en la definición de
lanza,
así que busca la definición de lanza.
Haz doble clic en eso. Y luego necesitamos
cargar rápidamente la escena de la lanza. Bien, y ahí debería
estar bien. Creo que
lo último que necesitamos para nuestro Syth es el artículo Syth Ahora queremos encontrar el
elemento Spear en nuestro proyecto, duplicar eso y crear
un punto de elemento Syth TRS Así que busca el artículo Syth. Y ese ítem de Syth
vamos a asignarle, por supuesto, la definición de
guadaña Ahora, para que nuestros Sitios se agreguen
como arma a nuestro jugador, vamos a necesitar una
referencia al arma dos D. Que podamos agregar a la
carga de nuestro jugador porque eso no existe ya en el jugador, por lo que hay que agregarlo Bien, entonces para agregar nuestra referencia
a la escena del arma, en realidad no
podemos usar la escena del pacto porque
si hacemos
eso, va a tener una referencia
cíclica
porque el arma TD
ya hace referencia porque el arma TD a este recurso de definición de
arma Entonces en este caso, para
sortear eso, necesitamos hacer un archivo de exportación, y esto será en
comillas, punto estrella TsCN, que significa que podemos
filtrarlo por cualquier cosa que tenga la extensión punto
TSCN al Y vamos a decir var
arma dos D camino, y esto será una cuerda. Este es el camino hacia
la escena del arma para agregar dos
cargas de armas como el jugador Bien, entonces ahora, si
miramos nuestra definición de lanza, podemos asignar al
arma dos caminos D, que va a estar en armas, y entonces tenemos
arma lanza aquí, Entonces eso es lo que necesitamos. Y entonces tenemos que hacer lo
mismo con guadaña Entonces busca guadaña. Y parece que lo
llamé arma guadaña, pero eso se suponía que era la definición
del sitio aquí abajo. El TRES es la definición. La escena es el arma del sitio. Bien, entonces haz doble clic
en la definición del sitio y luego asígnale la ruta. Así que en realidad puedes
simplemente arrastrar y soltar de aquí a allá, y
eso lo asignará. Entonces en objeto de arma ahora, si la carga no
tiene ya el arma, entonces necesitamos agregar realmente la nueva arma en el
nivel de arma uno a la carga En lugar de devolver
falso aquí y tri apply, en realidad
vamos a
crear la nueva arma. Entonces podemos decir que el arma
va a ser igual a. Veamos nuestra definición
arma dos ruta D, queremos instanciar Entonces vamos a decir
carga en la ruta, y luego instanciamos Y esa va
a ser nuestra arma. Entonces tenemos
que agregar eso a la carga. Entonces carga Agrega arma y
vamos a agregar el arma. Si eso funciona,
queremos devolver la verdad. Entonces, si tenemos nuestro artículo ahora
podemos agregarlo a la lista de posibles artículos para que
nuestra IU de recompensa genere. Entonces, si hago clic en la escena de selección de
subir de nivel y
vamos al primer nodo
aquí por encima de la derecha, tenemos nuestras opciones de
nivelación de nivel uno, y ya agregamos
en el ítem Spira Así que agreguemos en el elemento del sitio. Tan rápido carga nuestro artículo del sitio, dale un peso de uno, agrégalo. Bien. Y luego vamos a darle a Play y veamos qué pasa
cuando vamos por aquí. Entonces puedes ver que
dice artículo sin nombre, y realmente no
vemos ningún detalle Si le pego a elegir,
en realidad no es lanzar
el nuevo proyectil Así que todavía tenemos algo de
trabajo por hacer para eso, personalizando los artículos y
asegurándonos de que se carguen
correctamente, y nos encargaremos de eso
en la siguiente parte
51. P50: crea una interfaz de usuario para mostrar armas y el inventario del juego: Proyecto que realmente necesita ahora es la capacidad de ver
qué armas
hemos equipado en la parte superior
izquierda con el indicador UI. Y cuando subimos de nivel para mejorar la primera arma
o elegir una nueva arma, y conozco estos nombres y
descripciones aquí también. Eso también va a aparecer
aquí para que podamos asociar lo que deberíamos estar viendo y lo que
realmente estamos viendo. Entonces eso nos ayudará
con la depuración, pero también es muy útil
para el jugador también Así que vamos a seguir adelante y
crear una nueva escena de interfaz de usuario, así que voy a hacer clic en Más aquí arriba. Entonces quiero que se nombre este nodo de
control para, digamos, exhibición de
armas y también voy a hacer clic
derecho y cambiar su
tipo a un contenedor de panel. Bien, eso nos dará un
trasfondo por defecto. Entonces dentro de aquí,
voy a querer un contenedor de margen
y luego seguirlo con contenedor HBox
para organización Entonces haga clic derecho en Agregar
un contenedor de margen, y luego haga clic derecho en
Agregar un contenedor HBox Bien, y luego aquí
vamos a diseñar básicamente un icono con un indicador de nivel
para cada una de nuestras
armas de izquierda a derecha. Tomemos la exhibición de
armas y encojamos para que quede mucho
más así. Y luego lo voy a guardar nuestro proyecto en la carpeta UI, así en la carpeta UI las
armas se muestran. Y vamos a poner una copia en nuestra jugabilidad UI Canvas para que podamos ver cómo
va a quedar eso más o menos. Entonces busca arma, y
luego vamos a agarrar exhibición de
armas y
colocarla debajo de la interfaz de usuario. Y podemos ver que ahí es
bastante grande. Así que puedes hacer clic aquí y
saltar a la pantalla de armas, y vamos a encogerlo a tal vez más como el
centro de la pantalla. Anote el cuadro azul que indica
nuestro tamaño completo de interfaz de usuario. Entonces esto va a necesitar ser un poco más pequeño, de verdad. Y probablemente también quiero compensar
desde el centro. Hagamos el centro de diseño
por defecto, también. Ahora podemos volver a
la jugabilidad UI Canvas. Ahí podemos ver nuestras armas
exhibidas. En realidad no está
apareciendo como esperábamos. Entonces en exhibición de armas,
voy a tomar
los anclajes preestablecidos, y vamos con el centro
por defecto o el centro superior, más bien. Así que centro superior. Y podemos ver
el problema por qué se redujo a Así que voy a tomar el tamaño mínimo personalizado
aquí arriba y vamos a establecer un valor por defecto. Voy a decir 200 para la
X y luego 50 para la Y. Eso solo será para que
podamos verlo
y ajustarlo en
nuestra interfaz de usuario de juego. Así que voy a repasar a
la jugabilidad UI Canvas, y ahora podemos
posicionarlo donde lo necesitemos. Entonces voy a
posicionarlo, digamos, aquí
a la derecha de nuestro bar
principal de salud y barra EXB, y lo voy a arrastrar así Bien. Y entonces
podremos tener algunos íconos mostrando para nuestros niveles de armas. Entonces, para saber de eso,
vamos a querer usar nuestro contexto de jugador para que
podamos mostrar qué armas tiene
el jugador. Entonces en exhibición de armas, agreguemos un guión islas armas
pantalla punto GD Y entonces vamos
a querer exportar var el contexto, que es el
contexto del reproductor aquí, y podemos asignarlo
en el inspector. Tan rápido carga el contexto
del jugador. Y luego listo,
vamos a querer usar eso para
obtener referencia a nuestra carga de armas. Así que la función subrayado listo, va a devolver void, y luego vamos a decir
contexto punto jugador punto ¿Tenemos una referencia
a la carga? Nosotros no. Entonces, si
no queremos que esa otra propiedad incorporada
del jugador y que eso se haga referencia directamente en el guión
del jugador se ajuste para esto, podríamos decir encontrar hijos, y el patrón va
a ser citas vacías. El tipo va a
ser la carga de armas. Entonces esto nos va a
dar una matriz. Tomaremos el primer resultado de esto haciendo
corchetes en un cero, así que eso significa
índice de matriz de cero. Y vamos a asignar
eso a una carga. Entonces nuestra
carga de subrayado va a ser una carga de armas de carga de armas. Y vamos a decir que la carga de
subrayado es igual
al resultado de eso y
sí queremos afirmar que
eso no es nulo Así aseverar subrayado loadout
no es igual a null. Debe tener una carga sobre el jugador para mostrar
para exhibición de armas, nombre
porcentual al final para que podamos obtener el
nombre de este nodo Y entonces queremos que las armas de nombre de
clase se
muestren aquí arriba en la parte superior. Esto mostrará las armas y los niveles para el personaje de
contexto. Entonces hagamos otro
en Export var. Esto será para la UIC. Vamos a
instancia para cada una de las armas de nuestra carga. Así que hazlo en Export var. Digamos exhibición de armas, que será de
tipo exhibición de armas, pero aún no lo hemos creado. Y para indicar
que esta pantalla también hace más que
simplemente mostrar los datos, sino que también engancha todo. De hecho voy a
cambiar el nombre de esto para ver. Eso ayudará también a diferenciar
de la exhibición de armas, el contenedor sub UI. Y luego voy a renombrar
tanto la exhibición de armas. Y luego voy a renombrar tanto
el despliegue de armas punto GD el TSCN Entonces esto será ahora
Weapons View y aquí arriba, armas view dot TSCN Bien. También salta a la escena de vista y renombra
el nodo raíz, también. Eso es bastante importante.
Entonces las armas ven ahí. Ahora necesitamos crear nuestra exhibición de armas
individual para que pueda entrar dentro
de la vista de armas. Así que agreguemos una nueva
interfaz de usuario a nuestro juego. Esta será una
interfaz de usuario al inicio. Y estoy pensando
que la raíz aquí, también
podemos querer que
sea un contenedor de panel. Siempre se puede hacer
un panel vacío, pero tener la capacidad de tener el fondo es
algo de ayuda. Entonces cambiemos esto
a un contenedor de panel. Voy a cambiar el nombre de la raíz
para que sea exhibición de armas. Hagamos clic derecho sobre él, agreguemos un contenedor de margen de nodo hijo, si acaso lo necesitamos
y luego haga clic derecho en Agregar un wect de textura
para mostrar nuestro icono Haremos clic derecho para agregar una etiqueta. Y en realidad estoy
pensando que no necesito un contenedor VBox o HBox para esto porque
en realidad puede que quiera que la etiqueta escriba sobre la textura Para muchos juegos
que tendrían una textura y luego
texto al mismo tiempo, realidad
escribiría el
texto sobre el icono de textura. Se vería que mucho
en los sistemas de inventario por el número de artículos
en el inventario. Excepto en este caso,
estamos hablando del nivel del arma que
está equipada para el jugador. Entonces, como texto de prueba, podríamos decir el nivel X aquí. Por supuesto, podemos ver que la pantalla está
ocupando ahora la pantalla completa. Así que vamos a reducir eso. Voy a ir a la exhibición de armas
base, y tomaremos el diseño a
los anclajes preestablecidos arriba a la izquierda Bien, eso debería
reducirlo dramáticamente. Entonces ahora podemos ver que
sólo está mostrando el texto. Vamos a establecer una textura
en esta textura rect. Entonces haré una nueva textura de
atlas, y luego cargaremos
rápidamente un atlas. Busquemos
tal vez el 16 por 16. Hoja de sprites en nuestro
juego para todos los iconos, y luego queremos editar
región y seleccionar uno Entonces algo que
parece un arma. Aquí tenemos una espada que
funciona bien, y podemos cerrar. Bien, podemos ver que
el icono de la espada está ahí, pero no está respetando
la relación de aspecto, así que queremos ir al
modo stretch y cambiar esto para mantener
centrado el aspecto, creo. Bien, ahí tenemos
eso. Y ahora queremos llevar nuestro contenedor principal de
exhibición de armas, y queremos que también sea de un tamaño
específico. Entonces voy a decir talla
mínima personalizada 48 por 48. Eso nos va a dar una plaza aquí. Y voy
a querer tomar el texto de la etiqueta, y queremos que esté
centrado en la parte inferior. Así que la alineación vertical
a abajo por aquí en el
verá que en
realidad no cambia nada
porque necesitamos expandir el tamaño de la
etiqueta para
que el texto se centre en la parte inferior. Así que ve a maquetación ahora, y vamos a querer que se llene el dimensionamiento
del contenedor, creo. Sí. Bien, ahí.
Entonces ahora va a mostrar el nivel X ahí
en la parte inferior derecha. Y ahora
parece que queremos un poco de búfer entre nuestra textura
rect y nuestra etiqueta Por ahora,
guardemos esto nuestra carpeta UI, nuestra pantalla de
armas. Y creo que lo que queremos es
un contenedor de segundo margen. Entonces voy a dar click en
el primer contenedor de margen, agregar en otro contenedor de margen, y este va a ser
el padre del texturect Entonces, volvamos a posicionar eso en la parte superior para que
el texto se muestre por encima. Ahora, con este contenedor de margen, vaya a las anulaciones de tema, y queremos que el margen inferior sea algo así como diez píxeles De esa manera, el texto no
va a mostrar ya sabes, sobre los
pedacitos importantes de nuestro icono. Quizá hasta
lo necesitemos más que eso. Entonces probemos 12. A lo mejor incluso lo necesitamos
más que eso, en realidad. Para que podamos ver cómo
va a quedar más correctamente, vamos a aplicar nuestro tema de juego
a la exhibición de armas. Así que haz clic en la pantalla de armas, encuentra el tema y luego
carga rápidamente nuestro tema actual. Bien, entonces ahora eso es mucho más pequeño y está en la esquina
inferior izquierda. Creo que lo quiero en
la parte inferior derecha. Entonces haga clic en la etiqueta, y tomemos la
alineación horizontal a la derecha. ¿Bien? Eso se ve
bastante bien, pero está un poco demasiado
cerca del borde. Entonces quiero tomar el contenedor de margen
padre. Ese es el que está justo
debajo de la exhibición de armas, y quiero establecer algunos márgenes. Entonces vamos a las anulaciones de temas y tal vez dos píxeles
en cada uno de estos Bien, eso se ve bien. Excepto tal vez el margen inferior.
A lo mejor no necesitamos eso. Sí. Bien. Eso me gusta más. Bien, ahora, nuestra
exhibición de armas va a necesitar una referencia al
arma dos nodo D. Y luego siempre que el arma
dos nodos D suba de nivel, cambiamos el texto aquí
para mostrar el nuevo nivel. Entonces agreguemos un guión
a la exhibición de armas. Esto sólo va a ir en pantalla
Uilashwapon punto GD. Bien. Y esta será la exhibición de armas con nombre de
clase. Y necesitamos una referencia
al arma dos D. Yo podría
simplemente exportarla por ahora mismo. Entonces esta será una arma var de tipo arma dos D.
Diré valor establecido, y esta será
arma igual valor. Siempre que pongamos el arma, creo que simplemente llamaré a
una función de actualización, y la pondremos aquí. Así función refrescar. Entonces, para poner el texto en
la etiqueta y el icono, necesitamos obtener una
referencia de exportación a cada uno de esos. Así que en Exportación var textura, texto directo de tipo textura Rc. Y entonces necesitamos en
Export var label, que es de tipo label. Y cuando nos
refresquemos, queremos decir texrec dot texture
va a ser igual a arma dot definition
dot icon. Sí, eso funciona Y luego diremos que
el texto del punto de etiqueta es igual al punto de arma, si tenemos un nombre
aquí, nombre de arma. No, queremos el
nombre de definición porque el nombre en el arma es en
realidad el nombre del nodo que no tendrá
espacios ni nada por el estilo,
así que es mejor obtener
el nombre del recurso porque esa es una
propiedad personalizada que establecemos. Y entonces queremos
decir más es igual al espacio más una cadena del nivel de punto del
arma. ¿Bien? Entonces eso básicamente mostrará el nombre de las armas y luego a qué
nivel se encuentra actualmente. Y por si acaso la definición de arma
no tenga un icono, hagamos un método get icon. cual funcionará como lo hicimos con uno de los otros scripts anteriores, que simplemente devolverá null si esa propiedad pasa
que no se establece. Así que vamos a hacer clic derecho
sobre la definición. Entraremos en eso, clic derecho definición de
arma.
Vamos a entrar en eso. Y luego vamos a crear
nuestra función G icon, que devolverá una textura dos D. Así que si icon
no es igual a null, entonces volveremos icon. De lo contrario, devolvemos null, y esto debería evitar
que obtengas errores si el icono pasa
a ser nulo aquí. Bien, y probablemente
también queremos probar refrescar en R así que la
función subrayado listo, voy a tratar de hacer una actualización Eso también nos ayudará a confirmar que si no hay
arma dos D set, funcionará bien
y solo se mostrará en blanco. La idea aquí es
que cada vez que
configuremos la vista de armas, se va a poblar
con exhibiciones de armas Ponemos el arma, y eso se
va a refrescar de inmediato. Entonces vamos a la vista Armas. Y dentro de aquí, bueno, ya ves que estaba
exportando una exhibición de armas, pero en realidad, lo que quiero
hacer es exportar la escena. Entonces esta será una
escena repleta que podemos instancia. Y luego
cargamos rápidamente a la derecha nuestra pantalla para el
arma, así que exhibición de armas. Entonces listo, una vez
que tengamos la carga, quiero poblar esto con
todas las exhibiciones de armas para cada una de las armas que
realmente están en nuestra carga de armas Entonces hice algo
similar con el nivel de selección donde solo lo borro
y lo restablecí cada vez, generando nuevas escenas para cada una de las sub UI que
necesitan ser creadas. Pero aquí, en realidad voy a
tratar de reutilizarlo para que ustedes puedan
ver ambos enfoques. Esto
sería técnicamente el mejor uso de tus nodos al no tener que eliminarlos y
recrearlos cada vez Entonces creo que eso va
a ser útil saberlo después del curso. Entonces, una de las formas en que
podemos acceder fácilmente a todas
nuestras exhibiciones de armas activas va a ser tener
una variedad de ellas. Así que voy a decir var
subrayado muestra, y esto es una matriz Voy a acercar la exhibición de armas. Creemos también nuestra función de
actualización. Entonces nuestra función refresh
va a devolver void. Y para cada una de las armas
en nuestra carga de armas, vamos a crear una pantalla si es
necesario crear una De lo contrario, si ya existe en esta matriz de exhibición de armas, entonces la voy a reutilizar
simplemente refrescando las propiedades en ella
con la nueva arma colocando el arma
en el arma para. Bien, entonces para nuestra función de
actualización, queremos recorrer
todas las armas,
y lo haremos
usando las
posiciones de índice para que podamos hacer coincidir
los índice para que podamos hacer coincidir índices de carga de armas con
nuestros índices de visualización de armas Entonces, para IN rango cero para
subrayar el tamaño de punto de las armas de carga, incrementando Entonces
primero vamos a conseguir el arma. Entonces nuestra arma va
a ser una arma tipo dos. Igual a subrayar armas
de carga en esa posición de índice, y necesitamos obtener o
crear la pantalla Entonces voy a decir var
display es una exhibición de arma, y vamos a establecer
eso igual para obtener o crear display en una posición de
índice de I. Y luego en nuestra pantalla,
una vez que hayamos adquirido eso, diré que el arma de exhibición va a ser igual al
arma misma. Y debido a que la
actualización es parte
del setter y ese script, se
actualizará de inmediato automáticamente Ahora, sí hablé un
poco sobre los efectos
secundarios y si
haces el setter así, no necesariamente está 100% claro que configurar el
arma va a refrescar
automáticamente la interfaz Pero debido a que eso es tan integral
para la exhibición de armas, creo que está bien que aquí
mismo solo diga, Oh, colocamos el arma. Por supuesto, el arma
va a mostrar el arma
actual. Pero como la exhibición de armas
es literalmente lo que hace, establecer el arma e
insinuar que eso refrescaría qué arma
va a mostrar en la interfaz No creo que haya
mucho problema con
eso como efecto secundario. Pero definitivamente es
discutible. Entonces ahora solo
necesitamos obtener o
crear la pantalla. Así función, get o create
display con parámetro index, y eso va
a ser un entero, y vamos a
devolver una visualización de arma. Entonces digamos var
display of type weapon display va a ser igual
a displays dot Get at index. Bien, entonces eso podría ser nulo. Entonces, si display
no es igual a null, solo devolvemos la pantalla. De lo contrario, necesitamos crear
uno aquí mismo y agregarlo al modo que
la visualización
va a ser igual
a la instancia de la
escena de visualización del arma Y escribí ese nombre mal. Entonces aquí mismo, Control C, Control V. Y luego
queremos agregarlo como hijo
a esta UI o más bien va a ir en el
contenedor HBox. Entonces, aguanta. Necesito una referencia
al contenedor. Así que exporta el contenedor de exhibición V, y ese será cualquier
tipo de contenedor. Solo necesitamos exportar
eso en la interfaz de usuario. Después tomaremos el contenedor de
visualización y agregaremos el display
como hijo de eso. Decimos muestra punto
apen vi nueva pantalla. Y luego, por último, queremos
devolver la pantalla,
girar la pantalla. Entonces debería crearse aquí si no existía ya
aquí. Así que eso manejará
la creación de las nuevas pantallas. Ahora bien, ¿y si quitamos un arma? Luego, después de recorrer las armas y tener
todas las pantallas configuradas, queremos verificar si la
matriz de armas es realmente
más pequeña que nuestra matriz de pantallas y luego eliminar las pantallas adicionales. Entonces digamos que quitamos un
arma del juego, y queremos que nuestra pantalla
aquí se actualice. Bueno, eso va a ser una referencia nula en
la pantalla ahora. Así que podemos decir para
visualización y visualización muestro punto arma es nulo, entonces sólo podemos
liberar la pantalla. Así que muestra el punto Q gratis,
y aguanta aquí. Necesito tener ese subrayado ahí porque
esa es una variable privada Así que tenemos nuestro
display punto Q gratis. Entonces tenemos nuestro punto de
visualización Q gratis, y queremos cambiar el tamaño de
eso a nuestro loadout SI. Entonces, vamos a conseguir eso como una variable local del tamaño de
nuestras armas. Ahora podemos reutilizar el tamaño de las armas
aquí y aquí abajo también. Bien, entonces para volver a recorrer
esta función, actualiza y crea pantallas según sea necesario
para mostrar todas las armas, elimina cualquier pantalla
que tenga armas nulas y redimensiona la matriz de pantallas Entonces obtenemos el número de armas. Para cada una de esas armas, asignamos el arma a su posición de
visualización correspondiente. Entonces después de hacer eso,
volvemos
a mirar todas las pantallas, y técnicamente, podríamos recorrer desde el
alcance del arma hasta el final del mismo, pero un poco por
encima de la optimización por no mucha ganancia porque aquí
solo estamos mostrando como
seis elementos. Pero si el
arma de visualización es nula, pero aquí si el
arma de visualización es nula, lo
que podría ser si
quitamos un arma, entonces vamos
a hacer cola libre en la pantalla y cambiar el tamaño
del conjunto de pantallas para que este tamaño vaya a
coincidir con las armas En nuestro G o create display, si el display existe
en el mismo índice, solo devolverá
eso y
lo usamos. De lo contrario, creará
una nueva copia de la escena, y luego la aplicaremos
debajo del contenedor HBox Bien, ahora en el inspector, tenemos
que asignar ese contenedor HBox Podríamos cambiarle el nombre para que sea Contenedor de
Pantallas
si eso ayuda. Así muestra contenedor, manteniendo
la nomenclatura consistente. Y ya tenemos las
exhibiciones de armas aquí. Entonces esto funcionará en Bien, así que vamos a ejecutarlo y ver si
está trabajando en correr ahora mismo. Entonces corremos y
no pudimos encontrar la carga de
armas porque creo que podría
llamarse carga de armas Así se puede ver Fine children es un poco frágil así. Entonces ahí tenemos
carga de armas. Entonces intentemos encontrar la carga de
armas con la S, y luego la volveremos a ejecutar Bien, entonces llegamos a donde tenemos textre punto textura es igual
arma punto definición punto icono Bien, entonces nos
pegamos a otro tema. No he puesto el textrect en la etiqueta en la exhibición de
armas Entonces entremos en
exhibición de armas y rectificemos eso. La parte superior derecha, cuando estés
en el arma desplazándote, asigna la textura
wrectt doble clic, y luego asigna la etiqueta Bien, y
lo ejecutaremos una vez más. A ver si eso resuelve los problemas. Bien, entonces aquí, cuando no
hay arma, va a causar un problema. Entonces tal vez realmente
queremos que ponga un arma antes de que la refresquemos. Entonces como la actualización ocurre
aquí cuando colocamos el arma, voy a quitar la actualización lista. Realmente no es necesario, y en realidad solo
causa más dolor de cabeza aquí del que necesitamos.
Entonces voy a golpear play. Y bien, ahí vamos. Spear uno allá arriba
en la parte superior izquierda Voy a ir por aquí y
seleccionaremos el nuevo artículo. Ahora bien, esto no va
a funcionar porque no
hemos configurado señales. Bien, entonces un error que cometí, cuando llamas a Git en un índice que no
existe en una matriz, te va a dar errores
fuera de límite. Entonces, lo que realmente deberíamos
estar haciendo es asegurarnos de que el índice
esté en la matriz. Entonces diremos si displays
digamos que el tamaño es
mayor que el índice, entonces vamos a
devolver este bit aquí, muestra punto Git Index. Claro. Entonces podemos quitar la declaración
variable var display
weapon display here to when we instanciate the
display scene, y eliminaremos esta
línea en la parte superior
52. P51: conexión de señales y configuración de la interfaz de usuario de armas para la visualización dinámica: Bien, entonces tenemos algunas señales
más para conectar en nuestra vista de armas y
visualización de armas para que
cuando estemos en el juego, muestre correctamente la configuración de armas correcta
después de actualizar la interfaz de usuario. Entonces una muy importante
aquí va a ser cuando nuestra carga
agregue un arma
llamando al
método add weapon que
vamos a conectar a sus
armas cambiaron señal, que no
creo que haya creado todavía. Entonces saltemos a las
armas loadou. Voy a hacer click derecho
aquí, abre el símbolo. Ahora estamos en el guión punto GD
de carga de armas. Entonces tenemos el método add
weapon, y queremos admitir
una señal aquí que nuestra opinión pueda
responder a eso. Entonces en la parte superior, vamos a crear
nuestro cambio de armas de señal. Si queremos, podemos pasar la serie de armas
a la señal. Entonces armas, que es
una serie de armas dos D. Y ahora solo
tenemos que admitirlo aquí
abajo en la parte inferior
cuando llamamos agregar arma. Las armas cambiaron punto emiten, y pasamos en las armas. ¿Bien? Ahora de nuevo en
nuestro guión de vista, nos suscribimos a así sucesivamente listo, después de obtener la carga, queremos hacer subrayado armas de
carga
cambiaron Y vamos a decir
sobre las armas cambiadas. Haremos ese método aquí
abajo en la parte inferior. Entonces la función en las armas cambió. El parámetro son las armas P, que es una matriz de armas dos D,
vamos a regresar nulo. Ahora, vamos a
llamar a refrescar aquí. Eso es todo lo que tenemos que
hacer porque refrescar ya maneja verificar la carga del arma y
qué armas tenemos,
cuál es el tamaño de la misma Así que en realidad no
vamos a
usar directamente estas armas P aquí, así que voy a subrayarlo para
que no recibamos una advertencia Y ahora antes de golpear play, quiero asegurarme de
que nuestros artículos estén realmente definidos correctamente. Entonces en el sistema de archivos inferior
derecho, voy a buscar
ítem. Tenemos el artículo Syth Entonces veamos si vamos
a la parte superior en este momento, este es un artículo
sin nombre sin descripción, y también necesita un icono Además, parece que me
equivoco también, parece que tengo la definición de ítem
equivocada. Eso tiene mucho
sentido ahora, por qué no
apareció el arma guadaña Entonces vamos a cargar rápidamente aquí
la definición de guadaña. Bien, entonces eso está configurado correctamente, pero tenemos que establecer
nuestro nombre para mostrar. Guadaña. Entonces para la descripción, voy a poner un
proyectil que gira alrededor de la pantalla y
puede golpear a muchos enemigos Esa es básicamente su principal
diferencia sobre la lanza. Y para el ícono, bueno, saltemos a la definición de
guadaña Haré clic derecho sobre el
icono aquí y lo copiaré y luego cerraré eso y
lo pegaré en el ícono aquí. Bien, ahora tenemos que
hacer algo similar en el artículo de lanza. Así que lanza de
doble clic Después iremos a la parte superior derecha. El nombre para mostrar será lanza. Entonces la descripción puede ser
un proyectil básico que vaya hacia adelante desde la
dirección que el personaje, supongo, diré, está mirando Y luego el icono,
simplemente copiamos eso de la definición sobre el icono
del ítem. Así como así. Y eso básicamente debería manejar mucho de
eso. Así que vamos a jugar. Creo que
lo único ahora es que no nos hemos conectado a
una señal de subir de nivel, pero bien, podemos ver la lanza
uno en la parte superior izquierda Vamos a agarrar nuestra guadaña. Entonces la guadaña ya está ahí arriba, y nuestro proyectil
guadaña también está lanzando Podemos ver que está rotando. A lo mejor es la velocidad de movimiento no es realmente suficiente porque
queremos que realmente dé vueltas en
círculo alrededor del jugador. Pero asegurémonos de que pueda golpear. Sí. Bien, así que sí parece estar golpeando
a los enemigos. Muy rápido, en las elecciones
generadas, hay un aviso sobre el sombreado
seleccionado y la señal ya declarada Entonces eso no es genial.
Va a tomar la matriz seleccionada
y generar opciones. Esto está en el guión de vista de
armas. Esto está en el contenedor de la
caja de Recompensas aquí. Voy a tomar esto y vamos controlar R. Voy a
cambiarle el nombre a elementos seleccionados. Voy a golpear reemplazar
no reemplazar todos
porque recuerden, no
queremos meternos con
los nombres de las señales aquí arriba. Así que reemplace dentro de
esta función solamente, y queremos bajar hasta aquí. También debería hacer coincidir mayúsculas
y minúsculas y palabras enteras que ayudarán a reducir el número de cosas adicionales que
se seleccionan. Así que los datapen seleccionados
son ahora
elementos seleccionados datapen y luego
devolvemos Bien. Entonces eso debería
manejar esa advertencia. Bien, entonces la escena de nuestro sitio no estaba rotando exactamente de la manera
que hubiéramos esperado. Entonces un problema con los guiones de
proyectiles es que si trato de decir, ejecuta esta escena sin lanzarla desde un
arma dos D primero, que vamos
a conseguir este tema donde va a golpear
esa afirmación en listo Entonces, lo que podríamos hacer en lugar
de eso con fines de prueba, en su mayoría, es tener una dirección
predeterminada. Entonces voy a decir
que la dirección va a ser igual al
vector de dos puntos a la derecha. Entonces solo tiene ese valor por defecto ahí. Vamos a quitar la aseveración. Y así también voy a
exportar var el nivel para que tengamos la opción de establecer un nivel de arma en el inspector. No debería ser
requerido para nosotros porque mayoría vamos a estar
lanzando a través del método de
lanzamiento, ¿verdad? Así es como
montamos el proyectil. Pero por si acaso
queremos probarlo en el editor, podría configurar un nivel de prueba por aquí y el derecho
para que podamos definir una velocidad de arma predeterminada. Así que vamos a golpear Play. Bien,
entonces ahora con esa configuración, debería poder
ejecutar este script, y podemos ver cómo se
va a mover por defecto, lo cual es bastante útil para
nosotros ahí arriba en la parte superior. Incluso podría crear una escena de
prueba donde tengamos una cámara
mirando al centro de nuestra así que eso nos ayudará aún más para nuestro propósito de
depuración visual, así que no necesitamos ejecutar
el juego completo y tenemos que subir de nivel cada vez que queramos
probar el elemento guadaña Así que vamos a crear nuestra escena de prueba. Entonces esta va a
ser una nueva escena de dos D, y la guardaré en la raíz. Entonces llamémoslo
armas de prueba punto TsCN. Guarde eso, y voy a caer
en el arma de guadaña. Entonces arma guadaña punto TSN. Simplemente ponemos eso
en la raíz ahí. Voy a cambiar el nombre del nodo raíz. Entonces probemos armas, y luego
hagamos clic derecho y agreguemos una cámara a D. Así que esto tendrá un Zoom de tres.
Creo que es bueno. E intentemos
ejecutar la escena haciendo clic en el botón reproducir escena
actual. Bien, entonces la razón por la que
no vemos nada aquí es en realidad porque no
se supone que pongamos aquí
el arma guadaña Se supone que debemos poner el
proyectil Syth. Entonces mi error. Entonces busquemos forsythe punto
Tscn suelta eso en la raíz. Ahora bien, si nos
acercamos, deberíamos
poder ver eso. Bien, eso es bueno. Y vamos a darle al botón de correr escena
actual. Así que ahora podemos ver cómo va a quedar cuando nuestra guadaña dispara a la derecha, y eso hará que
sea mucho más fácil y rápido para nosotros
depurar esa Así que ahora con nuestra configuración de escena de
prueba, podemos ver cómo nuestras armas giran y se mueven
en la pantalla, pero eso no es exactamente
lo que estamos buscando. Entonces, lo que realmente
necesitamos cambiar aquí
es volver a la
escena de la guadaña, este nodo rotador, si queremos que el
arma o el sprite roten alrededor de un punto central, entonces realmente necesitamos mover este desplazamiento de rotador hacia la derecha
mientras mantenemos nuestro sprite
y caja de golpes en la mientras mantenemos nuestro sprite y caja de golpes Entonces voy a
mover temporalmente estos dos fuera
del rotador dos D que no se
vayan a mover con él, y luego voy
a mover el rotador dos D hacia la
derecha así Bien, así que eso nos
dará un desplazamiento para que todo a su alrededor
pueda
girar alrededor de ese punto lugar de simplemente rotar
por aquí en un círculo. Entonces, vamos a traer esto justo en el hit box de vuelta
al rotador dos D.
Bien, bien. Y tal vez queramos decir que la velocidad X sube a 25. Corremos la escena y veamos si eso nos da
lo que estamos buscando. Entonces, sí, pero eso es un
poco demasiado rápido, en realidad. Entonces tal vez solo bajamos eso nuevo al valor por defecto
de diez y lo volvemos a ejecutar. Entonces es la rotación la que
en realidad está haciendo eso. Entonces, o necesitamos una rotación
más lenta o quizás necesitamos que esto esté
más lejos a la derecha. No estoy seguro de cuál.
Esto es una especie de adivina
comprobando por mí aquí. Entonces solo si te sucede que mueves el rotador con este sprite
y caja de cadera debajo de él, solo asegúrate de
moverlos de regreso
al punto central 00 Y luego corramos la escena de
prueba y veamos. Supongo que solo 360 grados
es demasiado rápido. Bien, entonces voy a
volver a la escena sth y bajaremos los grados de
rotación. Cortemos eso a la
mitad, tal vez 180. Y luego ejecutemos
nuestra escena de prueba. Bien, eso probablemente se parece mucho
más a lo que queremos, pero ahora también he hecho demasiado lejos la distancia del rotador Bien, entonces voy
a sacar el sprite dos D y sacar la caja de cadera,
y
volvamos a mover el rotador en bastantes Mueva el sprite y la
caja de cadera hacia atrás debajo del rotador. Y vamos a probarlo en
la escena de las armas de prueba. Bien, así que vamos a correr eso. Uh, casi. Pero a lo mejor la velocidad del
proyectil sigue siendo demasiado rápida. No lo sé. Tenemos que
probarlo en el juego. Así que vamos a golpear play, y esto en realidad
va a ejecutar el juego principal porque esa es la escena principal. Entonces vamos a agarrar la lanza
el proyectil guadaña. Y ahí está cómo se ve nuestra
arma guadaña en este momento No estoy seguro de estar súper
contento con el patrón, pero al menos está haciendo
el concepto general. Es sobre todo cuestión
de que ahora tenemos que ajustar
las variables Déjame intentar que el jugador
sea golpeado y destruido. Bien, así que todavía
se quita de la escena, pero vamos a tener que
crear el juego sobre la pantalla. Como parte del pulido
del curso. Entonces voy a
correr eso una
vez más para que consigamos nuestro proyectil de
guadaña Es como
subir a la derecha. Prefiero que vaya más, como, centrado a la derecha. Déjame ver si puedo ajustar eso. A lo mejor ese es el resultado
de la velocidad X. Intentaré apagarlo, y volvamos a ejecutar la escena. Bien, entonces ahora es
un poco así. Volverá
al inicio aquí. Porque el rotador no
tiene velocidad extra. Y la dirección en la que lanza depende de si estás
mirando hacia la izquierda y hacia la derecha. Entonces al menos es
igual aplicación a ambos lados. A ti te
puede gustar esto. Puede que no. Es
sobre todo cuestión de simplemente ajustar las variables para obtener el patrón que desea
para el movimiento Entonces al menos por ahora, yo diría que es bastante aceptable. Vamos a subir de nivel el arma
lanza aquí. Y eso va a subir de
nivel el arma, pero aquí no tenemos una señal de
subir de nivel conectada. Bien, entonces donde hacemos eso
está en la exhibición de armas. Vamos a saltar a la exhibición de armas. Cuando colocamos el arma aquí, necesitamos conectar las señales. Pero en ese punto, yo diría que esto
en realidad es poner demasiadas cosas en un
armador para el arma En cierto modo oculta lo que se
supone que debe hacer. El
repaso estuvo bien. Pero creo que si estamos
conectando señales y actualizando la interfaz de usuario,
eso es demasiado. Así que vamos a crear un arma de conjunto de
funciones. Que pasará en un
arma arma dos D. Bien, así que si arma no es igual nula y y vamos a decir arma punto
nivel cambiado está conectado, y entonces tendremos
una devolución de llamada aquí, guión bajo en
nivel de arma Por supuesto, esto nos va a
dar un error porque el nivel cambiado aún no
existe en el arma. Entonces saltemos al
arma, busquemos símbolo. Vamos a crear una señal aquí, nivel de
señal cambiado, que pasarás en el
nivel, que es un entero. Si eso es todo lo que voy
a hacer con este nivel, y creo que lo es, entonces
diremos valor establecido. Diremos que si nivel es igual
al valor, volvemos sabiamente, nivel es igual al valor, y
podemos nivelar punto cambiado un MIT. En los niveles. Así que sólo
estamos haciendo observable esta
propiedad, y eso es todo lo que
voy a cambiar ahí El motivo de esta guardia es
que si establecemos el nivel al nivel, no
queremos emitir señales de UI
innecesarias porque el nivel, de
hecho, no cambió. Así que solo necesitamos
hacer esta actualización si la estamos
configurando en un nuevo valor. Ahora, sí me olvidé un colon aquí
arriba en la parte superior, así que eso va a
deshacerse de ese error. Ahora en nuestra exhibición de armas,
tenemos el nivel cambiado. Tenemos que crear
en el nivel de arma función de devolución de llamada
cambiada Entonces la función, copiar y pegar
en el nivel de arma cambió, y luego tenemos el
nivel P, que es un entero. Vamos a devolver void, y queremos
refrescar la interfaz de usuario aquí. Pero lo que en realidad estamos
haciendo aquí es que nos estamos desconectando de la vieja señal de
arma si existe Entonces comprobamos si el arma vieja existe aquí comprobando
si no es nula. Entonces, si la señal está conectada,
necesitamos desconectarla. nivel de punto del arma cambió desconexión del
punto en el nivel del
arma cambiado. Sin paréntesis. Y esta
parte solo está verificando que la señal está realmente
conectada antes desconectar una señal
que no está conectada. Entonces solo guardias de seguridad. Bien, entonces hemos preparado el arma vieja para que esté
totalmente desconectada, así ya podemos cambiar el arma. Entonces diremos arma
igual a arma P, y luego queremos conectarnos a estas señales de
cambio de nivel de armas. Pero también podemos poner un guardia comprobando si ya está
conectado por cualquier motivo. Esto es un poco
excesivamente seguro, pero solo podríamos decir, si el punto de cambio de nivel de arma ya está conectado a esta función aquí
abajo, y queremos
hacer eso inverso. Entonces estamos diciendo que si no está conectado, entonces
necesitamos conectarlo. Entonces el nivel de punto del arma
cambió el punto Conectar, el
subrayado en el
nivel de arma cambió Y también queremos refrescarnos, seguro. Así que vamos a refrescar eso. Entonces, cuando colocamos el
arma, nos refrescamos, y cada vez que
cambia el nivel, nos refrescamos. Entonces ahora queremos tomar
esta propiedad y subrayar y simplemente
hacerla privada Entonces esto será más
como una variable privada. Y no queremos modificarlo
directamente. Queremos
animar encarecidamente a cualquiera que use este script a usar el método set
weapon en su lugar. Entonces voy a seleccionar aquí, y vamos a controlar y
básicamente a buscar y reemplazar. Así que asegúrate de hacer coincidir el
caso y las palabras completas, y luego cambiemos esto
para subrayar el arma Creo que podemos salirnos con la suya
con el reemplazo masivo aquí. Entonces todas las 11 instancias
solo reemplazan todas. Eso es Control R para que
aparezca ese menú. Ahora, claro, si
ejecutamos el juego, entonces obtendríamos
un error porque estamos tratando de poner arma,
no subrayar arma desde el punto de vista de armas Entonces, si vamos a la vista de armas, ahora en nuestra actualización, queremos llamar a display
dot set arma en el arma dos D con el arma arma
dos D y quitar esto. Entonces, toda la razón para mover el código de
configuración de arma reactiva a este
método explícito de arma de conjunto es para que sepamos que
aquí están sucediendo
más cosas que simplemente establecer
el valor del arma. Por cierto, deshazte
de esa actualización. E incluso podemos eliminar esto, pero aquí en este punto, básicamente
es solo
una variable regular. Pero no queremos
ocultar el hecho de que está conectando y
desconectando señales
y actualizando la interfaz Puede ser un poco más explícito. Entonces todo este código podría
haber
estado con la misma facilidad bajo el setter de
variables de arma, pero tener esta función de bloque
grande escrita deja
más claro cuál es nuestra intención Y sé que
eso sí me contradice cuando
antes estaba como,
Bien, solo puedes hacer el armador
y usar la actualización Pero como
también estamos haciendo señales, creo que están pasando
demasiadas cosas, y no queremos ocultarlo
a
nadie que esté
tratando de configurar la pantalla. Queremos que
sepan, Bien, ahí está esta función de arma de gran set. Y eso es manejar todas
estas cosas extra. Oh, bien. Entonces sigamos
adelante y ejecutemos el juego, y voy a subir de nivel
la lanza al Nivel dos Ah, bien, para
que veas que hubo otra referencia a la
variable de armas , pero la
hicimos privada. Entonces queremos tener un getter para obtener el arma en lugar acceder a la
variable privada ahí Déjame echar un
vistazo a esta función y ver si incluso la
necesitamos, sin embargo. Bien, entonces ya que la vista de
armas está manejando liberando
las pantallas antiguas, necesitamos que el arma de punto de
visualización sea reemplazada por el arma display dot Git Así que vamos a crear esa
función en la exhibición de armas. Entonces funcionan aquí,
arma Git que va a devolver un arma a D. Sólo
vamos a decir,
si arma de subrayado, devolvemos arma de subrayado, lo contrario devolvemos null Entonces, ¿por qué molestarse en tener
esta función de arma Git cuando solo podrías obtener de la variable de arma directamente? Bueno, hicimos esta arma privada porque
queremos asegurarnos de que
animamos a cualquier desarrollador a usar explícitamente la
función set weapon. Y como esa es
una variable privada, no
deberíamos estar accediendo a ella
desde fuera del script. Entonces necesitamos una función pública de arma
Get
para acceder a eso. Entonces es básicamente
encapsulación y evitar que otras personas
hagan cosas con el script donde se
supone que no deben hacer eso
con el guión Ahora bien, una vez más, el guión bajo
es solo una práctica de indicar que está destinado
a ser privado de manera efectiva, pero GD Script
no tiene realmente privado o público como Por lo que en realidad no se puede evitar
que nadie acceda a él. Solo puedes indicar tu
intención con el guión bajo. Bien, así que vamos a cerrar eso y ejecutar la escena una vez más. Voy a subir de nivel nuestra lanza. Y vamos a conseguir la actualización de lanza. Así se puede ver que
Spear fue al nivel dos ahí mismo
y a la parte superior izquierda Por supuesto, esa interfaz de usuario es demasiado pequeña, necesito hacerla más grande. Así que vamos a ir a la
jugabilidad UI Canvas, y voy a hacer clic aquí. De hecho voy a cambiar el
diseño y lo centraremos. Entonces Anchors va
a ser centro superior, y luego quiero W
compensarlo de ahí, algo así como por aquí También salta a la escena de exhibición de
armas. Entonces si voy a transformarme aquí, me veo más como
un 400 pixeles por 75. Quiero asegurarme de que el
ancla siga centrada, así puedo hacer costumbre aquí y luego volver a la
parte superior central que lo volverá a centrar Echemos un vistazo a la
jugabilidad UI Canvas. Bien, eso sigue siendo bueno. Voy a saltar de nuevo a la
exhibición de armas desde aquí. Y creo que lo principal
es que solo tenemos que
asegurarnos de que cada una de
esas pantallas individuales, el icono esté configurado en
un tamaño mínimo. Entonces, si miro la exhibición de
armas aquí, tomemos el
tamaño mínimo y hagámoslo. Podríamos incluso decir 96, 96. Vamos a hacerlo grande y luego encogerlo si necesitamos. Entonces la etiqueta de texto aquí, ¿necesito que también
sea más grande ? A lo mejor yo sí. Vamos a anular
el tamaño de la fuente aquí. Y lo haré
como, digamos, 16. Bien, eso es
lo que está en estos momentos 32. Bien, entonces intentaremos 32. Alejar. Vamos a golpear play. ¿Cómo se ve en
la interfaz de usuario en este momento? Bien, eso es mucho mejor. Entonces iré a buscar la otra arma. Tenemos nuestra guadaña.
Entonces lanza, guadaña uno Creo que la única
otra cosa es tal vez un poco de un
contenedor de margen ayudaría. Así que cierra el juego, y
en la vista de armas, nuestro contenedor de margen,
hagamos anulaciones temáticas Estoy pensando constantes
de dos en todos los lados. Vamos a golpear play. Ejecutarlo. Y eso no ayudó tanto. Hagamos cuatro píxeles
en todos los lados, supongo, y presionemos play. Bien, eso es al menos más
visible. Voy a hacer seis. Entonces seis por todos lados,
eso debería ser suficiente. Bien, entonces entramos en modo de juego. Bien, ahora tenemos un poco
de barrera entre nuestro contenedor individual
y toda la vista de armas. Y eso se ve
mucho más sólido. Entonces está mostrando
el tipo de arma que
tenemos y el
nivel del arma, y esa es probablemente la mayor parte de lo que realmente
necesitamos que muestre. Entonces estoy pensando que estamos
bien para ir aquí. Déjame subir de nivel para funzies. Vamos a conseguir Syth Nivel dos. Sí, Syth también está
nivelando correctamente. Entonces eso prácticamente
maneja configurar la vista de armas y completa teniendo todas las
señales conectadas, corrigiendo los
elementos, asegurándose que tengan una
descripción e ícono, y solo tener esa interfaz de usuario clara, donde podemos ver lo que
realmente está pasando
con nuestro jugador.
53. P52: Creación de elementos de mejora de estadísticas para las actualizaciones de jugadores: Entonces, con nuestro
sistema de nivelación funcionando la capacidad de elegir
un objeto de armas y mejorar nuestra carga de armas con una nueva arma o un
nivel mejorado de un arma, ahora sería un
momento perfecto para agregar la capacidad de elegir una mejora no relacionada con
armas Por ejemplo, un ítem de impulso de
pasos, que
aumentará permanentemente nuestro HP al subir de nivel. E incluso podríamos convertirlo en un artículo que tiene una rara posibilidad de dejar
a los enemigos si queremos. En nuestra carpeta items,
abajo a la izquierda, voy a expandir eso y vamos a crear otro
tipo de ítem. Voy a hacer click derecho aquí
y crear un nuevo script. Y podríamos llamar a esto un ítem de impulso
stat DotGD. Esto se extenderá desde el recurso. Entonces es una especie de tipo de
definición. Y luego en nuestro
ítem Stat boost, lo abriré, le daré el
nombre de clase Stat Boost item. Ah, y esto en realidad
va a extenderse desde la
clase de elemento base, no desde el recurso. Entonces si miramos artículo, tenemos el Trapply
y Can apply Entonces, sigamos adelante y
tomemos esos porque
necesitamos implementarlos
en nuestro Stat Boote Así que sólo voy a
pegarlos de aquí. Entonces para poder aplicar, queremos
verificar si el objetivo tiene,
A, un bloque de estadísticas y B. ¿Ese bloque de estadísticas tiene la estadística que estamos tratando de impulsar? Podríamos crear un montón de clases
diferentes para, digamos, impulso de
HP, artículo de reducción de
enfriamiento. Pero en cambio, vamos
a simplificar eso al tener un nombre de stat var de exportación, que es un nombre de cadena. Y pondremos eso igual
a nada por defecto. Y luego vamos a tener un cambio de valor var de
exportación, que es un float. Y pongamos eso igual a 0.0. Entonces lo
primero es lo primero, quiero sacar el Spblock del
jugador si existe Así que voy a decir var
Stats es un controlador de estadísticas, y vamos a obtener eso
de ptarget dot get, y vamos a obtener ese nombre
stat como una propiedad Entonces esto puede terminar siendo nulo. Entonces, si las estadísticas son nulas, entonces vamos a
devolver falso aquí. Otra cosa que queremos verificar es el cambio de valor
realmente establecido. Entonces, si el cambio de valor
es igual a 0.0, voy a empujar una advertencia. No se puede impulsar la estadística
si el cambio de valor se establece en 0.0 o digamos que
los porcentajes son un poco más flexibles, y luego el cambio de valor porcentual. Y aquí vamos a devolver falso. Entonces, la razón de eso es que si no
hemos configurado el artículo, realmente no va
a hacer nada, así que simplemente
omitiremos aplicarlo, y pondremos una
advertencia ahí afuera para que sepamos que
ese es un problema que necesitamos arreglar con solo cambiar la propiedad de cambio de valor
a otra cosa. No hay una función lista para verificar estas cosas
como si hubiera con un nodo porque
los recursos nunca llegan listos. Entonces este parece
un buen lugar para ponerlo. Sólo lo comprobaremos
antes de aplicar. De lo contrario, creo que
podemos devolver la verdad. Creo que esos son
los dos constituyentes principales a los que
estamos atentos. Entonces, la otra cosa que
quería asegurarme, en realidad, era esta parte. Entonces estamos viendo si las
estadísticas tienen el nombre de la estadística, así que en realidad configuré
esto incorrectamente. Queríamos decir si ptarget
dot consigue estadísticas aquí. Entonces primero, estamos obteniendo
el controlador de estadísticas, y luego queremos verificar
si las estadísticas puntan G stat Name. No es igual a nulo. Si
eso es igual a nulo, entonces devolveremos false. Entonces primero, nos aseguramos de
que tenga un bloque de estadísticas, luego nos aseguramos de
que tenga la estadística, y luego nos
aseguramos de que realmente hayamos configurado este elemento correctamente
para cambiar el valor. Bien, entonces una vez si
pasamos todo eso, entonces podemos aplicarlo. Entonces aquí abajo, en la parte inferior, quiero obtener el
controlador de estadísticas una vez más, así que solo estoy copiando pegando eso
de aquí arriba a aquí abajo Obtenemos el controlador SAT, y luego queremos obtener el valor actual y luego
agregar el cambio a ese valor Entonces nuestro valor actual va a ser igual al
punto de estadísticas GET stat name, y luego vamos a
tomar eso e incrementarlo. Entonces digamos, nuestro nuevo valor, va a ser igual al valor
actual más
el cambio de valor. Y luego fijamos ese
valor en los Sts. Entonces las estadísticas establecen el
nombre de estadística al nuevo valor, y agrego un pequeño error tipográfico allí, así que asegúrate de que esos
nombres sean correctos Y entonces queremos volver a la verdad. Así que también podemos consultar
aquí, una vez más, solo para asegurarnos de que las estadísticas todavía
se encuentran realmente. Entonces, si las estadísticas son nulas,
devolveremos false. Y en realidad podríamos querer
un error aquí porque
se supone que debemos verificar si
podemos aplicar justo
antes de aplicarlo. Por lo tanto, las estadísticas
del controlador de estadísticas de empuje y error no se pudieron encontrar en porcentaje S,
porcentaje P objetivo. Entonces eso va a conseguir el nodo y reemplazarlo
ahí. Todo bien. Sí, así que para las estadísticas
que reciben nombre, básicamente
estamos cambiando
esto a una carroza por ahora. El nuevo valor es un float, y lo configuramos de nuevo
en el valor stat. Ahora, algunas de nuestras estadísticas
como HP son un entero. Entonces, cuando ponemos eso de nuevo
en el controlador de estadísticas, lo va a arrojar de
nuevo a un entero, y va a
perder nuestro valor flotante. Entonces, la idea aquí
es que si
vas a impulsar un número entero, entonces solo asegúrate de usar valores
no decimales en el elemento de impulso de estadísticas
real. Entonces pierde un
poco de claridad en que solo
estamos agrupando enteros y flotadores en
el cambio de valor,
pero nos da la flexibilidad de
poder manejar
la gran mayoría de nuestras estadísticas a través de una clase en
lugar de crear una para el cambio de HP,
una para el
aumento del porcentaje de daño, etcétera Sólo mucho menos guiones en los que
las cosas puedan salir mal. Así que vamos a crear
nuestro artículo HP boost. Y la
carpeta items, abajo a la izquierda, voy a crear
un nuevo recurso, que va a ser
un ítem de impulso SAT. Entonces esto irá en
la misma carpeta. Lo llamaré HP Boost, subrayaré puntos de ítem, guárdalo. Ahora a la derecha,
tenemos nuestro ítem de impulso SAT. Entonces el SAT que queremos cambiar
va a ser Max HP, y queremos que eso suba 50. Ahora, sí veo un defecto aquí, que es que si
impulsamos el MX HP, no
va a impulsar también
el HP base Entonces tenemos que tomar una decisión sobre cómo queremos
manejar eso. Una forma sería que cada vez que
aumentemos el MAX HP, ajustemos el HP
automáticamente en nuestro
script de controlador de pila por esa cantidad. Entonces esa es una opción.
Déjame revisar el controlador SC si
eso tiene algún sentido. Entonces busca stack controller
dot gD y project, abre eso, y podemos ver que
tenemos lo MAX HP. Entonces podemos ver el cambio
haciendo el MAXHP menos el y podríamos simplemente decir aquí
si el cambio es positivo, entonces afectamos al HP Sin embargo, siento que
realmente está empezando a
agrupar este setter, y en realidad puede haber algunos elementos que queremos
cambiar el Max HP, pero no el HP base Entonces creo que una forma un poco mejor de hacerlo sería en
nuestro ítem de impulso de estadísticas, realidad
tenemos un diccionario de estadísticas que queremos cambiar, y luego las recorremos. De esa manera, podemos hacer MaxHP
y HP al mismo tiempo. Incluso podríamos tener
un artículo que aumente,
digamos, Max HP, HP, y ataque todo de una vez, y eso solo va a requerir un poco de cuatro bucles Entonces cambiemos
esto vamos a convertirlo una var de exportación Cambios de estadísticas. Y este será un diccionario de nombre de cadena con
los valores flotantes. ¿Bien? Entonces ya nos
desharemos de esto, y eso nos dará
algunos errores inmediatos. Así que queremos asegurarnos de que
cada uno de estos nombres de cadena exista en el controlador stat. Entonces podríamos decir cuatro claves
en stat cambia teclas de punto. Sólo comprobaremos si la clave está realmente en ese controlador. Entonces si stats Git key es nulo, no tiene las estadísticas, no
podemos modificarlo,
eso es un problema. Y entonces
solo podemos hacer aquí abajo. Para el valor en stat
cambia los valores de punto. Entonces comprobaremos si el
valor es igual a cero, entonces vamos a
tener ese problema ahí, así que solo
reemplázalo por valor. Bien, entonces técnicamente aquí mismo, estamos haciendo dos bucles, y eso es sub óptimo. Entonces, una mejor manera de hacer esto en realidad sería
simplemente obtener el valor de la clave. Entonces voy a decir var valor es igual
a stat cambia punto G clave, y luego podemos verificar el valor sin
el extra de cuatro bucles. Entonces voy a cortar eso
y pegarlo aquí, quitar el segundo bucle de cuatro. Eso debería hacerlo mucho más
eficiente y más fácil de leer porque ahora solo estamos
lidiando con esto 14 Bien, ahora aquí abajo en la parte inferior, necesitamos hacer algo
similar para key in stat cambia teclas de punto. Necesitamos obtener el valor
para cada uno de estos. Así que vamos a
tabularlo de nuevo, así es parte del bucle de cuatro. Y diremos estadísticas punto Obtener clave. Nos va a dar
el valor actual. Tomamos el valor actual
más el cambio de valor. Eso nos da el nuevo valor. Entonces, ¿de dónde sacamos
el cambio de valor? Bueno, tenemos que decir var el cambio de
valor es a flote igual a los cambios de estadísticas punto
Obtener clave. Uh, eh. Y luego tenemos el
nuevo valor cuando sumamos esos juntos, conjunto de puntos de estadísticas. Sobre el nuevo valor, aguanta. Nombre de conjunto no declarado en el ámbito porque el nombre del
conjunto es la clave. Entonces queremos establecer la clave con el nuevo valor
en el controlador de estadísticas. Bien. Ahora, busquemos
elemento en el proyecto. Voy a abrir el artículo de impulso de HP. Ahora tenemos la
capacidad de manejar múltiples cambios de estadísticas de una sola vez. Así que solo haré MaxHP
y eso va a ser de 50. Quiero hacer MXHP
antes que HP porque
quiero aumentar el MX HP
antes de intentar impulsar el HP Por lo que el HP también será de 50 aquí. Entonces aumentamos los HP MX, y luego los HP subirán 50. Si estás en FHP, debería
ser en FHP por segunda vez. Y luego llamemos aquí al nombre
para mostrar, HP boost. La descripción se
incrementará el HP máximo en 50. Y luego para el icono, vamos a
crear una nueva textura atlas. Voy a ampliar eso. Vamos a cargar
rápidamente de nuestro proyecto, y voy a obtener la hoja de sprites 16
por 16 Así que editemos la región
y escojamos una. Entonces, acerque, ¿tenemos
algo como una poción de salud, algo que tiene
sentido para nosotros Hay una gota de sangre
que podría ser viable. O aquí hay un corazón. Esa es
otra buena opción. Bien, como que me gusta esta harina. Entonces, consigamos esta harina roja sangre
carmesí, y la elegiremos para
que pueda ser nuestro ícono de ítem Y probemos esto
agregándolo como opción en nuestra escena de subir de
nivel de jugador. Entonces en la escena de selección de nivel arriba, voy a dar click en
nuestra selección LevelUp Y tenemos nuestras opciones de
artículos aquí. Voy a
cargar rápidamente un nuevo artículo. Entonces este va a
ser nuestro artículo de impulso de HP. Vamos a
darle una oportunidad de caída de uno y presionar Agregar par de valor clave. Bien, así que ahora podemos golpear
play, y entraremos aquí. Voy a
subir de nivel, y vamos
a seleccionar nuestro impulso de HP. Elige eso, y
podrás ver, oh, de
repente, tenemos 160
HP, y así es como subir de nivel. Entonces puedes ver desde aquí
sería muy fácil aumentar otras estadísticas
como daño de ataque, reducción de
enfriamiento, ¿qué más? Velocidad de movimiento, etcétera, para tu personaje ya que
necesitas dar mejoras
54. P53: implementación de correcciones de UI para una mejor interfaz de usuario y Boost: Termina con nuestro sistema de actualización creando una camioneta
que
nos permitirá recoger y aplicar
inmediatamente uno de estos artículos como
nuestro artículo HP boost. Entonces vamos a querer buscar en nuestro proyecto las camionetas Entonces tenemos nuestras pastillas de objetos. Vamos a crear una camioneta HP boost. Comienza duplicando la camioneta
XP dos escena D. Entonces haré clic derecho
y duplicaré eso y luego esta será la camioneta
HP Boost, subrayaré dos D, claro, y haga doble clic en eso Bien, así que lo primero
que quiero hacer aquí es cambiar el sprite para que sea el mismo que en mi artículo Entonces voy a dar click Sprite
Animated TwoD. Vamos a la animación aquí
y creamos un nuevo recurso de
marcos de Sprite para que
podamos establecer un ícono diferente Voy a añadir marcos de
una hoja de sprites. Vamos al arte. No carmesí fanta
ver iconos de cuervo, hoja de sprite
completa, 16 por 16, acercar Asegúrate de que a la derecha,
estableces el tamaño en 16
por 16 aquí para que pueda dividir la
hoja de sprites apropiadamente Y si, encontraremos
esa flor que estaba usando. Entonces haz clic en eso, agrega el marco. Y boom, ahí está nuestro artículo. Puedo mirar la camioneta XP, pero en realidad esta es
solo una camioneta que inmediatamente
agrega experiencia. Entonces este script en realidad omite toda
la necesidad
de tener el ítem Entonces lo que estamos
buscando es más de
una recolección de elemento dos D. Así que vamos a cambiar el nombre de nuestro
nodo base, la recolección de elemento D, y vamos a hacer clic
derecho en él, desacoplar el script,
hacer clic derecho adjuntar un nuevo script, y esto va a ser un
ítem subrayado pickup, dos D, esto va a
extenderse de pickup a D. Creamos eso, le damos el nombre de
la clase item pickup dos D. Así que esto va a aplicar el artículo de recogida al
objeto que lo recogió. Entonces, en la
interfaz de usuario de nivel,
aplicamos inmediatamente el ítem a nuestro jugador. Aquí es solo un poco diferente. Tenemos que recoger primero el ítem
en el mapa del juego, como recogemos el EXB
y luego va a aplicar el efecto item
directamente al jugador Si agregamos artículos en un inventario, ese método de aplicación
sería más como agregar uno de los artículos a la
matriz de inventario e ir desde allí, pero nuestro juego no
necesita inventarios, así que básicamente estamos saltando Pero nuestro juego realmente no necesita inventarios aparte de
nuestra carga de armas, que funciona un poco diferente Entonces realmente no necesitamos
meternos en eso para este proyecto. Entonces nuestro artículo Recogida
dos D, por supuesto, queremos exportar var un
artículo de tipo artículo. ¿Bien? Así que guarda eso, y luego podemos dar click aquí y vamos
a asignar si queremos, podemos asignar el ítem por defecto. A lo mejor sólo voy a dejar
eso en blanco, aunque. Déjame echar un
vistazo al guión base pickup dos D,
clic derecho en él. Entonces necesitamos implementar
la función take. Así que vamos a copiar eso en la recolección
del artículo dos D.
Voy a pegar eso en. Lo implementaremos en un segundo. También voy a hacer función subrayado listo, devuelve void Y vamos a afirmar
que el ítem no es nulo. Cada recolección de artículo debe tener
un artículo asignado para recoger. En realidad, creo que aseverar es
un poco demasiado fuerte aquí. Probablemente iría con
más como error push. Entonces podemos ver qué está pasando
mal en la consola, pero no va a interrumpir el flujo del juego porque cuando
instancia la recolección del artículo, probablemente
va
a estar fuera de una gota, y no necesariamente
queremos que eso
rompa completamente el flujo de
nuestras pruebas de juego. Entonces creo que el error de empuje es un
poco más apropiado aquí. Entonces pues vamos a quitar el guión bajo
del objetivo P. Entonces primero, voy a decir, yo item dot se puede aplicar a P Target, luego voy a
aplicarlo al objetivo P. Entonces item dot intenta
aplicar a pTarget. Y si eso sucede, lo
sacaré
del cuarto de escena. Ahora bien, tal vez sería mejor
si la función T también tuviera un booleano para devolver false Entonces aquí, la naturaleza
de cambiar esto a un booleano significa que
tendría que
volver a la clase base
y cambiar Y entonces cualquier clase que también anula la función T,
tendría que cambiarla. Entonces ese es uno de los
defectos de depender demasiado de la herencia
para tus clases, lugar de usar un enfoque de
composición, como ves en el
inspector en este momento, composición sería más
como si tuvieras un montón de diferentes scripts pequeños que cada uno tiene su propio propósito
único, en lugar de tener
un script base extender un montón de otros scripts. Entonces, por ejemplo, el jugador podría
tener carácter extendido, y luego podría
haber otra clase por encima del jugador como
Spearman o dragoon, lo que agrega más Pero entonces, si obtienes
muchos scripts
directamente
dependiendo unos de otros, un pequeño cambio como simplemente
cambiar esto a un booleano podría significar que necesitas actualizarlo en
varios lugares . Entonces solo
algo en lo que pensar. En realidad no es tan
problemático aquí. Bien, entonces lo que
vamos a hacer con esta recogida de artículos es
ponerla en el mapa del juego ahora. Así HP Boost Pickup. Eso lo tenemos. Hemos guardado
esto para el proyecto. Oh, en serio, lo que
creo que quiero hacer esto es
hacer de esto una
escena base así que voy a renombrarlo item pickup dos D. Ahora
busquemos camionetas aquí abajo Entonces voy a
hacer click derecho aquí y
voy a hacer una nueva escena
heredada. Y luego en esta
escena heredada, puedo asignar el ítem. Entonces voy a cargar rápidamente
nuestro artículo HP boost y luego volver a
guardarlo en la
recolección del artículo como camioneta HP Boost. Dos D. Y entonces esa es la escena que ponemos
en el mundo del juego. En cierto modo, crear
una escena heredada como esta es realmente similar a extender un guión
y obtener toda
la base en tu nuevo objeto. Pero en ciertas
circunstancias como esta, donde solo estamos cambiando
qué tipo de elemento esa configuración de escena tiene
la camioneta HP boost, teniendo el artículo HP boost, pero por lo demás solo
siendo un
ítem normal pickup dos D.
Creo que en casos como ese, esto en realidad tiene mucho sentido. Así que ahora queremos poner nuestro artículo
en el mundo del juego. Voy a
buscar TCN punto mundial. Bien, voy a acercarme aquí. Tenemos un jugador ahí, así que
voy a buscar la camioneta HP Boost e
intentar arrastrar esto al mundo
del juego. Podría simplemente ponerlo ahí, pero pongámoslo
primero debajo de pastillas para que tenga el padre W
adecuado para moverlo Pongámoslo por
ahí y tal vez un segundo por aquí solo para asegurarnos de que podamos hacerlo dos veces. Vamos a golpear play, y luego vamos a
ir a buscar nuestra camioneta. Entonces voy a caminar
por aquí, y boom, tenemos 150 HP. Aquí podemos elegir si
queremos lanza o guadaña. Interesante, no está brindando la opción para la tercera camioneta. A lo mejor necesito que me agreguen. Y luego voy a ir aquí
y conseguir nuestro próximo impulso de HP. Entonces está nuestro elemento permanente de refuerzo de
Sp, y eso funciona un poco
diferente a nuestro EXP, que simplemente
modifica directamente la puñalada Así que vamos a verificar la selección de subir de
nivel, y solo me aseguraré de que
el artículo siga ahí. De alguna manera se inició, así que voy a
cargar rápidamente el valor
del artículo HP boost de uno, agregado en. Entonces ahora vamos a golpear
play una vez más. Sólo me aseguraré de
que vuelva a funcionar. Obtenga el impulso de HP desde el
nivel hacia arriba, selecciónelo. HP sube, seleccionamos
aquí y aquí, así conseguimos tres potenciadores HP Eso es trabajar bien. Lo último que
quiero ajustar, y esta es una rápida es que para nuestras selecciones de cajas de recompensa, no
bajan
al mismo tamaño. Cuando uno de ellos tiene
una descripción más larga. Entonces quiero saltar a la escena de selección de
recompensas. Da click en la raíz, y déjame ver aquí. Uno de estos necesita
expandirse hasta el final. Entonces, en realidad, la forma más rápida de
depurar esto sería presionar play Y mientras el juego se está ejecutando, voy a ir por aquí
y vamos a probar, cambiar el tamaño aquí. Y luego voy a tabular atrás
y ver si se actualizó. Bien, entonces nuestra área de impulso HP,
déjame revisar la raíz. Esto está configurado para llenar expandir. A lo mejor es la descripción la
que hay que hacer y ampliar. Así podemos ver la raíz aquí tiene expandir y llenar conjunto ya. Entonces voy a revisar
el contenedor de margen y asegurarme de que
también sea así. Entonces haremos el dimensionamiento
del contenedor de diseño. Rellenar. Bien, entonces otra
cosa podría mirar vista
remota para ver las notas que en realidad se están
ejecutando actualmente en el juego. Y vamos a expandir la capa World
Canvas a la interfaz de usuario. Tenemos el nivel de selección. Tenemos nuestro
contenedor de panel debajo de eso, el contenedor de margen,
el contenedor de caja V
y, el contenedor de caja de recompensas
y nuestras tres selecciones. Entonces, ¿por qué estos tienen
un tamaño diferente? Entonces podemos ver si miramos
a la derecha por aquí que las tallas para la
Y, son todas iguales. Eso es lo que
esperaríamos al mirar esto. Todos están estirados
todo el camino hacia abajo. Entonces encontremos el nivel
donde no están. El más pequeño
es el tercero. Entonces déjame ampliar eso. Haga clic en Contenedor de Margen. Podemos ver el contenedor de margen. Son los 20 píxeles de
tamaño completo, así que no es así. Bajemos al contenedor VBox. El contenedor VBox es 214. Eso es también lo que
esperaríamos porque el contenedor de margen
tiene un margen. Entonces supongo que en realidad es
esta caja de descripción. Puedes hacer clic en los
nodos y ver realmente un cuadro cuando se selecciona
aquí. Eso es algo genial. Creo que
en realidad podría ser nuevo. Entonces solo queremos que la descripción empuje
todo hasta el fondo. Bien, entonces sabemos lo que
estamos tratando de expandir. Entonces en la vista local ahora
arriba aquí arriba en la parte superior izquierda, hagamos clic en la descripción.
Ah, y ahí vamos. Ahí vamos. Entonces aquí abajo
en dimensionamiento de contenedores, está listo para comenzar a encogerse. Quiero que eso
sea realmente llenar y expandir. Ahora bien, si voy a tocar de
nuevo al juego, va todo el
camino hasta el fondo. Bien, así puedes
ver eso, ¿verdad? Estos tres están bajando. También me gustaría que los
tamaños de los iconos fueran iguales. Entonces tal vez necesitamos establecer un
tamaño absoluto específico para los iconos. Creo que tal vez el icono de la lanza
se configuró usando uno más grande, pero quiero asegurarme de que todos
vayan al tamaño correcto Entonces, si hacemos clic en el icono Rec aquí, intentemos cambiar el
tamaño de keep para ignorar el tamaño. Y creo que eso es
hacerlos iguales ahora. Sí, bien. Parece
estar alineado. Si tienes algún otro problema, eso sería una especie
de
proceso de depuración que puedes usar para arreglar tu interfaz
de usuario mientras
realmente tienes el juego funcionando Entonces es bastante útil
porque
en realidad puedes ver cómo se
va a
actualizar de inmediato puedes cambiar tu control dentro de
Gado y tu escena local, y se actualizará inmediatamente
en la vista remota. Entonces esa es en realidad una de las
cosas realmente geniales de Gudo Bien, entonces con eso, creo que
nuestro sistema de actualización recoge,
todo lo que necesitamos,
en ese sentido simplemente
está funcionando muy bien ahora Entonces ese es realmente el grueso del curso hasta este punto. Solo vamos a tener algunas cosas
pulidas por las que pasar, como guardar y cargar
un sistema de puntuación, como cuántos enemigos hemos
matado entre sesiones de juego, dorar un juego sobre la pantalla
para cuando realmente perdemos Así podremos ir a
nuestro menú principal y reiniciar el juego,
ese tipo de cosas. Pero la jugabilidad central está
prácticamente ahí ahora. Entonces eso va a ser
para este video, y luego
entraremos en la
etapa de wrap up y pulido del curso.
55. P54: Crear una pastilla de poción saludable para las gotas enemigas: Quiero virar un video más
sobre hacer camionetas para
tus artículos de juego Entonces creé la camioneta
para el artículo de impulso de HP, pero quiero crear un artículo que los enemigos dejarían caer
. Esto sólo será una
simple poción de salud. Entonces voy a buscar nuestro artículo
HP boost en el proyecto, y vamos a duplicar
la camioneta HP boost. Entonces haz click derecho y baja a duplicar y vamos
a llamarlo Poción de Salud TCN de dos puntos d. Ahora queremos
abrir esa escena, Salud poción tod punto Entonces nuestro artículo aquí se va a llamar Health Potion two D, solo para indicar que está en
el mundo del juego de las dos D. Para el
elemento HP Broca a la derecha, hagamos clic en el menú desplegable
y luego hagamos que este sea único. Así que esencialmente estamos tomando la base y creando
una copia única de la misma, y ahora voy a hacer clic derecho aquí y guardarla como
una poción de salud Así que haz clic derecho en Guardar como, y luego ponlo en el
proyecto y los artículos, y voy a hacer poción de salud Subrayar elemento TRS. Cambiemos los cambios de estadísticas para que solo aumentemos los HP en 25, y eliminemos el
Mx HP de este impulso. Ahora para nuestro nombre para mostrar, diré Poción de salud Y para la descripción, diré restaura 25 HP, punto. Y luego para el
ícono, seleccionemos otro ícono de nuestra región
y encontremos una poción de Salud Estoy seguro de que hay
algunos de ellos aquí. Entonces sí, más cerca de la cima, tenemos más que unos pocos. Realmente elige aquí. Iré con el
típico de aspecto. Y vamos a seleccionar eso. Y luego también necesitamos
agarrar ese mismo icono para el Sprite animado
dos D. Así que haz clic ahí, ve a la animación, haz
un nuevo Sprite frames, y luego selectelect
de Los íconos de arte,
hoja completa de sprites 16 por 16, acercan el
tamaño del conjunto superior a 16 por 16 Y luego controla el zoom del carrete del ratón
central hacia la parte superior y agarra
la misma poción de Salud, que está aquí mismo Debe ser solo uno seleccionado. Pulsa añadir. Bien, y ahí está
nuestra poción de Salud Entonces esto ya
debería poder funcionar. Déjame tirarlo al mundo del
juego como copia. Entonces tenemos nuestra
poción de Salud dos D.
Solo la pondré aquí
por ahora mismo, y luego solo podemos
usar la poción de Salud Entonces, en realidad, la
salud base comienza a los 50. Entonces si voy por aquí, se
puede ver 50 va a 75 de cada 100.
Entonces eso está funcionando. Bien, entonces tenemos que
entrar en la escena del esqueleto, y tendríamos que modificar
nuestro componente de gotas, pero en realidad nunca
configuramos gotas para el esqueleto.
Entonces vamos a Oc. Sólo voy a
seleccionarlo aquí y Control C, copiarlo sobre el esqueleto. Entonces en la parte superior derecha, tenemos nuestras definiciones de caída, que ya va
a tener la caída EXP con un peso de 1.0. Así que queremos agregar en la
capacidad de a veces caer una poción HP en lugar de la EXP Voy a agregar un elemento, y voy a hacer clic en
una nueva definición de caída. Entonces solo para fines de prueba, le
daré un peso de cinco gotas, lo que significa que
el 86% de las veces va a
caer una poción de salud, no un EXP, solo para que
lo veas funcionando Y luego carguemos rápidamente nuestra poción de
salud dos D. Bien, así que para nuestras gotas
que realmente funcionan, también
necesitamos agregarla como una
llamada a nuestra animación de muerte Entonces, hagamos clic en el reproductor de
animación, vayamos a Muerte, y
haremos una llamada a las gotas aquí. Entonces, al inicio, agreguemos
un método de llamada en las gotas. Y vamos a hacer click
derecho inserte una tecla para soltar con una sola vez. Eso está bien. otro error que cometí
en la recolección del artículo. Cuando empujamos el error
para el artículo no es nulo. Eso debería ser
realmente empujador si
es nulo porque estamos
tratando de verificar que realmente
recordamos establecer un artículo de exportación en
la recolección del artículo. Eso fue una simple inversión
lógica ahí. Bien, ahora sigamos adelante y golpeemos Play e intentaremos
derrotar a un esqueleto. Sólo voy a recoger algunos artículos
en XP aquí, obtener el sitio. Y sólo vamos a esperar a que salga
un esqueleto. Mientras tanto, podemos ver que los orbes siguen simplemente
bajando su XP Siempre, esa es la
única caída posible, y ahí tenemos un esqueleto. Entonces, si derrotamos a este tipo, 86% de las veces más o menos, debería dejar caer una poción de salud Entonces ese tiempo no lo hizo.
Tendremos que derrotar a un par más. Y vamos a ver. ¿Conseguimos
la poción de salud para desovar Sí, ahí vamos. Poción de salud Así que en realidad vimos que
ambos pueden engendrar. Otra poción de salud vino de ese esqueleto, otra poción de
salud Entonces puedes ver que
la ponderación
definitivamente está funcionando
la gran mayoría de las veces estamos obteniendo la poción de
salud
en lugar del EXP Entonces ahora que
sabemos que está funcionando, solo
podemos ir al esqueleto. Iremos a las gotas. Tomemos la definición de gota en la
poción y hagamos de ella un 0.1 Entonces eso significa que diez de 11 veces la EXP va a caer, y una de cada 11 veces la poción
de salud va a caer, y así es como funciona
la ponderación Sumas todas las posibilidades
más sus pesos, y tus probabilidades son
tu peso para ese específico dividido por el peso total de
todos ellos juntos. Bien, y así es más
o menos como
agregas una poción de salud
al juego Entonces puedes ver que una vez que
tenemos nuestro ítem stat, nuestras pastillas que nos
dan un ítem stat, y podemos simplemente aplicarlos
al jugador y podemos simplemente establecer como nombre de cadena a
qué estadística estamos afectando, se vuelve realmente fácil modificar muchas
cosas diferentes en nuestro personaje
56. P55: implementación de la sacudida de cámara para efectos de impacto y muerte del jugador: Ahora estamos pasando a la parte
pulida del curso, que va a
terminar las cosas sumando algunos
bonitos a mitades. Vamos a comenzar
con una sacudida de cámara al
golpe para que nuestro jugador haga el juego un
poco más intenso. Y también haremos
cosas como agregar en un juego sobre pantalla y la
capacidad de rastrear la puntuación más alta. Entonces comencemos
con el movimiento de la cámara. Vayamos al mundo. Y en el mundo, tenemos
una cámara dos D aquí. Así que podríamos simplemente
adjuntar un guión justo a la cámara dos D. Así que
voy a hacer clic aquí, adjuntar un guión,
y digamos agitar cámara dos D. Subrayar
dos D, debería decir Y vamos a crear y
vamos a poner eso en, supongo, la carpeta UI. Así que abre eso y crea. Le voy a dar el nombre de
clase shake Camera two D. Y
trabajemos en la configuración de esto. Entonces, antes que nada, necesitamos una
referencia a nuestro jugador como muchos otros guiones para que
cuando el jugador recibe daño, podamos tener el gatillo del
efecto shake. Así que vamos a hacer Exportar var
context of player context. Así que al igual que antes
con otros elementos de la interfaz de usuario, obtenemos acceso a las estadísticas
a través del contexto. Y luego agreguemos
algunas variables para controlar nuestra fuerza de sacudida. Entonces, antes que nada, exporta var Max shake strength
que es un flotador, y voy
a establecer eso en 10.0 por defecto. También podemos tener
una duración de batido. Así que exporta var shake duration, que es un float,
y lo estableceremos 0.3 segundos por defecto. Y luego quiero un conjunto
separado de variables para cuando muera
el personaje. Entonces esto debería ser una sacudida
extra fuerte para dar el impacto de, Oh, perdiste a tu jugador,
perdiste el juego. Entonces vamos a hacer Export Var
muerte sacudir fuerza, y eso va a ser un
float up default a 20.0 Y luego tenemos en la exportación
Var duración del batido de muerte, que voy a establecer en un flotador
de 0.6 segundos por defecto. Entonces, cuando empiece nuestro guión, quiero obtener las
estadísticas del jugador. Así que voy a decir
var underscore stats va a ser un
controlador de estadísticas aquí, y entonces necesitamos el
subrayado de función listo Entonces diremos estadísticas de puntos de
jugador de contexto, y vamos a establecer estadísticas de
subrayado iguales a eso Afirmemos que
eso no es nulo. G stats no es igual a nulo. Debe tener una referencia a las estadísticas del jugador
para poder sacudir la cámara. Bien, entonces cuando nuestra cámara está
temblando por todas partes, queremos recordar su posición
original para
que una vez que hayamos terminado, podamos volver a esa posición. Vamos a tener otra
variable aquí. Este va a
ser un vector dos D, subrayado offset original, que va a
ser un vector 20 Bien, recuerda el signo
igual ahí. Así que estamos inferyendo que es un vector del vector dos punto cero, y esto lo convierte en un
vector 20 también Bien, entonces nuestro
offset original on ready
va a ser igual a
nuestro offset actual. Entonces este es el offset
de la cámara porque nuestro guión extiende
esta cámara directamente. Y luego necesitamos conectarnos al controlador
de estadísticas
HP cambió la señal. Así subrayan las estadísticas Hp
colgado punto Conectar. Y vamos a conectar
que vamos a conectar eso a en HP cambiado. Así que vamos a crear esa
función aquí abajo, el
subrayado en HP cambió, y eso va a
tener los datos de estadísticas Entonces P data y esto es
stat datos cambiados. Esta vez cuando tenemos
nuestra función de devolución de llamada, en realidad
voy
a usar los datos P directamente porque aquí es
muy útil para determinar si estamos
haciendo un batido regular
o estamos haciendo un batido de muerte Entonces, si el cambio de HP en el evento es mayor
o igual a cero, solo
queremos regresar
porque no estamos temblando en una curación o si el
HP no cambia. Entonces ahora queremos comprobar si el valor del evento punto u
es mayor que Zarel Entonces, ¿el personaje sigue
vivo, esencialmente? Entonces, si ese es el
caso, entonces vamos
a usar los valores normales de shake. De lo contrario, vamos a
usar el valor del batido de la muerte. Entonces,
la fuerza de sacudida de subrayado va a ser igual a nuestra fuerza
máxima de sacudida, y luego el tiempo de sacudida de subrayado va a ser igual
a nuestro agarre Nuestra duración Shake. Bien, entonces necesitamos esas variables
locales aquí arriba. Así que var subraya la fuerza de
sacudida es un flotador y Var subraya
Shake time también es un Hay por supuesto, va
a default a cero. Ah, y cuando puse evento aquí, realidad
me refería a Pdta Así cambio de punto pata
y pdata punto neu. Bien, así que de lo contrario, aquí hay
otro caso, que es que la
salud está por debajo cero o igual o por debajo de
cero, debería decir. En cuyo caso vamos a poner la fuerza de la sacudida
a los valores de la muerte. Por lo que subrayar
la fuerza del temblor va a ser igual a la fuerza del
temblor de la muerte, y el tiempo de sacudida
va a ser igual a la duración del batido de muerte Bien, ahora, hay otra
cosa aquí, que es que dependiendo de
lo saludable que esté nuestro carácter, es posible que
queramos aumentar
o disminuir la fuerza. Entonces por eso tuve MX
shake strength aquí. Ahora mismo, siempre
va a ser ese máximo de 10.0 que configuré ahí. Entonces creo que una buena manera de
hacer esto sería verificar cuánto daño infligiste versus cuál es el HP máximo
del personaje. Entonces, si un ataque hace la
mitad de su salud, quieres que sea un temblor de cámara
bastante fuerte. Pero si es solo una garrapata de daño
a lo largo del tiempo, como, Oh, hace un daño por segundo, eso es bastante
intrascendente Simplemente puedes hacer que sea
un batido muy pequeño o eliminar completamente
el batido por completo. Entonces var, la relación de daño va a ser igual al valor absoluto F, del evento punto hg. Esta es la cantidad de
salud que acabamos de cambiar, y eso va
a dividirse por el máximo de cualquiera de los dos puntos oh. Entonces mientras editaba, noté que las matemáticas aquí son incorrectas. Llamar al máximo
entre un punto oh y el punto de estadísticas MX HP no tiene mucho
sentido aquí porque
en realidad queremos que la relación esté entre el
cambio y la salud, el valor absoluto de eso de
todos modos. Y el MX HP. Entonces realmente lo que queremos hacer
es decir var por ciento de cambio. Y lo que realmente
queremos que esto diga es el valor absoluto float
del p data dot change dividido por guión bajo
estadísticas punto MX HP Entonces eso nos da nuestra proporción, que debería ser de 0-100 Pero queremos abrazar eso. Entonces digamos relación sujeta ahora. Voy a cortar
esto y digamos sujetar F en el cambio porcentual, y
lo vamos a forzar entre 0.0 y 1.0. Entonces, si por alguna razón nuestro valor de cambio en realidad era mayor que nuestro MX HP
total, como, digamos que recibimos 9,000 daños
y nuestro HP máximo fue de 100, entonces eso
sería en realidad un cambio porcentual de 90 Así que en realidad
queremos simplemente limitar eso al 100%
o si
vamos en la otra dirección, no
puede estar por debajo del 0% de cambio. Entonces nuestro valor total
va a ser 0-100, no importa cuán grande o
pequeño sea el cambio Multiplique la fuerza máxima de sacudida
por la relación de sujeción. Lo último que tenemos que
hacer aquí para
asegurarnos de que esto
en realidad no regrese como cero es tomar el MX HP
y lanzarlo a un flotador. Entonces eso es importante
porque de lo contrario, entero dividido por un
entero simplemente dejaría caer el punto decimal antes de convertirlo incluso en
un cambio porcentual. Ahora podemos seguir adelante
y correr y
asegurarnos de que siga
funcionando como se esperaba, así encontraré a un tipo que nos golpee. Bien, y todavía tenemos
ese movimiento de pantalla, ¿verdad? Por supuesto, el de la muerte
será mucho más grande. Entonces, debido a que cambiamos las matemáticas, es posible que también quieras ajustar la fuerza de sacudida máxima y hacerlo más fuerte,
como 20 o 30. Y recuerda, esto
siempre va a ser un porcentaje de la fuerza
máxima de batido. Entonces necesitas tener
en cuenta eso cuando realmente estás averiguando qué tan fuerte va a ser
el batido Entonces, veamos, a los 30, la fuerza
máxima es algo
así. A lo mejor un poco fuerte. Así que incluso podría bajar
eso a 20. Como más de un número final. Bien, ahora, finalmente, en realidad
necesitamos el proceso para el batido. Así que vamos a subir a la cima aquí. Después de subrayado listo, voy a decir función subrayado
proceso Delta Entonces solo estoy llenando eso automáticamente. Y entonces vamos a decir, si el tiempo de batido es
mayor que 0.0, entonces vamos a sacudir
realmente la pantalla. Entonces, cómo lo hacemos
es con algunas matemáticas. Entonces vamos a decir guión bajo
sacudir el tiempo de subrayado es menos igual al Delta Entonces quitamos el tiempo del tiempo que estamos transcurriendo aquí, y luego voy a
obtener el valor del batido X y
el batido Y y aplicar
ese desplazamiento a la cámara Entonces var shake X va a
ser igual al rango F aleatorio de 1.0 a 1.0
veces la fuerza de sacudida negativa. Entonces, esencialmente, estamos
obteniendo una dirección aleatoria multiplicada por nuestra fuerza de sacudida
actual. Y luego var shake Y, claro, te
imaginas que eso es lo mismo. Va a ser igual al rango de subrayado F
aleatorio, negativo 1.0 a 1.0 veces
guiones bajos fuerza de sacudida Tomamos ambos, y lo
aplicamos al offset de la cámara. Entonces offset va a ser igual desplazamiento normal
más
el vector dos, y esto va a ser
shake X y shake Y. Así que esencialmente en
cada actualización de fotograma, la cámara va a temblar a una nueva posición aleatoria ligeramente
fuera del offset original, y lo hará hasta que termine
el tiempo de agitación. Entonces, si el tiempo de batido
es cero o menos, entonces diremos otra cosa, entonces
queremos devolver el
desplazamiento de la cámara a sus originales. Entonces offset va a ser
igual al offset original. Bien, y si tengo este derecho, ese es más o menos
nuestro guión ahí. Lo último que
vamos a necesitar hacer es asignar el contexto del jugador
y el inspector. Tan rápido por aquí, desplegable, carga
rápida, contexto de jugador. Y vamos a ejecutar el juego
y dejar que nuestro jugador golpeado y ver si
funciona como se esperaba. Bien, entonces aquí hay un orco, y ahí está nuestro movimiento de cámara
cada vez que nos golpean Y ahí está nuestro
temblor de cámara al morir, que es mucho más fuerte,
como puedes ver. Entonces, esencialmente, ese es nuestro efecto de sacudida de cámara
completo. A continuación, obviamente,
sería un buen momento para poner en la pantalla GameOver para que podamos volver al menú Inicio del juego, que también necesitamos crear
57. P56: cómo crear un juego sobre pantalla con la navegación por el menú principal: Una de las últimas cosas que
necesitamos agregar es una pantalla GameOver y
una pantalla de menú mínima. Entonces GameOver
va a aparecer, por supuesto, cuando nuestro
personaje sea derrotado Así que tendremos que
volver a acceder
al contexto del jugador para que podamos verificar
si vivo es falso. Entonces primero, voy a abrir el sistema de archivos
e ir a la interfaz de usuario, y vamos a encontrar nuestra jugabilidad
principal UI Canvas que hará que sea un
poco más fácil trabajar
para que podamos ver dónde vamos a
poner el juego sobre la pantalla. Entonces, por ahora,
creo que voy a subir de nivel
la selección
y esconder eso. Hará que sea más fácil trabajar en él. Y tomemos la interfaz de usuario. Voy a hacer
clic derecho en Agregar un Nodo hijo. Y así queremos un nuevo control este control va
a estar centrado. Entonces, en el diseño, hagamos anclajes de posición de
diseño y hagamos centro Ahora, te click también ve al mouse
y gira el filtro a Ignorar. Y hagamos clic derecho y agreguemos un contenedor de panel a
este nodo de control. Así contenedor de panel.
Ese será el trasfondo. Tomaremos el
contenedor de panel y lo estiraremos. Así que acerque, asegúrese de que el contenedor
del panel esté seleccionado por aquí, y expandamos eso. Entonces nuestro contenedor de panel queremos centrado en nuestro control padre. Así que vayamos al diseño ahora y
hagamos el centro de anclajes de diseño. Eso debería poner a los padres anclas aquí mismo en el
centro, así que eso es bueno Lo hará centrado
en la pantalla. Cambiemos el nombre del
nodo padre para que sea la pantalla GameOver. Además, haz clic derecho en
él y guárdalo como una sucursal en la
carpeta UI, pantalla GameOver Así que ahora podemos simplemente saltar a
esto y editar esto puramente. Así que nuestra pantalla GameOver, por supuesto
vamos
a necesitar algo así como una etiqueta de texto enriquecido como título Hagamos clic derecho en Agregar
una etiqueta de texto enriquecido. Y solo puedo decir
GameOver dentro de ti. Probablemente querremos
hacer que el
tema basado en raíces también sea nuestro tema principal del
juego. Tan rápido carga el tema aquí, tema
del juego que
nos dará la fuente Pix art. Ahora también podemos tomar
la etiqueta de texto enriquecido, y digamos encajar el contenido. También queremos
decir texto centrado, y parece ser
demasiado grande también. Eso no va a ser un problema, creo, después de que agreguemos el
contenedor VBox en así que,
derecho, haga clic en el contenedor
del panel, agregue un contenedor VBox Mueva la
etiqueta de texto enriquecido debajo de ella. Bien, eso arregla el dimensionamiento de eso ya que ahora está
controlado por el contenedor. Vamos a hacer click derecho
sobre la VBox y agregemos tal vez una rata de textura y luego obtendremos un ícono
triste para ahí Y luego obtendremos
un ícono de GameOver. Si usamos textura y hacemos textura
atlas, la expandimos. Y luego para el atlas, carguemos rápidamente nuestros íconos. Podríamos simplemente usar el 64 64 aquí si vamos a
mantener eso en el proyecto. Editar región. Bien,
y luego tenemos que alejar zoom y
seleccionar algo que sea bueno para, como, un juego terminado. Así que hay muchas
opciones para elegir. Estoy pensando en esta calavera que
parece que está durmiendo. No es demasiado oscuro, no
es demasiado lindo, así que creo que eso podría funcionar. Déjame sacar esto del camino para que pueda ver al editor de región. Podría necesitar
cambiar realmente el tamaño aquí. Voy a intentar un paso de cuatro
en la X y cuatro Y. De
esa manera, puedo estirar
esto hacia la derecha, y luego la izquierda y la derecha van
a coincidir entre sí. También voy a tirar de
abajo hacia arriba un poco. Bien, entonces con el paso 44, eso funcionó un poco bien
para que pueda acercarme aquí. Acercamos el zoom en nuestra pantalla
GameOver. Voy a querer
creo que clip de filtro. Creo que también para
el modo stretch, necesitamos mantener el aspecto centrado, y eso me queda bien. Por lo que también agregaremos
en un cuadro de descripción. Entonces, haz clic derecho en el VBox, agrega otra etiqueta de texto enriquecido, y podemos decir,
has sido derrotado Intentamos volver a intentarlo. Claro, vamos con
eso, encajar el contenido. Sí. Y luego solo
necesitamos un botón aquí en la parte inferior para ir
al menú principal. Entonces, haga clic en VBox, agregue un botón de nodo hijo Este botón dirá menú principal. Le voy a adjuntar un guión. Entonces este será un nuevo botón. Bien, a continuación,
tomemos
aquí este botón y voy a renombrarlo botón de cambio de
escena porque vamos
a volver al menú principal. Vamos a adjuntarle un guión. Entonces esto será el
botón de cambio de escena punto GD. Crea eso. Y queremos agregar
Exportar var una misma ruta. Así que en realidad podemos hacer de
esto un archivo de exportación, y esto serían citas punto
estrella TSCN Bien, entonces nuestra ruta de escena es
una cadena y luego en listo nos conectaremos a
su señal presionada, así que presionado punto conectar
en botón presionado, y luego función
subrayado en botón presionado simplemente
cambiará a Así que vamos a hacer Gtree punto
cambio de escena a archivo, y ponemos en la ruta de la escena, y luego eso va a
cambiar nuestra
escena actual a la escena del menú principal Como comprobación importante, probablemente
ayudaría si decimos
afirmar que la trayectoria de la escena está vacía Es igual a false y
decir que debe haber una ruta de visión para cambiar
cuando se presiona este botón. Bien. Entonces una cosa más que probablemente quiera es un contenedor de
margen. Vamos a hacer clic derecho
en la pantalla GameOver, agregar un contenedor de margen Voy a
ponerlo directamente debajo del contenedor del panel y
luego VBox debajo de eso ¿Bien? Así que ahora
podemos establecer valores en el contenedor de margen
y sobrescrituras de tema, algo así como cuatro
para todos los lados, y eso hará que se
vea un poco más agradable, dando un poco de
búfer para el texto Y nuestro juego a través de la pantalla, tenemos
que asegurarnos de que esto abrirá la interfaz de usuario cuando se pierda el juego. Entonces voy a adjuntar
un nuevo guión aquí. Juego de interfaz de usuario sobre pantalla. Crea eso. Podría querer un nombre de clase aquí,
juego sobre pantalla. Y vamos a obtener una referencia al jugador
a través del contexto. Así que en Export vara Context
es de tipo player context. Digamos que el subrayado de la función
está listo, y listo, haremos estadísticas de puntos
del jugador de puntos de contexto, y obtendremos el cambio de Alive Conectémonos a eso y
digamos sobre jugador Alive cambió. Entonces tenemos nuestra
función subrayado en jugador Alive cambiado. No recuerdo si eso
tenía algún parámetro, así que voy a hacer clic en el símbolo Alive cambiado, y
lo comprobaremos, tiene el Boole en vivo así que
vuelve al juego sobre guión, y lo necesitamos como
parámetro aquí Entonces P Alive es un booleano. Esto volverá nulo. Y si P Live es igual a falso, entonces aquí vamos a mostrar todo
nuestro menú de juego. Bien, ahora, nuestro estilo de
botón de cambio de escena no va a funcionar porque
no tenemos escena de menú principal. Así que vamos a crear un marcador de posición. Agrega una nueva interfaz de usuario de escena, y este será el menú principal. Lo guardaré en el proyecto. Entonces, hagamos
eso en la raíz del menú principal
del proyecto, guárdalo. Y luego en el
juego sobre pantalla, asignemos ese menú principal como un camino a la ruta de escena y el
botón de cambio de escena así. Simplemente puedes arrastrar y soltar. Esa es la forma más fácil de hacerlo. Bien, también, antes de que me olvide, vaya a la pantalla Game Over y
asigne el contexto del jugador. Así que simplemente carga rápidamente ese recurso de contexto de
jugador. Ahora queremos ir al mundo. Podemos ver que el juego
sobre la interfaz de usuario está ahí mismo. Entonces veamos si podemos
probarlo muy rápido. Y asegúrate de que podamos ir
al menú principal a través de él. Así que le pegué a Play. Y
está ahí mismo. Voy a golpear el
menú principal, y eso nos da una pantalla en blanco
porque en
realidad no hemos agregado nada
a esa escena. Es solo un
elemento de interfaz de usuario en blanco, esencialmente. Entonces eso en realidad está funcionando. Creo que la otra
cosa que queremos hacer está lista para el
juego sobre pantalla. Solo asegurémonos de que se esconda. Entonces diremos esconderse listo. En nuestro juego UI Canvas, posible que también
queramos
ocultarlo allí, pero no hay necesidad necesariamente
significa si ayuda. Pero solo lo dejaré visible por defecto para que podamos
probar la altura. Entonces se esconde, y ahora
solo tenemos que ir a ser derrotados, y debería aparecer
si está funcionando correctamente. Entonces dos hits, tres hits,
cuatro hits, cinco hits. Ahí está nuestro juego sobre pop up, menú
principal, y el
flujo está funcionando. Lo último que creo que necesito
aquí es solo cambiar el tamaño de esto. Así que llevaré el
juego a través de la pantalla dentro de nuestro
juego UI Canvas, y tomemos la forma de diseño y llevemos la escala a tres. Eso debería ser lo suficientemente grande. Así puedo probarlo una
vez más muy rápido en el juego. Bien, entonces un hit, dos it, tres, cuatro it, cinco
hit, game over. Y obtenemos el botón del menú principal. Y ese es el flujo básico.
58. P57 Seguimiento de puntuación alta y visualización de la interfaz de usuario para las derrotas de los enemigos y el tiempo de supervivencia: Uno agradable tener que a nuestro juego le falta
es una puntuación alta, poder rastrear a cuántos enemigos hemos
derrotado en un juego, y luego recordar esa
puntuación en un archivo seguro para una hoja de puntuación alta que
pudimos ver en la pantalla del menú
principal. Entonces, para implementar eso, primero
tenemos que empezar
contando cuántos enemigos hemos derrotado cada vez que un
enemigo es derrotado. Así que vamos a
necesitar alguna combinación de informar sobre el estado de la muerte a un administrador de estadísticas o gerente de puntaje
alto, y luego tomar ese
valor después de que
termine el juego y guardarlo para
actualizar el archivo Safe. Así que antes en el curso, agregamos en un juego manager Singleton y nunca
realmente hicimos mucho con él De hecho, la forma en que implementé el juego a través de la pantalla
terminó simplemente usando el
contexto del jugador en lugar de
tener que informar directamente sobre el administrador del
juego. Así que, en realidad, vamos
a darle al administrador del juego algo de un propósito para que
podamos usarlo en el curso. Así que tendremos un
objeto dentro de un administrador de juego para las estadísticas del juego, y luego
lo rastrearemos durante el juego. Y luego lo establecemos
cada vez que iniciamos una nueva. Entonces en sistemas,
voy a hacer
click derecho y hacer un nuevo script. Digamos que son las estadísticas del juego, que serán un ref
contado porque en realidad
vamos
a convertirlo en un hijo del
manager del juego Singleton Entonces abre las estadísticas del juego, y luego digamos si
nuestros enemigos derrotaron, que será un entero
que por defecto es cero, y necesitaremos un
nombre de clase aquí arriba en la parte superior Así que las estadísticas del juego. Y
luego en game manager, voy a tener una función de inicio, que volverá nula, y eso va a
tomar nuestras estadísticas de juego y restablecerla o
configurarla en un nuevo objeto. Entonces, para las estadísticas de las estadísticas del juego. Esto va a ser estadísticas
iguales a GameStats dot nu. Vamos con eso por ahora. Y cuando el mundo cargue, voy a querer tomar las estadísticas del
juego y restablecerlas. Así que vamos a adjuntar un
guión al mundo. Todo derecho haga clic aquí,
adjunte un guión. Lo pondremos en la escena base. Así que crea eso y voy a
decir función lista, y diremos game
manager dot SAT. Bien, así que sea lo que sea que
necesitemos
que cargue nuestro juego al inicio,
solo tendremos eso ahí. Así que mientras estemos usando
el script world aquí, entonces podremos
manejarlo. También podemos querer
darle a esto un nombre de clase. Podría terminar siendo
un guión bastante importante si fuéramos a continuar
con la serie. Entonces creo que merece
el mundo del nombre de clase. Así que ahora, cada vez que
iniciamos un nuevo juego, esencialmente
va
a restablecer las estadísticas. Y entonces tal vez reportar juego terminado. Podríamos considerar
entrar aquí un poco más tarde y guardar
estadísticas de puntaje alto como hacer. Bien, ahora quiero
modificar nuestras estadísticas, y quiero reportar cada vez que se modifiquen
nuestras estadísticas. Entonces, en las estadísticas del juego, crearemos una señal para nuestros
enemigos derrotados. Así que los enemigos de señal
derrotados, cambiados. Tomaremos una cantidad y un
entero como parámetro, y seguiremos
un patrón similar donde cada vez que
actualicemos el valor, y nos protegeremos de
si son los mismos valores. Yo enemigos derrotados es igual
a valor, solo regresamos. De lo contrario, estamos
estableciendo un nuevo valor. Entonces los enemigos derrotaron
a igual valor, y luego decimos enemigos derrotados cambiaron punto m con un nuevo valor. Bien, así que justo cuando
actualizamos la propiedad, reportamos con una señal para que podamos
observar la propiedad. Y creo que eso es
todo lo que necesitamos para configurar una interfaz de usuario. Bien, entonces ahora que eso está ahí, siempre que tengamos el estado de la
Muerte en, digamos, nuestro orco o nuestro esqueleto, saltemos al guión del estado de
muerte Entonces, en nuestro estado de Muerte, estoy pensando en Enter
tiene más sentido por decir estadísticas de puntos del manager del juego, EMS derrotado más es igual a uno, y así es como
actualizaremos ese contador haciendo un
seguimiento de todos los
enemigos que hemos derrotado. Ahora lo último que necesitamos es un poco de UI para mostrar a cuántos enemigos hemos derrotado y así dentro de nuestro
juego UI Canvas, agreguemos otro vamos a
convertirlo en un contenedor de panel. Agrega el contenedor del panel hijo aquí, y pondremos el diseño como los anclajes en la parte superior derecha Lo estiraré
un poco así. Desplazarlo. Déjame nombrar esto
para que sea la vista de estadísticas del juego. Luego haga clic derecho en guardar una rama como escena
y la interfaz de usuario, por supuesto, salte a la escena, y hagamos clic derecho en ella
y le demos un guión. Entonces esta será la vista de Gamestts. Puedo darle el
nombre de la clase, vista de gamests. Y en la vista de dos D
donde la editamos, agreguemos una etiqueta para nuestros
verdaderos enemigos derrotados. Así que haga clic derecho en Agregar nodo hijo. Empezaremos con un
contenedor HBox, creo, y luego haremos clic derecho en
Nodo Achil, etiqueta de texto enriquecido Yo sólo duplicaré eso. Entonces el primero será
para mostrar el texto, y luego el segundo
será el número. Entonces esta será la etiqueta stat. Y luego la de abajo
será la etiqueta de cantidad. Bien. Entonces el
sello del SAT va a mostrar
consistentemente a
los enemigos derrotados, dos puntos, vamos a encajar al contenido. Y luego el segundo, voy a
verter corchetes, cero. Entonces eso es solo un marcador de posición. Y creo que necesitamos que estas se estiren
para que
podamos verlas de verdad. Así que intentemos ir a layout, dimensionamiento de
contenedores y
expandirnos en la horizontal. Sí. Y luego etiqueta de cantidad, lo
mismo. Ir a maquetación. Dimensionamiento del contenedor, expandir en el, expandir en la horizontal. Bien, entonces ahora esto es algo
así como lo que tenemos ahora mismo. Bien, entonces ahora toma las estadísticas del juego hit Q para entrar en modo selecto, y lo reduciremos
a lo que necesitemos. Un contenedor de margen
también estaría bien aquí, así que haré clic derecho y agregaré
un contenedor de margen secundario, y pongamos contenedor HBox debajo de eso en el contenedor de
margen El tema anula
las constantes y tal vez cuatro píxeles en cada lado.
Eso se ve mucho mejor. Creo que eso podría ser
lo suficientemente funcional por ahora mismo. Volveré al juego UI Canvas
y me aseguraré de que esto vuelva a estar en la esquina superior
derecha como un ancla, arriba a la derecha, y luego
lo compensaré golpeando W para moverlo Entonces sólo tienes que moverlo un poco hacia abajo de
la esquina. Bien. Y luego necesito en
el guión de GameSTTS view, necesito conectarme realmente a
la señal en los Así que la función subrayado ya. Vamos a hacer
manager de juego estadísticas de puntos puntos enemigos derrotados cambiaron conectar
a enemigos derrotados cambiados. Voy a tomar ese nombre y hacer
una nueva función aquí abajo, función sobre enemigo
derrotado cambiado, que va a
tomar la cantidad P y retorno entero void, y vamos a
actualizar el valor ahí. Bien, así que básicamente
tomamos la nueva cantidad y ponemos a la etiqueta. Así que en Export VR. Entonces de todos modos, tomamos
a nuestros enemigos derrotados etiqueta, y establecemos el texto
igual a una cadena de la cantidad y eso
es más o menos eso. Sólo necesitamos dos puntos
aquí al final. Tal vez en listo, queremos
afirmar que existe la etiqueta
derrotada del enemigo Debe establecer la etiqueta de enemigos derrotados para mostrar el
conteo o el montaje de enemigos derrotados. Seremos un
poco más precisos. Ahora, haz clic en la
Vista de estadísticas del juego, salta a la escena. Y dentro de aquí, queremos
asignar esa etiqueta de cantidad. Así que haz clic en asignar y
elige la etiqueta de cantidad. Y si lo tengo bien, eso
debería ser todo aquí. Así que vamos a jugar y
darle una oportunidad. Todo lo que tenemos que hacer es derrotar un par de enemigos y verlo
aparecer en la parte superior derecha. Entonces el problema aquí es que las estadísticas no
se inician en nada, así que quiero hacer
clic con el botón derecho en el símbolo de Lou supongo que
el problema aquí es que las estadísticas podrían no establecerse
antes de que se ejecuten listas en la interfaz de usuario, ya que esa es la
cima del mundo, supongo que los niños
listos primero. Entonces, una mejor manera de
hacer esto, supongo, sería decir que las estadísticas
son iguales a gamestts dot u
Así que esto siempre se
creará cuando comience el juego. Así que esto siempre se
creará cuando comience el juego Y luego queremos
llamar a stats dot reset. Así que solo haremos una
nueva función para eso. Esto también significará
que no necesitamos
reconectar señales porque
todavía estamos usando el mismo objeto Entonces en realidad es una
mejor manera de hacerlo. Vamos a saltar a las estadísticas del juego y
crear nuestra función de reinicio. Entonces restablecer la función. Simplemente llevamos todo de
vuelta a sus valores predeterminados. Entonces enemigos derrotados es igual a cero, y eso debería ser todo
lo que necesitamos para ahora mismo. Por lo que ahora las estadísticas
deben establecerse tan pronto
como comience el juego antes de que
el mundo esté incluso cargado. Y luego a partir de ahí,
deberíamos poder
conectarnos a la señal. Bien, intentemos una vez más. Bien, juega. Bien, tenemos
un conteo en la parte superior derecha. Por supuesto, es
demasiado pequeño, pero al menos
podemos ver eso. Así que vamos a derrotar a un orco y
asegurarnos de que está funcionando. Y ahí tenemos uno para
aparecer si matamos a otro tipo. ¿Bien? Ahí tenemos
tres. Entonces sí, el conteo está funcionando seguro. Solo necesito escalar la interfaz de usuario. Entonces en jugabilidad Canvas, simplemente
haremos eso aquí. Una
escala de transformación simple de tres. Mueva eso a
la derecha aquí. Y ahora tenemos que cortar
realmente gran
parte de este espacio extra. Eso es simplemente tomar
demasiado sin motivo alguno. Entonces voy a necesitar un
poco de edición ahí. Vamos a saltar a
la vista de los juegos. La etiqueta de cantidad,
en realidad voy a cambiar eso de nuevo a cero sin los corchetes para que antes de
derrotar al primer enemigo, no tenga
ninguna exhibición torpe Bien, ahora para que el
tamaño sea demasiado grande, creo que mucho de
eso es solo que configuro manualmente los
gamests view size Así que vamos a reducir eso por aquí
a lo que realmente necesitamos. Así que podemos hacerlos
mucho más pequeños. Y esta segunda vista
no necesita ser casi tan
grande como la primera. Entonces no hay
razón para que
ocupen la misma
cantidad de espacio. Creo que lo que en realidad podríamos querer es más un contenedor de
flujo. Permítanme cambiar el tipo
de contenedor de caja H a
un contenedor de flujo H de flujo. Bien, ahora bajaré
a la etiqueta de cantidad, y desmarquemos expandir aquí Y luego intentemos tomar el tamaño mínimo personalizado
y configurarlo a,
como, 40 píxeles,
probablemente lo suficientemente grande, para que pueda aguantar hasta los
mil dígitos por lo menos. Y entonces el resto
del espacio
va a ser ocupado
por el enemigo derrotado. También cambiemos la
vista en la base a nuestro tema predeterminado de Tema de juego de carga
rápida. Sí, bien, eso va
a tener un gran impacto, también. Entonces ahora, si lo miramos, realidad
puedo reducir esto. Debería haberlo hecho
al principio, de verdad. Entonces algo así,
ese es nuestro espacio para la etiqueta y el
número de ahí. Podemos ir al juego jugar UI Canvas y podemos reducir
esto drásticamente. Se puede ver que
todo lo que no es ese píxel del lado derecho solo es consumido por la etiqueta de
texto de la izquierda. Entonces es mejor si ambos
elementos no están tratando de ocupar una parte igual del tamaño
de la vista, sino que uno es
como un tamaño estático, y el resto simplemente se expande. Y luego voy a poner esto un poco más en la
esquina de allá. Le pegaremos a Play. Y mira
cómo resulta eso. Bien, eso es mucho mejor, talla
más apropiada. Entonces, claro, sólo
para volver a probar. Simplemente vamos a derrotar a un tipo, y eso se actualiza, así que
tenemos a nuestros enemigos derrotados contar. Entonces agreguemos una
estadística más, que es
cuánto tiempo ha
sobrevivido nuestro jugador en el juego, otra estadística útil para tener
y buena para nuestro puntaje más alto. Entonces en nuestra vista de Gamests, voy a duplicar
este contenedor HBox Ahora vamos a
necesitar un contenedor VBox para que puedan superponerse uno
encima del otro Haga clic derecho en
Contenedor de margen, agregue una VBox. Mueve ambos cuadros H debajo
de él, así, y ahora cambia la etiqueta de
estadísticas de la izquierda al tiempo sobrevivido colon. Y si entramos en GameStatsVew, va a ser
una Simplemente nos conectaremos a
las estadísticas de cuánto tiempo hemos vivido y mostraremos que
en el tiempo sobrevivió el área. Entonces, hagamos clic derecho en Estadísticas, busquemos el símbolo
y abramos eso. Así que vamos a tener
var tiempo sobrevivido, que es un flotador igual a 0.0. Vamos a establecer el valor en él. realidad no deberíamos necesitar a este
guardia. Es sólo un extra. Así que voy a decir que el tiempo
sobrevivió equivale a valor. Y luego, por supuesto, el
tiempo sobrevivió, cambió emite, el tiempo sobrevivió. Y entonces tendremos esa
señal aquí arriba en la parte superior. El tiempo sobrevivió, cambió. Lo cual va a
ser una carroza del tiempo. Bien, entonces toda la
razón para tener este guardia es que
si por alguna razón, algo en el juego puso el valor al valor
que ya está en,
como, enemigos derrotados era
50, y ahora son 50 otra vez. Yo activaría una actualización
adicional de la interfaz de usuario. Pero honestamente, antes
que nada, es poco probable que eso suceda. Y segundo, en realidad no
debería hacer un gran problema con nada. Entonces es más de solo por
tecnicismo. Solo se cambia si
el valor realmente
cambió en lugar de realmente
un problema para el juego. Entonces solo quería
aclarar eso. Bien, ahora, nuestro reinicio
también necesita tomar tiempo sobrevivido y establecer eso igual a 0.0 porque estamos
reiniciando el tiempo Bien, ¿entonces vamos a ver qué más? En nuestro mundo de juego, estoy pensando que
queremos incrementar el tiempo Entonces, cuando el mundo esté funcionando, tendremos un proceso de
subrayado de función Va a tomar el
manager del juego dot stats dot TV plus iguala al Delta. Pero esto solo puede ocurrir realmente
mientras el jugador esté vivo. Así que vamos a hacer Exportar para el contexto en Exportar
contexto VR, contexto de jugador. Puedes ver dónde estamos usando este recurso de contexto en
todo el juego en
diferentes lugares. Por lo que tener eso como
un recurso guardado, es sumamente útil
para poder difundir la referencia
para toda nuestra interfaz de usuario y otros nodos que necesitan
hacer referencia al jugador sin tener directamente
referencia de escena al jugador. Entonces ojalá, he dejado
claro lo útil que puede ser eso. Entonces tenemos el contexto del jugador, y solo queremos
incrementar el tiempo sobrevivido si el jugador está vivo. Entonces, si contact dot player
dot stats dot Live, entonces incrementaremos el tiempo De lo contrario, sólo
vamos a saltarnos eso. Y eso debería ser lo suficientemente
bueno por ahora necesito una referencia a
la nueva etiqueta de cantidad. Entonces diremos en Export var, Time label es una etiqueta de texto enriquecido, y esta es la vista
GameSts, por supuesto Así decir manager del juego estadísticas punto punto Tiempo sobrevivir
cambio punto Conectar, en el tiempo sobrevivir
sobrevivió, cambiado. Y solo tenemos otra
devolución de llamada aquí abajo. La función en el tiempo
sobrevivió cambió, obtiene el flotador PT. Vamos a regresar void, y luego colocamos el
texto en la etiqueta. Entonces, el
texto de punto de etiqueta de tiempo va a ser igual a una cadena del PT, y eso probablemente sea lo suficientemente bueno. Yo solo haré una afirmación
en la etiqueta de tiempo también. Asegúrate de que esté listo. Necesita establecer la etiqueta de tiempo para
actualizar el tiempo sobrevivido. Bien. Y en nuestra vista de Gamests, asignemos esa
otra etiqueta de cantidad Es posible que queramos cambiar el nombre de
estos contenedores HBox. Por lo que el primer contenedor fue el contenedor derrotado del enemigo. Y entonces el segundo es
el contenedor de tiempo sobrevivido. Entonces solo aclarando
cuál es cuál. Asegurémonos de que esté
en la interfaz de usuario del juego. Vamos a salir al mundo, a
ver que sigue ahí. Golpea play para probar y correr y ver cómo va a quedar
eso. Ah, bien, entonces no he establecido el contexto en el
mundo, claro. Entonces en el nodo mundo, tenemos que cargar rápidamente
el contexto del jugador. ¿Bien? Y ahora, si corremos, el tiempo debería
poder incrementarse Y luego tenemos el tiempo allá
arriba en la parte superior derecha. Ahora bien, esto está funcionando mayormente. Creo que aquí hay un
par de temas. Uno, parece que necesitamos
expandir esto un
poco más grande verticalmente. Oh, bonito. Cuando el
juego es positivo, también
se detiene. Eso es importante. Y luego, en segundo lugar, no
creo que
necesitemos mostrar todos
los milisegundos. Creo que reducir esto
a un decimal
sería un poco menos
estresante para los ojos. Se puede ver que el segundo y tercer decimales están volando Ni siquiera lo puedes leer
. Entonces no tiene sentido mostrar
esa información. Bien, entonces para cambiar nuestra función de configuración de
texto, vamos a
hacer cotización por ciento uno F. Así que esto nos va a dar el valor flotante con
una posición decimal, y luego damos un símbolo de
porcentaje para que
agreguemos la variable PT para configurar
realmente esa cadena. Bien, y ahora podemos
golpear play y
veremos que el tiempo sólo
muestra el primer decimal. Eso es diez veces más
legible y menos distrae. Mejoras mayores. Entonces creo que eso se ve
genial para nuestras estadísticas de juego. Creo que
lo único que podría cambiar es poner el tiempo sobrevivido en la parte superior y el enemigo es derrotado en parte inferior y golpear play
una vez más. Creo que eso sólo va
a quedar un poco mejor. tiempo sobrevivió. Creo que quiero la
más llamativa en la parte superior derecha, y luego las otras
estadísticas más menores que muestran debajo de ella, las que
van a actualizar menos Sólo una menor
preferencia visual ahí. Bien. Y sólo para mostrar, todavía
podemos derrotar al orco, y eso contrarresta funcionando Entonces las estadísticas del juego son buenas
en la jugabilidad al menos.
59. P58: cómo guardar y cargar notas altas con JSON: Bien, ahora que nuestras
estadísticas de juego están funcionando, queremos tomar
eso y en la derrota, queremos actualizar
las puntuaciones altas y guardarlas en un archivo JSON. Entonces esto sería básicamente el inicio de un sistema de ahorro de carga. Y este tipo de
juegos, específicamente, no
hay tanto un
estado guardado como solo puntuaciones altas, aunque, pero el proceso sería muy similar si
necesitabas guardar un archivo de juego. Básicamente, necesitas
serializar los datos en un archivo, y una de las formas más
convenientes hacerlo es el formato JSON Entonces, para guardar y
cargar los datos, quiero tener un objeto
save load. Ahora, normalmente, haría de
esto un sistema separado, pero la única vez
que necesitamos guardar los datos es cuando nuestro
personaje es derrotado, y vamos a manejar eso a
través del manager del juego. Así que en realidad solo
voy a en sistemas, crear un nuevo script, y voy a
llamarlo guardar carga. No voy a llamarlo
sistema porque esto es más un componente para el propio manager del
juego. Y esto será contado ref. Así que voy a crear ese guión. Ampliemos
los sistemas. Ábrela. Podríamos darle el nombre de
clase save load. Y vamos a
necesitar dos funciones aquí función guardar estadísticas, y esto va a tomar las estadísticas
actuales del juego
como parámetro. Entonces las estadísticas de las estadísticas del juego, y volveremos anuladas aquí. Entonces esto tomará las estadísticas
actuales y convertirá en un
diccionario de datos, y luego
serializaremos esos datos Así que los datos de VR son iguales
a y voy a poner en y voy a poner
entre llaves aquí en Colón, estadísticas punto dos diccionario. Ahora bien, este método,
por supuesto, no existe. Eso lo escribiremos en un minuto. Y una vez que tenemos los
datos en un diccionario, este es un diccionario
de datos, por cierto, podría dejarlo más claro
declarando ahí el tipo Pero siempre que veas estas
llaves y guión GD, estás
hablando de un diccionario Entonces a continuación convertimos esos
datos en una cadena JSON. Entonces eso es muy sencillo de
hacer también. Vamos a decir var cadena JSON
va a ser igual a JSunnu. Así que tenemos un nuevo
objeto JSON que
nos permite llamar a esta cadena de método
Pi en nuestros datos, y eso lo convierte en un formato de cadena JSON
legible JSON. Así que ahora necesitamos
abrir la ruta del archivo. Así que vamos a decir var
archivo va a ser igual a fileaccess punto OP Entonces esta es otra
clase estática en la biblioteca de Godo, y necesitamos darle una ruta y luego acceso al archivo de derecho Entonces diremos Save File path, que aún no hemos definido, y luego queremos acceder aquí. Entonces, ¿de dónde vamos a conseguir la ruta de archivo
segura
aquí arriba en la parte superior? Vamos a decir var, guardar ruta de
archivo es una cadena. Esto será igual al usuario
slash LASH gametatt JSON. Bien, entonces lo que básicamente
significa este
Fópata es que va a
guardar en los datos de la aplicación, asumiendo que estás en Windows, para este proyecto de juego específico, en la raíz de esa carpeta, habrá un nuevo archivo
llamado gamesatt Entonces cada juego hecho en GADO tiene
una carpeta de usuario en Windows, esa es la barra de datos de la app Gdolah el nombre de
tu proyecto, creo Y luego va a guardar
GameStatst JSON en la raíz. Así que este archivo JSON es
efectivamente tu archivo guardado. Para un juego de supervivientes, el archivo say es realmente
solo tus estadísticas altas porque cada vez
que comienzas un nuevo juego, tienes un nuevo personaje,
no guardas y cargas el juego como lo harías
con un típico juego de rol. Pero el proceso es
más o menos el mismo. Entonces, si el archivo existe y tuvimos que abrirlo
para escribir, ¿correcto? Entonces, si no lo encontramos, entonces debe
haber habido un error. Pero si lo encontramos, diremos file dot store string porque tenemos una cadena
JSON ahí arriba,
bien, así que solo almacenamos la cadena
JSON en el archivo, y luego hacemos file dot Close. Y así es como
escribes al expediente. Y de lo contrario, si la
operación correcta está fallando, entonces queremos empujar
y error, claro. Así que el error push va a ser fallido al abrir el
archivo sa para su escritura, y podría decir en path, por ciento s, y vamos a
hacer y las citas Entonces por aquí, por ciento
guardar ruta de archivo. Así que dando tanta
información como podamos, y luego podemos depurar a partir de
ahí si hay algún problema. Por supuesto, hay que deletrear correctamente el error
porti. Eso ayudaría, y esa
es la función segura. Bien, ahora queremos hacer
nuestra función de estadísticas de carga. Así que la función carga las estadísticas, y vamos
a tener el
objeto stats en el que estamos cargando
los datos. Entonces las estadísticas son de tipo estadísticas de juego. Por supuesto, obtenemos esto del manager
del juego más tarde. Y primero, queremos
abrir el archivo para que R acceda. Entonces el archivo VR es igual a Dios, no
puedo escribir en este momento. El archivo VR es igual al punto de
acceso al archivo OP en
la ruta de guardado del archivo Así que estamos cargando y
guardando en la misma ruta de archivo. Y luego tenemos Fleaccess
dot RED. Entonces nos vamos. Entonces digamos, si no es archivo, así que no pudimos abrir, entonces
podemos decir, error push, falló al abrir archivo para
leer en Path porcentajes,
porcentaje, guardar ruta de archivo De hecho, podríamos incluso querer
hacer de esto un booleano. Entonces si lo hacemos un booleano, entonces podemos devolver falso aquí, como en fallamos la operación Eso podría ser un
poco más útil. Posteriormente, puedes cambiar Safsts para hacer
lo mismo si quieres Y estamos devolviendo false, no literalmente la palabra clave
así que en este punto, nuestros archivos se abren para el acceso de lectura. Así que ahora necesitamos obtener la
cadena del archivo JSON. Entonces nuestro JSOText es igual
al punto de archivo Obtener como texto. Bien. Y la razón por la
que no se muestra es probablemente porque
no escribí esto aquí. Entonces podría decir acceso a archivos. Veamos, ahí también hay que
subrayar el texto JSON ,
y podemos seguir adelante Entonces tenemos el texto del archivo, así que
terminamos con el archivo. Cerremos el
archivo, cierre el filete. Si el archivo está vacío, entonces podemos regresar aquí. Entonces el texto de punto JS está vacío. Entonces puedes devolver
verdadero o falso aquí. Depende de lo que quieras. Voy a devolver true, en realidad, para que podamos indicar que
la operación tuvo éxito, pero no hubo datos para cargar. Entonces diremos que carga los
datos de estadísticas en el objeto de estadísticas del
juego. Entonces si el archivo no está vacío, sin embargo, entonces
necesitamos convertirlo. Entonces var JSON va a
ser igual a Jsunt Nu. Entonces tenemos un nuevo objeto JSON, y luego
queremos analizar el texto. Entonces digamos que var error es igual a json punto parse en el texto JSON. Entonces, si hay algún
problema con eso, devolverá un error. Entonces si error, entonces
queremos empujar error, falló al analizar JSON
con porcentajes de error, y diré porcentaje de error Creo que eso podría agregar alguna información
extra útil. Y luego devolvemos falso
aquí porque, por supuesto, si erró al analizar el archivo, entonces hay un
problema importante con nuestro archivo SAI Probablemente no estaba
formateado correctamente. Bien, entonces si no hubo error, sabemos que el parse funcionó correctamente, así podemos decir var. Un dato del diccionario es
igual a json dot g data. Así que básicamente lo estamos
convirtiendo en el
formato GidorCognized como diccionario Y entonces diremos
Varsats data es un diccionario igual a datos punto Obtener en cotización
Estadísticas, creo Y el predeterminado aquí
es un diccionario vacío. Para que las estadísticas coincidan con
lo que tenemos aquí arriba. Guardamos las estadísticas en
el par de valores clave de estadísticas, y necesitamos recuperarlas
del par de valores clave de estadísticas. Entonces, una vez que tenemos nuestros datos de estadísticas
reales, que es un diccionario, entonces podemos hacer estadísticas punto
From dict para diccionario, y vamos a pasar
los datos de estadísticas. Y eso es todo lo que tenemos que
hacer para nuestra carga, así que volvemos verdad. Bien, creo que eso se ve
bastante bien. Entonces lo que necesitamos ahora es
un diccionario de dos y del método de diccionario
para nuestras estadísticas de juego. Entonces, si abrimos las estadísticas del juego, digamos function to dict
devuelve un diccionario, y luego la función
de dict va a tomar un diccionario de datos
y devolver void. Entonces, para
convertir esto en un diccionario, necesitamos un diccionario VR como ese va a ser
igual a un nuevo diccionario. Y entonces, en realidad,
ya sabes, dentro de aquí, podemos simplemente envolver
todo esto en una sola cosa y poner cada nuevo par de
valores clave en una nueva línea. Entonces diremos enemigos derrotados es igual a
enemigos derrotados. CD de dos puntos para el par de valores
clave. A la izquierda,
tienes el nombre de la cadena y a la derecha,
tienes el valor real. Entonces a la izquierda aquí,
tenemos tiempo sobrevivido. Y luego dos puntos, y hacemos tiempo sobrevivido a la
variable de la derecha, y luego volvemos
el diccionario. Y es realmente así de simple. Entonces siguiente para del diccionario, queremos cargar los valores antiguos
en los valores actuales. Entonces vamos a hacer
enemigos derrotados, igual a p data dot git, el valor clave par
enemigos derrotados. Y luego el valor por defecto, vamos a hacerlo nulo para que
si no hay ese valor, en realidad
golpeamos un error porque lo contrario lo cargaríamos
a algo como cero, y eso
anularía permanentemente todos nuestros datos guardados. Algo discutible en qué
dirección quieres ir aquí. Al igual que, ¿quieres que falle
inmediatamente
la carga de guardado, o quieres que tenga éxito pero luego anule los datos reales
antiguos, lo que realmente no suena
muy deseable, verdad? No quieres anular
el progreso del jugador. Entonces tal vez sería más como necesitas lanzar un hot
fix o algo así. Si te encuentras con
esta circunstancia donde el JSON simplemente
no se cargó correctamente, no
tienes este campo, le falta el nombre,
algo así. Entonces por eso estoy
yendo hacia más como, Oh,
debería ser nulo. Entonces, cuando intenta establecer el flotador en un nulo o
el entero en un nulo, vas a golpear un
error, y tiene que ser arreglado o de otra manera va a romper todos los juegos de
tus jugadores. Creo que ese es probablemente
el camino a seguir aquí. Entonces el tiempo sobrevivido
va a ser igual a pdta dot get on time
survived as a string, y entonces el
valor predeterminado es Bien, entonces tenemos las estadísticas del juego Actualmente, las únicas
estadísticas del juego son nuestras estadísticas principales del juego, nuestras estadísticas actuales del juego, pero también queremos tener
estadísticas de juego persistentes,
nuestras estadísticas de juego de puntuación más alta. Entonces quiero poner una
función aquí para tomar
el valor más alto
al comparar con las estadísticas de un juego actual. Entonces voy a decir función
establecida al más alto, digamos, establecer puntajes altos. A la P estadísticas actuales del juego, y esto va
a ser turno nulo. Entonces solo vamos
a llamar a esto en nuestras estadísticas de juego de puntuaciones altas, pero esto va
a ser básicamente
tomamos el mayor de
los dos valores. Por lo que los enemigos derrotados
van a ser iguales al máximo de enemigos derrotados o los P actuales puntos
enemigos derrotados. Bien, entonces solo estamos
tomando el valor más alto, y lo estamos estableciendo a los enemigos
enteros derrotados. Y hacemos lo mismo
con el tiempo sobrevivido. El tiempo sobrevivido es igual a máx. El tiempo sobrevivió y el tiempo de punto
actual P sobrevivió. Bien, así es como
conseguimos los puntajes más altos. Simplemente comparamos las
estadísticas actuales al final
del juego y vemos si eso es más alto que nuestros puntajes altos
actuales. Así que necesitamos el objeto guardar carga, y también necesitamos las estadísticas de juego
de puntuación más alta en nuestro gestor de juegos. Entonces abramos ahora al manager
del juego. Gestor de juegos punto GD. Entonces también tendremos aquí
las estadísticas var high score, que va a
ser un GameStnu y también tendremos aquí la var saveoad que va a ser igual a nuestro objeto save Entonces este es solo un
componente local de nuestro manager de juegos. Incluso podríamos hacerlo privado. Sí, ¿por qué no? Hazlo privado. Porque realmente la lógica
saveoad aquí, solo
queremos pertenecer
al manager del juego En realidad no es
algo que otros guiones deban estar tocando,
así que lo hacemos privado. Entonces esta función aquí,
digamos función End Game, creo que es un poco
de un mejor renombrar. Eso será a su vez nulo. Entonces, al final del juego, queremos tomar nuestras estadísticas de puntaje
alto, y queremos establecer puntajes altos
con nuestras estadísticas actuales. Y entonces podríamos querer
restablecer las estadísticas actuales, pero en realidad no voy a hacer eso porque es posible que
queramos mostrar en el menú principal del juego cuáles fueron las puntuaciones de la
última sesión, así que en realidad no reiniciaremos
hasta que iniciemos correctamente
el juego nuevamente. Creo que eso es un poco mejor. Ah, y por supuesto, después
de establecer las puntuaciones más altas, queremos llamar a guardar estadísticas de guardar punto de
carga. Entonces vamos a guardar las estadísticas
de puntuación más alta. Y pienso en listo. Sí, en función Listo. Y recuerda, esto es
Auto Load Singleton, así que en cuanto comience el juego, ya se va a cargar Y quiero hacer subrayado guardar las estadísticas de carga de puntos de carga
en las estadísticas de puntaje alto Y si, eso en realidad se
encarga del resto. Entonces, la cola lógica para guardar
y cargar está básicamente oculta dentro de ese objeto de
guardar carga o más como
encapsulado, realmente. Entonces, toda la carga
guardada está dentro de aquí, pero el administrador del juego
en realidad maneja cuándo debería guardar
y cargar esos datos. Y puedes ver esto hace que
el manager del juego sea mucho más fácil de leer porque dividimos sus funciones en
diferentes componentes lugar de abarrotar
todo en un guión gigante del administrador de juegos Entonces este video va
un poco largo, así que haré el siguiente video
sobre la construcción de
la pantalla del menú principal. Ya tenemos la plantilla para ello porque nuestro juego sobre
botón salta hasta aquí, pero aquí no hemos configurado
nada. Entonces conectaremos
esto a las estadísticas de
puntaje alto , tendremos una pantalla, un botón Iniciar juego y un
fondo de pantalla de inicio de algún tipo.
60. P59: diseño de un menú principal con pantalla de alta puntuación y funcionalidad de inicio del juego: Va a tomar el diseño
en el contenedor High Scores, y vamos a ponerlo en los anclajes de arriba o
derecha. Entonces puedo acercar el zoom. Voy a golpear Q para mover esta
posición por ahí. Estiremos nuestro contenedor
de puntuaciones altas, y luego construiremos algunos
otros nodos de control aquí. Entonces voy a hacer clic aquí,
agregar un nodo hijo. Digamos Contenedor de Margen. Misma historia con contenedor
Margin. Queremos una anulación de tema, cuatro píxeles en todos esos. Y luego para ahorrar algo de
tiempo, supongo que
podríamos ir a la vista de Gamesets Y voy a copiar pegar ese tiempo sobrevivió
y enemigos derrotados. Sólo voy a
controlar ver todo y vamos a pegarlo
en el menú principal. Entonces dentro de ahí. Y sí me olvidé de
un contenedor VBox, así que agrega un contenedor VBox
y luego mueve esos dos contenedores de texto
debajo de él. Así. Y entonces así es más o menos cómo
va a quedar ahora mismo. Guardemos el
contenedor de puntuaciones altas en su propia escena, haga clic
derecho, digamos escena
branchien, así Y luego quiero tomar
el layout transform y triplicar la escala, así. Bien, así que cuando hagamos
eso, va a meterse un poco con
nuestro preset de Anchors, así que solo voy a
posicionar esto por ahí No hace falta que sea
realmente perfecto. También abramos el contenedor de puntuaciones
altas y agreguemos un texto de título. Entonces acercando aquí en
el contenedor VBox, haré clic derecho y
agregaré una etiqueta de texto enriquecido Y coloquemos esto
encima del contenedor VBox. Revisa el contenido de Fit, y
digamos puntuaciones altas, pero voy a prefacio eso
con, digamos, arcoiris Terminar los corchetes, ir al final Arco iris. Por supuesto, para
que esto funcione, necesitamos verificar el código BB habilitado, y ahí obtenemos un arco iris
predeterminado. Entonces creo que quiero
bajar la frecuencia y hacer que eso sea menos dramático. Entonces digamos que la
frecuencia es igual a 0.5. Bueno, vamos al 0.25 par. Sí. Eso es mucho mejor. Y entonces necesitamos
SAT para la saturación. Entonces digamos saturación
de 0.2, tal vez 0.5. Bien, eso es un poco
domador. Entonces eso es bueno. Y haremos centro de
alineación horizontal. Bien, eso no está tan mal. Entonces en el menú
principal, podemos ver cómo va a quedar
eso. De vuelta en el contenedor de puntuaciones altas, vamos a asignar la etiqueta correcta. Entonces Max etiqueta derrotada es la etiqueta de cantidad debajo del contenedor derrotado del
enemigo. Y entonces la etiqueta más larga
sobrevivida está en el contenedor de tiempo
sobrevivido. Bien, guarda eso, y de
vuelta en nuestro menú principal, necesitamos un fondo de textura. Entonces voy a hacer
click derecho en el menú principal. Agreguemos un acto de textura. Voy a renombrarlo para que quede destrozado de
fondo. Volveremos a eso.
Además, en la pantalla del menú principal, queremos asegurarnos de que
apagamos el filtrado del mouse. Así ratón a la derecha, giramos filtro para ignorar.
Eso es importante. De lo contrario, el menú principal bloquearía realmente los
botones debajo de él. Así que agreguemos un botón
ahora para nuestro juego de Inicio. Entonces agrega un botón. Cambiemos el nombre de eso al botón
Iniciar juego. Y si recuerdo, solo tengo un guión que puede cambiar de
escena de inmediato. Entonces botón de cambio de escena, voy a arrastrar y soltar esto justo en el botón
Iniciar juego. Y entonces tenemos que darle
el camino de escena del mundo. Entonces, en la parte superior derecha, ruta de escena, seleccione TCN de punto mundial, y ahora ese botón debería
poder abrir el mundo, que es nuestra escena de juego Este botón es realmente
pequeño, por supuesto, así que tenemos que ir a maquetación. Y yo triplicaré la
escala aquí abajo. También lo coloquemos en anclas y luego digamos
fondo central. Podemos acercarnos aquí. Voy a pegarle a W. Vamos a
compensarlo hasta aquí. Vamos a darle el
texto Iniciar juego, y es posible que también queramos
seleccionar un icono. Así que hagamos icono
como textura atlas, carga
rápida y atlas
de nuestro proyecto de juego. Yo haré 64 o 64. Dit región y simplemente
elige el ícono que te guste para comenzar el
juego. Entonces no lo sé. Ya que se trata de un juego basado en
combate, tal vez una de estas
espadas sería buena Así que voy a agarrar esto, asegurarme de obtener todos los píxeles. Entonces necesito estirar esto
hacia la izquierda, golpear cerca. Por si acaso también
revisaré el clip del filtro. No queremos que los
píxeles de borde entren ahí. Entonces ese es básicamente
nuestro juego de inicio. Botón vamos a W y
asegúrate de que esté dentro de los límites de nuestro menú principal Vayamos también a Project, y tomaremos el menú principal y haremos que sea nuestra escena de lanzamiento
del juego. Entonces en general Run, en vez de lanzar
el mundo ahora, vamos a cargar. El menú principal puntea TSCN. Bien, ahora veamos en
qué parte estamos. Voy a golpear play. la puntuación más alta ahí arriba,
tenemos Start Game. Vamos a golpear Start Game, que lanza nuestra escena principal de
juego. Eso es lo que esperaríamos.
Y muy rápido, en realidad, vamos a ser derrotados
para que podamos ver la puntuación más alta
en nuestro menú principal. Por supuesto, cambié el nombre del Game Manager dot report game over, así que tenemos que cambiar esto a
game manager dot end game Eso es sobre el jugador
derrotado estado. Bien, ahora vamos a
lanzar una vez más. Así que solo me aseguraré de que me
derroten una de estas obras, tres hits, cuatro
hits, cinco hits. Y veamos. Los jugadores
ya fueron liberados. Está en la nota Mundial porque en realidad
liberamos al jugador También tenemos que decir
aquí por los mundos. Si la función de proceso, donde estamos agregando
el tiempo sobrevivido, tendremos que decir si
contexto fuera jugador. Y vamos a tener que decir
no es igual a nulo. Creo que para referencias previamente
liberadas, si solo haces Context Out player, eso
seguirá golpeando un error, pero si dices que
no es igual a null, entonces eso va a sortear eso Bien, así que básicamente, si el
jugador ya no existe, o el jugador ya
no está vivo, entonces vamos a agregar tiempo
sobrevivido a las estadísticas del juego. Ya que el jugador fue removido, esto manejará esa parte de ella, y deberíamos estar bien para ir. Bien, entonces una jugada de bateo más, asegurándose de
que eso realmente funcione. Oh, podemos ver que
la puntuación más alta actualizó aquí, sin embargo,
así que eso es bueno. Es posible que necesitemos cambiar un poco
el tamaño de la interfaz de usuario. Como pueden ver,
el problema aquí, está mostrando como
12 decimales, así que vamos a cambiar
eso en un minuto. A ver si podemos ser derrotados más rápido que 7
segundos. Bien, vamos. Uno, dos, aguanta. Actualiza este equipo
y falló. Bien. Entonces tenemos que encontrar otro enemigo o
dos. Ahí vamos. 12 segundos. Menú principal. Puedes ver que nuestra
supervivencia más larga ahora es de 12.6 segundos. Enemigos derrotaron a dos. Y vamos a cerrar el juego y darle a play. Eso verificará
que la carga desde el archivo esté realmente funcionando. Así que vamos a cerrar y golpear play. Puede que aún no lo haya configurado. Es interesante
ver si tiene o no. Bien, entonces sí, cuando se carga
el juego, el manager del juego es, como, una de las primeras cosas en cargar, y ya carga
en la puntuación más alta lo que guardó la puntuación más alta
del archivo es. Bien, así que como un momento genial
para mostrar dónde está eso, presentemos los datos de la aplicación
en Windows File Explore, y luego queremos encontrar a Godot Y luego creo
que son los datos del usuario de App, el último proyecto Script
Survivor's GD script Y justo aquí
tenemos a ArjSoFle. Bien, así que vamos a editar en el Bloc de notas. Y ahí se puede
ver ahí mismo. Nuestras estadísticas reales del juego
guardadas en un archivo. Tenemos enemigos derrotados en
dos ocasiones que sobrevivieron a las 12.6, y esos son nuestros datos de juego guardados, que se actualizan cada vez que nos derrotan si resulta
que somos alguno de esos números Bien, entonces para el contenedor de
puntuaciones altas, el texto de supervivencia más largo, simplemente
queremos
copiar lo que estábamos haciendo en la vista de estadísticas del juego. Entonces voy a
saltar a ese guión. Y luego quiero copiar
sobre este bit aquí mismo, que toma el
flujo y nos da una cadena que sólo tiene
un decimal. Ve al contenedor de altas puntuaciones, y voy a reemplazar
eso aquí con esto. El PT, por supuesto, en realidad
va a ser el manager del juego punto alto
scorstts punto El tiempo Ahora si estamos en juego,
llegamos al menú del juego, deberíamos ver 12.6
segundos por aquí Eso es mucho más legible
como nuestro puntaje más alto. Entonces ahora para nuestros antecedentes, literalmente
tomaré una
captura de pantalla del juego. Y podrías
apagar la interfaz de usuario para esto si quisieras
hacer una captura de pantalla. Eso probablemente sería
un poco más útil. Bien, así que apaguemos también las formas de colisión antes de
tomar la captura de pantalla. Así que las formas de colisión de depuración desactivadas. Bien, así que sigamos adelante y tomemos nuestro sitio como una actualización
para que podamos mostrarlo. Dejaré un par de estas
camionetas en el mapa del juego. Esperaremos a que el
esqueleto genere, y luego veremos si podemos obtener una buena captura de pantalla en el juego Una cosa que
consideraría sería subir la tasa de engendros si queremos enfatizar cuántos enemigos
hay en el juego Bien, así que hagamos una captura de pantalla aquí. Esa no me gusta tanto. Vamos a hacer una captura de pantalla ahí. Entonces, imprima la pantalla para tomar una captura de pantalla si eso no
fuera obvio. Y voy a abrir Gap. Así Gap es un editor de imágenes gratuito. Es algo así como Photoshop. Pero libre. Entonces
vamos a hacer Archivo Nuevo, y voy a hacer 1920 por
1080 píxeles. Ábrela. Control V para pegar
en nuestra captura de pantalla, y vamos a agarrar
algo así. No es realmente un tutorial de
edición de imágenes aquí, pero realmente rápido, voy a pegar una barra
superior ahí dentro. Entonces usando un relleno negro, entonces podemos darle el
texto si así lo deseamos. Voy a elegir una fuente. Así que
vamos con pixel regular. Tendrías que instalar esa
fuente si quieres usarla. Bien, así que solo pasé
un poco de tiempo creando algo
así como una miniatura personalizada, excepto que vamos
a estar usando eso en el proyecto final del juego Entonces solo abofeteando un
fondo negro en la parte superior, algún texto Pixar, mencionando
que es un curso de GD,
mencionando que es un curso de Do,
y luego el Esta probablemente no será la miniatura
final del curso, pero podemos usarla para la pantalla del menú del juego
por ahora al menos Y voy a abrir esto. Lo exporté al
proyecto, claro. Entonces donde tengas eso guardado, puedes ver que tengo la pantalla del menú
principal aquí. Entonces, lo que quiero hacer y la interfaz de usuario, esta es en realidad
la pantalla equivocada. Queremos el menú principal.
Pasamos a fondo Rec. Voy a carga rápida, y buscaré la
pantalla del menú principal. Pop eso ahí dentro. Puede que tenga que aumentar
el tamaño aquí, así que vayamos al modo de diseño, anclas y hagamos naufragio completo Bien, entonces con esto y
completamente destrozado ahora queremos asegurarnos de que nada
esté bloqueado por esto Entonces creo que tenemos que mover
esto a la parte superior de la izquierda. Bien, ahí los
puntajes más altos muestran que podemos tocar. Bien, y podemos jugar, y deberíamos verlo ahí. Guión Sobrevivientes alta puntuación aquí
arriba. Es un curso de Gado. Tenemos el
botón Iniciar juego y el icono de Gado, lo que quiero decir, bastante
sólido para como cinco, 10 minutos de trabajo, creo que, por
supuesto, se puede mejorar. Bien, entonces ahora en este punto, prácticamente el juego
está a punto de terminar. Tenemos nuestra pantalla de inicio ahí. Podemos iniciar el juego,
las puntuaciones altas, mostrando durante el juego
las puntuaciones actuales y
en la pantalla del menú principal para
las puntuaciones más altas de todos los tiempos. Podemos derrotar a los enemigos.
Podemos perder el juego. Podemos actualizar tal vez
queramos hacer alguna limpieza, como eliminar estas
actualizaciones iniciales del mapa del juego Eso es un poco raro
ahí. Pero eso solo
estaba ahí para fines
de prueba. Quizás queremos aumentar la dificultad, sumar
nuevos enemigos en. Podríamos tener a nuestro
personaje principal, ya sabes, mostrando la lanza
si queremos que eso esté ahí en
lugar de algo sin brazos Pero, quiero decir, funciona
para lo que es ahora. Y podemos
subir de nivel varias veces. No está listo para su
lanzamiento completo, claro. Todavía habría mucho
trabajo por hacer ahí, pero básicamente todo está funcionando como se pretendía.
Se acabó el juego. Ahí está nuestro puntaje más alto.
Quizás al menú principal vendría bien una banda sonora, ese tipo de así que podría hacer un video más pulido para simplemente
limpiar el curso, pero eso va a ser
más o menos. Entonces espero que todos
ustedes hayan aprendido mucho
siguiendo hasta el final. Sé que este fue un curso
bastante largo, 11 horas más tiempo de ejecución total
editado. Entonces, quiero decir, si llegaste
aquí y seguiste todo lo largo y tu
juego está funcionando como está, quiero decir, buen trabajo porque en realidad eso
fue bastante. Bien, así que muchas gracias
chicos por mirar a grandes rasgos, el final de mi curso de guion
sobrevivientes, guión GD en Gadot 4.4
61. Supervivientes de la caligrafía P60: mejoras en el juego y depuración: Entonces, en este video,
vamos a tratar de agregar algo de pulido al prototipo de nuestro guion
sobreviviente. Entonces antes que nada, al
final del último video, tengo siete errores
en la consola. Entonces eso es lo primero de lo que
vamos a encargarnos. Cada vez que veas un error, es un buen momento para resolverlo, depurarlo, averiguar
qué iba mal. Entonces tenemos recolecciones de artículos que
no tienen un artículo
realmente asignado a él Entonces creo que lo que
sería realmente útil aquí sería
decir por ciento Sur, y luego lo
pusimos aquí como porcentajes Bien, para que veas
que el mensaje de error aquí no es tan claro
como podría ser. recolección de un artículo debe
tener un artículo, pero no sabemos qué
recolección de artículo realmente falló en eso. Entonces, ¿cómo se puede hacer eso en
el ítem pickup dos D script es al final de
asignado a pickup, hacer un porcentaje y
luego hacer un seguimiento de la cadena
con un porcentaje de auto Entonces eso reemplazará los
porcentajes con el nodo, que va a resolver a un nombre de
nodo o en otras palabras, qué nodo en realidad no
tenía el ítem asignado Bien, vamos a correr
eso una vez más. Solo jugaré un poco, ver si pegamos algún número nuevo. Bien, entonces ya que esas
recolecciones de artículos y la porción de salud, dice
que el artículo no
está listo, lo cual es raro porque el en la exportación definitivamente
debería estar haciendo eso Entonces, si el ítem es igual a nulo, entonces reportamos un error. Oh, bien, bien, bien.
Entonces cometí un error aquí. Si eso fuera una afirmación,
eso funcionaría bien. Pero lo que realmente
queremos hacer es decir, yo ítem es igual a null, luego empujamos el error. Yo todavía estaba ahí en la
lógica de afirmar . Así que
vamos a tabularlo. Si el artículo es nulo,
empujamos un error. Ahora bien, si jugamos,
debería funcionar, claro. De lo contrario, siempre iba
a empujar un error. Así se puede ver en el debugri aquí
abajo,
ya no hay problemas Voy a recoger algunos artículos. Consigamos que los enemigos los dejen caer, y eso debería funcionar
bien para eso. Hasta ahora, no
parece que haya
otros errores nuevos. Noté un poco
de un problema de diseño de interfaz de usuario aquí. Entonces creo que si llevo
la guadaña aquí, podría como
que reposicione
esta interfaz de usuario de alguna manera rara Oh, bien, eso es
lo que pasó. La caja HB en realidad se estaba
expandiendo para hacerse más grande. Entonces para arreglar eso, o
necesito bloquear
el tamaño en su lugar. Chico, debería
hacerlo más grande y luego mover esto hacia la derecha. Creo que eso sería mejor. Bien, entonces para esta interfaz de usuario de jugador, necesitamos expandirla un
poco para que tenga
espacio para asar. Entonces entraré en la interfaz de usuario del jugador. Y luego tomemos el contenedor del panel
raíz, estiremos esto hacia la derecha para
que tenga espacio extra. Iré a la interfaz de usuario de Game Play. Vamos a mover esto
hacia la derecha. Ahora bien, si presiono Play y por
casualidad actualizamos nuestra salud, y redimensiona esto en realidad ya no
debería empujarlo más hacia la
derecha porque
ya tiene espacio para caber
esa etiqueta de texto completo Y sí necesito redimensionar un poco el diseño de
las armas. Lo compensé un poco
incorrectamente ahí, así que solo alinearé esto
hasta la cima ahí, vamos a golpear play, iniciar juego. Bien, y eso se
ve bastante sólido. En el mundo, sí
quiero eliminar todas estas
camionetas por defecto Esos eran solo para pruebas. Esos no deberían estar en
el prototipo final, así que voy a cortarlos con Control X,
tenerlos todos seleccionados. Y sí creo que quiero hacer que el juego estándar juegue un
poco más difícil. Entonces voy a ir
al sistema spawner, y vamos a aumentar
la tasa de span Así que voy a
tirar esto
al inicio a una
mayor tasa de desove También agrega un punto extra
aquí, algo así. Ajusta el manillar,
algo así. Yo solo quiero hacer una
curva más pronunciada para que consigamos que más enemigos engendren más rápido para que
pueda presumir de una jugabilidad
más intensa En la demo. ¿Bien? Y todos juegan. Vamos a probarlo
un poco y ver cómo va eso. Entonces
voy a empezar el juego. Queremos que nuestros enemigos
suban al centro. A lo mejor los orcos son
un poco demasiado lentos. Podría aumentar la velocidad de
movimiento
tanto de los orcos como del esqueleto Así que realmente no hay
necesidad de hacerlo fácil aquí. Bien. Entonces ahí tenemos nuestros
esqueletos y los orcos Entonces voy a aumentar la
velocidad de movimiento de ambos. Buscaré el controlador de
estadísticas orco. Cambiemos las estadísticas de orcos. La velocidad puede ser, digamos, 35, y luego
vamos al esqueleto. Velocidad del controlador sat de 60. Yo solo lo voy a hacer un
poco difícil aquí, y entonces el MX HP puede
ser como 100. Todo bien. Y el orco HP es de 40. Eso está bien.
Juguemos. Comienza el juego. Una cosa que podrías
agregar, no lo voy a hacer aquí, pero tener, como, una explosión de engendro enemigo al inicio haría que
el juego inicial se jugara un poco más intenso
si comienzas el juego engendrando instantáneamente a diez
tipos para que se acerquen a Eso podría ayudar.
Pero creo que eso es un poco exagerado solo
por el prototipo Entonces las obras sí se mueven
un poco más rápido, y los esqueletos
son bastante rápidos ahora Entonces esto definitivamente
será mucho más difícil. Sí necesito tomar los HP
actuales y
ponerlos en 100 al inicio. Bien, a lo mejor los esqueletos son incluso un poco
demasiado rápidos, Bien, así que arreglemos a los
jugadores iniciando HP, jugador, controlador de
estadísticas,
estadísticas de jugadores, HP a 100. Y voy a poner a nervios un poco
los esqueletos. Digamos 50 velocidades.
Creo que eso es bastante justo. Bien, en las definiciones a
nivel de jugador, también
voy a hacer que
el nivel suba bastante fácil. Entonces tomaré el nivel tres
y pondré eso en cinco. nivel cuatro será
diez XP, el nivel cinco, puede ser 15, el nivel seis, puede ser 20 y el nivel
siete puede ser de 25 HP. Y luego sólo voy a
añadir uno más por 100. Y eso va a ser como el
que en realidad no llegas a llegar. De hecho,
solo agreguemos uno más. Digamos 1,000 nueva definición
de nivel. La razón por la que me
cuesta ir es solo que
realmente no suceda. Como que
lo estropeé. Eso fue Nivel 1,000 toma diez XB. Eso
no es lo que quiero. Lo que quería, y
eliminemos eso es el nivel nueve va a ser
una definición de nivel con mil EXP necesarios, agrega eso. Entonces esto solo lo hace para
que no tenga que planear esa cantidad de escalado
en la demo del prototipo. Simplemente sería una especie de
exageración por ahora mismo. Así que vamos a golpear Play, y voy a
ver cómo va el juego. Comienza el juego, y
esperaremos a que los primeros
enemigos engendren Bien, creo que es un poco
demasiado fácil al principio. Quiero que sea intenso rápidamente. Entonces creo que lo que voy a hacer en
realidad es poner en ese engendro
instantáneo de diez tíos Entonces en el mundo, digamos
en la exportación V engendros iniciales, y voy a establecer eso
como N igual a diez El mundo tendrá
una referencia al spawner,
así que
el sistema spawner Y luego listo, voy a decir,
I Los vanos iniciales están por encima de cero Entonces diremos sistema spawner. Déjame ver. ¿Cómo se llamaban
las funciones? Engendro aleatorio. ¿Y a
eso lo llamo diez veces? Agárrate. Bien. Sí, y
parece que necesito llamar a eso diez veces o el
número de tramos iniciales Así que por un tiempo en los engendros iniciales, vamos a llamar a
spaorsystem dot Entonces diez engendros iniciales, esto debería hacernos engendrar diez tíos al
inicio del Bien, no olvides establecer el sistema sponnor en el mundo Así que asigne ese sistema sponnor. Referencia directa del nodo,
vamos a presionar Play. Y si esto funciona, tendremos diez tíos al
inicio del juego, lo que debería
hacerlo mucho más difícil. Bien, sí, eso es un montón de chicos para el
inicio del juego. Entonces solo tenemos que
evitarlos a todos. Eso en realidad podría ser
demasiado duro, honestamente. Voy a poner eso a cinco, y voy a cambiar eso a cinco
en el guión, también. Creo que diez tipos
al principio cuando ni siquiera
has
ascendido de nivel es solo que es mucho
lidiar con una sola Bien, entonces tenemos a nuestros
cinco chicos empezando ahora. Consigamos un XP. Voy a mejorar con el
Syth así que eso nos dará una forma extra de golpear a
los enemigos. Mucho más fácil ahora. Y yo sólo voy a seguir aquí. Vamos a obtener algunas actualizaciones ya que
tenemos la curva
EXP mucho más fácil, entonces deberíamos poder subir de
nivel con bastante facilidad. Pero tengo que decir,
aumentar la velocidad sobre los enemigos definitivamente hace que
sea mucho más difícil esquivarlos, así que eso es algo
a tener en cuenta. Sigamos mejorando la lanza. Entonces creo que a cierto nivel, la lanza golpea a dos tipos a la
vez. Ya está ahí. Lanza de nivel tres
puede golpear a dos tipos. Lo cual definitivamente es
una mejora enorme. Solo estoy
pasando por el juego aquí. Los esqueletos a 50
velocidades son bastante duros. 60 velocidades para los esqueletos definitivamente
serían demasiado. Sigamos
con la lanza. Con base en los ajustes actuales, realidad no tengo idea si la lanza o la
guadaña es mejor Probablemente con
grupos grandes como este, la guadaña
sería mejor porque, ya
sabes, puede golpearlos a
todos a la vez. Pero a veces un solo
objetivo también es importante. Quiero decir, solo nos estamos
metiendo en, como, cómo jugar el juego
ahora en este momento. Entonces eso es un montón de esqueletos,
y en algún momento, van a atraparme como que
me van a atrapar Podemos ver un
poco de un problema, que es ese tipo de
agrupamiento demasiado juntos Entonces sí quiero que no se
apilen entre sí, pero creo que sus formas de
colisión probablemente
sean demasiado grandes en este momento. Esto es una especie de
hacerlos incapaces de moverse. Así que en realidad nos metimos en
un buen problema que podemos arreglar. Hagamos una pausa en el juego, y luego voy a
tomar los esqueletos En todas las escenas,
tomemos la forma de colisión, y voy a
encogerlo mucho. Hagamos eso como un dos
y luego iremos al orco. Tomaremos su forma de colisión. Esta es la forma de colisión
del cuerpo del personaje base, y tomemos esa forma de
colisión, expandirla y
establecerla en dos también. Si deshacemos el juego, si eso está funcionando correctamente, y creo que es como que lo es No puedo decir al 100%. Entonces, debido a que su forma de
colisión es más pequeña, se agruparán menos Pero, sí, sigue siendo bastante difícil cuando hay
tantos tipos viniendo hacia ti. Si hubo como,
proyectiles también, entonces definitivamente tienes un juego
bastante difícil en este punto Así puedo conseguir un
par de cosas más. Actualicemos la
guadaña esta vez. Y vamos a ir por
el juego a través de la pantalla. Probablemente podría
correr por un tiempo, pero solo queremos verificar todo siga funcionando
con el juego polaco, afrutado,
prototipo sólido ahí dentro. Y vamos al menú principal. Tenemos nuestro tiempo sobrevivido. Creo que sí necesito sacar
eso a la izquierda un poco solo para que haya espacio para el punto decimal en este caso. Aparte de eso, creo que
nos vemos bastante bien. Entonces en el menú principal, así que solo
voy a expandir
esto a la izquierda un poco, obtener todo en una línea. Eso se verá mejor. Y tal vez también me
puse
la música en el menú principal. Entonces voy a hacer clic derecho en un nodo. Hagamos
reproductor de AudioStream no dos D, porque, quiero decir,
no hay dos mundo D ahora Sólo estamos
mirando el menú del juego. Carguemos rápidamente
nuestro AudioStream,
así.p3 porque necesito ir a
buscarlo en Bien, así que vamos a
agregarlo en el audio ahora desde la carpeta de audio. Tenemos tres saltos de Caja
Corazones Rojos. Solo usaremos eso para
el menú principal también. Voy a ponerme los auriculares para que pueda probar
esto por mí mismo. Vamos a jugar. Oh, en
realidad no toqué audio. Bien, entonces hagamos reproducción automática. Sí. Y luego jugar. Bien, en realidad, quiero
comprobar el mundo del juego principal, y quiero ver
qué tan fuerte es eso. Son -40 decibelios. Bien, así que hasta quiero que eso sea un poco más tranquilo
en el menú principal Entonces hagamos eso -45
decibelios. Voy a golpear Play. Pruebalo. Bien, y
luego vamos a Empezar Juego. Aquí es un poco más fuerte.
A lo mejor la música del final hago un poco
más fuerte que eso, también Bien. Entonces el mundo del final del juego, voy a tomar eso y
ponerlo en negativo 35 Creo que lo hice súper tranquilo durante el curso porque simplemente no
quería que
fuera una interferencia cuando estaba hablando de ello. Bien, así que vamos a golpear Play. comenzar el juego.
Bien, eso es bueno. Otro efecto de sonido
que podría querer agregar es cada vez que aparecemos la pantalla de selección de
nivel arriba, creo que eso podría
usar un efecto de sonido. Aparte de eso, creo que
nos vemos bien. Entonces, subamos a la pantalla de selección de subir de
nivel. Bien, haz clic en Agregar un reproductor de
AudioStrem aquí. Déjame ver si tenemos
algunos buenos efectos de
sonido para subir de nivel en el proyecto. Entonces va a estar bajo menú de interfaz
de usuario de audio.
Claro, déjame revisar. Bien, usar artículo
parece que funcionaría. Entonces voy a tomar el reproductor de
flujo de audio aquí. Vamos a hacer estallar en el artículo de uso. Esto no va a Autoplay, así que necesito ir a la selección de
LevelUp. Vamos a agregar en un pop up de
exportación var. AudioStream, que
será un reproductor de AudioStream. Así que vamos a decir pop
up audiostream dot play, y solo tengo que
arreglar esa exportación Bien, y luego asegúrate de
agregar el pop up AudioStream en la exportación Entonces tenemos que agregar eso en. Podríamos hacer a
punto afirmar si
queremos afirmar pop up Recuerda configurar el reproductor
AudioStream para reproducir sonido de nivel superior Bien, ahora vamos a golpear play.
Podemos ir a Start Game. Y probemos derrotando a
un enemigo, subimos de nivel. Y luego tomamos nuestra actualización. La música continúa. Y creo que eso fluye bastante bien. Definitivamente es agradable tener un efecto de sonido real
para el veo up. Así que sigamos adelante
con Syth esta vez. El Syth definitivamente
pone en guerra aquí. Podría ser OP, en realidad. Bien, entonces Syth cuatro,
veamos cómo va eso. Definitivamente, es muy duro. Eso es un gran problema. Como
es básicamente un AOE, probablemente no debería estar haciendo tanto daño,
seamos honestos Bien, creo que ya he
visto suficiente ahí. Sólo voy a
afilar la lanza. Y hacer que la lanza sea más
divertida de usar realmente. Así que vamos a saltar al jugador,
el arma de lanza. Vamos a saltar a la definición de
escena. Podemos simplemente pulirlo por mucho que nos
apetezca, creo Nivel uno corto. Podemos
dejar eso como los impagos. Nivel dos, tres,
cuatro, cinco. A ver. Para el nivel dos, solo haré
que haga de 20 a 30 de daño, y que se enfríe. Sí, podemos hacer 0.9. El nivel tres será del 30 al 35. Creo que la lanza también puede hacer dos golpes en el nivel
dos. Eso está bien. Y luego nivel tres,
haremos 30 o 40 daños. Bien, entonces el máximo golpea dos, y luego vamos a subir los proyectiles a
dos en el nivel cuatro, y esto será de 35 a 45 de
daño a 0.8 enfriarse Y luego hagamos de
40 a 45 daños. Puede ir más rápido.
Hagamos el enfriamiento 0.6. Los proyectiles pueden ser ¿por qué no? Digamos que
tres proyectiles. Eso parece bastante
loco, pero bueno. Y luego voy a hacer un
recorrido rápido con la lanza. A ver si la lanza puede
incluso competir con la guadaña. Bien, más lanzas. Eso debería darnos dos proyectiles.
Eso debería ser mucho mejor. Llegar al Nivel cuatro
fue un poco duro. No voy a
equilibrar esto demasiado, pero sí quería
hacerlo al menos soportable Oh, Dios. El desove se está
volviendo un poco ridículo Oh, se me olvidó hacer un bucle de la música. Bien, abre el mundo del juego. Eso es bastante importante.
Así que el mundo del juego. Vamos a abrir esa escena. Tenemos el reproductor de flujo de audio. Queremos tomar esta
música y check loop. Entonces creo que tenemos que
hacer eso en el proyecto. Hagamos tres. Haga doble clic
en esto y habilite el bucle Bien. Cerrar.
Y luego reproducción automática Entonces, en tu reproductor de flujo de audio, vamos a verificar Looping
on para ese audio Eso también debería estar en la pantalla del menú
principal por si acaso. Así que aquí parámetros, dando vueltas, y luego voy a deshacer el juego Así que eso no empezará hasta que
volvamos a entrar ahí. Entonces como golpeamos Lanza
Nivel cinco, ya no
podemos seleccionar lanza Eso es bueno verificar dos veces
y asegurarse de que, ya sabes, no irr hacia fuera tratando de subir de nivel
hasta el Nivel seis Así que todavía podemos elegir
la guadaña, claro. Bien. Y sólo voy a
dejarme morir en este momento. Creo que sí. Todo parece
bastante bien. Ah, y la pantalla de
puntuación alta aquí, si eso todavía no se
muestra correctamente, saltemos a ella. Entonces, para los puntajes más altos, para asegurarnos de que aquí haya
suficiente espacio, fijemos un
tamaño mínimo en estos. Voy a poner esto en 60.0 y luego vamos
a expandir la
base de puntuación más alta hacia la izquierda Bien, también toma
la etiqueta de cantidad, y hagamos un
tamaño mínimo de 60, ¿de acuerdo? Y podemos tomar los puntajes más altos y hacerlo aún
más grande a la izquierda. Todo bien. Y luego pulsamos play. Y solo asegúrate de
que los puntajes más altos no vayan por el borde en ningún lado. Entonces esto sería bueno para
al menos un dígito más, creo, sin pasar por el borde
y envolverlo ni nada. Bien, entonces en este
punto, más o menos, creo que el prototipo
está relativamente pulido. Estoy seguro de que hay ajustes
que podemos hacer en el código y el contenido para que se agreguen
al juego y simplemente que
sea un juego de pleno derecho Pero en lo que va del curso, mostrando los fundamentos de
cómo configurar todo esto, un superviviente como juego
y GD Script Gudo 4.4 Creo que eso es más o menos sobre
todo lo que hay que mostrar Entonces espero que ustedes hayan
disfrutado mucho
siguiendo a Long todo
el camino hasta el final. Puede haber algunos
pequeños videos de actualización, pero eso es prácticamente todo. Entonces gracias de nuevo por
ver a Iben Chris, y los veré chicos en
mi futuro contenido de video