Introducción

En este artículo vemos cómo importar y exportar paquetes en Unity, podemos usar esta característica para compartir Assets, por ejemplo las soluciones para Unity que se pueden descargar de esta página en general están empaquetadas de esa manera, entonces para poder usarlas tendrás que saber cómo importar paquetes en Unity.

En el siguiente vídeo muestro cómo importar paquetes de Unity y cómo exportarlos


Paquetes para importar

En mi página de itch.io comparto paquetes de Unity con soluciones que se pueden descargar e importar, te dejo dos de estas descargas aquí debajo.

Cómo importar paquetes de Unity

Los paquetes de Unity son archivos con extensión «.unitypackage».

Para importarlos podemos hacer clic derecho en la carpeta de nuestro proyecto y poner «Import Package > Custom Package», luego elegir el paquete en la ventana emergente. También podemos arrastrar el paquete a Unity o simplemente hacer doble clic en él.

Al importarlo nos aparecerá una ventana para seleccionar qué archivos del paquete queremos importar, luego de elegir los que necesitamos, damos clic al botón Import.

Cuando el proceso de importación finaliza podemos recuperar todos los Assets contenidos en el paquete.

Cómo exportar paquetes de Unity

Para exportar un paquete de Unity hacemos clic derecho en la carpeta del proyecto y elegimos la opción «Export Package», nos sale una ventana que nos permite elegir los archivos que serán empaquetados. Cuando terminamos hacemos clic en el botón «Export» y nos sale una ventana de guardado en la que tenemos que ingresar el nombre y la ubicación del archivo.Con esto ya tenemos el paquete de Unity listo para compartir.

Esto de crear un paquete de Unity con los archivos del proyecto también lo suelo utilizar para guardar copias de seguridad adicionales de mis proyectos.

Introducción

En este artículo te presento un prototipo descargable para utilizar un segundo monitor en Unity para mostrar un minimapa. Esta solución está pensada para mostrar un Canvas con información en un segundo monitor.

En el siguiente video hablo sobre la solución para usar múltiples pantallas en Unity, las pruebas que hice, qué inconvenientes me surgieron, cómo ataqué el problema y muestro cómo funciona la solución en Unity.

Archivos de descarga e implementación en Unity

El archivo de descarga es un paquete de Unity que podemos importar directamente y recuperar la escena que se muestra en el video junto con todos los Assets.

Solución: Cómo usar múltiples pantallas en Unity
Versión:1.0
Publicado:marzo 13, 2020

Problemas con el Motor y Soluciones

Como explico en el video, existen varios problemas sin resolver con respecto a la implementación de una segunda pantalla en Unity.

Uno de los problemas que me encontré es cuando se usan dos monitores de distinta resolución. El motor aparentemente utiliza como referencia una de ellas y esto trae problemas con el escalador de Canvas.

Para resolver este problema utilizo un empty GameObject en el segundo Canvas como contenedor de todos los elementos. Esto permite que el usuario escale el segundo Canvas en caso de que esté mal ajustado a su monitor.

Otro problema que surgió es que no hay una manera práctica de detectar cuándo un monitor se conecta y se desconecta,

Cómo usar la Solución

Tomando como base el prototipo que viene en el paquete, hay que empezar a construir la interfaz gráfica que uno necesita.

La idea es construir la interfaz gráfica en el Canvas principal y seleccionar los elementos que queremos mostrar en el segundo Canvas, estos elementos los vamos a duplicar y colocar en el contenedor del segundo Canvas.

En el Canvas principal está asignado el Script «SecondDisplay», en el inspector hay un vector en el que tenemos que asignar todos los GameObjects del Canvas principal que van a ser trasladados al Canvas secundario, de esta forma, al activar el segundo monitor, esos elementos del Canvas principal se van a ocultar.

Para ver la ventana de configuración del segundo display se debe presionar la tecla F1, esto podemos cambiarlo en el script «SecondDisplay», anulamos la función en el método Update y se puede desplegar esa ventana desde donde se necesite.

Introducción

Esta descarga para Unity consiste en el modelo 3D de un reloj de pared estilo antiguo, números romanos y marco de madera. Las manecillas son funcionales.

La descarga es gratuita e incluye las texturas PBR con resolución 512 x 512.

En el siguiente video muestro brevemente el contenido del paquete y cómo usar la solución.

Si lo necesitas, en el siguiente video puedes ver cómo importar paquetes en Unity.

Descargar el paquete

Contenido del Paquete

Dentro hay un modelo 3D del reloj, tres texturas (Albedo, Metallic y Normal). Dos Scripts para poner el reloj en hora y testear esa funcionalidad. Una escena en la que está todo configurado, al abrir esta escena y entrar en el modo juego, el modelo del reloj irá mostrando aleatoriamente distintos horarios.

Cómo utilizar el reloj en Unity

El Reloj se controla utilizando el script «GDTClock», este tiene una función pública llamada «SetTime» que permite ponerlo en hora.

En términos simples, para utilizar el reloj debemos crear un Script que lo controle, dentro de este Script debemos definir una referencia de la clase «GDTClock» y encontrar la referencia de este objeto en la jerarquía, esto último lo podemos hacer manualmente definiendo el objeto «GDTClock» como público o serializado y luego arrastrando el objeto del reloj al espacio en el inspector. El Script «WallClockTest» que viene dentro del paquete muestra como hacer uso del reloj.

Te dejo un video que explica en detalle cómo llamar funciones definidas en otro Script y un artículo sobre comunicación entre scripts en Unity. Con esto podrás entender en detalle cómo utilizar este reloj.

Introducción

En este artículo vamos a ver cómo son las funciones seno y coseno, sus expresiones matemática, su gráfica en el plano cartesiano y sus características principales.

Expresión matemática de una función Seno y Coseno

La expresión matemática de la función seno es:

(1)  


La expresión matemática de la función coseno es:

(2)  

Se lee comunmente «f de x», siendo X la variable independiente, a, b, x0 y c números reales constantes.

Características de las funciones Seno y Coseno

Dominio

El dominio es el intervalo de valores admisibles para la variable independiente, comunmente denominada X.

En el caso de las función seno y coseno el dominio es el conjunto de los números reales, es decir la variable independiente puede tomar cualquier valor desde menos infinito a más infinito.

Funciones trigonométricas en el plano cartesiano

La gráfica de f (X) en el plano cartesiano es una onda periódica que se repite en todo el dominio. Puedes graficar las funciones seno y coseno a partir de una tabla de valores.

Fig. 1: Gráfica de una función cuadrática con el coeficiente a positivo.

Fig. 2: Gráfica de una función cuadrática con el coeficiente a negativo.

Desplazamiento de las funciones Seno y Coseno

Hay un valor en el eje «y» respecto del cual las funciones seno y coseno oscilan, si trazamos una línea horizontal en ese valor del eje podemos ver que las funciones se alejan desde ese valor una cierta cantidad hacia arriba, luego vuelven y bajan exactamente la misma cantidad.

El desplazamiento que las funciones Seno y Coseno tienen en el eje y está dado por la constante «c» en las ecuaciones 1 y 2.

En las figuras 1 y 2 el desplazamiento vale 0.

Amplitud de las funciones Seno y Coseno

El término «a» que multiplica a las funciones seno y coseno, en las ecuaciones 1 y 2 se lo conoce como amplitud de la función y es lo que determina la excursión que tendrá la función en el eje y.

Si nos ubicamos en el valor de desplazamiento en el eje y, la función se moverá hacia arriba y abajo una cantidad igual a el valor de a.

Frecuencia de la funciones Seno y Coseno

Las funciones Seno y Coseno son periódicas, esto quiere decir que hay una porción del dominio en el que la función toma valores únicos y luego este patrón se repite en el resto del dominio, infinitamente. Es como si tomáramos ese trozo de la función, lo copiamos y lo pegamos hacia adelante y atrás en el eje x.

