Definición de BOOLEANO

Un BOOLEANO es un tipo de variable primitiva que se caracteriza por poder estar sólo en dos estados, «true» o «false». El nombre de esta variable se lo debe al matemático George Boole quien creó el álgebra de Boole, la cual es la base de todas las operaciones digitales.



Para tener una idea general sobre variables en programación recomiendo ver el siguiente vídeo antes de seguir leyendo el artículo.




Sintaxis de una variable BOOLEANA en C#

Para definir una variable booleana en lenguaje C#, en el caso de Unity, se utiliza la palabra «bool» y a continuación se indica el nombre de la variable, por ejemplo de la siguiente manera:

bool unBooleano=false;

Aplicaciones de una variable BOOLEANA

La aplicación más importante de una variable booleana es en la toma de decisiones para el control del flujo de un programa, una sentencia IF es una estructura de control que permite tomar una decisión basado en una condición de naturaleza booleana. Si la condición indicada en la sentencia IF es verdadera, el programa ejecutará una cierta región de código, si la condición es falsa podemos hacer que ejecute otra región distinta del código.

Un bucle WHILE es una estructura de control repetitiva que ejecutará una serie de instrucciones que indiquemos y al finalizar volverá a repetir esas instrucciones, este proceso lo hará mientras las condición indicada se mantenga verdadera, cuando la condición cambie a falso el flujo del programa saldrá del bucle.

Usando variables booleanas y los operadores lógicos podemos representar cualquier expresión lógica que necesitemos, estas expresiones pueden utilizar múltiples variables y pueden ser analizadas o generadas a partir de una tabla de verdad.

En general, todo lo que sea estados activado/desactivado en Unity se representa con una variable booleana que a veces se puede leer y escribir, otras veces son de solo lectura. Dos ejemplos son el estado de habilitación de un objeto de la jerarquía y el estado de habilitación de un script asignado a un objeto. Se puede hacer que un objeto desaparezca de la escena, simplemente cambiando su estado de activación, en este vídeo se muestra cómo activar y desactivar GameObjects de la escena y en este otro cómo activar y desactivar componentes asignadas a GameObjects.



Introducción

En este artículo vamos a ver qué es la sintaxis en programación y mostrar la sintaxis de algunos de los elementos y estructuras de control más comunes en programación. También encontrarás algunos vídeos mostrando implementación en lenguaje C# en Unity.

Qué es la «SINTAXIS» en programación

La SINTAXIS en programación es el conjunto de reglas que definen la manera de escribir instrucciones de código. Cada lenguaje de programación tiene su propia sintaxis, es por eso que no es conveniente estudiar la programación basándose puramente en la escritura del código, sino entendiendo la manera de pensar, los conceptos básicos, conocer las estructuras de control y cómo aplicarlas; de esta forma se aprende programación independientemente del lenguaje y luego, dependiendo la aplicación, se estudia la sintaxis del lenguaje que se necesite, algo que nos puede tomar algunas horas o un día de dedicación.

Elementos importantes para estudiar la sintaxis de un lenguaje

Cuando estudiamos la sintaxis de un lenguaje, en general siempre vamos a caer en los mismos elementos, voy a listar los elementos mas comunes de todo lenguaje de programación e indicar su sintaxis en el caso particular del lenguaje C#.

Comentarios

Los comentarios son muy importantes a la hora de programar ya que ayudan a que otros miembros del equipo entiendan lo que estamos haciendo, pero también son importantes para nosotros mismos como ayuda de memoria o como forma rápida de interpretar el código.

Imaginen trabajar en un proyecto que dura varias semanas o meses y en el que van a redactar decenas de scripts de programación, en el momento de escribir esos scripts uno entiende perfectamente cuál es la función que cumple, cuáles son sus variables y métodos; pero al cabo de un par de días toda esa compresión se desvanece dejando un oscuro vacío detrás.

para que sirven los comentarios en programacion, sintaxis en programacion

Cuando necesitamos volver a esos scripts para aplicar cambios o corregir problemas, es decir hacer el mantenimiento de un programa,resulta todo un problema volver a entender qué función cumplían o cuáles eran las variables así que es de mucha ayuda tener comentarios que nos faciliten este trabajo.

En C# se puede escribir un comentario simple utilizando dos barras ( // ), todo lo que siga a continuación será ignorado por el compilador. Los comentarios más extensos requieren que indiquemos el inicio y el final del comentario, el inicio se indica con la barra seguida de un asterísco ( /* ), mientras que el final se indica con el asterisco seguido de una barra ( */ ), esto también es muy útil para comentar grandes secciones de código.

Asignación

La asignación es la acción de darle un valor a una variable. El operador asignación en C# es el signo igual ( = )

Estructuras de control

Las estructuras de control permiten modificar el flujo de ejecución de un programa, produciendo saltos o repeticiones en el código.

Sentencia IF

La sentencia IF permite tomar una decisión en función de una condición lógica, la sintaxis en C# para una sentencia IF es la siguiente:

if(valorBooleano){
//Instrucciones a ejecutar si condición verdadera
}else{
//Instrucciones a ejecutar si condición falsa

}

La condición de la sentencia if (en este caso valorBooleano) puede ser cualquier variable o instrucción que tenga como resultado un valor booleano.

Hay algunas variantes de la sentencia if que permiten ignorar las llaves, pero creo que eso podría ocasionar muchos problemas, por ejemplo bugs muy difíciles de rastrear, algo que puede evitarse simplemente haciendo uso de las llaves para delimitar el comienzo el final de cada parte de la sentencia if.

Bucle FOR

El bucle for es una estructura de control repetitiva que nos permite ejecutar un conjunto de instrucciones un número fijo de veces, es muy útil para recorrer colecciones (como el array) y aplicar acciones a cada uno de los elementos. En C# la sintaxis para un bucle for es la siguiente:

for(instruccionInicial ; condicionRepeticion ; instruccionIncremento){
//Instrucciones que se repiten
}

Un ejemplo típico de un bucle for puede ser el siguiente:

for(int i=0; i<n ; i++){
//Instrucciones que se repiten
}

En el bucle de arriba, la variable de iteración es i que comenzará inicialmente en 0, la condición para que se mantenga el bucle es que i sea estrictamente menor que otra variable entera n (que puede ser el tamaño de un array por ejemplo) y al finalizar una iteración lo que se hará es un incremento de la variable i, con la instrucción «i++». Las instrucciones que se realizan en bucle se colocan dentro de las llaves.

