Introducción

En este artículo vamos a ver cómo exportar un juego de Unity a Android, partiendo de los requisitos necesarios para poder compilar para la plataforma Android, ver algunos de los problemas que nos podemos encontrar en el proceso y cómo solucionarlos.

Descargar Unity y el paquete para Android

Al momento de instalar Unity debemos asegurarnos de descargar también el paquete para Android, de modo que si no has hecho esto o no lo recuerdas, es una buena oportunidad para descargar la última versión de Unity junto con todos los paquetes necesarios.

En particular a mi me gusta ver todas las versiones disponibles, así que en Google suelo buscar con el término «unity version download», lo que me conduce a la página con todas las versiones (primera página en la figura 1).

Fig. 1: Buscamos la página que contiene todas las versiones de Unity.

De ahí accederemos a una página como la que se observa en la figura 2, en mi caso, debido a que mi conexión es algo inestable, descargo Unity utilizando torrent.

Fig. 2: En la lista tenemos varias opciones para descargar Unity.

Fig. 3: En mi caso descargo la última versión por torrent.

Al seleccionar la opción resaltada en la figura 3 se descarga automáticamente un archivo tipo torrent.

Fig. 4: Descargamos el archivo torrent y lo ejecutamos.

Lo mínimo que necesitaremos descargar será el editor Unity y el paquete de Unity para Android, en la figura 5 están seleccionados los paquetes necesarios.

Fig. 5: En la ventana del torrent elegimos los archivos necesarios, en este caso como mínimo necesitamos los dos archivos seleccionados.

Configurar Android SDK y JDK

Para exportar nuestros juegos de Unity a Android necesitamos utilizar algunas herramientas externas, el Android Software Development Kit y el Java Development Kit.

Si no tienes instalado estos dos kits, más adelante muestro algunas capturas y links de descarga, por ahora vamos a asumir que están instalados y seguir adelante con la parte de Unity.

Entramos en Edit > Preferences y vamos a la parte de External Tools (herramientas externas), ahí tienen que haber campos para indicar la ruta del Android SDK y JDK, como se ve en la parte inferior de la figura 6.

Fig. 6: En la ventana de preferencias vamos a la parte de Herramientas Externas (External Tools).

Haciendo click en Browse, indicamos la ruta de estos dos kits de desarrollo. La ruta de instalación por defecto del Android SDK se observa en la figura 7, hay que tener en cuenta que la carpeta AppData podría encontrarse oculta.

La ruta del JDK se observa en la figura 8, dentro de archivos de programa, Java.

Fig. 7: Esta es la ubicación del Android SDK, si no encuentran esto en su disco leer más adelante.

Fig. 8: Esta es la ubicación del JDK, si no encuentran esto en su disco leer más adelante.

Tal vez es necesario definir la variable de entorno JAVA_HOME, en mi caso me pasó que al intentar exportar un proyecto me decía que esa variable no estaba definida, dejo el siguiente video en el que muestro cómo definir la variable de entorno JAVA_HOME.

Configurar Unity para Plataforma Android

Ahora debemos indicarle a Unity el tipo de plataforma para la que queremos exportar, en este caso Android. Para esto vamos a File > Build Settings y se nos despliega una ventana como la que vemos en la figura 9.

ventana build settings para configurar el proyecto para exportar de unity a android
Fig. 9: En la pestaña Build Settings seleccionamos la plataforma Android y ponemos Switch Platform.

En esta ventana seleccionamos la opción Android y hacemos click en Switch Platform, con esto Unity hace un trabajo de fondo y luego de un momento el proyecto ya está adaptado para trabajar con Android.

Antes de crear una compilación debemos configurar algunas cosas más.

Vamos a la ventana Player del proyecto, en la pestaña Edit > Project Settings > Player.

Fig. 10: Vamos a Edit > Project Settings > Player, para hacer los ajustes necesarios para exportar de Unity a Android.

Aquí podremos ingresar nuestra marca, el nombre del juego, íconos, las claves de Google Play, entre otras cosas.

Fig. 11: Aquí podemos poner el nombre de nuestro Estudio y el nombre del Juego.

En este momento nos interesa poder crear una versión APK del juego para probar en un dispositivo Android, así que vamos directamente a la parte «Other Settings» y en el campo llamado «Package Name» tenemos que indicar un nombre de identificación que tendrá en Android.

Esto es más que nada para diferenciar nuestra aplicación de todas las demás existentes. La estructura de este nombre debe ser así: «com.Company.ProductName».

Por ejemplo si GameDevTraum crea un juego llamado «Laberinto», el nombre del paquete podría ser: com.gamedevtraum.laberinto. No es necesario que coincida con un dominio web.

En la figura 13 vemos que simplemente utilicé el nombre: com.mycompany.proyecto1 y esto ya me permitió crear una compilación para Android.

Fig. 12: Indicar un nombre del paquete es necesario para poder compilar para Android.

Fig. 13: Ejemplo de nombre de paquete.

Este nombre del paquete aparecerá por ejemplo en la carpeta Android de nuestro dispositivo.

Fig. 14: El nombre del paquete es el nombre que tendrá la carpeta de instalación de la aplicación.

Con esto básicamente ya podemos exportar nuestro juego de Unity a Android, volvemos a la ventana Build Settings y hacemos click en Build and Run.

Fig. 15: Con esto estamos listos para compilar, en la ventana Build Settings hacemos click en Build and Run.

Aquí debemos ingresar una ubicación y un nombre para el archivo final. Al darle a Save comienza el proceso de compilación y cuando termina, tenemos un archivo .apk que podemos instalar en un dispositivo Android con API compatible.

Fig. 16: Nos pedirá seleccionar una ubicación y un nombre para el archivo exportado de Unity a Android.

Fig. 17: Cuando el proceso de compilación termina tendremos un archivo .apk para instalar en Android.

Fuentes desconocidas

Por defecto los dispositivos Android rechazan aplicaciones que provienen de fuentes desconocidas, es decir que no están firmadas y aprobadas.

Para probar nuestro juego debemos permitir que se instalen este tipo de aplicaciones. Podemos hacerlo desde la configuración de Android, en mi caso desde «Pantalla Bloqueo y Seguridad». También se puede hacer desde el instalador e indicar que se permita solamente para esa instalación en particular, de esa forma seguiremos rechazando aplicaciones de orígenes desconocidos.

Fig. 18: En este punto, para instalar el juego en un celular deberemos aceptar las fuentes desconocidas, esto puede hacerse directamente desde el instalador.

Instalamos la aplicación en nuestro Android y ya podemos probarla. En mi caso utilicé directamente el emulador de Android Studio, como se ve en la figura 19.

Fig. 19: Prueba de la aplicación desde el emulador de Android Studio.

Descargas de los Kits de Desarrollo

Android SDK

En la página para descargar Android Studio podrás conseguir el Android SDK.

Hay dos formas de instalarlo, una es descargar e instalar el programa Android Studio completo. La otra forma es descargar solamente el Android SDK, haciendo Scroll en la misma página podrás encontrar las descargas. Figuras 20 y 21.

Fig. 20: Una forma rápida para tener el Android SDK es instalar directamente Android Studio.

Fig. 21: También se puede descargar el Android SDK individualmente.

Java Development Kit (JDK)

En la página de descarga del Java Development Kit podrás descargar este JDK. En la figura 22 vemos la página de descarga, debemos aceptar los términos de la licencia y luego elegir el paquete apropiado para nuestro sistema operativo.

Fig. 22: Página de descarga del Java Development Kit (JDK).

Variables de Entorno

Hace algunos años era necesario agregar manualmente algunas variables de Entorno al sistema operativo para poder crear aplicaciones Android. Creo que esto ya no es necesario, pero de todas formas si todo lo anterior no te ha funcionado te dejo un poco de información sobre estas variables de entorno para orientarte y que puedas buscar una solución.

Si en la barra de búsqueda de Windows escribimos «Variables de Entorno» nos aparace la opción «Editar las variables de entorno del sistema», como se ve en la figura 23.