Esto quiere decir que podemos definir con qué frecuencia las funciones se repiten. Si la frecuencia es mayor, la función se repetirá más veces en el eje x.

La frecuencia de una función se la suele representar con la letra f y su valor concretamente está dado por el coeficiente b en las ecuaciones 1 y 2.

Período de las funciones Seno y Coseno

El período es la distancia en el eje x que la función recorre desde que comienza hasta que finaliza para luego volver a repetirse.

El período se lo simboliza con la letra T en mayúscula, no está a simple vista en la función pero puede calcularse como 2 veces PI, dividido por el valor de la frecuencia, es decir:

(3)  

Siendo f la frecuencia de la función, este valor es el coeficiente b en las ecuaciones 1 y 2.

Desfasaje de las funciones Seno y Coseno

El desfasaje es el corrimiento que tiene la función en el eje x, este corrimiento puede ser a la izquierda o a la derecha y está dado por el valor que sumamos o restamos (respectivamente) al valor de b.x, en el argumento de las funciones seno y coseno, he representado este valor como x0.

Relación que existe entre las funciones Seno y Coseno

Si vemos las figuras 1 y 2 vemos que las gráficas de la función seno y coseno son muy similares, de hecho resultan idénticas a simple vista sin examinar los ejes. Esto se debe a que la única diferencia que existe entre ambas es que tienen un desfasaje de 90 grados o medio PI en radianes una de la otra.

Esto quiere decir que utilizando una función seno y aplicándole un desfasaje podemos hacer que sea idéntica al coseno y visceversa. Osea que dada la gráfica de una de estas funciones podemos representarla como seno o como coseno, matemáticamente es igual.

Los valores de las funciones seno y coseno puras, es decir sen(x) y cos(x), los podemos representar utilizando un círculo de radio de 1 centrado en el origen como los catetos de un triángulo rectángulo que se forma con tres puntos. El primer punto es el origen (0,0), el segundo punto es un punto del círculo que estará definido por un segmento que parte desde el origen y tiene determinado ángulo respecto de la parte positiva del eje x; y el tercer punto es la proyección del segundo punto sobre el eje x.

Lo anterior es bastante difícil de imaginar pero podemos verlo ilustrado en el siguiente gif tomado de esta página de Wikipedia.

Valores que toman las funciones seno y coseno dependiendo de los ángulos en radianes. Fuente Wikipedia.

En todo momento vemos que el coseno se corresponde con el cateto del eje x en el triángulo rectángulo y el valor del seno está en el cateto sobre el eje y.

Introducción

Hice una recopilación de algunas de las obras de música clásica más conocidas junto con sus nombres, aquí puedes escucharlo:

Esta música está genial para ponerla de fondo mientras estudias o trabajas en algún proyecto, además puedes usarla para medir intervalos de tiempos. Esto lo hago seguido, por ejemplo me propongo un objetivo como este: Voy a estudiar este idioma o voy a trabajar en esta tarea hasta que se termine la música.

Índice con los nombres de los compositores

0:00 – 2:34 In the Hall of the Mountain King – Edvard Grieg
2:34 – 8:25 Eine kleine Nachtmusik – Wolfgang Amadeus Mozart
8:25 – 11:54 Winter, 1st Movement – Antonio Lucio Vivaldi
11:54 – 17:15 Ride of the Valkyries – Richard Wagner
17:15 – 40:56 9th Symphony, 4th Movement – Ludwig van Beethoven
40:56 – 47:52 5th Symphony, 1st Movement – Ludwig van Beethoven
47:52 – 56:02 7th Symphony, 2nd Movement – Ludwig van Beethoven
56:02 – 1:01:18 Sonata N°14, 1st Movement – Ludwig van Beethoven
1:01:18 – 1:03:23 Sonata N°14, 2nd Movement – Ludwig van Beethoven
1:03:23 – 1:10:16 Sonata N°14, 3rd Movement – Ludwig van Beethoven
1:10:16 – 1:19:41 Piano Sonata No. 2 – Ludwig van Beethoven
1:19:41 – 1:31:25 William Tell Overture – Gioachino Rossini

En este vídeo muestro un procedimiento que nos permite hacer secciones sobre un objeto en Blender y luego otro procedimiento para cortar directamente sobre las caras de los objetos.

Introducción

En este artículo vamos a ver dos formas de cortar objetos en Blender, una es con la herramienta «Bisect» que permite seccionar un objeto de acuerdo a como trazamos y orientamos un plano, lo que da un resultado como el que se muestra en la figura 1. Luego vamos a ver la herramienta «Knife» que permite marcar puntos sobre las caras y aristas de un objeto, como si se tratara de un cuchillo, esos puntos luego podemos transformarlos en vértices y generar objetos como el que se observa en la figura 2.

Fig. 1: Bisección del cubo.

Fig. 2: Corte sobre una de las caras para formar una grieta.

Procedimiento para cortar o seccionar objetos en Blender

Las herramientas que vamos a usar son Knife y Bisect (Cuchillo y Bisecar), podemos verlas en la figura 2. El cuchillo se puede acceder rápidamente con la tecla K.

Fig. 3: Estas son las herramientas para cortar o seccionar objetos en Blender.

Fig. 4: Se deben seleccionar todas las caras que van a participar en el corte.

Herramienta Bisecar

Vamos a comenzar utilizando la herramienta bisecar que nos permitirá cortar un objeto en dos partes.

Para usar esta herramienta deben estar seleccionadas todas las caras que participarán en el corte. Luego marcamos dos puntos sobre el objeto (figura 5), esto trazará un plano perpendicular a la vista y que pasa por esos dos puntos, sobre este plano se hará el corte del objeto. En la figura 6 podemos ver el resultado.

Fig. 5: Con la herramienta Bisect se deben marcar dos puntos para hacer el corte.

Fig. 6: El cubo fue dividido en dos partes.

Tomando el resultado de la figura 6 podemos eliminar la parte superior y crear una nueva cara, obteniendo el resultado que buscábamos.

También puedes separar el objeto en dos partes, aquí puedes ver cómo.

Fig. 7: Podemos eliminar la parte superior y crear una nueva cara.

Herramienta Cuchillo

Ahora vamos a ver la herramienta cuchillo, el acceso rápido es la letra K.

Con el cuchillo podemos obtener un resultado similar que con la herramienta bisecar, marcamos los puntos por donde se hará el corte y al finalizar presionamos Enter.

Fig. 8: Con la herramienta cuchillo podemos lograr un resultado similar.

Fig. 9: Marcamos los vértices del corte y al finalizar apretamos Enter.

Fig. 10: Se han creado nuevas caras como consecuencia del corte.

La herramienta cuchillo nos permite hacer cortes irregulares en cualquier parte del objeto, en este caso vamos a hacer una grienta sobre una de las caras haciendo un corte en forma de estrella.

Si hacemos doble clic mientras estamos haciendo el corte, el punto final se unirá automáticamente al punto inicial.

Fig. 11: Con la herramienta cuchillo se pueden hacer cortes irregulares en cualquier parte del objeto.

Para crear la grieta seleccionamos la nueva cara en forma de estrella, presionamos E para hacer una extrusión, S para escalar y hacer esa nueva cara más pequeña y la tecla G seguida de X para mover la cara en la dirección del eje X.

Fig. 12: Al finalizar el corte tenemos una nueva cara que podemos manipular.

Introducción

En este artículo vamos a ver cómo crear un texto 3D simple en Blender a partir de una cualquier fuente a elección ya sea de la carpeta Fonts del sistema o una fuente cualquiera descargada de internet. El procedimiento consiste en crear un objeto Text que es un recurso que tiene Blender para generar textos y configurar distintos parámetros como la alineación, tamaño de fuente y demás. Con esto obtenemos un texto editable, a partir de ahí podemos convertir ese objeto en un Mesh, es decir un modelo 3D con vértices, aristas y caras.



En el siguiente vídeo vemos cómo crear un texto 3D básico en Blender.




Resumen de cómo hacer Texto 3D en Blender