Vídeos con ejemplos de sintaxis en programación

En este vídeo vemos qué es un método, sus características, la sintaxis para definir un método.


Definición

El pseudocódigo es una herramienta que permite representar instrucciones de código pero sin usar ningún lenguaje de programación en particular, es un punto intermedio entre el lenguaje coloquial y un lenguaje de programación.

Tengo un vídeo para recomendarte sobre este tema:

En el siguiente vídeo hago una implementación de el algoritmo de ordenamiento de burbuja y lo primero que hacemos es analizar el pseudocódigo del algoritmo, entendemos cómo funciona a nivel conceptual y en el resto del vídeo traducimos ese pseudocódigo a lenguaje C# en este caso para usar en Unity.


Aplicaciónes del pseudocódigo

La aplicación más útil del pseudocódigo es transmitir algoritmos pero sin especificar el lenguaje de programación, el programador debe ser capaz de interpretar estas instrucciones y reescribirlas en el lenguaje de programación que se necesite.

Otro uso del pseudocódigo es transmitir ideas rápidamente entre programadores.

Estudio del pseudocódigo

Cuando estudiamos materias de programación, las reglas que se empleen para el pseudocódigo dependerán de lo que indique cada profesor, es conveniente tener una lista con las palabras exactas que permitan representar las acciones básicas que se emplean en cualquier algoritmo, por ejemplo asignación de variables, operaciones matemáticas, estructuras de control (if, for, while) y declaración y llamada de métodos.

En la práctica bastaría con que las instrucciones que se indiquen en el pseudocódigo puedan ser perfectamente interpretadas por otro programador sin que existan ambigüedades.

Un Script es un documento que contiene instrucciones de programación en un determinado lenguaje, que es el que entiende la herramienta que estamos utilizando para desarrollar cualquiera sea la aplicación que requiera programación.

Algunos Ejemplos de utilización de Scripts

Por ejemplo, un Script puede contener una lista de instrucciones para que un Arduino cumpla una función. También puede contener una serie de reglas que definen el estilo de una página web. Un juego simple podría ser codificado en un Script.

Scripts en lenguaje C# que se usan en el motor Unity

En nuestro caso vamos a utilizar Scripts dentro del motor Unity, estos Scripts estarán escritos en lenguaje C# y la mayor parte del tiempo haremos que estos Scripts cumplan una determinada función dentro de Unity, utilizando los objetos y componentes de la jerarquía y realizando operaciones lógicas y matemáticas necesarias para el desarrollo de la mecánica del juego.

Qué hay dentro de un Script en Unity

Al crear un nuevo Script en Unity, en el interior se definirá por defecto una CLASE DE PROGRAMACIÓN con el mismo nombre que le dimos al archivo, la cual extenderá de la clase MonoBehaviour de Unity, además traerá definidos dos métodos (o funciones), la función Start y la función Update.

Cómo se ejecutan los Scripts en Unity

Para que el código que definimos dentro de un Script de Unity se ejecute, el Script debe estar asignado a al menos un GameObject en la jerarquía (el Script tiene que extender de MonoBehaviour para poder añadirlo a un GameObject).

Con esto es suficiente para que Unity lo añada a su ciclo de ejecución, al entrar en el modo juego, Unity ejecutará en determinados momentos algunas de las funciones que están definidas dentro del Script, por ejemplo las funciones Start, Update y FixedUpdate, y lo hará de manera automática.

Para qué sirven los Scripts en Unity

Unity es un software que se conoce como motor gráfico, este software facilita muchas cuestiones técnicas a la hora de crear aplicaciones gráficas, ya que si no contáramos con él, deberíamos manualmente programar funciones que le digan a las tarjetas gráficas cómo renderizar lo que queremos que aparezca en pantalla, haciendo uso de librerías como DirectX u OpenGL. Unity además nos provee de un motor de física que permite detectar colisiones y representar interacciones entre objetos como si se tratase de cuerpos rígidos, con las propiedades físicas más comunes que estos tienen. El procesamiento del audio también es un punto importante.

Unity nos ofrece una serie de herramientas muy útiles y que de otra forma requerirían mucho conocimiento técnico, pero para poder manejar esas herramientas se necesitan dos cosas, una es conocer el motor Unity, es decir familiarizarse con estas herramientas y entender qué función cumplen. Y lo segundo que necesitamos es saber programar para hacer uso de estas herramientas, y eso lo haremos a través de Scripts de programación.

Definición

Un ALGORITMO es una secuencia de pasos ordenados que nos permite pasar de un estado inicial a un estado final deseado. Esta serie de pasos tienen que proporcionar la información necesaria y sin ambigüedades, es decir que sólo debe haber una forma posible de interpretarlos. Un algoritmo puede describir una secuencia de pasos para realizar una determinada acción o resolver problemas matemáticos.

En el siguiente vídeo vemos qué es un ALGORITMO en programación a nivel conceptual.


Ejemplos de ALGORITMOS implementados en lenguaje C# en Unity

Implementación del ALGORITMO Bubble Sort con lenguaje C# en Unity

En el siguiente vídeo hago una implementación de el algoritmo de ordenamiento de burbuja y lo primero que hacemos es analizar el pseudocódigo del algoritmo, entendemos cómo funciona a nivel conceptual y en el resto del vídeo traducimos ese pseudocódigo a lenguaje C# en este caso para usar en Unity.

Implementación de un ALGORITMO para Barajar ARRAYS de cualquier tipo con lenguaje C# en Unity

Implementación de un ALGORITMO para encontrar VALORES MÍNIMOS y MÁXIMOS dentro de un Array con lenguaje C# en Unity

Has entrado en una zona secreta de GameDevTraum, en esta sección se irá publicando contenido oculto del canal y la página, un contenido secreto que solo puede ser accedidos si tienes el link. Una sección reservada para los que están unidos al server de Discord o aquellos que, picados por la curiosidad, se han topado con esta misteriosa página.

Índice

PROTOTIPOS
—Juego 2D – Invaders
—Juego 3D – Laberinto
VÍDEOS SOBRE UNITY