Al entrar en esa opción nos aparece la ventana de propiedades del sistema y ahí tenemos un botón para ver y editar las Variables de Entorno del sistema.

En mi caso no fue necesario agregarlas manualmente así que no voy a avanzar más allá de esto, con esta base puedes buscar en la web alguna solución al problema particular que tengas.

Fig. 23: Anteriormente era necesario crear algunas variables de entorno para poder crear aplicaciones Android.

Fig. 24: Ubicación de las variables de entorno para agregar o modificar.

Introducción

En este artículo vamos a ver el componente RigidBody en Unity, para qué sirve y cómo utilizarlo.

Conocer sobre este componente te permitirá crear una físicas precisas en tu juego.

¿Qué es un RigidBody en Unity?

En primer lugar RigidBody en Unity es una «Clase de Programación» definida en el núcleo del motor y accesible via Script usando el namespace «UnityEngine«. Esto en términos simples significa que es una estructura de programación que busca modelar algún tipo de comportamiento en particular. Aquí puedes ver una introducción a las clases en programación.

RigidBody significa Cuerpo Rígido, que en el estudio de la física es una forma de pensar determinados objetos y poder realizar cálculos y predicciones en distintos escenarios.

La clase RigidBody modela el concepto de Cuerpo Rígido en física y nos permite tratar a los GameObjects como si fueran objetos físicos que tienen masa propia, son afectados por la gravedad, pueden colisionar con otros objetos, ejercer fuerzas sobre otros cuerpos, tener un coeficiente de rozamiento dependiendo de la superficie en la que se encuentren, tener velocidad lineal y angular, inercia, momento angular.

A estos cuerpos podemos aplicarles fuerzas o torques y estos Cuerpos Rígidos responderán en base a las ecuaciones clásicas de la física Newtoniana. Hermoso!

Para saber más sobre qué es concretamente un GameObject en Unity, visita este artículo.

Componente Rigidbody en Unity

En la jerarquía de Unity tenemos el listado de los GameObjects que se encuentran en la escena. Si elegimos uno de ellos, podremos ver sus componentes en el inspector y agregar las que necesitemos para que modelen su comportamiento. Aquí podemos agregar al GameObject la componente RigidBody que le proporcionará el comportamiento de Cuerpo Rígido físico.

Colliders y RigidBody

Los Colliders son fundamentales para poder utilizar un GameObject como un Cuerpo Rígido, ya que proveen al GameObject de una frontera para determinar cuando colisiona con otros objetos.

En el siguiente video se pueden ver distintos tipos de Colliders y en la parte final cómo se relaciona con el componente RigidBody.


Aplicar fuerzas a un RigidBody en Unity

Hace tiempo hice una serie de tutoriales básicos para Unity en la que mostraba cómo utilizar métodos y componentes básicos del motor. En uno de ellos mostré cómo aplicar fuerzas a los RigidBodies. Puedes verlo a continuación.

Como RigidBody es una clase, cuenta con diversos métodos públicos que permiten acceder a su estado interno o realizar determinadas funciones. Entre ellas se encuentra la posibilidad de aplicarle una determinada fuerza al GameObject.

Conclusión

RigidBody es una Clase de Programación definida en el core del motor, accesible por el namespace UnityEngine. Esta clase nos permite darle a los GameObjects el comportamiento de Cuerpos Rígidos físicos con todo lo que eso conlleva.

Los Colliders son esenciales para delimitar la frontera del Cuerpo Rígido y poder calcular las fuerzas y colisiones con otros GameObjects con RigidBody.

Usando los métodos públicos de la Clase RigidBody podremos aplicar fuerzas, velocidades lineales y angulares, torque y modificar una gran variedad de propiedades presentes en el estudio de la física Newtoniana.

Introducción

En este artículo vamos a analizar el método FixedUpdate de Unity el cual permite realizar cambios equiespaciados en el tiempo.

Un método es una función definida en un Script que puede ser ejecutada y realiza la tarea que definimos en su interior. Para saber más sobre métodos en programación puedes leer este artículo o ver un video que resume la información.

En el siguiente vídeo muestro un experimento para observar las diferencias entre UPDATE y FIXEDUPDATE en UNITY

 


Método FixedUpdate en Unity – MonoBehaviours

La función FixedUpdate está definida en la clase MonoBehaviour y se va a ejecutar automáticamente en intervalos regulares de tiempo si el MonoBehaviour se encuentra activo.

Por defecto, el tiempo entre ejecuciones consecutivas de FixedUpdate es de 20 milisegundos o 0.02 segundos. Este tiempo lo podemos ver y modificar en la pestaña Edit > Project Settings > Time – Fixed Timestep.

Cuando creamos un nuevo Script en Unity, por defecto nos aparecerá algo de código ya escrito. En este código se define una Clase de Programación que se llama igual al nombre que le dimos al Script y que extiende o hereda su comportamiento de MonoBehaviour, esto en términos simples significa que nuestro Script es en sí un MonoBehaviour o un caso particular de MonoBehaviour.

Los MonoBehaviours se pueden agregar a los GameObjects que se encuentran en la jerarquía, esto podemos hacerlo desde el inspector usando el botón «Add Component» o simplemente arrastrando el Script al inspector del GameObject.

Ejecución de la función FixedUpdate

Mientras el juego está corriendo, Unity automáticamente toma todos los MonoBehaviours que hay en la escena y realiza la ejecución de los métodos FixedUpdate cada vez que se cumple el tiempo «Fixed Timestep». De modo que no debemos hacer la ejecución de este método manualmente, el motor se encarga de ello.

Quiere decir que la función FixedUpdate se ejecutará de manera periódica mientras nuestro juego esté corriendo.

Independientemente de los FPS (frames por segundo) de nuestro juego, el método FixedUpdate que se ejecutará en intervalos regulares, 50 veces por segundo si el Fixed Timestep está seteado en 0.02 segundos.

FixedUpdate vs Update

Existe otra función de actualización que se ejecuta automáticamente cada cierto tiempo, se trata de la función Update.

Experimento para entender las diferencias entre Update y FixedUpdate

Conclusión – FixedUpdate para cambios equiespaciados en el tiempo

El método FixedUpdate representa la parte dinámica de un juego en Unity, cuando queremos producir cambios en el tiempo y que estos cambios se apliquen en intervalos regulares, recurrimos a la función FixedUpdate.

Una aplicación típica de esta función es realizar el movimiento de objetos o algunas animaciones que hacemos de manera procedural.

Al mover objetos en FixedUpdate, la velocidad del objeto será la que indiquemos. Si en cambio movemos objetos en la función Update, cuando nuestro juego funcione a más FPS, el objeto se moverá más rápido que cuando el juego funcione más lento.

Es útil entender cómo es el orden de ejecución de los métodos Start, Update y FixedUpdate ya que nos permite identificar distintos momentos en la ejecución del juego.

Introducción

En este artículo vamos a analizar el método Update de Unity el cual permite realizar cambios en el tiempo en nuestros proyectos.

La palabra «método» en programación hace referencia a una función definida en un Script que puede ser llamada y realiza la tarea que definimos en su interior. Para saber más sobre métodos en programación puedes leer este artículo o ver un video que resume la información.

Antes de continuar dejo un video en el que hice algunas pruebas en Unity para entender mejor cómo es el orden de ejecución de los métodos Update y FixedUpdate. Entender esto te ayudará a decidir cuál método es mas conveniente para resolver lo que necesites.

🟢 VÍDEO: Diferencias entre UPDATE y FIXEDUPDATE en UNITY



Método Update en Unity – MonoBehaviours

La función Update está definida en la clase MonoBehaviour y se va a ejecutar automáticamente en cada frame del juego si el MonoBehaviour se encuentra activo, es decir si el script donde tenemos definida dicha función está asignado a un GameObject de la jerarquía y además se encuentra activo tanto el GameObject como el Script.

Cuando creamos un nuevo Script en Unity, por defecto nos aparecerá un poco de código ya escrito. En este código se define una Clase de Programación cuyo nombre coincide con el nombre del archivo de texto que le dimos al Script al crearlo. Por defecto, un nuevo Script extiende su comportamiento (lo hereda) de la clase MonoBehaviour, esto en términos simples significa que nuestro Script es un caso particular de MonoBehaviour.