1. Conseguir el archivo de la fuente que vamos a usar. Puede ser una fuente de la carpeta Windows > Fonts, o una fuente descargada de internet, de páginas como 1001Fonts o DaFont por ejemplo.

2. En Blender, estando en el modo objeto presionar SHIFT+A y añadir un objeto Texto.

3. Con el objeto texto seleccionado entrar en el modo edición con la tecla TAB y editar el texto que se necesite.

4. En la ventana propiedades (la ventana donde se selecciona el motor de renderizado o se crean materiales), vamos a la pestaña «Texto«, que tiene un ícono con la letra «a«, ahí se puede seleccionar la fuente en la sección «Font» y modificar otras propiedades del texto.

5. En la misma pestaña «Texto» vamos a la sección «Geometry» y aumentamos el parámetro «Extrude«, con esto podremos modificar el volumen del texto.

6. Al finalizar la edición del texto volver al modo objeto, hacemos clic derecho sobre el texto y elegimos la opción «Convert To Mesh«. Esto hará que el objeto «texto» pase a ser un modelo 3D con vértices, aristas y caras que podremos editar.

Procedimiento detallado para hacer Letras 3D en Blender 2.8

En mi caso voy a comenzar descargando una fuente de la página «1001 Fonts«. Asegúrate de conocer la ubicación de la fuente que vas a utilizar o tener el archivo a mano, para poder seleccionarlo fácilmente en Blender.

Fig. 1: Elegimos una fuente para el texto 3D.

Estando en el modo objeto, apretamos SHIFT + A y añadimos un nuevo objeto tipo «Text«, como vemos en la figura 2. Luego con el texto seleccionado apretamos Tab para entrar en el modo edición y poder escribir el texto que queramos.

Fig. 2: Agregamos un objeto texto.

Fig. 3: Con Tab entramos en el modo edición y escribimos el texto.


Cuando tenemos un Texto seleccionado nos aparece una pestaña donde podemos configurar todas las propiedades, la podemos ver en la figura 4. Dentro de esa pestaña vamos a la sección Fonts y hacemos clic en el botón para abrir (figura 5).

Fig. 4: Vamos a la pestaña texto que aparece cuando tenemos un objeto texto seleccionado.

Fig. 5: En la sección Font hacemos clic en el botón para abrir la fuente.

Utilizando el explorador buscamos la fuente que hemos elegido.

Fig. 6: Seleccionamos la fuente en el explorador.

Voy a centrar el texto en «Paragraph – Alignment» (figura 7) y para que las letras sean 3D vamos a la sección «Geometry» y le damos un valor distinto de cero a «Extrude».

Fig. 7: Podemos alinear el texto.

Fig. 8: Para darle volumen al texto vamos a «Geometry» y aumentamos el valor «Extrude».

Esto hace que el texto ahora tenga profundidad, como vemos en la figura 9.

Fig. 9: Configuramos todos los parámetros necesarios hasta obtener el resultado deseado.

Cuando terminamos de editar el texto volvemos al modo objeto, hacemos clic derecho sobre el texto y elegimos «Convert To Mesh», esto hará que el objeto texto pase a ser un modelo 3D.

En la figura 11 vemos la geometría de las letras 3D.

Fig. 10: Convertimos el objeto texto a Mesh, de esa forma las letras pasarán a ser un objeto 3D.

Fig. 11: Al entrar en el modo edición podemos ver la geometría de las letras 3D.



Introducción

En este artículo vamos a ver cómo hacer agujeros en Blender sobre un modelo 3D con la forma de un segundo modelo, para esto vamos utilizar el modificador «Boolean» en modo «Difference». Este modificador además de perforar una pieza cuando está en modo «Difference» también sirve para hacer uniones e intersecciones entre modelos 3D.

Un vídeo al respecto

En el siguiente vídeo se ve cómo usar el modificador booleano para cortar un modelo 3D con la forma de otro modelo. Un ejemplo de esto es el de la miniatura, partiendo de dos objetos, un cubo y una estrella, se utiliza la estrella para cortar el cubo dando como resultado una pieza como la que se ve en la miniatura a la izquierda.


Procedimiento para cortar un objeto con otro objeto en Blender

Vamos a tomar un cubo y hacerle un agujero utilizando un cilindro, como se observa en la figura 1.

Fig. 1: Partimos de un cubo y un cilindro.

Seleccionamos el cubo y vamos a la pestaña «Modificadores», señalada en la figura 2. A continuación agregamos el modificador Boolean, como se observa en la figura 3.

Fig. 2: Seleccionamos el cubo y vamos a la pestaña modificadores.

Fig. 3: Agregamos un modificador de tipo Boolean.

En el campo «Object» del modificador debemos asignar el objeto que va a hacer el corte, en nuestro caso el cilindro. Podemos usar el gotero para seleccionar el cilindro o podemos elegirlo de la lista.

Es importante que el modo de operación sea «Difference», como se observa en la figura 4, esto hará que todo el espacio que ocupe el cilindro dentro del cubo sea removido.

Fig. 4: En el campo Object seleccionamos el objeto de corte, en este caso el cilindro.

Luego colocamos el cilindro en donde queremos que se haga el agujero.

Fig. 5: Posicionamos el cilindro de acuerdo a cómo queramos el agujero.

Si vamos al Outliner y ocultamos el cilindro (figura 6) vemos que la pieza ya tiene hecho el agujero.

Fig. 6: Ocultamos el cilindro en el Outliner de Blender para ver el resultado.

Fig. 7: Al ocultar el cilindro se ve que se ha hecho un agujero en la pieza.

Cuando ya no tengamos que hacer más cambios, podemos aplicar el modificador para que el corte se haga efectivo. En la figura 9 vemos cómo queda la geometría después de aplicar el modificador.

Fig. 8: Aplicamos el modificador Boolean para que el corte se haga efectivo.

Fig. 9: En la geometría podemos ver el corte.

Introducción

En este artículo vamos a ver cómo exportar modelos 3D de Blender a Unity, en qué formato hacerlo, cómo exportar los materiales y las texturas, además vamos a ver algunas cuestiones de organización que tengo en cuenta tanto en Blender como en Unity que nos pueden facilitar las cosas a la larga.

En el siguiente vídeo muestro cómo exportar modelo de Blender a Unity y qué hacer con las texturas.


Serie completa sobre modelar, texturizar y exportar modelo 3D de BLENDER A UNITY

👇 Modelado 3D paso a paso 👇

Por si te interesa a la abajo a la izquierda te voy a dejar un video en el que hago un modelo 3d paso a paso de una copa de vino a partir de una imagen de referencia, luego lo exporto a Unity y luego en Unity configuro el material para que tenga transparencia. A la derecha te dejo otro vídeo sobre el modelado paso a paso de una una lámpara de un parque que forma parte de una serie integradora en la que muestro el procedimiento completo para exportar modelos y texturas de Blender a Unity.

🟢 MODELADO DE UNA COPA EN 3D CON IMAGEN DE REFERENCIA EN BLENDER

🟢 MODELADO DE UNA LÁMPARA EN 3D EN BLENDER

Resumen de cómo exportar modelo 3D de Blender a Unity

1. En Blender, en el modo objeto, seleccionamos el o los modelos 3D que queremos exportar.

2. Hacemos clic en File > Export y elegimos el formato FBX en este caso.

3. Se recomienda marcar la casilla «Selected Only» para exportar a Unity solamente los modelos 3D seleccionados.

4. Elegimos la ubicación y el nombre del archivo para exportar. Una opción es exportar directamente a la carpeta del proyecto de Unity. Esto permite sobreescribir los modelos y lograr que los cambios se apliquen automáticamente en todo el proyecto (siempre que no se rompa la conexión entre los Prefabs de la jerarquía y el archivo .fbx).

En qué formatos exportar a Unity

El formato que utilizo es .fbx (Filmbox), el cual permite exportar además los materiales que contiene el modelo 3D, los huesos de animación, las acciones definidas con el Action Editor y los Shape Keys. Pero también se puede utilizar el formato OBJ.