—Cuenta regresiva absoluta
—Algunas ideas sobre interfaz gráfica
—Idea para el control de un submarino 2D
—Algunos datos sobre publicar una aplicación o juego en Google Play
—Plataformas aleatorias
VÍDEOS SOBRE BLENDER

—Modificador booleano en Blender 2.92, perforar cubo con cilindro
—Modelar rostro 3D en base a imagen de referencia con topología
—Nodos para imagen con transparencia en Blender
MISCELÁNEOS

—Algunas ideas y conceptos para simular gravedad sin RigidBody en Unity
—Saber si un punto se encuentra dentro de un polígono
—Configurar Streamlabs para superponer chat de Twitch en Apex Legends

Prototipos

Juego 2D tipo Invaders

El prototipo Invaders se puede acceder desde la portada de GameDevTraum, pero aquí tienes un link directo. Consiste en un juego tipo arcade en el que controlas una nave y aparecen oleadas de naves enemigas que irán descendiendo cada vez con más velocidad. La misión del jugador es destruir la mayor cantidad de naves antes de perder todas las vidas.

Video 1 – Descripción del proyecto

En el vídeo de la derecha hablo sobre todos los elementos que componen el proyecto, desde los Assets, Spritesheets, animaciones y la composición del a jerarquía.

Vídeos 2, 3 y 4 – Funcionamiento de los Scripts

En los siguientes tres vídeos se explica el funcionamiento de cada uno de los Scripts que resuelven el proyecto.

Juego 3D en primera persona – Laberinto, encontrar objetos y escapar

El juego del laberinto consiste en encontrar una serie de objetos que aparecerán aleatoriamente en distintos lugares del laberinto, al hacerlo se libera una llave que le permite al jugador escapar, la idea es que encuentre todos los objetos y la llave antes de que se agote el tiempo. Puedes probar el juego del laberinto aquí.

Vídeo 1 – Descripción general del proyecto

En el vídeo de la derecha hablo sobre todos los elementos que componen el proyecto, desde los Assets, Spritesheets, animaciones y la composición del a jerarquía.

Vídeo 2 – Descripción detallada de los Scripts

En el vídeo de la derecha se habla sobre el funcionamiento de cada uno de los Scripts que resuelven el juego del Laberinto, en el interior está la aparición aleatoria de los objetos, del personaje, la cuenta regresiva, la liberación de la llave y demás.

Vídeos sobre Unity

Cuenta regresiva absoluta (funciona aunque se cierre el juego)

GameDevTraum – Abosulte Countdown Timer

Arriba puedes descargar el paquete de Unity para importarlo y en el vídeo de la derecha se explica cómo funciona la cuenta regresiva absoluta. Es un timer que se puede crear y que va a funcionar por más que cambiemos de escena o salgamos del juego y volvamos a entrar.

Algunas ideas sobre interfaz gráfica

El vídeo de la derecha tiene algunas ideas sobre cómo plantear una interfaz gráfica, lo bueno es el componente vertical layout que te acomoda automáticamente los hijos que tenga el GameObject uno debajo del otro y con distancias configurables.

Idea para el control de un submarino 2D

Esto salió de una pregunta de Discord, era algo sobre el control de un submarino con animaciones dependiendo del daño que haya recibido.

https://www.youtube.com/watch?list=TLGGQBBz3DcojIYyMTA2MjAyMQ&v=v6dekriLO-A

Algunos datos sobre publicar una aplicación o juego en Google Play

Aquí le explico a un amigo las cosas básicas que hay que configurar y hacer para obtener un archivo del juego que se pueda publicar en Google Play. La idea es generar un archivo con extensión AAB que contenga las versiones del juego en 32 y 64 bits.

https://www.youtube.com/watch?list=TLGGBqhIvxCZoxUyMTA2MjAyMQ&v=Jn_OX6-GZKo

Una idea para elegir plataformas de manera aleatoria y colocarlas en posiciones aleatorias

Esto fue algo que surgió en un directo, se trata de una idea para instanciar objetos aleatorios en una posición aleatoria delante de la cámara, la idea sería que la cámara siempre esté avanzando de modo que los objetos siempre estén apareciendo por delante.

Vídeos sobre Blender

Modificador booleano en Blender 2.92, perforar un cubo con un cilindro

En el vídeo de la derecha muestro cómo configurar el modificador booleano en Blender 2.92, el proceso que se hace es perforar un cubo con un cilindro. Mientras el modificador está activo, la geometría del cubo permanece intacta, solo cuando el modificador se aplica es cuando la geometría del cubo pasa a incluir la perforación.

Modelar rostro 3D en base a imagen de referencia con topología

En este vídeo muestro algo que considero muy útil para practicar modelado de objetos y el uso de Blender, se trata de tomar una imagen de referencia de un rostro que contiene la vista frontal y lateral y además muestra la topología del rostro, es decir se ven las caras y dónde estarían ubicados los vértices. Esto permite saber exactamente como construir los edge loops para obtener un modelo 3D de un rostro con buena topología que responda correctamente a las deformaciones proporcionales.

Nodos para hacer que el alfa de una imagen sea transparente en Blender

Se tiene una imagen PNG con transparencia y la idea es aplicársela a un material en Blender conservando esa transparencia, en este vídeo se muestra un arreglo de nodos que resuelven este problema.

https://www.youtube.com/watch?list=TLGG4eTG83gKiZIyMTA2MjAyMQ&v=WmEvgKaaAic

Misceláneos

Algunas ideas y conceptos para simular gravedad sin RigidBody en Unity

En el vídeo de la derecha hablo sobre algunos conceptos básicos sobre física y matemática, que considero necesarios para abordar el problema de simular el efecto de un campo gravitatorio sobre un objeto en Unity, pero sin recurrir al componente RigidBody el cual nos soluciona ese problema y muchos más.

Ángulos del infierno

Estos tres vídeos son una curiosidad, me surgió el problema de detectar cuándo un punto se encuentra dentro de un polígono definido por cierta cantidad de puntos, en este caso 4 puntos. Este problema surge con la necesidad de implementar un mecanismo de selección de personajes para un prototipo estilo Age of Empire, en el que la cámara está arriba y los aldeanos en el escenario, con el mouse se traza una caja de selección y los aldeanos que quedan en el interior de la caja quedan seleccionados. Entonces con la caja de selección 2D sobre la pantalla se proyectan 4 puntos sobre el escenario y luego se determina si un aldeano se encuentra dentro del polígono que definen esos 4 puntos. Aquí se puede ver el prototipo de los aldeanos.

