‫Hola y bienvenido.
‫En esta conferencia vamos a mostrar una pantalla suelta y lo
‫haré completamente desde C++ para generar ese widget.
‫Vamos a sumergirnos y ver cómo se hace.
‫De acuerdo, nos gustaría mostrar algo de interfaz de usuario cuando un jugador muere para decirle qué está pasando, que ha perdido y
‫que el nivel está a punto de restablecerse.
‫Así que no les sorprende.
‫Por lo tanto, no necesitamos crear una interfaz de usuario, widgets de interfaz de usuario, un UMG, un widget de gráficos en movimiento irreal.
‫Entonces, primero hagámoslo, creando una carpeta para almacenar la interfaz de usuario.
‫Y ya sé que vamos a tener dos elementos de UI, así que creo que tendré una carpeta de UI aquí y
‫luego entremos aquí y hagamos clic con el botón derecho y luego vamos, deberías haber hecho esto antes, pero vamos. te guiaré a
‫través de él.
‫Vamos a ir a la sección de la interfaz de usuario, luego seleccionamos el modelo de widgets y el
‫prefijo que se va a usar es el guión bajo WB P y luego será la pantalla suelta.
‫Ahora puedes hacer algunas clases base para este tipo de cosas en C++, pero no vamos a cubrir esto en
‫esta sección.
‫Por lo general, no es necesario hacer eso, y es mucho más fácil hacerlo en Blueprint.
‫No hay muchas ventajas en hacerlo en C++ a menos que una interfaz de usuario se vuelva muy complicada y desee poner
‫parte de esa lógica de interfaz de usuario en C++.
‫En nuestro caso, este no es el caso, por lo que podemos seguir adelante y usar los planos.
‫Después de todo, la interfaz de usuario es algo visual.
‫Tiene sentido usar una herramienta visual para armarlo ahora porque ya sabe cómo crear
‫widgets.
‫Entonces voy a darte esto como un desafío para que configures una pantalla suelta.
‫Queremos agregar un texto que explique que el jugador ha perdido y que estamos a punto de reiniciar.
‫Quiere colocar ese texto probablemente en el centro, hacerlo visible, asegurarse de que sea visible en el juego.
‫Y, sin embargo, como dije, explique que habrá un reinicio próximamente.
‫Y luego, después de que hayas intentado este desafío, veremos cómo podemos generar esto desde C++.
‫Tal vez haya visto cómo hacer esto en Blueprint antes de que veamos cómo podemos hacerlo desde C++.
‫Así que pausa el video y hazlo.
‫Bien, bienvenido de nuevo.
‫Así que voy a ir y crear, en primer lugar, un poco de texto.
‫Así que quiero buscar en la paleta de la izquierda, voy a buscar el elemento de texto y traerlo.
‫Te lo voy a cambiar para que pierdas.
‫Escritura de diálogo bastante sencilla y poco imaginativa aquí.
‫Voy a cambiar el color, la opacidad y la apariencia a rojo para que quede súper claro que se han perdido
‫y solo lo frotaré un poco más y voy a expandir esa fuente y cambiar el tamaño para que sea más grande.
‫.
‫Y luego voy a expandir el cuadro alrededor de nuestro texto y voy a centrar nuestro texto.
‫Entonces, bajando la justificación, voy a centralizar el texto.
‫Y si me expando, veamos si hay algún otro lugar en el que pueda alinearme al centro y que no lo
‫haya.
‫Así que voy a ir y hacer las cajas más o menos apropiadas y luego voy a subir a mis alineaciones y mis anclas
‫y cosas así.
‫Y voy a seleccionar el menú desplegable para anclas y seleccionar el ajuste preestablecido para anclarse en el medio, porque eso es lo
‫que quiero hacer.
‫Quiero establecer mi alineación en 0. 5 y 0. 5, lo que básicamente significa que estamos alineando con el
‫centro del objeto en lugar de que la esquina superior izquierda vuelva a hacer el ancla.
‫Bien, eso no significa que no fue muy útil.
‫Y luego la posición X, ¿por qué creo que si solo configuro la posición junto a cero y cero porque
‫configuré mis anclas de esa manera, entonces mi posición perdida estará en algún lugar en el medio y
‫simplemente la moveré? hacia arriba muy ligeramente.
‫Mantenga mi posición X en cero, la posición Y en -50, porque quiero agregar un texto secundario que diga, en efecto, podría
‫ser más fácil simplemente duplicar el otro texto aquí porque tiene toda la configuración
‫que ya necesito.
‫Solo quiero hacerlo un poco más pequeño.
‫Coloque cero nuevamente y voy a decir que el nivel se reiniciará en 5 segundos y voy a hacer que el tamaño de fuente sea
‫mucho más pequeño.
‫Entonces es menos en tu cara, algo como esto, y luego solo muévelo un poco hacia
‫abajo, una pequeña muesca y sigue restableciendo esa posición X a cero y 100% feliz con el posicionamiento.
‫Solo voy a moverlo un poco más.
‫Si mantengo shift presionado, puedo bloquearlo en el eje con el que me muevo para que esté más o menos
‫centrado.
‫Está bien, así que estoy feliz con eso.
‫Ahora tenemos que seguir adelante y tratar de generar la cosa.
‫¿Cómo vamos a hacer eso?
‫Bueno, antes que nada, vamos a necesitar saber qué clase de widget se supone que vamos a generar, y necesitamos saber
‫dónde vamos a hacerlo a partir de ahora.
‫Como ya he dicho, creo que un buen lugar para hacer esto es desde el propio controlador del reproductor.
‫Y vamos a necesitar saber en el controlador del reproductor qué clase, qué clase de widget estamos tratando de
‫generar.
‫Ahora, sé que es una clase modelo, pero aún necesitamos que sea una clase que estamos tratando de generar.
‫Entonces, la forma en que vamos a hacer esto es crear una nueva propiedad aquí.
‫Habrá ediciones en cualquier lugar y vamos a querer que esto sea una subclase porque siempre es una buena
‫manera de asegurarnos de obtener una nueva clase.
‫Básicamente, podría usar el tipo de nueva clase si quisiera, pero eso no restringe qué tipo de clase
‫podemos usar.
‫Y aquí queremos restringirlo a que solo uses widgets.
‫Si revisa su plano, puede ver si vamos a algún lugar aquí, puede encontrar si una clase principal usa un
‫widget que sabemos que cuando coloca el prefijo se convierte en un widget.
‫Así que esta es una subclase de.
‫Y luego usaremos nuestros paréntesis angulares, usará un widget y en realidad voy a declararlo
‫aquí en lugar de incluirlo.
‫Entonces, clasifique que usa un widget y luego lo llamaremos la clase de pérdida de pantalla.
‫Solo mantén muy claro lo que está pasando allí.
‫Ahora, voy a seguir adelante y compilar en esta etapa mientras hacemos lo siguiente porque compilar cuando se cambia un archivo
‫toma un poco más de tiempo.
‫Ahora, en realidad, la compilación fallará en esta etapa porque no hemos incluido el módulo UMG.
‫No sabemos cómo hacer eso.
‫No se preocupe por la compilación en esta etapa y aproximadamente a los 9 minutos del video, corregiremos
‫este error.
‫Ahora en C++, lo que vamos a querer hacer es generar ese widget.
‫Así que no queremos hacerlo tal vez incluso antes de tiempo.
‫Realmente no importa porque el temporizador no espera.
‫Simplemente establece la hora y luego pasa directamente a la siguiente línea de código, por lo que no estaremos esperando 5 segundos si
‫hicimos esto en Stripe, si generamos la interfaz de usuario inmediatamente después, realmente no importa en qué orden lo hagamos. haz
‫esto en
‫Entonces, lo que vamos a querer hacer es usar una función llamada crear widget, que no está disponible actualmente.
‫Por lo tanto, primero debemos incluir algo con hash y vamos a incluir una barra inclinada del modelo usando un
‫widget.
‫Y esa es una clase que necesitamos para acceder a esta función de creación de widgets.
‫Y básicamente vamos a decir crear widget.
‫Tiene que estar bien, en realidad, vamos a ver qué necesitamos para proporcionarlo.
‫Voy a f 12 a su implementación.
‫Puede ver que es un poco complicado de ver, pero tenemos un parámetro de plantilla aquí que es básicamente el que usa
‫un widget de forma predeterminada, por lo que probablemente no tengamos que proporcionarlo.
‫Y luego está el objeto propietario y la clase que necesitamos crear y luego un nombre de widget que no
‫necesariamente necesitamos proporcionar.
‫Y luego regresa como el puntero al widget.
‫Entonces, lo que realmente voy a hacer es aquí, le daremos un objeto propietario.
‫Ahora, solo ciertas cosas pueden poseer el widget.
‫Una de esas cosas es en realidad el controlador del reproductor.
‫Entonces podemos pasar esto.
‫Y lo siguiente es que queremos pasar la subclase t de usted usa un widget.
‫Bueno, afortunadamente ya lo hemos configurado en el encabezado del archivo.
‫Así que podemos continuar y pasar eso y evitaré que mi sangría intente arreglarse mientras no haya puesto un punto y coma
‫al final de la línea.
‫Y luego vamos a ver qué más.
‫Bueno, eso es todo.
‫Simplemente devuelve el widget en este punto.
‫Entonces, lo que podemos hacer es tener un puntero hacia usted, usar una tienda de widgets y esta será nuestra pantalla perdida.
‫Así que tenemos que perder la clase de pantalla.
‫Una vez que hemos creado el widget, se convierte en una pantalla suelta real.
‫Lo siguiente que debemos hacer es hacer que esta interfaz de usuario sea visible.
‫Hacemos eso agregándolo a la ventana gráfica en un lenguaje irreal.
‫Pero primero, debido a que agregamos a la ventana gráfica llamando a una función en la pantalla azul, debemos asegurarnos de
‫que no sea un puntero nulo.
‫Entonces, si perder la pantalla no es igual al puntero nulo, ¿por qué podría no haber puntos?
‫Por cierto, pequeño reto para ti.
‫Vea si puede averiguar por qué podríamos terminar con un puntero nulo aquí.
‫Bueno, una de las razones es que tal vez nos olvidamos de configurar la clase de pérdida de pantalla.
‫Y si ese es el caso y no tenemos un conjunto de clase de pantalla azul válido, entonces crear widget
‫solo nos devolverá un puntero nulo.
‫Y no queremos que eso suceda y ciertamente no queremos llamar a una función en un puntero nulo.
‫También puede hacerlo la flecha de la pantalla azul.
‫Y luego lo que queremos aquí es una función llamada agregar a la ventana gráfica.
‫Que simplemente va a hacer precisamente eso.
‫Vaya y agréguelo a la pantalla para que podamos ver esa pantalla azul.
‫Ahora, voy a seguir adelante y compilar eso también, iré a Unreal y abriré nuestro modelo
‫para el controlador del jugador.
‫Así que dispare un controlador de juego aquí y deberíamos poder ver algún lugar aquí.
‫Y una variable aún no ha aparecido.
‫Tal vez tenía algunas áreas de construcción.
‫Vayamos y echemos un vistazo al registro de mensajes.
‫Sí, podemos ver algunos errores de compilación aquí, a saber, estos extraños sobre la falta de símbolos externos.
‫Si tenemos una pequeña mirada que dice cosas sobre usted, use un widget que no esté disponible.
‫Ahora, si recuerda algunas conferencias anteriores, sabemos que este tipo de errores tienden a ocurrir cuando
‫nos falta una dependencia de módulo.
‫Entonces, si vamos y abrimos nuestros documentos de compilación de disparos simples y solo voy a cerrar la terminal para agregar un
‫poco más de espacio, entonces pueden ver que lo que debemos hacer es agregar una nueva dependencia pública aquí.
‫Entonces, al final de esto, agregaremos una dependencia pública para UMG.
‫Así que una nueva coma y luego entre comillas vamos a poner UMG.
‫Y eso básicamente nos permite hacer uso de las inclusiones que teníamos aquí, el widget de uso de barra inclinada de
‫blueprint.
‫Todo eso está en un módulo separado.
‫Entonces, las cosas estándar que están incluidas.
‫Así que tenemos que ir y decirle a develar que queremos usar ese módulo en C++.
‫Avancemos y construyamos y veamos si funciona ahora.
‫Bueno.
‫Eso parece exitoso.
‫Si vamos al editor y volvemos a disparar un controlador de reproducción.
‫Alguna razón por la que no creo que haya recargado correctamente, así que tuve que presionar compilar aquí en el editor.
‫Volvamos ahora al controlador de juego de disparos.
‫Por fin puedes ver esa clase de pantalla suelta.
‫Podemos hacer clic en el menú desplegable allí e ir y seleccionar AWP, subrayar, perder pantalla allí, compilar,
‫guardar y vamos a matarnos.
‫Recibir un disparo en un par de veces.
‫Explosión, explosión.
‫Y ahí tienes
‫La pantalla de Alu ha aparecido diciéndonos lo que está pasando, ese nivel está a punto de reiniciarse en 5 segundos,
‫y de hecho lo hace.
‫Así que ahora sabe no solo cómo puede crear gráficos UMG, sino también cómo puede generarlos desde C++ en
‫lugar de Blueprint.
‫En la próxima lección, vamos a tener una perspectiva menos pesimista de las cosas e intentaremos
‫ver si también podemos crear algunas condiciones ganadoras para este juego.
‫Te veré luego.