Los MonoBehaviours se pueden agregar a los GameObjects que se encuentran en la jerarquía, esto podemos hacerlo desde el inspector usando el botón «Add Component» o simplemente arrastrando el Script al inspector del GameObject.

Ejecución de la función Update

Al correr el juego, Unity automáticamente va a tomar todos los MonoBehaviours que haya en la escena y va a realizar la ejecución de los métodos Update antes de mostrar cada fotograma del juego. De modo que no debemos hacer la ejecución de este método manualmente, el motor se encarga de ello.

Quiere decir que la función Update se ejecutará de manera periódica mientras nuestro juego esté corriendo.

Si nuestro juego funciona a 60 FPS (frames por segundo) la función Update se ejecutará 60 veces por segundo.

Update vs FixedUpdate

Existe otra función de actualización que se ejecuta automáticamente cada cierto tiempo, se trata de la función FixedUpdate. Esta función está relacionada a la actualización de las físicas del motor y se ejecuta con un ritmo fijo que por defecto es de 20 milisegundos.

Experimento para entender las diferencias entre Update y FixedUpdate en Unity

Conclusión – Update para cambios en el tiempo

El método Update representa todo lo que es dinámico en nuestro juego, cuando queremos producir cambios en el tiempo Update es una de las funciones que tenemos que considerar.

Es útil entender cómo es el orden de ejecución de los métodos Start, Update y FixedUpdate ya que nos permite identificar distintos momentos en la ejecución del juego.

Introducción

En este artículo vamos a ver la función valor absoluto de un número, cuáles son sus propiedades, algunas gráficas y como extra vamos a ver cómo calcular el valor absoluto de una expresión en el motor gráfico Unity, en el ámbito de la programación y el desarrollo de videojuegos.

Definición del Valor Absoluto de un Número

El valor absoluto de un número es la distancia que hay entre ese número y el 0 del sistema de medición.

Esto da lugar a dos resultados posibles dependiendo del número en cuestión.

Si el número es positivo, el resultado de tomar el valor absoluto es el mismo número. Si en cambio el número es negativo, al tomarle el valor absoluto el resultado es el mismo número pero en valor positivo.

Formalmente:

   

Debido a esta definición podemos afirmar que el valor absoluto de un número es siempre un número positivo.

Gráfica del Valor Absoluto de X

A continuación se muestran algunos gráficos de la función valor absoluto para entender cómo es su comportamiento.

Observar en cada gráfica los rangos de las variables en los ejes para ver cómo la gráfica es afectada por los desplazamientos en X en Y y por los coeficientes que multiplican a la expresión.

(1)  

(2)  

(3)  

(4)  

Distancias

Cuando estamos trabajando con distintos puntos en un sistema de coordenadas, muchas veces nos interesa trabajar con las distancias que existen entre ellos, las cuales son valores positivos.

El valor absoluto permite trabajar con estas distancias en expresiones matemáticas.

Cómo calcular el Valor Absoluto en Unity

Para calcular el valor absoluto de una expresión en Unity, debemos hacer uso del método estático «Abs» de la clase «Mathf».

Sea «num» una variable numérica definida en el programa en cuestión, para tomar su valor absoluto hacemos:

Mathf.Abs(num);

El resultado de la ejecución de este método podemos almacenarlo en otra variable o en la misma, de la siguiente forma:

num = Mathf.Abs(num);

Introducción

Desde el punto de vista de la programación, un GameObject en Unity es una clase de programación, sin embargo el concepto va mas allá de eso, en Unity un GameObject es la unidad básica para construir cualquier cosa que se necesite en una escena, cada GameObject perteneciente a una escena se encuentra listado en la jerarquía de Unity. En este artículo encontrarás información detallada sobre sus características y funciones, antes de avanzar dejo un vídeo con un análisis completo sobre el concepto de GameObject.

Te recomiendo el siguiente vídeo en el que hago un análisis del concepto de GameObject en Unity


Características básicas de un GameObject

Vamos a ver cuáles son las características y componentes básicos de un Empty GameObject que es el más general que podemos agregar en una escena de Unity.

Consideremos que tenemos un Empty GameObject en la escena llamado «Objeto1», con este GameObject vamos a ejemplificar la manera de acceder a sus componentes.

Componente Transform

Los GameObjects como mínimo tendrán un componente Transform que indicará su posición, rotación y escala en la escena.

Podemos acceder a la referencia de su componente Transform utilizando el operador punto de la siguiente manera:

objeto1.transform

Si quisiéramos acceder al Vector3 que representa la posición del GameObject en la escena nuevamente usamos el operador punto de la siguiente manera:

objeto1.transform.position

Si quisiéramos acceder al float que representa la componente y de la posición del objeto en la escena podemos hacer lo siguiente:

objeto1.transform.position.y

Lo mismo se aplica para los demás miembros del componente Transform

objeto1.transform.rotation

objeto1.transform.scale

Tags o Etiquetas

Un GameObject tiene un Tag asignado que permite distinguirlo de otros GameObjects de la escena, listarlo utilizando ese Tag o realizar alguna función si el objeto tiene asignado un determinado Tag.

Layers o Capas

Las Layers se asignan a los GameObjects y del mismo modo que los Tags nos permiten listarlos y realizar acciones si el GameObject pertenece a determinada layer.

Una aplicación más interesante de las Layers es en el renderizado de los GameObjects. Podemos configurar varias cámaras en la escena y hacer que cada cámara capte una o más Layers en particular.

Método GetComponent

Este método permite obtener la referencia de un componente de algún tipo específico que esté asignado al GameObject. Para saber qué es un método en programación puedes hacer clic aquí.

Supongamos que nuestro objeto se llama «objeto1» tiene asignado un componente tipo AudioSource porque emite algún tipo de sonido y nos gustaría acceder a ese componente y tal vez modificar el volumen. Podemos usar este método de la siguiente manera:

objeto1.GetComponent<AudioSource>();

Esto nos dá la referencia del AudioSource que tenga asignado. En el caso de que el GameObject tenga más de un componente de ese tipo, podemos hacer lo siguiente:

objeto1.GetComponents<AudioSource>();

Esto devuelve un Array que contiene todos los componentes de ese tipo que el objeto tenga asignado.

Método SetActive

Este método permite activar o desactivar el GameObject en la jerarquía, el resultado es equivalente a marcar o desmarcar el tilde que se encuentra en la parte superior del inspector cuando el objeto está seleccionado.

Para activarlo hacemos:

objeto1.SetActive(true);

Para desactivarlo:

objeto1.SetActive(false);

Flexibilidad para construir GameObjects complejos

Hemos mencionado que el Empty GameObject es el tipo de objeto más simple que podemos encontrar en una escena en Unity.

Podemos personalizar estos objetos tanto como necesitemos, añadirles componentes preexistentes en el motor Unity o nuestros propios Scripts de programación. Esto hará que cada GameObject tenga un comportamiento especializado.

Conclusión

Hemos visto qué es un GameObject en Unity, cuáles son sus componentes principales y la posibilidad de agregar tantas componentes como sean necesarias para construir los objetos que necesitemos en nuestro mundo.

El objeto más simple que pueda haber en una escena tendrá asignado un componente Transform que indiciará su posición, rotación y escala en la escena. Tendrá asignados un Tag y un Layer que permiten agrupar objetos y realizar funciones apropiadas para cada grupo.

En el ámbito de la programación GameObject es una clase de programación, que cuenta con campos y métodos que lo definen. Se puede consultar el listado de todos sus miembros en la API de Unity.

Introducción

En este artículo vamos a estudiar la circunferencia como figura geométrica, cuáles son sus características y su ecuación matemática. Además vamos a ver cómo calcular su perímetro y área.



Definición de una circunferencia