Cómo exportar las texturas de blender a Unity

Cuando exportamos un modelo 3D en Blender en formato FBX normalmente las texturas no se adjuntan dentro del archivo aunque hay una manera de hacerlo. Concretamente para trasladar las texturas de Blender a Unity tenemos dos alternativas una es hacer que las texturas se incluyan en el archivo FBX, lo cual lo encuentro un poco incómodo pero es una alternativa válida, la otra opción es llevar a Unity por un lado el modelo y por otro las texturas y luego configurar todo, este último es el método que prefiero a la hora de llevar modelos de Blender a Unity. Dejo un par de vídeos al respecto.

🟢 Exportar modelo de Blender a Unity con texturas

🟢 Incorporar las texturas en el archivo FBX

Cosas que tengo en cuenta antes de exportar

Antes de exportar de Blender a Unity trato de mejorar ciertos aspectos del modelo 3D y sus parámetros para tener todo lo más organizado y simple posible.

Outliner de Blender

El Outliner es la ventana donde podemos visualizar todos los objetos de la escena y agruparlos en colecciones. Es similar a la ventana «Jerarquía» en Unity, de modo que cuando exportemos los modelos de Blender a Unity, parte de la información del Outliner se trasladará a la Jerarquía de Unity, por eso está es recomendable prestar atención a los nombres de los objetos y las relaciones de parentesco que hay entre ellos.

Fig. 1: Ventana Outliner de Blender donde podemos ver listados los objetos de la escena.

Los nombres de los modelos 3D se exportan de Blender a Unity

En el Outliner de Blender podemos modificar los nombres de los objetos y dado que esos nombres se van a exportar directamente de Blender a Unity, siempre trato de elegir nombres significativos, que sean tan descriptivos del objeto como sea posible.

A la larga, cuando tenegamos muchos modelos 3D en nuestro proyecto, la organización es fundamental.

Los orígenes de los modelos 3D se trasladan de Blender a Unity

El origen de un objeto, es el punto que en el espacio que lo representa. Las transformaciones de traslación, rotación y escala del objeto, se aplicarán respecto de ese punto. De modo que en general nos interesa que esté en un lugar coherente del modelo 3D.

Para cambiar de posición el origen se utiliza el Cursor 3D de Blender.

Entramos en el modo edición de la geometría y seleccionamos un vértice, arista o cara en donde queremos colocar el origen. Luego presionamos «CTRL + SHIFT + S» y elegimos la opción «Cursor to Selected», para mover el cursor 3D al elemento seleccionado.

Volvemos al modo Objeto, hacemos clic derecho sobre el modelo 3D, vamos a la opción «Set Origin» y elegimos «Origin to 3D Cursor». Esto se encargará de colocar el origen de coordenadas del modelo 3D en la posición donde está el cursor.

🟢 Procedimiento para modificar el origen de un modelo 3D en Blender
 

Las relaciones jerárquicas entre objetos en Blender se reflejan en Unity

Quiere decir que si tenemos objetos que son hijos de otros objetos, es decir están emparentados en el Outliner de Blender, esta relación de parentezco se trasladará a la jerarquía de Unity al exportar los modelos 3D.

Unir o Separar objetos en Blender antes de exportar

Si tenemos un modelo 3D que consiste en varias piezas y estas no deben cambiar de lugar, quizás nos conviene juntar todos esos objetos en uno solo o por el contrario si tenemos un único objeto pero tal vez nos interesaría remover determinadas partes o ir haciéndolas aparecer en Unity, deberíamos separar ese objeto en varias partes.

Este es el artículo sobre cómo unir o separar objetos en Blender.

Los materiales de los modelos 3D exportados en Blender los tenemos en Unity

Es conveniente crear buenos materiales en Blender y utilizar buenos nombres para identificarlos ya que al exportarlos, estarán disponibles para usar en Unity.

En mi caso lo que hago es crear materiales Seamless que luego voy reutlizando en distintos modelos 3D y ajustando los mapas UV en cada caso, esto nos permite luego en Unity crear un material idéntico y aplicarlo a todos los modelos que lo necesiten.

Conclusión

Hemos visto cómo exportar modelos 3D de Blender a Unity, en qué formato y algunos detalles a tener en cuenta para aprovechar al máximo lo que nos ofrece Blender.

El formato a utilizar es .fbx (filmbox) que permite exportar varias características de Blender a Unity.

Los nombres, orígenes, relaciones jerárquicas y materiales se van a exportar de Blender a Unity, es por eso que conviene prestar atención a estos elementos y organizarlos al máximo, de esa forma podremos ir mejorando los modelos 3D de forma más sencilla.


Introducción – Definamos objeto y mesh en Blender

Comencemos entendiendo qué es un objeto en Blender, los objetos son entidades que tienen como mínimo un punto de referencia en el espacio 3D que se conoce como «Origen» y tienen asociada una «Transformación», esa transformación consiste en información sobre su posición en el espacio, su rotación y su escala. Un objeto en Blender puede estar vacío y simplemente servir para marcar una coordenada en el espacio, aunque normalmente, si estamos modelando en 3D, el objeto tendrá definido un Mesh, el cual es un conjunto de vértices, aristas y caras que están conectados de determinada forma.
El objeto además podría contener varios meshes que no necesariamente estén conectados entre si, por ejemplo imaginen un modelo 3D que consiste en una mesa y una silla, se tiene un mesh para la mesa, otro mesh para la silla, pero ambos meshes constituyen un único objeto en la escena de Blender.



Ahora que tenemos una idea más precisa sobre la diferencia entre objetos y meshes, vamos a ver cómo unir objetos en Blender, para lo cual partiremos de dos objetos separados y los uniremos formando un único objeto que contiene toda la geometría. Y luego para separar objetos en Blender la idea es partir de un objeto en Blender que en su interior contiene varios meshes aislados, lo que haremos es tomar un objeto compuesto de dos partes o meshes y vamos a separarlo nuevamente en dos objetos de Blender distintos.

Blender tiene distintos modos de trabajo, cuando estamos modelando en 3D dos de los modos mas usados son el «modo objeto» y el «modo edición«, en el modo objeto trabajamos con los objetos de la escena mientras que en el modo edición se trabaja con la geometría que un objeto específico o un conjunto de objetos tiene definido en su interior. Para unir dos objetos en Blender tenemos que encontrarnos en el modo objeto y para separar un objeto en Blender tenemos que estar en el modo edición.

En el siguiente vídeo muestro en detalle cómo UNIR dos objetos de Blender en un único objeto y luego cómo seleccionar una parte de un objeto y SEPARARLO en otro objeto en Blender:




Resumen de los procedimientos

Primero vamos a ver una serie de pasos simplificados para unir y separar objetos en Blender, más abajo estará el proceso detallado paso por paso.

Pasos para unir objetos en Blender

1. Estando en el modo objeto seleccionar todos los objetos que se quiere unir con la tecla SHIFT.

2. Presionar CTRL + J para unir o hacer clic derecho y elegir la opción «Join».

Pasos para separar objetos en Blender

1. Seleccionar el objeto que se quiere separar en partes y entrar en el modo edición (TAB).

2. Seleccionar todos los vértices que pertenezcan a la porción de mesh que se quiera separar en un segundo objeto.

3. Presionar la tecla P y elegir la opción «Separate By Selection», también pueden hacer clic derecho, ir a la sección «Separate» y elegir la opción «By Selection».



Procedimiento detallado para unir objetos en Blender

Partimos desde dos objetos separados como los que se ven en la figura 1, en el Outliner de la figura 2 vemos que se trata de dos objetos separados.

Fig. 1: Partimos de dos objetos separados.

Fig. 2: En el Outliner de Blender podemos ver que se trata de dos objetos distintos.

Seleccionamos ambos objetos utilizando SHIFT y hacemos clic derecho para que se nos despliegue el menú que se observa en la figura 3. Elegimos la opción «Join» para combinar ambos objetos en uno solo.