Aún no tengo un vídeo mostrando el código del algoritmo que resuelve el problema, pero si un vídeo explicando cómo atacar el problema.

Planteo del problema.

Aquí describo el algoritmo que soluciona el problema.

En este vídeo se muestra la solución funcionando.

Configurar Streamlabs OBS para que el chat de Twitch aparezca en las overlays de Apex Legends

https://www.youtube.com/watch?list=TLGGHHt78y4IRMYyMTA2MjAyMQ&v=LzX_bNCUYsw

Introducción

Esta solución para Unity consiste en un sistema de control de volumen para la música y los efectos de sonido, la idea es que en una ventana de configuración se ajustan los niveles deseados, el sistema guarda esa información y se la aplica a todos los componentes AudioSource que tiene registrados. Para registrar un componente AudioSource en el sistema basta con asignarle uno de dos Scripts que vienen dentro del paquete, uno lo asignaremos si se trata de un AudioSource de música, el otro si el AudioSource es de sonido. El sistema registrará todos estos AudioSources, añadiendo los que se van creando y quitando los que se van destruyendo. Además, como el sistema guarda la configuración seteada por el usuario, al iniciar nuevamente el juego esos volumenes estarán aplicados.

En el siguiente vídeo se ve cómo configurar desde cero el sistema de control de volumen para Unity:


Paquete de Unity para descargar e importar:

Cómo utilizar este sistema de control de volumen

En el paquete de descarga viene una escena en la que está montado el sistema.

Paso 1: Colocar el script AudioSettings en la escena para el control del sistema

En el paquete viene un Script llamado AudioSettings, este Script tiene que estar presente en la escena, en mi caso lo puse en un GameObject vacío llamado «AudioSettings», en el inspector se verán los valores actuales de volumen de música y efectos de sonido y la cantidad de AudioSources registrados, pero estos valores son solo para informarse lo que está pasando dentro del sistema, escribir valores en esos campos no afectará en nada.

Paso 2: Asignar los Scripts apropiados a los AudioSources

En la escena en general tendremos varios componentes AudioSource que emitirán sonidos. Para registrar estos AudioSources hay que asignarles al mismo GameObject que tiene el AudioSource un Script que se encarga de inicializar estos objetos e integrarlos al sistema, los scripts son: «MusicAudioSource» y «SFXAudioSource», solo con asignar uno de estos scripts el sistema se encarga de integrarlo al sistema, cargarle el volumen apropiado y modificarle el volumen cuando se produce un cambio en la configuración, no importa si el objeto con el AudioSource existe antes de entrar en el modo juego o se instancia a través de un Prefab (siempre que pongamos el Script en el Prefab). Esto lo podemos comprobar si vemos el inspector del script AudioSettings, el cual nos informa cuántos AudioSources de cada tipo hay registrados.

Paso 3: Sliders de control de volumen

En la escena viene un pequeño Canvas que contiene dos Sliders de control, uno para el volumen de la música y otro para el volumen de los efectos de sonido. Estos Sliders tienen que ejecutar las funciones dinámicas de cambio de volumen apropiadas que están definidas dentro del Script AudioSettings (ver el evento «OnValueChanged» de cada Slider).

Para lograr que el Slider muestre inicialmente los valores de volumen con los que se carga el sistema, tienen que tener asignado el Script «UIElementInitializer» y seleccionar el tipo de elemento del que se trata, en este caso tendremos solo dos elementos: «MUSIC_Slider» y «SFX_Slider», pero este sistema ustedes lo pueden ampliar para inicializar cualquier tipo de elementp de la interfaz gráfica que quieran, simplemente añadiendo elementos al enum dentro del Script y agregando casos dentro del Switch definido en la función Start.

Esto permitiría tener Sliders de control de volumen en distintas escenas y que todos afecten los mismos valores de configuración.

Introducción

En este artículo vamos a analizar un algoritmo para sumar los números del 1 al 10, es decir crearemos una función que nos resuelva la operación 1+2+3+…+10, esta función la programaremos de manera genérica para calcular la suma de todos los números naturales del 1 al N, siendo N cualquier número natural, por ejemplo si N vale 100, nuestro algoritmo sumará los números naturales del 1 al 100.

Cómo se puede resolver esta situación?

Algo que podríamos hacer es sumar explícitamente todos esos números, como se muestra a continuación:

suma = 1+2+3+4+5+6+7+8+9+10

Aquí a la variable suma se le asigna la suma de todos los números enteros hasta el 10.

Sin embargo esta manera de hacerlo es muy rígida, solo nos permite resolver esa operación en particular, si quisiéramos sumar los números hasta el 15, tenemos que ir al código y agregar los número manualmente y esto por supuesto es muy impráctico y no lo se puede modificar en tiempo de ejecución. Además, ¿por qué tomarse la molestia de escribir la suma cuando se podría asignar directamente el valor 55 a la variable suma, verdad?

Así que vamos a resolver este problema con una estrategia más flexible, vamos a hacer esta operación en varios pasos usando propiedades matemáticas como la asociativa o la existencia del elemento neutro para la suma. Esto nos permitirá tener un algoritmo que no solo sume los números enteros del 1 al 10 sino del 1 a cualquier número que queramos.

Algoritmo para sumar los números del 1 al 10

Podemos pensar esta suma grande en sumas más pequeñas, por ejemplo si partimos desde 0, primero resolvemos 0+1 y almacenamos este resultado en una variable, luego en otro paso, al resultado de 0+1 le sumamos 2, en otro paso, a ese resultado le sumamos 3 y así sucesivamente hasta llegar al último valor que se quiere sumar. La cantidad de pasos que hay que dar van desde el primer elemento que hay que sumar hasta el último elemento, osea en el ejemplo, desde el Paso 1 hasta el Paso 10.

Eso se puede resolver usando una variable que funcione como acumulador de la suma y un bucle repetitivo que vaya sumando los números al acumulador en cada iteración. Así que para las variables declaramos:

public int suma;
public int n=10;

El acumulador se inicializa en 0, porque el 0 es el elemento neutro para la suma, 0 sumado a cualquier número es igual a ese número. Esto lo hacemos con la siguiente instrucción:

suma=0;

Luego definimos un bucle for, si estás usando Visual Studio algo que puedes hacer es escribir «for» y apretar dos veces la tecla Tab, eso va a autocompletar la sintaxis del bucle for.

El bucle lo vamos a inicializar en el valor 1 y hacer que termine en la variable N, en este caso en particular es importante que usemos el signo “menor o igual”. Resumiendo lo que vamos a obtener es una primera iteración en la que «i» vale 1 y en la última iteración i vale 10 (en este caso particular).

for(int i=1;i<=n;i++){
suma=suma+i;
}

Dentro del bucle ejecutaremos la instrucción que se observa, variable suma igual a la variable suma más i, esto significa que primero vamos a calcular esta operación y luego vamos a asignarla a esta variable, en la primera iteración, suma vale 0, a eso le sumamos i que vale 1, 0+1 igual 1 y eso lo asignamos en la variable suma, en la siguiente iteración suma vale 1 e i vale 2, de modo que se resuelve la operación 1+2 y se asigna en la variable suma. Así sucesivamente hasta llegar al último número.

Prueba de funcionamiento del algoritmo en Unity

El código completo en lenguaje C# quedaría aproximadamente de la siguiente manera:

public int suma;
public int n=10;


void Start(){
suma=0;
for(int i=1;i<=n;i++){
suma=suma+i;
}
}

Procedemos a testear el código, guardamos los cambios en el Script y lo ejecutamos, en nuestro caso esto lo hacemos asignando el Script que contiene al código a cualquier GameObject de la jerarquía de nuestro proyecto en Unity y entrando en el modo juego. Al hacer esto, Unity ejecuta automáticamente la función Start de ese Script y el resultado de la suma queda almacenado en la variable suma.

Como la variable «n» es pública, se puede modificar su valor en el inspector, por ejemplo poner 100 y se va a resolver la suma de los números naturales del 1 al 100.

Vídeo tutorial con la implementación del algoritmo para sumar N números en C# Unity

En este vídeo muestro cómo implementar un ALGORITMO para SUMAR los números del 1 al 10 en lenguaje C# en Unity.


Introducción

En este artículo vemos cuáles son las causas del error «Can’t Add Script» en Unity con el fin de entender por qué se produce y así identificar qué acciones tomar para resolverlo.

En el siguiente vídeo vemos cómo solucionar error «CAN’T ADD SCRIPT» en Unity


Por qué se produce el error «Can’t Add Script» en Unity

Este error en el que no se nos permite añadir un Script o componente a un GameObject puede surgir por dos motivos.

Caso 1: El nombre del Script y de la clase que define no coincide

El primero es que el nombre del Script, es decir el nombre del archivo con extensión «.cs» no coincide con el nombre de la clase de programación que está definida en su interior. Esto suele pasar cuando creamos un Script y luego le cambiamos el nombre al archivo sin hacer un proceso de Refactorización.

Para solucionar este problema primero hay que identificar el Script que tiene conflictos, esto lo podemos hacer con la información que nos proporciona la ventana del error «Can’t Add Script» que aparece cuando intentamos añadir el Script con conflictos a un GameObject. Si no se recuerda cuál fue el Script que produjo el error, se puede crear un Empty GameObject y comenzar a añadir cada uno de los Scripts hasta que aparezca el error.

Una vez que se sabe cuál es el Script que genera el error «Can’t Add Script» lo abrimos y ubicamos la parte de la definición de la clase, la cual empieza de la siguiente manera:

public class NombreDeLaClase …

El nombre de la clase es el nombre que tiene que coincidir con el del archivo, así que lo que se puede hacer es modificar el nombre de la clase para que sea igual al del archivo, o modificar el nombre del archivo para que sea igual al de la clase.

Una vez que este problema se resuelve será posible añadir el Script a un GameObject. Si se necesita cambiarle el nombre al Script la mejor manera es hacer clic derecho en el «NombreDeLaClase» y poner «Rename», esto hará que Unity modifique ese nombre en todos los lugares en donde se utilice ese Script.

Caso 2: El Script fue creado en presencia de errores en consola

La segunda razón por la que ocurre el error «Can’t Add Script» en Unity es cuando se crean nuevos Scripts mientras hay errores en consola, en general se trata de errores de sintaxis (errores en la escritura del código). El motivo en este caso es que si hay errores en consola, Unity no puede compilar, por lo tanto si creamos un nuevo Script en este punto, por más que el archivo se haya creado, no se puede añadir la clase de programación al motor, en otras palabras Unity no sabrá que este Script existe hasta que no pueda compilar.

La solución en este caso es resolver todos los errores que haya en consola, esto hará que Unity compile y pueda registrar el nuevo Script. A partir de ese punto se podrá asignar el Script a un GameObject.

Introducción

En este artículo vemos cómo resolver el error de Visual Studio cuando no funciona el AUTOCOMPLETADO, es decir Visual Studio no nos sugiere código y tampoco reconoce los componentes propios del motor como la clase «GameObject», «Component» o «Collider». Puede que tengas este problema y no lo hayas notado, he hecho consultas para personas a las que no les funcionaba la opción de autocompletar y algunos incluso no sabían que existían.

Trabajar sin el autocompletado hace que programar sea muy difícil, incluso ralentiza mucho a un programador experimentado que pueda arreglárselas sin esa opción.

Tengo un vídeo en el que muestro algunas posibles soluciones para este error:


Cómo conectar Visual Studio a Unity para el AUTOCOMPLETADO

Primero hay que asegurarse de que Visual Studio está instalado, este se hace desde la aplicación Unity HUB, a la sección «Installs«, luego ir al ícono del engranaje de la versión del motor que se esté utilizando y agregarle el módulo Visual Studio.

Una recomendación: Intenta utilizar las herramientas que se consiguen en Unity HUB.
Una vez intenté utilizar una versión más reciente de Visual Studio que me descargué de la página oficial de Microsoft y al usar esa versión Unity se negaba a compilarme un proyecto muy avanzado en el que estaba trabajando.

Si Visual Studio está instalado pero aún así no nos sugiere código tenemos que asegurarnos de que Visual Studio está conectado a Unity, para eso en Unity vamos a:

Edit > Preferences > External Tools.