Una circunferencia es una figura geométrica en la cual todos sus puntos se encuentran a la misma distancia de un determinado punto llamado centro, dicha distancia se conoce como radio de la circunferencia. En la figura 1 vemos el gráfico de una circunferencia genérica cuyo centro se encuentra en el punto (a,b) y tiene un radio r.

Fig. 1: Gráfico de una circunferencia de radio R centrada en (a,b).



Ecuación de una Circunferencia

Conociendo la expresión matemática de una circunferencia podremos dibujarla en el plano cartesiano y posteriormente utilizarla en nuestros proyectos de programación y desarrollo de videojuegos.

Coordenadas cartesianas

La expresión que define una circunferencia en coordenadas cartesianas es la siguiente:

(1)  

Donde R es el radio de la circunferencia y su centro se sitúa en el punto (a,b) del plano cartesiano.

En este caso para dibujar la circunferencia debemos conocer el rango de valores de las variables X e Y. Por ejemplo consideremos el círculo unidad centrado en (0,0):

(2)  

Si dibujamos un círculo de radio 1 con centro en (0,0) podemos ver que tanto los valores de X como de Y van a estar en el intervalo [-1,1]. Al elegir un valor de ese intervalo y asignarlo a una de las variables podremos despejar la ecuación y obtener el valor de la otra variable.

Coordenadas paramétricas

También puede ser útil la expresión de una circunferencia en el sistema de coordenadas paramétricas ya que al estar definido con funciones periódicas, el rango de variación del parámetro es infinito. La expresión de un círculo está dada por el siguiente sistema de ecuaciones.

x=a+r.cos(t)

y=b+r.sin(t)

(3)  


Haciendo variar el parámetro t entre 0 y 2π obtenemos todos los puntos de la circunferencia.

Como mencionamos antes el parámetro t puede tomar valores de menos infinito a más infinito y siempre va a devolver algún punto de la circunferencia, debido a que los senos y cosenos son funciones periódicas.



Circunferencia y funciones matemáticas

Hay que tener en cuenta que no existe una función matemática que defina el círculo ya que por su definición, una función es una expresión en la que se cumple que, para cada valor de la variable independiente, existe un único valor para la variable dependiente. Por lo tanto la circunferencia no es una función matemática.

En otras palabras, para que un gráfico pueda corresponder a una función matemática debemos poder trazar una línea vertical en cualquier parte del gráfico y ésta línea debería corta a la función en un único punto. Esto no ocurre en el círculo, ya que si tomamos por ejemplo un círculo de radio R centrado en el origen (0,0), la recta coincidente con el eje Y corta al círculo en dos puntos.

Algo que sí sería válido es descomponer el gráfico de la circunferencia en dos partes, un semicírculo superior y uno inferior y encontrar las expresiones matemáticas cuyos gráficos se corresponden con esos semi círculos. Esto lo que podemos hacer despejando la variable y en la ecuación 1 de mas arriba.

(4)  

El valor absoluto surge porque tomamos la raíz cuadrada de una expresión que está elevada al cuadrado, esto da lugar a dos valores posibles para esa expresión, uno positivo y otro negativo, que son los que definen el semi círculo inferior y superior de la circunferencia.

Semicírculo superior

La expresión de la función que representa el semi círculo superior de una circunferencia genérica es:

(5)  

Semicírculo inferior

La expresión de la función que representa el semi círculo inferior de una circunferencia genérica es:

(6)  

Perímetro de una circunferencia

El perímetro de un círculo es la longitud de su frontera, imaginemos que hacemos una marca en un punto del círculo, colocamos ese punto en el 0 de una recta y lo hacemos girar hacia adelante, el punto donde la marca vuelve a tocar la recta es el valor del perímetro de la circunferencia. Matemáticamente se puede calcular como:

(7)  

PI tiene un valor aproximado de 3.1415 y «r» es el radio de la circunferencia.

Área de una circunferencia

El área de un círculo es el resultado de la multiplicación del número π por el radio de la circunferencia al cuadrado. Matemáticamente:

(8)  



Aplicaciones de la circunferencia en programación

VÍDEO: Determinar puntos cercanos a otro punto

Debido a que la circunferencia es el conjunto de puntos que se encuentran a una cierta distancia llamada «radio» a un punto llamado «centro», si nos paramos en el centro de la circunferencia y analizamos la distancia de un punto cualquiera al centro de la circunferencia podemos saber si el punto está fuera, sobre o dentro de la circunferencia.

Es como si el radio de la circunferencia definiera una frontera, todos los objetos que estén a una distancia menor al radio de circunferencia se encontrarán en el interior de la misma, si el punto está a una distancia mayor al radio sabemos que está fuera de la circunferencia y si la distancia es igual al radio el punto está sobre la circunferencia.

En el vídeo que se encuentra a continuación utilizo la ecuación paramétrica de la circunferencia para dibujar un círculo alrededor de un objeto, en los primeros minutos del vídeo se puede ver el código para determinar el i-ésimo punto de un círculo de radio «distance» y «circleSubdivisions» subdivisiones, esta es la instrucción:

Vector3 circlePoint = new Vector3(distanceMathf.Cos(2Mathf.PIi/circleSubdivisions)+ targetObject.position.x, 0f, distanceMathf.Sin(2 * Mathf.PI * i / circleSubdivisions) + targetObject.position.z);




Introducción

En este artículo vamos a ver cómo llamar funciones y leer variables que están definidas en otro Script en Unity, además tienes un conjunto de vídeos importantes que hablan en profundidad sobre este tema. Ser capaz de llamar funciones y leer variables que están definidas en otro script te va a ayudar a crear soluciones más potentes, ya que permite tener scripts especializados en tareas específicas y que otros scripts lean su información o utilicen sus funciones cuando lo necesiten.



Tengo el vídeo perfecto para explicar esto

Este vídeo es información pura, no pude hacerlo más corto sin dejar de lado algo importante. Concretamente se trata de un ejercicio práctico en el que muestro de forma muy resumida el procedimiento para llamar funciones y leer variables que están definidas en otro script en Unity. Como explico al inicio del vídeo, es muy importante realizar este ejercicio con el objetivo de entender el procedimiento, entender la parte de la asignación de referencia y entender el uso del operador punto.

Haz este ejercicio y reflexiona sobre el procedimiento hasta que lo entiendas, una vez que lo entiendas vuelve a retomar lo que estabas intentando hacer. Si logras superar esa barrera en la que no necesitas que alguien te dé una receta sino que tú mismo entiendes cómo funcionan las cosas y puedes crear tu propia solución para lograrlo, en ese punto ya no habrá quien te pare.




Si entiendes el vídeo anterior puedes usar mi solución de puntaje básico para Unity

Un sistema de puntaje que gestiona un valor de puntaje entero y hace el guardado de datos automáticamente. Para usarlo solo tienes que ejecutar una función que está definida en otro script. Puedes usarlo como punto de partida para crear un sistema de puntaje para Unity que se adapte a tus necesidades.

Para profundizar más en el tema sobre acceder a otros Scripts tengo dos vídeos con más información

1 – Cómo llamar funciones definidas en otro script en Unity

2 – Cómo leer variables definidas en otro script en Unity



Interacciones entre scripts – Cosas a tener en cuenta

Antes de ver una aplicación concreta, dejo una lista de puntos a tener en cuenta que considero son importantes para entender todo el fundamento detrás de la interacción entre Scripts.

Sobre los Scripts

En este caso vamos a ver un ejemplo en Unity, así que los dos Scripts que vamos a utilizar van a ser extensión de la clase MonoBehaviour. Esto en términos prácticos significa que al iniciar el juego, se ejecutará un método Start() y entre cada frame del juego se ejecutará el método Update().

Sobre la ejecución de los Scripts

Para que estos Scripts se ejecuten, deben estar asignados a uno o más GameObjects de la jerarquía. Es decir debe existir una Instancia de la clase definida en el Script.

Instancias de una clase

Cuando añadimos un mismo Script a dos GameObjects distintos estamos creando dos instancias separadas de la clase, es decir dos objetos que van a ser similares porque pertenecen a la misma clase, pero su estado no necesariamente será el mismo. Aquí puedes ver las diferencias entre las clases de programación y los objetos.