Es conveniente aprenderse el acceso rápido CTRL+J para ganar tiempo.

Fig. 3: Seleccionamos ambos objetos, hacemos clic derecho y usamos la opción «Join».

En el Outliner vemos que ahora tenemos un solo objeto compuesto por ambos cubos.

Fig. 4: Ventana Outliner de Blender donde se ve que los dos objetos se han unido y ahora son uno solo.



Procedimiento detallado para separar objetos en Blender

Ahora vamos a revertir el proceso anterior, partimos de un único objeto compuesto por varias partes (o meshes), vamos a tomar una de esas partes y a separarla en un objeto aparte.

Para esto entramos en el modo edición (acceso rápido TAB) y seleccionamos todos los vértices que queremos separar en un nuevo objeto. En el video de arriba se selecciona un vértice del cubo y a continuación se usa el acceso rápido CTRL+L que me permite seleccionar todos los vértices que están conectados.

Fig. 5: Para separar los objetos en Blender, seleccionamos todos los vértices que queremos separar.

Luego hacemos clic derecho para que se nos despliegue el menú que se observa en la figura 6 y vamos a «Separate«. También podemos usar el acceso rápido con la letra «P» para que se nos despliegue este menú.

Elegimos la opción «Selection» para separar todos los vértices seleccionados en un nuevo objeto.

Fig. 6: Hacemos clic derecho y vamos a la opción «Separate». También se puede usar el acceso rápido al menú para separar objetos con la letra «P».

Fig. 7: Elegimos la opción «Selection» para separar los vértices seleccionados en un nuevo objeto.

En la figura 8 vemos que ahora tenemos dos objetos distintos en el Outliner.

Fig. 8: En el Outliner vemos que se han separado los objetos y ahora son dos.



Introducción

En este artículo vamos a ver una solución descargable que consiste en una cinta transportadora hecha en Unity, cuyo funcionamiento es controlado utilizando una placa Arduino.


Archivos para descargar

En el siguiente paquete encontrarás dos carpetas, una con los archivos de Unity y otra con los archivos de Arduino.

Dentro de la carpeta Unity encontrarás una compilación para probar la simulación y también un paquete de Unity que puedes importar en tu proyecto y acceder a los assets de esta simulación.

Grabar programa en Arduino

En las descargas encontrarás una carpeta llamada «Arduino», que contiene el programa que se encarga de leer las entradas digitales, formar una palabra y enviarla por el puerto serial.

El programa es bastante simple por lo que funcionará en cualquier placa Arduino que puedas conseguir, en mi caso usé un Arduino Mega.

En el siguiente video se puede ver cómo grabar el programa en la placa Arduino, necesitarás el software de Arduino.

https://gamedevtraum.com/wp-content/uploads/en/game-development/unity-tutorials-and-solutions/conveyor-belt-in-unity-controlled-by-arduino/conveyor-belt-in-unity-upload-arduino-program.mp4
Video 1: Grabar programa en Arduino.

Circuito para las entradas digitales

El programa de Arduino que viene en la descarga utiliza los pines 2 y 3 para las entradas digitales. El pin 2 controla el estado de la máquina alimentadora y el pin 3 controla el estado de la cinta transportadora.

Hay muchas formas de conectar señales a la entrada digital del Arduino, voy a mostrar dos alternativas utilizando switches.

ADVERTENCIA
ASEGURARSE DE CONECTAR BIEN LOS ELEMENTOS AL ARDUINO, UN CORTOCIRCUITO PUEDE DESTRUIR LA PLACA.
ES NECESARIO CONOCER LA DISTRIBUCIÓN DE PATAS DE CADA CONTACTO EN PARTICULAR, MEJOR SI SE DISPONE DE UN TESTER PARA MEDIR CONTINUIDAD.

Alternativa 1: Switch de dos posiciones

En mi caso usé switches de dos posiciones para las entradas digitales, en estos switches el terminal del medio hace contacto con un extremo o el otro dependiendo de la posición en la que esté el switch. Por lo tanto, en los extremos conectamos las señales de voltaje alto y bajo (en mi caso 5 Volts y 0 Volts respectivamente). El terminal del medio del switch se conecta a la entrada digital del Arduino.

Reitero la advertencia, el switch que usé es como el que se observa en la figura 1 y en este caso en particular se conecta de esa forma.

Fig. 1: Esquema de conexión de un switch de dos posiciones para entrada digital del Arduino.

Alternativa 2: Interruptor con resistencia pull-up

Tal vez sólo dispones de un switch interruptor, es decir un contacto que se cierra o se abre. En las entradas digitales del Arduino debe haber constantemente señales de voltaje alto o bajo, no debemos dejar entradas digitales sin conectar a nada (conexión al aire como le decimos acá) ya que esto conducirá a comportamientos impredecibles.

Para esto hay que implementar un pequeño circuito con resistencia pull-up, como el que se observa en la figura 2.

En este caso usamos una resistencia conectada al terminal GND del Arduino y el otro extremo conectado por un lado a la entrada digital y por otro al switch interruptor, el otro extremo del switch lo conectamos a la señal de voltaje alto (5 Volt por ejemplo).

Fig. 2: Esquema de conexión de un interruptor con resistencia pull-up para entrada digital del Arduino.

El circuito de la figura 2 funciona de la siguiente manera: cuando el interruptor está abierto no hay circulación de corriente a través de la resistencia, por lo tanto los 0 Volts se trasladan a la entrada digital y el Arduino lee un nivel bajo. Cuando accionamos el switch la corriente circulará por la resistencia y en la entrada del Arduino habrá una señal de nivel alto.

Comprobar que el programa Arduino está funcionando

El programa de Arduino se encarga de leer el estado de las entradas digitales, crear una palabra binaria que representa esos estados y enviarla por puerto serie.

Si abrimos el monitor Serie, desde la pestaña Tools, deberíamos ver los estados de las entradas digitales mensajes. Como se observa en el siguiente video.

https://gamedevtraum.com/wp-content/uploads/en/game-development/unity-tutorials-and-solutions/conveyor-belt-in-unity-controlled-by-arduino/conveyor-belt-in-unity-test-serial-port.mp4
Video 2: Comprobar que el programa de Arduino está funcionando

Probar la simulación

Una vez que hemos grabado el programa en la placa Arduino, podemos ejecutar la compilación que viene en la descarga.

Al entrar en la simulación, en la esquina superior izquierda hay un botón para conectar Unity con la placa Arduino.

En esta parte pueden surgir problemas con la conexión, probablemente corrija esto en otra versión de la solución. Para asegurarse de que la conexión funcione, la placa Arduino debe estar conectada antes de abrir la compilación y el proceso de conexión puede tardar varios segundos en concretarse. Si luego de 30 segundos la placa no se ha conectado, verificar el paso anterior y volver a abrir la simulación e intentar de nuevo.

Video 3: Prueba de la cinta transportadora en Unity controlada por Arduino.

Importar paquete y corregir error API Compatibility Level

Para acceder a los archivos fuente de la simulación está el paquete de Unity, lo puedes importar como se ve en el siguiente video.

Video 4: Importar paquete y corregir error de API Compatibility Level.

Al importar el paquete nos aparecerán errores ya que algunos Scripts no pueden acceder al paquete con las clases que permiten acceder al puerto serie.

Para solucionarlo seguimos los pasos que se ven en el video 4. Vamos a la pestaña Edit > Project Settings > Player > Other Settings y en el campo «API Compatibility Level» seteamos «.NET 4.x».

Funcionamiento de la cinta transportadora en Unity controlada por Arduino

Dentro del paquete está la escena que se ve en la simulación, podemos acceder a ella y ver sus elementos, en la figura 3 podemos ver la jerarquía de la escena.

En la jerarquía tenemos tres máquinas, «Toori Machine» es la máquina que se encarga de colocar objetos sobre la cinta transportadora. «GDT Conveyor Belt» es la cinta transportadora y «Box» es la caja donde caen los objetos y son destruidos.