En la sección del editor de Script, usando el menú desplegable elegimos «Visual Studio» (si esta opción no aparece puede indicar que Visual Studio no está instalado), también se puede usar la opción «Browse» para ubicar el ejecutable del editor que quieran utilizar.

Reinicia Visual Studio si lo tienes abierto.

Una vez hecho esto deberías recuperar el autocompletado en Visual Studio para Unity, es decir deberías ver cómo te sugieren variables como «GameObject», «Rigidbody», etc.

Introducción

En este artículo vemos cómo generar una versión standalone de nuestro proyecto para Windows, es decir un programa que se puede ejecutar sin necesidad de tener abierto el motor Unity, esto en definitiva es el resultado final que buscamos, una versión del juego o aplicación que pueda funcionar en cualquier ordenador de la plataforma para la que fue compilado.

En el siguiente vídeo, en la parte final se ve cómo configurar el motor y generar una compilación para Windows:


Cómo crear una compilación para Windows a partir de un proyecto en Unity 3D

Comenzamos dirigiéndonos a la pestaña File > Build Settings, esto nos abrirá la ventana «Build Settings» que se observa en la figura 1. Aquí podremos configurar algunos parámetros de compilación, como las escenas que se van a añadir y la plataforma objetivo.

Fig. 1: Ventana Build Settings para configurar los parámetros de compilación y compilar.

Vamos a hacer clic en el botón «Add Open Scenes» para añadir la escena actual a la compilación (una escena en blanco que viene por defecto). La escena que se coloque en la posición 0 será la que se cargue al iniciar, de modo que si tenemos múltiples escenas habrá que reordenarlas convenientemente.

Fig. 2: Botón para añadir la escena actual a la compilación.

El siguiente paso es darle al botón «Build and Run», esto hará que se despliegue una ventana en la que seleccionaremos la carpeta de destino para exportar los archivos del juego o aplicación. En mi caso suelo crear una carpeta llamada Builds en paralelo a la carpeta Assets del propio proyecto, pero pueden elegir cualquier carpeta que deseen, asegúrense de recordar dónde se encuentra para luego poder usar los archivos.

Fig. 3: Botón Build and Run para crear una compilación y ejecutarla.
Fig. 4: Elegimos la ubicación donde se depositarán los archivos de la compilación.

Cuando hemos elegido la carpeta de destino hacemos clic en «Select Folder» para confirmar.

Fig. 5: Se confirma la ubicación elegida con el botón Select Folder.

En este punto comienza el proceso de compilación, que tardará más o menos dependiendo de factores como la complejidad del proyecto, la plataforma objetivo y la potencia de nuestro ordenador.

Fig. 6: El proceso de compilación comienza, el tiempo que tomará dependerá de la complejidad de nuestro proyecto y la potencia de nuestro ordenador.

Cuando el proceso de compilación finaliza se abre la aplicación automáticamente, en la figura 7 podemos verla, en este caso es simplemente una escena en blanco.

Fig. 7: Al finalizar se abre la compilación del proyecto.

Si vamos a la carpeta que se eligió para la compilación encontraremos los archivos del juego o aplicación (figura 8). Estos archivos se pueden compartir y funcionarán en otras computadoras que usen la plataforma para la que fue exportada y cumplan con requisitos mínimos de hardware para que el juego o aplicación funcionen.

Fig. 8: Carpeta que contiene los archivos de la compilación.

Introducción

El primer paso es instalar el motor Unity y las herramientas necesarias para comenzar a desarrollar videojuegos y aplicaciones. En este artículo repasaremos los pasos fundamentales para instalar y configurar el motor Unity, además haremos una compilación «standalone» para Windows, es decir una versión del proyecto que se puede ejecutar sin necesidad del motor Unity.

Antes de seguir avanzando dejo el vídeo que cubre la información de este artículo sobre cómo DESCARGAR e INSTALAR el motor Unity desde Unity HUB


Cómo instalar motor Unity y herramientas para distintas plataformas

Paso 1: Descargar e instalar Unity HUB

Unity HUB es una aplicación que permite gestionar las distintas versiones de Unity, sus módulos y los proyectos que hagamos. Unity HUB se puede descargar ingresando en este enlace. La siguiente imagen es una captura del enlace anterior, al pulsar el botón «Download Unity Hub» comienza la descarga de la aplicación.

Fig. 1: En el enlace de arriba se pueden descargar la aplicación Unity HUB.

Paso 2: Instalar versión del motor Unity

Una vez instalado Unity HUB lo abrimos y vamos a la sección «Installs», como se observa en la figura 2.

Fig. 2: En la sección «Installs» se pueden añadir nuevas versiones de Unity y agregar módulos a versiones ya instaladas.

En la sección «Installs» se encuentran las versiones ya instaladas del motor, podemos eliminarlas, añadirle módulos y también agregar nuevas versiones de Unity utilizando el botón «Add» como se observa en la figura 3.

Fig. 3: Con el botón Add se puede instalar una nueva versión del motor Unity.

Esto nos despliega una ventana en la que se puede elegir la versión del motor. Las versiones que tienen «(LTS)» son las versiones más estables del motor, usualmente siempre instalada la última versión oficial de Unity y además la última versión LTS, si es un proyecto importante utilizo esta última.

Fig. 4: En esta ventana se selecciona la versión del motor Unity que se desea instalar.

Paso 3: Añadir módulos a la versión de Unity

Los módulos extienden la funcionalidad de Unity y se pueden añadir en cualquier momento, no necesariamente al momento de instalar Unity.

El Visual Studio es el editor de Scripts oficial que se utiliza con Unity, aunque se pueden utilizar otros editores si se lo prefiere.

Fig. 5: Ventana de selección de módulos para añadir al motor Unity. Módulo Visual Studio para editar Scripts seleccionado.

Dependiendo de nuestra plataforma objetivo serán los módulos que tengamos que instalar, por defecto el motor exporta para el sistema operativo Windows.

Si se quiere exportar para móviles Android y publicar juegos y aplicaciones en Google Play se necesitan los módulos que se ven en la figura 6. Android Build Support, Android SDK & NDK Tools y el módulo OpenJDK. Si se quiere exportar juegos y aplicaciones que funcionen en navegadores, en páginas como Itch.io o en una página web de su propiedad, se necesita instalar el módulo WebGL Build Support