Contar con las REFERENCIAS de los objetos

Esto es uno de los puntos fundamentales a los que hay que prestar atención e intentar entender en profundidad.

Los objetos son las instancias de una clase y para poder acceder a su funcionalidad debemos tener la referencia de este objeto, es decir encontrarlo de entre todos los objetos presentes en el programa y tenerlo almacenado en un campo para poder utilizarlo.

Esto es similar a cuando queremos usar una variable, necesitamos tener definida dicha variable para poder utilizarla en el Script.

El operador punto

El operador punto en varios lenguajes de programación nos permite acceder a los campos y métodos definidos como públicos dentro de una clase.

Si tenemos la referencia del objeto, podremos utilizar el operador punto para ejecutar cualquiera de sus métodos públicos o leer y escribir cualquiera de sus campos públicos.



Ejemplo práctico de Comunicación entre Scripts en C# – Unity

Pasos previos

En un proyecto cualquiera de Unity creamos dos Scripts, ScriptA y ScriptB, en el primero definiremos la función que será ejecutada desde el otro Script.

Fig. 1: Creamos dos Scripts llamados ScriptA y ScriptB.

En la jerarquía vamos a crear dos empty GameObjects para poder crear instancias de ambos Scripts.

Fig. 2: Creamos dos Empty GameObjects en la jerarquía para que contengan ambos Scripts.

En el GameObjectA agregamos como componente el ScriptA y al GameObjectB el ScriptB. Esto podemos hacerlo desde el inspector con el botón Add Component o haciendo drag and drop.

Fig. 3: Seleccionamos el objeto A y en el inspector, utilizando Add Component, agregamos ScriptA a sus componentes.
Fig. 4: Otra forma de agregar componentes es arrastrarlos directamente al inspector del GameObject.



Código dentro de los Scripts

Vamos a escribir las instrucciones que usaremos para resolver la comunicación entre Scripts. En este caso utilizo Visual Studio como editor de código.

Abrimos ambos Scripts y nos encontramos algo de código ya escrito.

Fig. 5: Abrimos ambos Scripts en algún editor. Podemos ver algo de código ya escrito.

En el primer Script vamos a escribir el siguiente código:

Fig. 6: Campos y métodos pertenecientes al Script A.

Un string público llamado «name» que nos servirá para identificar de qué instancia se trata.

Dos métodos llamados Function1 y Function2, el primero público y el segundo privado.

El método público será la función que podremos ejecutar desde cualquier otro Script utilizando el operador punto.

Como vemos en la figura 6 lo que hace es imprimir en consola lo que devuelve el método Function2. Este método devuelve un texto concatenado que permite ver quién está ejecutando el método Function1 y de qué instancia de la clase ScriptA se trata. Esto se entenderá mejor más adelante.

Ahora vamos a trabajar en el Script B, que será el que llame a la función definida en el otro Script A. En la figura 7 vemos las instrucciones del ScriptB.

Fig. 7: Campos y métodos pertenecientes al Script B.

Definimos un string para asignar un nombre y saber de qué instancia se trata.

Para poder ejecutar funciones definidas en otro Script debemos tener la referencia del objeto que es instancia de esa clase. Así que tenemos que definir un objeto de tipo ScriptA al que le damos el nombre «scriptA» (primera letra con minúscula), como vemos en la línea 13 de la figura 7.

Esto es sólo la mitad del trabajo, hemos declarado que el ScriptB va a tener una referencia de un objeto de tipo ScriptA, pero aún no hemos encontrado dicha referencia.

Para encontrar la referencia de un objeto en un Script hay varias formas, en este caso voy a utilizar el método FindObjectOfType<> de MonoBehaviour, a este método le ingresamos el tipo de objeto que tiene que buscar y devolverá la referencia del primer objeto de ese tipo que encuentre en la jerarquía. Ver línea 18 de la figura 7.

Ver otras formas de encontrar referencias en Unity

Por último ejecutamos la función definida en el otro Script A desde este Script B (línea 20 de la figura 7).



Operador punto

Como mencionamos con anterioridad, el operador punto nos permitirá acceder a todos los campos y métodos públicos definidos dentro de la clase.

En las figuras 8 y 9 vemos que utilizando la referencia del objeto del Script A seguida de un punto, podemos ver la lista de los campos y métodos que podemos utilizar.

En la figura 8 vemos el campo name que era el string definido como público en el ScriptA y en la figura 9 vemos el método Function1, también definido como público. Lo que no vemos es el método Function2 ya que fue declarado como privado.

Fig. 8: El operador punto nos permite leer y escribir el campo «name», que es un string definido como público.

Fig. 9: El operador punto nos permite ejecutar el método «Function1» definido como público.

Primera prueba de ejecución

Antes de darle al botón Play, seleccionamos los GameObjects A y B e ingresamos nombres en los campos «name» que nos permitan saber de qué objeto se trata.

La instancia del Script A se llamará «George (A)» y la instancia del Script B se llamará «Mike (B)», como vemos en las figuras 10 y 11.

Fig. 10: En el inspector del GameObjectA, ponemos un nombre para saber que se trata de esa instancia de la clase Script A.

Fig. 11: En el inspector del GameObjectB, ponemos un nombre para saber que se trata de esa instancia de la clase Script B.

Al correr el juego vemos en el inspector del GameObjectB que el campo ScriptA ahora muestra un objeto (a diferencia de la figura 11 en la que decía «none»).

Esto significa que el ScriptB pudo encontrar la referencia del ScriptA.

En la figura 13 se muestra el mensaje en pantalla, impreso por el método Function1 del ScriptA, que fue llamado desde el ScriptB.

El mensaje dice: «Mike(B) ha ejecutado mi Function1. Por cierto soy George(A)».

Fig. 12: Al correr el juego se encuentra la referencia del objeto ScriptA debido a la instrucción FindObjectOfType<>.

Fig. 13: Este mensaje se imprime debido a que se ejecuta un método definido en ScriptA desde el ScriptB.



Segunda prueba de ejecución

Vamos a profundizar un poco el concepto de objeto de programación como instancia de una clase.

Elegimos el GameObject A de la jerarquía y agregamos una segunda instancia de la clase ScriptA usando el botón «Add Component» o drag and drop.

Esta segunda instancia se llamará «Luke (A)», en la figura 14 vemos ambas instancias de la clase.

Fig. 14: Se agrega una segunda instancia de la clase ScriptA al GameObjectA con un nombre distinto.

Al correr el juego así como está, vemos en la consola que Mike (B) ha ejecutado el método Function1 de Luke (A), ver figura 15.

Lo que ha ocurrido aquí es que la instrucción FindObjectOfType<> en la línea 18 de la figura 7, ha encontrado la referencia de un solo objeto de tipo ScriptA, el que hemos llamado Luke (A).

Fig. 15: Al correr el juego ahora vemos que se está ejecutando el método Function1 de la instancia llamada Luke.

Vamos a modificar el código en ScriptB para que sea capaz de encontrar todas las referencias de ScriptA que haya en la escena y ejecute el método Function1 de cada una de ellas.

A continuación se muestra el problema resuelto:

Fig. 16: Modificamos de esta forma el ScriptB para que ejecute las funciones de las dos instancias de ScriptsA

En la declaración del objeto ahora hemos definido un array o vector de objetos tipo ScriptA (línea 13 figura 16), esto quiere decir que podremos guardar muchas referencias de objetos ScriptsA.

En la línea 18 de la figura 16 el cambio es algo sutil, en lugar de ejecutar FindObjectOfType<> se ejecuta FindObjectsOfType<>, esto hace que se encuentren todas las referencias que haya de ese objeto.

Lo último que hacemos es recorrer el array de objetos ScriptA utilizando un bucle foreach y ejecutarle a todos ellos el método Function1, como se observa en las líneas 20 a 23 de la figura 16.

Fig. 17: Al correr el juego vemos que se encuentran las dos referencias de los objetos ScriptA y las tenemos almacenadas en el array.