Fig. 3: Jerarquía de la escena que viene dentro del paquete.

Cinta transportadora

La cinta transportadora es un modelo 3D con una estructura y una banda.

Para lograr la animación del funcionamiento lo que se hace es agregar offset al mapa UV de la textura. En este caso como la textura se encuentra distribuida verticalmente agregamos offset a la componente Y del mapa UV. Cuando el mapa UV tiene un offset de 1 en la componente Y la textura vuelve al estado inicial.

Entonces para lograr el efecto de que la cinta transportadora avanza o retrocede incrementamos gradualmente el offset del mapa UV en alguna de las componentes.

Para lograr que la cinta transporte objetos, se tiene un box Collider en modo Trigger que detecta cuándo un objeto está sobre la cinta, estos objetos deben tener asignada una componente RigidBody.

Fig. 4: Script que controla la cinta transportadora en Unity.

Entonces en el Script de la cinta transportadora se define la función OnTriggerStay que se llamará cuando un objeto esté sobre la cinta transportadora. Esta función se encargará de mover el objeto, para sincronizar el movimiento de la cinta con el movimiento del objeto hay un parámetro en el inspector llamado «SyncUVMovementFactor», por defecto está seteado en 2, como se observa en la figura 2.

La cinta transportadora tiene una función pública que permite activarla o desactivarla y que puede ser llamada desde cualquier otro Script. Ejecutamos esta función con la información que leemos de la placa Arduino, es decir se activará o desactivará de acuerdo al estado de la entrada digital 3 de la placa.

Máquina alimentadora

Para que la simulación sea un poco más completa se incluye una máquina que coloca objetos sobre la cinta transportadora. Esta máquina se controla con el Script «FeedingMachine» y también tiene un método público que permite encenderla o apagarla. Esta máquina se controlará con la entrada digital 2 del Arduino.

Fig. 5: Script que controla la máquina que coloca objetos sobre la cinta transportadora.

En el inspector podemos colocar el prefab de los objetos que debe colocar sobre la cinta transportadora y podemos cambiar los tiempos entre un objeto y otro.

Comunicación entre Arduino y Unity

Esta parte se resuelve utilizando una versión modificada de la solución WRMHL compartida por el equipo RELATIVTY. Te animo a visitar los links para ver la solución original y los proyectos.

Para poder comunicar Unity con Arduino se debe tener un GameObject en la jerarquía con el Script «wrmhlRead» asignado.

Fig. 6: Script que controla la comunicación entre Arduino y Unity.

He agregado un entero llamado «arduinoMessageLength» en el inspector, que indica la longitud de la palabra binaria que se envía desde el Arduino. Esto se utiliza para sincronizar correctamente Unity con Arduino en caso de existir más dispositivos utilizando el puerto serie.

En nuestro caso, como desde el Arduino enviamos una palabra de dos dígitos, en ese campo se debe poner dos. En caso de agregar más dígitos a la palabra, se debe modificar apropiadamente este campo.

La lectura del mensaje del Arduino se hace en el método «ReadMessageAndAction()». Aquí adentro podemos realizar la acción que queramos en Unity. En nuestro caso ejecutamos los métodos públicos de los Scripts ConveyorBelt y FeedingMachine, para activar o desactivar las máquinas de acuerdo a la orden del Arduino.

Conclusión

Hemos visto cómo funciona la solución de la cinta transportadora en Unity controlada por Arduino.

Con los archivos provistos se puede crear una nueva simulación de acuerdo a las necesidades de cada uno.

En este artículo vamos a ver qué es la MODULARIZACIÓN en programación y por qué es importante aplicarla. Además vamos a ver ejemplos de aplicación en lenguaje C# orientado a Unity.

¿Qué es la MODULARIZACIÓN en programación?

La palabra modularización proviene de módulo, cuya definición textual es: «Elemento con función propia concebido para poder ser agrupado de distintas maneras con otros elementos constituyendo una unidad mayor.«

La modularización es el proceso por el cual seleccionamos y agrupamos instrucciones de programación que cumplen una función específica.

Estos módulos los construimos utilizando «MÉTODOS«, los cuales son bloques agrupados de código que realizan una función específica.

Tengo un par de vídeos sobre «métodos» y un ejemplo de implementación

En este vídeo vemos teoría sobre métodos en programación, qué son, para qué sirven, cómo se definen.


En este vídeo vemos ejemplos de métodos en programación para resolver tareas específicas

Por qué es importante la MODULARIZACIÓN

Supongamos que tenemos un problema, tan complejo como se quiera y cuya solución consiste en ejecutar tantas instrucciones de programación como se necesite. Utilizando módulos de programación, podemos construir una solución que se pueda ejecutar empleando una sola instrucción, esta instrucción lo que hará es ir al contenido del módulo, ejecutar cada una de sus instrucciones y al finalizar el programa retornará al punto donde se hizo la llamada al módulo.

La ventaja de esto es que el módulo lo creamos una única vez y luego lo podemos reutilizar cuantas veces sea necesario y desde cualquier parte del código, además ya no necesitamos pensar en el funcionamiento interno del módulo, lo utilizamos como un conjunto que sabemos que va a realizar determinada función. En otras palabras, aumentamos el grado de abstracción de nuestro código.

Fig. 1: A izquierda una lista de instrucciones con código repetido. Con un módulo podemos reutilizar el código y obtener algo más compacto como se ve a la derecha.

Características de los módulos en programación

Respecto a la Funcionalidad

Un módulo debe tener una función específica y no ir más allá de sus responsabilidades. Por ejemplo, si tenemos un módulo que se encarga de calcular calcular el producto de dos números y devolver el resultado, no sería adecuado que además imprima mensajes en pantalla o haga otra cosa que vaya más allá de su propósito.

Respecto a la Identificación

Los módulos tienen un nombre de identificación que nos permite ejecutarlos, es recomendable que elijamos este nombre de modo que sea lo más representativo posible de la función que realiza, de esa forma resulta más intuitivo a la hora de usarlo.

Parámetros de entrada

Los módulos pueden aceptar datos de entrada que serán utilizados por sus instrucciones internas para realizar la función.

Al momento de definir un módulo se deben indicar todos los parámetros que requiere y de qué tipo de dato se trata. Al momento de ejecutar el módulo se deben agregar todos los parámetros necesarios, en el orden establecido y deben ser del tipo correcto.

Parámetro de salida

Los módulos pueden devolver un dato como resultado de su ejecución.

Al momento de definir un método se debe indicar el tipo de dato que devuelve y la última instrucción del módulo debe ser la devolución de ese dato. Al momento de la ejecución del módulo, se debe tener en cuenta que el llamado a ese método implica como resultado un dato, por lo tanto hay que ver qué se hace con ese dato, podemos por ejemplo asignarlo a una variable o un objeto.

Visibilidad

Cuando definimos un módulo podemos darle distintos tipos de visibilidad que limitarán el acceso a ellos, por ejemplo los módulos que pertenecen al funcionamiento interno de una clase de programación usualmente se definen como privados, para que no pueda accederse a ellos desde un contexto externo a esa clase.

En C# tenemos tres tipos de visibilidad, pública, privada y protegida.

La visibilidad pública implica que la función puede ser accedida desde cualquier contexto, es decir podemos por ejemplo ejecutar la función desde otro script de programación.

La visibilidad privada implica en términos simples que el módulo sólo puede ser accedido desde el mismo Script de programación.

La visibilidad protegida se utiliza cuando tenemos herencia de clases y sirve para que las subclases puedan acceder a estos módulos, pero no las clases externas.

Fig. 2: En esta imagen están resumidas las características principales de un módulo de programación.

Definición de un módulo en C#