Fig. 6: Módulo Android para exportar juegos y aplicaciones Android con Unity.
Fig. 7: Módulo WebGL para exportar juegos y aplicaciones para navegadores con Unity.

Una vez que se eligen los módulos, se pulsa el botón Next, se aceptan los términos y condiciones y la instalación comienza.

Paso 4: Finalizar instalación y crear nuevo proyecto

Cuando la instalación termina, en la pestaña «Installs» nos aparece la nueva versión (figura 3), haciendo clic en los tres puntitos de la esquina superior derecha de cada versión se pueden añadir nuevos módulos o eliminar la versión.

Ahora si vamos a la sección «Projects» podemos crear un proyecto nuevo utilizando el botón «New» o la flecha que se encuentra a la derecha, esta última acción nos permite elegir el motor para crear el nuevo proyecto, como se observa en la figura 9.

Fig. 8: Ventana de gestión de proyectos Unity.
Fig. 9: Botón para crear un nuevo proyecto seleccionando la versión del motor Unity a utilizar.

Al crear un nuevo proyecto se abre la ventana que se ve en la figura 10, donde podemos darle un nombre al proyecto, elegir la plantilla que más se adapte a lo que queramos hacer, elegir la ubicación de los archivos del proyecto y finalmente crear el proyecto con el botón «Create».

Fig. 10: Configuración inicial de un proyecto en Unity.

Introducción

Este artículo pertenece a la serie sobre encontrar las referencias de GameObjects y Componentes en Unity, en esta serie se verán distintas técnicas para encontrar desde un Script cualquier objeto que esté en la jerarquía en una determinada escena en Unity, esto es algo muy importante que hay que entender y saber cómo hacerlo ya que si contamos con la referencia de un objeto o componente, podremos accederlo y leer cualquier dato público o ejecutar cualquier función pública que necesitemos.

En el siguiente vídeo explico cómo extraer una componente de un GameObject en Unity.


Condiciones iniciales

Partimos de un Script llamado «FindReferenceOfAnObject» en el que vamos a encontrar la referencia de un cierto GameObject que está en la escena en Unity, dentro del Script usaremos esa referencia para imprimir su nombre en consola con la instrucción de la línea 13 de la figura 1.

Fig. 1: Script que vamos a utilizar para ver los distintos métodos.

La jerarquía de la escena que vamos a usar está compuesta por los GameObjects que se observan en la figura 2, el objeto «Script-GameObject» es el que tiene asignado el Script de la figura 1 y es el que se encargará de encontrar las referencias, en la figura 3 se ve el inspector de este GameObject, donde está asignado el Script.

El objeto «GDT (Object to Find)» que se ve en la figura 2 es el objeto que tenemos que encontrar, así que si tenemos éxito deberíamos ver ese nombre impreso en consola.

Fig. 2: Jerarquía de la escena que vamos a utilizar para encontrar las referencias.
Fig. 3: Inspector del GameObject que tiene asignado el Script para encontrar referencias.

Cómo obtener la referencia de una COMPONENTE asignada a un GameObject

Consideremos que tenemos la referencia de un GameObject y sabemos que ese GameObject tiene una determinada componente asignada, por ejemplo un AudioSource, un RigidBody, una Camara o un Script que nosotros mismos creamos y le asignamos.

A partir de la referencia de este GameObject podemos acceder a las referencias de las componentes que tiene asignada, para eso usamos la variable que contiene el GameObject y con el operador punto ejecutamos la función GetComponent<T>(), siendo T el tipo de componente.

La función GetComponent dá como resultado el componente tipo T que se encuentra asignado al GameObject o devuelve null si ese GameObject no tiene una componente de ese tipo. Este resultado lo podemos asignar a una variable que sea del mismo tipo T y de esa forma conservar la referencia para usarla más adelante.

Introducción – Qué vamos a hacer y para qué

En este artículo vamos a ver un método que nos permitirá encontrar una COMPONENTE de un tipo específico en Unity desde un Script, por ejemplo encontrar una componente tipo AudioSource, Collider o incluso un Script que nosotros mismo hayamos creado y asignado a un GameObject. El propósito de eso es tener la referencia de ese componente dentro de nuestro Script y poder utilizarla de acuerdo a nuestras necesidades. Por ejemplo si queremos llamar una función que está definida en otro Script vamos a necesitar la referencia de la instancia de ese otro Script para poder hacerlo.

El método que vamos a ver consiste en utilizar una instrucción de código que revisa cada GameObject de la jerarquía y sus componentes hasta encontrar la componente del tipo que indiquemos, si hay una componente de ese tipo presente en la escena la instrucción la devolverá como resultado de ejecución y podremos almacenar esa componente en una variable o usarla inmediatamente para ejecutar alguna acción simple sobre el componente que encontramos. Si por el contrario no hay ninguna componente de ese tipo en ningún GameObject de la escena, la instrucción devolverá Null y eso podría conducir a un error de tipo NullReferenceException.

A continuación vamos a ver una lista de puntos clave acerca de este método:

  • Este método es efectivo cuando la componente que buscamos es única en la escena, si hay más de una componente del mismo tipo no hay garantías de encontrar precisamente la que estamos buscando.
  • Es recomendable usar este método en alguna función de inicialización como Awake o Start.
  • No se recomienda usar este método dentro de funciones de actualización como Update porque implican recorrer en el peor de los casos toda la jerarquía de la escena. A menos que se controle de algún modo el flujo del programa para que la instrucción se ejecute una única vez.
  • Si la componente que se quiere buscar se va a usar más de una vez es recomendable encontrarla una vez y almacenarla en una variable global para poder usarla cuantas veces sea necesaria.

En este vídeo vemos cómo implementar este método para encontrar una componente que es única en la escena

Luego de encontrar esa componente de la escena la usamos para referenciar a su GameObject porque esa es la idea de la serie de vídeos, pero esta parte no es necesaria, se puede usar la componente para lo que se necesite.


Condiciones iniciales

Partimos de un Script llamado «FindReferenceOfAnObject» en el que vamos a encontrar la referencia de un cierto GameObject que está en la escena en Unity, dentro del Script usaremos esa referencia para imprimir su nombre en consola con la instrucción de la línea 13 de la figura 1.