Al correr nuevamente el juego, vemos que ahora en el inspector del GameObjectB tenemos las referencias de los objetos ScriptA (figura 17), tenemos un array de dimensión 2.

Como se observa en la figura 18, en consola ahora se imprimen dos mensajes, el primero corresponde a la ejecución del método Function1 de Luke y el segundo a la ejecución de Function2 de George.

Fig. 18: En la consola vemos que se ejecutan los métodos Function1 de cada objeto ScriptA.



Tercera prueba de ejecución

Vamos a modificar nuevamente el ScriptB para ver otra forma de obtener las referencias de los objetos y así poder llamar a sus funciones desde otro Script.

En este caso, en el ScriptB, vamos a declarar dos objetos tipo ScriptA serializados (también pueden ser públicos, la idea es que aparezcan en el inspector). Estos objetos se van a llamar «scriptALuke» y «ScriptAGeorge».

Luego en el método Start vamos a ejecutar los métodos Function1 directamente usando estos objetos. En este caso no es necesario encontrar las referencias ya que las asignaremos directamente en el inspector.

A continuación se muestra el ScriptB modificado.

Fig. 19: Modificamos el ScriptB de esta forma para probar otra manera de tener la referencia de los objetos.

En el inspector podemos ver los nuevos campos para los objetos tipo ScriptA (figura 20).

Fig. 20: En el inspector tenemos campos para dos objetos tipo ScriptA.

Vamos a modificar un poco los GameObjects de la jerarquía, vamos a tener un Empty GameObject llamado A-Luke y otro llamado A-George.

Fig. 21: En lugar del GameObjectA vamos a tener dos empty GameObjects para cada instancia de la clase ScriptA.

En cada GameObject asignamos el componente ScriptA y completamos el nombre correspondiente, ver figuras 22 y 23.

Fig. 22: En el GameObject A-Luke agregamos el componente ScriptA e ingresamos el nombre correspondiente.

Fig. 23: En el GameObject A-George agregamos el componente ScriptA e ingresamos el nombre correspondiente.

Ahora vamos a tomar los GameObjects de la jerarquía y asignarlos en los campos correspondientes del ScriptB

Fig. 24: Con estos GameObjects haremos drag and drop en los campos de ScriptB.

En las figuras 25 y 26 vemos que las referencias han sido asignadas manualmente, esto significa que se podrán ejecutar sus respectivos métodos Function1.

Fig. 25: Podemos asignar directamente el GameObject al campo correspondiente siempre que entre sus componentes hay un objeto de ese tipo.

Fig. 26: Las referencias de ambos objetos ScriptA han sido asignadas a los campos correspondientes.

En consola vemos que se imprimen los mensajes producto de la ejecución de Function1.

Fig. 27: Al correr el juego vemos que se ejecutan los métodos Function1 de ambas instancias.

Antes de terminar me gustaría cambiar el orden de ejecución de los métodos Function1 en el ScriptB, como se ve en la figura 28.

Fig. 28: Invertimos el orden de las instrucciones y realizamos otra prueba.

Al hacer esto y correr nuevamente el juego vemos que los mensajes en consola cambian de lugar, figura 29.

Fig. 29: Vemos que los mensajes cambian el orden de aparición en consola.



Conclusión

Hemos visto cómo llamar a funciones que están definidas en un Script desde otro Script, a lo que le dimos el nombre informal «Comunicación entre Scripts».

Para que esto se pueda hacer, el método o función a ejecutar debe estar declarado como público, lo que permite accederlo desde contextos externos.

Además debemos tener la referencia del objeto que contiene ese método a ejecutar, esto se puede lograr de varias formas, en este artículo vimos tres maneras de hacerlo, teniendo en cuenta de que puede haber más de un objeto que contiene el método a ejecutar.

Entender en profundidad el concepto de objeto de programación, el cual es la instancia de una clase y de que para acceder a sus campos y métodos públicos debemos tener la referencia de ese objeto, podemos construir soluciones más complejas y vamos entrando en el tema de la programación orientada a objetos.

Introducción

En este artículo se provee una solución que permite mostrar tres tipos de mensajes en pantalla en Unity. Un mensaje momentáneo que se muestra siempre que mantengamos la orden, un mensaje que se muestra cuando se lo ordena y al presionar cualquier tecla se desactiva y un tercer mensaje similar pero que cuenta con un botón para cerrarlo.

En el siguiente vídeo explico 3 formas de mostrar mensajes en pantalla en Unity


En los primeros minutos del video se explica cómo importar el paquete y se hace una prueba de funcionamiento. El resto del video trata sobre el diseño y la funcionalidad de los Scripts, entender esto sería lo más valioso porque te permite sacarle el máximo provecho a la solución, pudiendo utilizarla desde donde quieras o modificarla a tu conveniencia.

Archivos de descarga

En la descarga encontrarás un zip que contiene el paquete de Unity.

Importar el paquete

Para poder acceder a los archivos, tienes que importar el paquete desde Unity, en el video lo que hago es arrastrar el archivo directamente a la carpeta Assets.

Aparecerá una ventana que permite importar todos lo archivos. El paquete contiene dos Scripts, un prefabricado y una escena.

En la escena ya está implementado el sistema de mensajes y se puede probar haciendo clic en Play y presionando las teclas 1, 2 y 3 del teclado alfanumérico.

Tipos de Mensajes en Pantalla

La solución provee una forma de mostrar distintos mensajes en pantalla en Unity. Estos mensajes pueden ser de tres tipos.

Mensaje Simple

El mensaje simple se muestra por un sólo frame del juego, por lo tanto para que el mensaje sea visible hay que ejecutar la orden varios frames seguidos.

Este mensaje puede ser útil para mostrar información cuando se produce un evento OnTriggerEnter(), por ejemplo cuando el personaje se encuentra en determinada área. Otro ejemplo puede ser mostrar un mensaje siempre que el jugador esté mirando un objeto concretamente, como se hace en la solución del sistema de interacción base.

Mensaje Salteable por Tecla

Este es el típico mensaje «Press any key to continue» (presiona cualquier tecla para continuar). En este caso la orden se envía una vez y el mensaje persiste hasta que el jugador presiona cualquier tecla.

Mensaje Salteable por Botón

Este mensaje es parecido al anterior, en el sentido de que la orden se envía una vez y el mensaje persiste, pero el cartel del mensaje cuenta con un botón que permite ocultarlo.

Introducción

En este artículo se presenta una nueva solución para Unity, se trata de un menú de pausa que se despliega al presionar la tecla Escape y que permite configurar algunos parámetros como la resolución o el volumen y salir del juego.

En el siguiente video se ve el funcionamiento del menú de pausa y cómo importar el paquete y modificar los Scripts de Standard Assets para adaptarlos a la solución.

Archivos de descarga

Importante – Error al importar el paquete

Al importar el paquete van a tener un error porque es necesario hacerle unos cambios al Script FirstPersonController de Standard Assets.

Dentro de este Script, vamos hasta al final y en la región por encima de la penúltima llave ( } ) introducimos el siguiente método:

public void SetCursorLock(bool b){
m_MouseLook.SetCursorLock(b);
}

En el video se explica exactamente cómo importar el paquete y cómo configurar los Scripts de Standard Assets para adaptarlos a la solución.

Introducción

En este artículo vamos a las operaciones de sumatoria y productoria, las cuales nos permiten realizar sumas y productos de manera repetitiva con un patrón conocido, vamos a ver cómo se representan y cómo realizar los cálculos. Al final vamos a ver cómo programar sumatorias y productorias en lenguaje Java o C#.

¿Qué es la sumatoria y la productoria?

La sumatoria y productoria son formas de definir operaciones matemáticas que consisten en secuencias de sumas y productos respectivamente.

Imaginemos que tenemos que sumar o multiplicar todos los números comenzando en el 1 y terminando en el 1000, pero además multiplicar cada uno de ellos por 3.

Utilizando la simbología de la sumatoria y productoria podemos escribir largas operaciones como esas de forma abreviada. Además las propiedades nos pueden ayudar a simplificar la expresión y calcular los resultados con mayor facilidad.