Para crear un módulo en C# vamos a usar la sintaxis de declaración de un método de programación, la cual consiste en indicar primero el tipo de visibilidad, luego el tipo de dato de retorno (o escribir «void» si no retorna datos), a continuación el nombre de identificación del módulo (se recomienda iniciar con mayúscula y usar camel case), luego entre paréntesis todos los datos que requiere el método incluyendo el tipo dato y finalmente se abre y se cierran las llaves. Todas las instrucciones del módulo estarán dentro de esas llaves.

En la figura 3 podemos ver la sintaxis de varios módulos genéricos, todos ellos con visibilidad pública (para que sea privada hay que utilizar la palabra «private»).

Arriba a la izquierda tenemos un módulo que no devuelve datos (en la definición se utiliza void) y tampoco requiere parámetros de entrada (se abre y cierra paréntesis).

Arriba a la derecha tenemos un método que no devuelve datos y requiere una cantidad N de parámetros (vemos que entre paréntesis se incluyen los datos separados por coma). El parámetro p1 podría ser por ejemplo «bool b1» indicando que es de tipo bool y su nombre es «b1». Osea que dentro del módulo podemos utilizar b1 sabiendo que es la información que viene del exterior.

Fig. 3: Ejemplos genéricos de la sintaxis de los módulos en programación.

En la figura 3, abajo a la izquierda tenemos un método que no requiere parámetros de entrada pero si devuelve un dato, ya que al lado de public dice «datoX». En lugar de datoX tenemos que poner un tipo de dato, como una variable primitiva o un objeto, por ejemplo «int» indica que el módulo devuelve un valor entero, mientras que «Vector3» indica que el módulo va a devolver un objeto de la clase Vector3. Nótese que al final del método se devuelve un valor de nombre X, este valor debe ser del mismo tipo que fue declarado en el método.

En la figura 3, abajo a la derecha tenemos un método que requiere parámetros y devuelve un dato.

Ejemplo de un módulo en C#: Calcular el área de un círculo de determinado radio

Vamos a diseñar un módulo que se encargue de calcular el área de un círculo, este módulo recibirá como parámetro un valor real que representa el radio del círculo y devolverá un valor real que será el valor del área de un círculo con ese radio.

Pseudocódigo

Función AreaCirculoDeRadio (REAL radio)
– INICIO
– – Real area <- PI * radio * radio
– – Devolver area
– FIN

Implementación en C#

La sintaxis en lenguaje C# de un método basado en el pseudocódigo anterior es la siguiente.

Definición del módulo

private float AreaCirculoDeRadio(float radio){
      float area = Mathf.PI * radio * radio;
      return area;
}

Por supuesto no es la única opción, también puede ser definido de esta forma:

private float AreaCirculoDeRadio(float radio){
      return Mathf.PI * radio * radio;
}

Utilización del módulo

Luego podemos por ejemplo hacer uso de este módulo de programación desde el método Start de Unity de la siguiente forma:

void Start(){
      float r = 5;
      float a=AreaCirculoDeRadio(r);
      Debug.Log("El área de un círculo de radio "+r+" es: "+a+".");
}

Descripción del problema

Se ha creado un Canvas con uno o más botones para realizar una acción, al correr el juego no funcionan los botones cuando los pulsamos.

Esto es algo que me ha pasado en varias ocasiones y puede deberse a varias razones.

Vamos a asumir que tienes un GameObject con el Script con la función del botón definida como pública, lo has asignado al componente Button del Canvas y seleccionado la función apropiada. Si no has hecho esto y necesitas ayuda, te invito a leer este artículo sobre cómo usar botones del Canvas.

En el siguiente vídeo muestro una forma rápida de testear si funcionan los botones del Canvas y cuatro razones por las cuales los botones podrían no funcionar en Unity y cómo solucionarlas




Posible Solución 1: No hay EventSystem

Cuando creamos un Canvas automáticamente se crea un GameObject llamado «EventSystem», como se observa en la figura 1, este GameObject tiene asociada algunas componentes que se encargan de manejar los eventos de entrada.

Fig. 1: GameObject EventSystem en la jerarquía.

Fig. 2: Componentes de EventSystem en el inspector.

Si accidentalmente eliminamos el GameObject EventSystem, no se detectan las entradas del mouse y no funcionan los botones del Canvas.

Para solucionar esto podemos crear un segundo Canvas para que aparezca el GameObject EventSystem y luego eliminar ese segundo Canvas.

Posible Solución 2: Botón configurado como no interactivo

El componente Button tiene un booleano para inhabilitarlo, como se ve en la figura 3 la casilla «Interactable».

Fig. 3: La casilla Interactable se utiliza para deshabilitar el botón.



Posible Solución 3: Botón no es un RayCast target

El botón tiene asignado un componente Image para la imagen de fondo y además un componente Text para el texto del botón.

Ambos componentes tienen una casilla con el nombre «Raycast Target», que lo que hace es habilitar el componente para que pueda ser detectado por un trazado de rayos, el proceso por el cual se detecta que se ha pulsado algún elemento del Canvas.

En las figuras 3 y 4 vemos las casillas «Raycast Target». En un botón si todas las casillas Raycast Target están desmarcadas, no se podrá detectar cuando se haga clic sobre esos elementos.

Fig. 4: Componente imagen de Canvas.

Fig. 5: Componente texto de Canvas

Para solucionar este problema, asegurarse que al menos una casilla Raycast Target se encuentre habilitada

Introducción

En este artículo vamos a ver cómo crear botones en Unity, configurar el diseño y asignarle una función dentro de un Script que se ejecutará al pulsarlo.

Para que un botón pueda ejecutar una función es necesario que esta función sea definida con visibilidad pública.

Al pulsar un botón podemos hacer que se ejecute todo tipo de acciones, desde las mas simples como cerrar la aplicación o un conjunto de acciones tan extenso como se necesite.



Tengo un par de vídeos que te van a servir para utilizar botones en Unity

#1 Cómo definir una función en un Script y llamarla al pulsar un botón




#2 En el caso de que no funcionen los botones consulta este vídeo



Configuración de la interfaz gráfica

Antes de ver cómo usar botones del Canvas en Unity vamos a crear los elementos mínimos necesarios para poder resolver el problema.

Creación del Canvas

El Canvas es el objeto en el cuál podemos colocar elementos pertenecientes a la interfaz gráfica. Para crear un Canvas hacemos clic derecho en la jerarquía, vamos a UI y luego cliqueamos en Canvas, como se observa en la figura 1.

Fig. 1: Creación de una GameObject Canvas en Unity.

Antes de avanzar, recomiendo configurar el componente escalador de Canvas de acuerdo a tus necesidades, este componente se encuentra asignado al Canvas y puedes verlo en el inspector.

En mi caso voy a configurar el parámetro «UI Scale Mode» como «Scale With Screen Size» e indicar una resolución de referencia de 1920×1080, como se observa en las figuras 2 y 3.

Fig. 2: Componente Canvas Scaler de un objeto tipo Canvas.

Fig. 3: Resolución de referencia para el escalador de Canvas.


Creación del botón

Ahora dentro del Canvas vamos a crear un Botón. En la jerarquía, hacemos clic derecho en el objeto Canvas, vamos a UI y elegimos la opción «Button», esto añadirá un objeto tipo Botón al Canvas.

Fig. 4: Creación de un objeto botón en Unity.

Luego voy a crear un panel que tendrá como hijo un objeto tipo Text, ambos se pueden crear desde el mismo menú que se observa en la figura 4. En la figura 6 se ve cómo queda la interfaz gráfica para probar la acción del botón al pulsarlo.

Fig. 5: El Canvas contiene un botón y un mensaje. Se crea un empty GameObject para asignar el Script con la acción.

Fig. 6: Elementos de la interfaz gráfica.

Crear una acción para el botón

A modo de ejemplo la acción va a consistir simplemente en hacer aparecer un cartel que digaa que el botón ha sido pulsado.

Para que el botón pueda realizar alguna acción al ser pulsado, tenemos que definirla en un Script, así que vamos a crear uno haciendo clic derecho en la carpeta del proyecto, luego vamos a Create y elegimos la opción C# Script, como se observa en la figura 5.

