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