Símbolo de Sumatoria y Desarrollo matemático

La sumatoria se simboliza con la letra griega Sigma en mayúscula.

Debajo del símbolo de sumatoria se indica la variable índice y desde qué valor inicia. En la parte superior del símbolo se indica el último valor que tomará el índice.

A la derecha del símbolo está la expresión que determina todos los términos de la sumatoria, cada término surge de reemplazar el índice en la expresión desde el primer al último valor.

En la ecuación 1 vemos del lado izquierdo la expresión de la sumatoria y del lado derecho la operación desarrollada.

(1)  

¿Cómo programar una Sumatoria?

Implementar la sumatoria en algún lenguaje de programación es relativamente simple, debemos definir una variable para acumular la suma que debe estar inicializada en 0 (elemento neutro para la suma). Tenemos que tener en cuenta a qué conjunto numérico pertenecen los sumandos, de esto dependerá el tipo de variable a elegir.

Definimos una variable entera para el fin de la sumatoria.

Hacemos un bucle for que va desde el inicio de la sumatoria hasta el final y en el interior del bucle definimos la operación a realizar.

En la figura 1 vemos la implementación de la sumatoria de la ecuación 1 junto con el resultado impreso en consola.

Fig. 1: Implementación de la sumatoria de la ecuación 1 en Java, IDE Netbeans.

Símbolo de Productoria y desarrollo

La productoria se simboliza con la letra Pi en mayúscula.

Debajo del símbolo de productoria se indica la variable índice y desde qué valor inicia. En la parte superior del símbolo se indica el último valor que tomará el índice.

A la derecha del símbolo está la expresión que determina todos los términos de la productoria, cada término surge de reemplazar el índice en la expresión desde el primer al último valor.

En la ecuación 2 vemos del lado izquierdo la expresión de la productoria y del lado derecho la operación desarrollada.

(2)  


Implementar la productoria en programación

Implementar la productoria es similar a hacer la sumatoria, debemos definir una variable para acumular el producto que deberá estar inicializada en 1 (elemento neutro del producto). También analizamos el tipo de números que estamos multiplicando para elegir el tipo de la variable de acumulación.

Definimos una variable entera para el fin de la productoria.

Hacemos un bucle for que va desde el inicio de la productoria hasta el final y en el interior del bucle definimos la operación a realizar.

En la figura 2 vemos la implementación de la productoria de la ecuación 2 junto con el resultado impreso en consola.

Fig. 2: Implementación de la productoria de la ecuación 2 en Java, IDE Netbeans.

Vídeo tutorial sobre cómo implementar una sumatoria en lenguaje C#

En el siguiente vídeo explico qué es una SUMATORIA y cómo implementarla en programación


Introducción

En este artículo vamos a ver a modo informativo qué es un paradigma de programación y dar algunos ejemplos.

Las primeras generaciones de computadoras se programaban utilizando lenguaje de máquina, es decir se daba una secuencia de instrucciones que la máquina entendía. Como era complicado recordar los códigos de estas instrucciones, se creó el lenguaje Assembler, que también consistía en un set de instrucciones para la máquina, pero escritas con palabras simple de recordar.

Con los avances de la tecnología fueron surgiendo los lenguajes de programación, que permitieron a los programadores aumentar el nivel de abstracción y resolver problemas más complejos.

¿Qué es un Paradigma de Programación?

La programación en lenguajes de alto nivel puede adoptar varias formas, es decir podemos afrontar la resolución de problemas desde distintos ángulos.

Existen diferentes modos de diseñar un lenguaje y varios modos de trabajar para obtener los resultados que necesitan los programadores. Esos modos de pensar o trabajar se llaman PARADIGMAS DE LENGUAJE DE PROGRAMACIÓN.

A continuación vamos a mencionar algunos de estos paradigmas.

Paradigma Imperativo

Los programas consisten en una sucesión de instrucciones o comandos, como si el programador diera órdenes concretas.

Esta forma es la manera más simple en la que se pueden atacar los problemas, pero se vuelve ineficiente cuando los problemas son complejos.

Paradigma Lógico

Este paradigma como su nombre lo indica se basa en el pensamiento lógico el cual nos resulta natural entender. Utilizando lógica se pueden expresar de manera formal problemas complejos, elaborando premisas y luego aplicando hipótesis, axiomas y teoremas para la resolución.

La programación lógica resulta óptima en aplicaciones de inteligencia artificial. El lenguaje Prolog utiliza este paradigma.

Paradigma Funcional

Este paradigma consiste en crear funciones que resuelven un tipo determinado de problemas y luego llamarlas cuando se necesiten. Estas funciones pueden contener otras funciones en su interior.

Algunos lenguajes que utilizan este paradigma son Haskell y Python.

Paradigma Orientado a Objetos

En este paradigma se construyen modelos de objetos, los cuales son entidades abstractas que tienen definidos un conjunto de datos y funciones en su interior.

Ir a la sección de Programación Orientada a Objetos.

Algunos lenguajes que utilizan este paradigma son el C++, Java y C#.

Introducción

En este artículo vamos a ver qué es punto flotante y cómo se representan valores con decimales utilizando este sistema.

La representación por punto flotante (o coma flotante) es una forma de escribir un número decimal que se asemeja a la notación científica. Esto nos permite representar y operar con números muy grandes y también con números muy pequeños (con muchos decimales).

El estándar de cómputo en punto flotante se describe en la norma IEEE 754.

Estructura de un número en punto flotante

Este sistema de representación utiliza una determinada cantidad de dígitos binarios dependiendo el tipo de precisión (comúnmente 16, 32, 64 y 128 bits).

Un bit es destinado al signo, es decir si ese bit vale 0 se trata de un número positivo, si vale 1 es un número negativo.

Los bits restantes se reparten en la representación de los decimales (se suele llamar mantisa) y el exponente.

   

En la expresión n es el número decimal a representar.

La letra s es el bit destinado al signo (si s vale 0 la expresión (-1) elevado a la 0 resulta en 1 positivo).

La letra e es el exponente y m es la mantisa.

Pasar números decimales a punto flotante

1- Tomamos el número a representar, separamos el signo y escribimos el valor absoluto en base 2.

2- El valor absoluto en base 2 se escribe en notación científica en base 2 normalizada.

3- El exponente se expresa en notación en exceso (dependerá del tipo de precisión que se elija).

4- El coeficiente se escribe en la mantisa sin la parte entera, ya que la normalización en el paso 2 obliga a que la parte entera de la mantisa sea 1, almacenarla no aporta información.

Error de Truncamiento del sistema Punto Flotante

El error de truncamiento se produce al tomar una cierta cantidad de dígitos de un número y dejar de lado los demás.

Pensemos en el número π (3.14159265…), el cual es un número irracional que tiene infinitos dígitos.

Las computadoras no pueden almacenar infinita información en la memoria porque se necesitaría una memoria infinitamente grande, de modo que en algún punto se debe parar.

Si a π , le truncamos toda la parte decimal y nos quedamos sólo con el 3, estaremos cometiendo un error de aproximadamente el 4.5% relativo al valor real de π . Si en cambio tenemos en cuanta los dos primeros decimales de π, nos quedamos con 3.14. En este caso estaremos cometiendo un error de aproximadamente el 0.05% relativo al valor real de π.

Este error ocurrirá en el sistema de punto flotante ya sea porque queremos representar número irracionales o porque el decimal que queremos representar se vuelve irracional al pasarlo al sistema binario (ejemplo 0.1 decimal tiene infinitos dígitos al pasarlo a binario).

Introducción

En este artículo voy a mostrar una solución para hacer que los personajes no jugables (NPC) en Unity patrullen por una ruta compuesta por una serie de puntos.

Primero vamos a ver cómo agregar la solución al prototipo de inteligencia artificial para enemigos. Luego voy a explicar cómo funciona este sistema de patrulla en sí para poder adaptarlo a cualquier proyecto.

La explicación del prototipo de inteligencia artificial para enemigos en Unity puedes verla a continuación:


Instrucciones y Descargas