Fig. 1: Script que vamos a utilizar para ver los distintos métodos.

La jerarquía de la escena que vamos a usar está compuesta por los GameObjects que se observan en la figura 2, el objeto «Script-GameObject» es el que tiene asignado el Script de la figura 1 y es el que se encargará de encontrar las referencias, en la figura 3 se ve el inspector de este GameObject, donde está asignado el Script.

El objeto «GDT (Object to Find)» que se ve en la figura 2 es el objeto que tenemos que encontrar, así que si tenemos éxito deberíamos ver ese nombre impreso en consola.

Fig. 2: Jerarquía de la escena que vamos a utilizar para encontrar las referencias.
Fig. 3: Inspector del GameObject que tiene asignado el Script para encontrar referencias.

Cómo encontrar la referencia de un GameObject que tiene una componente específica

Si sabemos que el GameObject que nos interesa encontrar tiene asignada una componente específica, como por ejemplo un componente «Camera», «Rigidbody», «AudioSource» o un Script que nostros mismo hayamos creado, podemos usar esa información para dar con la referencia del GameObject.

Voy a crear un Script llamado «SomeScript» y lo voy a asignar al GameObject que queremos encontrar, como se observa en las figuras 4 y 5.

Fig. 4: Creación de un nuevo Script llamado «SomeScript».
Fig. 5: El Script se asigna al objeto que se quiere encontrar.

Utilizando la instrucción «FindObjectOfType<T>()», donde T es el tipo de objeto que estamos buscando (en nuestro caso es de tipo «SomeScript»), podemos encontrar la referencia de la instancia «SomeScript» que está asignada a ese GameObject, luego usando el operador punto podemos acceder al GameObject al cual ese Script está asignado.

La instrucción que hace todo esto la vemos en la línea 20 de la figura 6.

Fig. 6: Instrucción para encontrar la referencia del objeto tipo «SomeScript» y luego obtener el GameObject al cual está asignado.

Cuando se ejecute esta instrucción, Unity revisará todos los objetos de la jerarquía y cada una de sus componentes hasta dar con el objeto de tipo «SomeScript», cuando lo encuentra lo devuelve como resultado, pero como nos interesa el GameObject al cual está asignado ese Script, utilizamos el punto y accedemos al campo «gameObject». Si no hay ningún objeto que tenga asignada la componente «SomeScript» tendremos un error de referencia nula.

Para tener en cuenta, si tenemos más de un GameObject que tiene asignada la componente que estamos buscando, Unity nos devolverá la primer componente que encuentre en su registro, en este caso pueden surgir ambigüedades, podríamos obtener la referencia de un objeto distinto al que queremos.

Introducción

Este artículo pertenece a la serie sobre encontrar las referencias de GameObjects y Componentes en Unity, en esta serie se verán distintas técnicas para encontrar desde un Script cualquier objeto que esté en la jerarquía en una determinada escena en Unity, esto es algo muy importante que hay que entender y saber cómo hacerlo ya que si contamos con la referencia de un objeto o componente, podremos accederlo y leer cualquier dato público o ejecutar cualquier función pública que necesitemos.

Aquí tienes la lista de reproducción sobre encontrar las referencias en Unity, en esa lista se irán añadiendo vídeos con técnicas cada vez más específicas. El siguiente vídeo habla sobre la técnica que se muestra en este artículo:

Tengo un par de vídeos en los que justamente explico cómo acceder a los childs

En este primer vídeo vemos cómo encontrar el primer CHILD de un GameObject a través de código en Unity


En este otro vídeo vemos cómo encontrar TODOS LOS CHILDS de un GameObject a través de código en Unity



Condiciones iniciales

Partimos de un Script llamado «FindReferenceOfAnObject» en el que vamos a encontrar la referencia de un cierto GameObject que está en la escena en Unity, dentro del Script usaremos esa referencia para imprimir su nombre en consola con la instrucción de la línea 13 de la figura 1.

Fig. 1: Script que vamos a utilizar para ver los distintos métodos.

La jerarquía de la escena que vamos a usar está compuesta por los GameObjects que se observan en la figura 2, el objeto «Script-GameObject» es el que tiene asignado el Script de la figura 1 y es el que se encargará de encontrar las referencias, en la figura 3 se ve el inspector de este GameObject, donde está asignado el Script.

El objeto «GDT (Object to Find)» que se ve en la figura 2 es el objeto que tenemos que encontrar, así que si tenemos éxito deberíamos ver ese nombre impreso en consola.

Fig. 2: Jerarquía de la escena que vamos a utilizar para encontrar las referencias.
Fig. 3: Inspector del GameObject que tiene asignado el Script para encontrar referencias.

Cómo encontrar al HIJO de un GameObject desde un Script en Unity

Tal vez nos interesa obtener la referencia de un GameObject que sabemos que está como hijo de otro GameObject del que si tenemos la referencia, por ejemplo, en la figura 4 vemos que el objeto que queremos encontrar está como hijo del GameObject que tiene asignado el script. En el artículo sobre «gameObject» y «transform» vimos cómo acceder al objeto que tiene el Script asignado, por lo tanto contamos con la referencia del padre del objeto que queremos encontrar y podemos aplicarle distintas acciones, entre ellas obtener sus hijos.

Fig. 4: El objeto que queremos encontrar está como hijo del objeto que tiene asignado el Script.

Para encontrar el hijo de un GameObject en Unity vamos a usar la componente Transform del GameObject padre, la cual podemos acceder directamente a través de la variable «transform».

Sobre la referencia de la componente Transform del padre ejecutamos el método GetChild(int index) que permite obtener la componente transform del objeto hijo que esté en la posición indicada entre paréntesis. Los hijos comienzan a contarse desde la posición 0 y como el GameObject solo tiene un hijo (como se observa en la figura 4), a la función GetChild le pasamos como parámetro el valor 0.

Esto dá como resultado la transformación del hijo, pero como nos interesa obtener la referencia del GameObject no de su Transformación, utilizamos el operador punto y accedemos el campo «gameObject».

La instrucción queda como se observa en la línea 18 de la figura 5.

Fig. 5: Instrucción para encontrar la referencia de un GameObject que se encuentra como hijo de otro GameObject.

De esta forma, en la variable «objectToFind» tendremos asignada la referencia del objeto que estamos buscando.



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