Fig. 7: Creación de un nuevo Script en Unity.

Le damos un nombre y a continuación creamos un empty GameObject y le asignamos el Script. En la figura 5 puedes ver que he creado un empty GameObject llamado «ButtonTest».

Fig. 8: Creamos un Script llamado ButtonTest para programar la acción del botón al pulsar.

Fig. 9: Asignamos el Script al GameObject ButtonTest.

Para describir todas las acciones que debe realizar un botón al pulsarlo creamos un método o función pública dentro del Script, en la figura 10 vemos la función llamada «MyButtonFunction».

Es muy IMPORTANTE declarar la función como PÚBLICA, sino no podremos asignarla al botón

La función se encarga de incrementar un contador llamado «buttonPressedCounter» y luego escribir un mensaje en pantalla que indique cuántas veces fue pulsado el botón. El if tuve que agregarlo porque cuando el contador vale 1, la palabra «time» va en singular.

Puedes probar este mismo ejemplo para, recuerda añadir el namespace que está en la línea 4, «UnityEngine.UI», sino no podrás acceder a la clase Text.

Fig. 10: Código dentro del Script ButtonTest.


Vamos al inspector y colocamos el componente Text del Canvas en el campo del Script.

Fig. 11: Asigno el texto que solicita el Script en el inspector.

Ahora seleccionamos el botón y vamos a la componente Button en el inspector, aquí debemos hacer clic en el botón + del panel OnClick(), esto agregará una nueva acción cuando se produzca un evento OnClick(), es decir cuando el botón sea pulsado.

Fig. 12: En el panel OnClick hacemos click en el botón + para agregar una nueva acción.

Fig. 13: Aparece un campo en el que podemos asignar un GameObject.

Como vemos en la figura 13, nos aparece un campo en el que podemos asignar un GameObject, aquí arrastramos desde la jerarquía, el GameObject que tiene asignado el Script con la acción. Como vemos en la figura 14, hemos arrastrado el GameObject «ButtonTest».

Fig. 14: Asignamos el GameObject que contiene el Script con la acción que queremos que realice el botón al pulsarlo.

Luego utilizando el menú desplegable, que inicialmente dice «No Function», vamos a seleccionar primero el Script y luego la función pública que hemos creado para el botón, como se observa en la figura 15.

Fig. 15: Usando el menú desplegable, elegimos la función que queremos que se ejecute al pulsar el botón.


Cada vez que se pulsa el botón el cartel se modifica mostrando la cantidad de veces que ha sido pulsado.

Fig. 16: Cada vez que se pulsa el botón se incrementa el contador y se modifica el mensaje en pantalla.

Conclusión

Hemos visto cómo usar los botones del Canvas en unity. La acción debe estar programada dentro de un Script utilizando un método de programación y debe estar declarada como pública.

Luego debemos agregar un nuevo campo en el panel OnClick() del componente Button y asignar el GameObject que tiene el Script con la acción.

Finalmente, utilizando el menú desplegable en OnClick(), debemos seleccionar la función que hemos definido en el Script.

Introducción

En este artículo vamos a deducir la expresión de una recta que pasa por dos puntos distintos del plano cartesiano.

Existe una única recta que pasa por dos puntos distintos dados.

Te recomiendo leer el artículo sobre funciones lineales para saber más sobre como representar rectas en el plano cartesiano.

Fig. 1: Ejemplo de la gráfica de una función lineal en el plano cartesiano.

Rectas simples de analizar

Antes de pasar a la deducción de la recta que pasa por dos puntos, vamos a ver algunos casos en los que podemos fácilmente decir de qué recta se trata, simplemente analizando los puntos que nos dan.

Recta Horizontal

Una recta horizontal es una recta paralela al eje X del plano cartesiano, osea que todo valor de X tendrá como imagen un mismo valor de Y.

Dados dos puntos podemos darnos cuenta de que se trata de una recta horizontal porque los valores Y son los mismos para ambos puntos, por ejemplo P1: (-3,4) y P2: (2,4). En este caso se trata de la recta Y = 4.

La expresión genérica de esta recta es:

Y = b

Siendo b el valor del eje Y por el que pasa la recta.

Como vemos en la expresión, la variable independiente no tiene ninguna incidencia en la función, sin importar cuál sea el valor de X, la función siempre tendrá el mismo valor para Y.

Recta Vertical

Se trata de una recta paralela al eje Y del plano cartesiano.

Dados dos puntos, podemos darnos cuenta de que se trata de una recta vertical porque los valores de X son los mismos para ambos puntos, por ejemplo P1: (1,-1) y P2: (1,4).

Para representar esta recta podemos decir que se trata de la recta:

X = c

Siendo c el valor por donde pasa la recta vertical.

Hay que tener en cuenta que una recta vertical no es una función lineal, ya que las funciones matemáticas requieren que para cada valor de la variable independiente (en este caso la variable x), exista un único valor para la función. En una recta vertical tenemos infinitos valores distintos para un único valor de X.

Recta identidad

La recta identidad es una recta inclinada a 45 grados que pasa por el origen y es característica porque para cualquier valor de la variable independiente X, la variable dependiente Y vale lo mismo. Es decir que si tomamos X = 2, el valor de Y también es 2.

La expresión de esta recta es:

Y = X

Entonces si por ejemplo nos dan los puntos P1: (-2,-2) y P2: (3,3), como vemos que para ambos puntos los valores de X y de Y coinciden, podemos fácilmente determinar que se trata de la recta identidad.

Recta identidad invertida

En este caso se trata de una recta similar a la recta identidad, solo que el valor de Y es el opuesto de X, por ejemplos si tenemos los puntos P1: (-2,2) y P2: (3,-3) , podemos determinar fácilmente que se trata de esta recta.

La expresión de esta recta es:

Y = – X

Deducción de la recta que pasa por dos puntos

Ahora vamos a deducir la expresión de una recta que pasa por dos puntos a partir de una recta genérica. Como se vio en el artículo de función lineal, una recta cualquiera se puede expresar como:

(1)  

donde a es la pendiente y b es la ordenada al origen de la función.

Vamos a considerar que tenemos dos puntos genéricos P1: (x1 , y1) y P2: (x2 , y2). Como queremos que ambos puntos pertenezcan a la recta, necesariamente tienen que satisfacer la expresión de la función lineal, por lo tanto podemos escribir dos ecuaciones:

(2)  

(3)  

Podemos plantear un sistema de dos ecuaciones en el que las dos incógnitas son a y b. Así que por ejemplo podemos tomar la ecuación 2 y despejar la incógnita b:

(4)  

Luego tomamos esta expresión y la reemplazamos en la segunda ecuación 3:

(5)  

Reagrupando y sacando factor común con la incógnita a tenemos:

(6)  

Finalmente la pendiente de la recta será igual a:

(7)  

En la expresión 7 podemos ver que si los valores de X de ambos puntos coinciden (es decir el caso de la recta vertical), el denominador vale 0 y la expresión resulta indeterminada, impidiéndonos encontrar un valor para la pendiente.

Una vez que tenemos el valor de la pendiente, podemos reemplazarlo en en cualquiera de las ecuaciones del sistema para encontrar el valor de b.

(8)  

Despejando:

(9)  

Con esto encontramos de manera genérica cuánto valen los coeficientes a y b de una recta que pasa por dos puntos cualquiera del plano:

(10)  

(11)  

Ahora simplemente reemplazamos los valores por los puntos dados y tenemos la expresión de la recta que pasa por dos puntos en particular.

Verificación de los resultados

La verificación de la solución es la herramienta que tienes para saber si te has cometido un error en alguna cuenta, una vez que tienes la expresión de la recta, no olvides reemplazar en la ecuación de la recta los puntos por los que la recta tiene que pasar, esto se hace para verificar que ambos puntos satisfacen la ecuación, si esto no ocurre, has cometido un error en algún paso de la deducción.

Salir de la versión móvil
Secured By miniOrange