https://gamedevtraum.com/wp-content/uploads/es/desarrollo-de-videojuegos/tutoriales-y-soluciones-para-el-motor-unity/sistema-de-patrulla-para-npc/sistema-de-patrulla-para-npc.mp4
Video 1: Funcionamiento de la solución.

Paso 1: Descargar el prototipo de IA para NPC

En primer lugar descargar el prototipo de inteligencia artificial para enemigos, en el video se explica cómo funciona.

Prototipo Inteligencia Artificial NPC Enemigo

Paso 2: Descargar el nuevo Script Enemigo

Luego descargamos el Nuevo Script Enemigo que incluye la función de patrullar.

Script NPC Enemigo que patrulla

Paso 3: Agregar y configurar el nuevo Script en el Prototipo

Seleccionamos uno de los enemigos en la jerarquía y en el inspector vamos a desactivar el Script Enemigo anterior y le asignamos el nuevo, como vemos en la figura 1.

Fig. 1.a : Nuevo Script Enemigo aplicado a uno de los prefabricados del enemigo dentro del prototipo.

Los campos se pueden a rellenar se pueden tomar del Script Enemigo anterior, asignando manualmente cada elemento.

Los nuevos campos están bajo el título «Estado de Patrulla» en negrita, en la figura 1.

El Array Puntos de Ruta no es necesario asignarlo, lo coloqué ahí para saber que se habían encontrado las referencias de los puntos de ruta.

Para definir una ruta para el enemigo vamos a crear un empty GameObject que llamaré «RutaDePatrulla1». En el interior colocaré más empty GameObjects en los puntos pertenecientes a la ruta de patrulla. En la figura 1.b llamé a estos puntos «1» y «2», el nombre en sí no es importante, pero el orden en el que están si lo es.

IMPORTANTE: asegurarse de que los puntos están al nivel del suelo.

Una vez que la ruta está definida la asignamos al campo «Ruta de Patrulla» en el inspector del nuevo enemigo.

Fig. 1.b : Se usan Empty GameObject para definir la ruta del enemigo.
Fig. 1.c : Asignación de la ruta de patrulla al enemigo.

Concretamente lo que se hizo es agregar un nuevo estado que se llama «Patrullando» y que cuando está activado es porque el NPC comienza a caminar del punto en el que está al siguiente punto.

Al llegar se pone en estado de guardia por los segundos que indiquemos en la variable «tiempoDeGuardiaEnPunto», luego pasará al estado de patrulla nuevamente e irá al siguiente punto.

¿Cómo funciona la solución?

Ahora vamos a ver cómo funciona el sistema de puntos de ruta. Si entendemos esto podremos aplicarlo a cualquier proyecto.

Campos

En primer lugar necesitamos un GameObject serializado que se llama «rutaDePatrulla». Aquí asignaremos un GameObject cuyos hijos serán todos los puntos que el enemigo recorrerá.

Luego definimos un vector de objetos Transform que llamamos «puntosDeRuta», este no es necesario que aparezca en el inspector, pero aún así le añadí SerializeField para saber si las referencias se habían encontrado correctamente.

El entero «puntoDeRutaIndex» es el que indica el punto de la ruta de patrullaje al que el NPC debe ir.

Por último el float «tiempoDeGuardiaEnUnPunto» es el tiempo que el NPC esperará en cada punto antes de pasar al siguiente.

En la figura 2 vemos los campos definidos.

Fig. 2: Campos necesarios para la solución del NPC Enemigo que patrulla.

Métodos

El método ObtenerPuntosDeRuta se utiliza para encontrar las referencias de todas las componentes Transform de los hijos del objeto «rutaDePatrulla». En la figura 3 vemos este método definido.

Fig. 3: Método ObtenerPuntosDeRuta perteneciente a la solución.

El método anterior hay que ejecutarlo al comenzar la partida. En la figura 4 muestro la ejecución del mismo en el método Start del nuevo Script Enemigo.

Fig. 4: Ejecución del método ObtenerPuntosDeRuta perteneciente a la solución.

Cuando el enemigo debe pasar de un punto al otro debemos incrementar el índice (entero «puntoDeRutaIndex») para pasar al siguiente punto. En el caso de que estemos en el último punto del vector debemos pasar al punto en la posición 0, así que para eso se utiliza el segundo if definido en la figura 5.

Fig. 5: Ejemplo de cómo recorrer el vector de puntos de ruta.

Noten como en la figura 4 también se le dice al agente que vaya hacia ese punto (con la ejecución de «SetDestination»).

Elementos necesarios en la Jerarquía

Para la ruta dijimos que necesitamos un GameObject cualquiera y que los puntos que definen la ruta de patrullaje serán los hijos de este GameObject.

Se pueden definir todos los puntos que se quieran y el algoritmo definido en el método ObtenerPuntosDeRuta los encontrará y se ajustará automáticamente.

Fig. 6: Ejemplo de una ruta para el NPC Enemigo.

Fig. 7: Asignación de la ruta creada en la figura 6 al NPC enemigo.

Extras

En el video 1 se veía en el Editor unas líneas blancas que unían los puntos de la ruta de patrullaje como para mostrar el camino que el NPC sigue.

Esto se consigue con la ejecución dentro de Update del método «DibujarRuta» que se ve en la figura 8.

Fig. 8: Método auxiliar para dibujar en el editor el camino que seguirá el NPC enemigo.

Introducción

En este artículo muestro algunos de los timelapses de Blender que he hecho en el último tiempo.

El Timelapse es una técnica que se usa para mostrar un proceso lento de manera acelerada. Me gusta ver timelapses de modelado 3D porque son entretenidos y usualmente se descubren formas nuevas de hacer las cosas.

Si estás empezando con Blender 2.8 o las versiones anteriores hice un artículo con video mostrando atajos y consejos que considero útiles para saber desde el principio.

Cubo de Rubik

Este fue el primero que hice para el canal, un cubo de Rubik que se consigue modelando primero un cubo con aristas redondeadas y luego duplicando hasta tener todas las piezas.

Los materiales están definidos desde el Shader Editor (en Blender 2.79 era el Node Editor), no se utilizan texturas.

Peones de Ajedrez

Un par de peones de ajedrez hechos de dos formas distintas, en una partimos de una esfera y se extrusionan las caras hacia abajo y en la otra se parte de un círculo para la base y se hacen extrusiones hacia arriba.

Para ayudar a darle la forma a las piezas se modela con una imagen de referencia situada en el fondo, esto es especialmente útil para piezas de revolución.

Máscara Veneciana

Otro ejemplo de modelado 3D con imagen de referencia, en este caso la referencia nos sirve para copiar la topología de un rostro 3D de manera precisa, esto hará que posteriormente responda mejor a las deformaciones proporcionales y a las subdivisiones.

Creo que es una buena manera de estudiar cómo modelar caras en 3D.

Torii – Puerta Japonesa

Me gustó mucho hacer este timelapse, aunque tuve que hacerlo dos veces porque en la primera ajusté mal el programa para capturar la pantalla.

En este caso investigué un poco para encontrar música royalty free que se ajuste al modelo y encontré un canal llamado PeriTune que tenía melodías muy lindas y algunas se podían usar en los videos. También tienen un sitio web.

Kokeshi – Muñeca Japonesa

Este es uno de los primeros modelos 3D que hice utilizando Blender 2.8 y su nuevo motor de renderizado Eevee.

Me pareció genial la facilidad que ofrece Eevee para aplicar efectos en tiempo real, aunque al principio me costó acostumbrarme a las cosas nuevas, como seleccionar con el clic izquierdo.

El timelapse tuve que hacerlo dos veces porque en la primera tuve un problema con la captura.

Sistema Lockpick de Skyrim

Estoy haciendo un análisis del sistema lockpick de Skyrim. Mi intención es recrearlo en Unity lo más fielmente posible y el primer paso es crear el modelo 3D.

En este timelapse no solo hago el modelado y mapas UV en Blender sino que utilizo Substance Painter para crear las texturas, es un software genial que adquirí hace unos meses.

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