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:
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.
Las variables «gameObject» y «transform» de MonoBehaviour en Unity
Cualquier Script que creamos que hereda de la clase MonoBehaviour tiene definido en su interior una serie de variables y funciones que ya vienen definidas en MonoBehaviour y en las clases de jerarquía más alta de las que hereda MonoBehaviour. En general cuando creamos un nuevo Script en Unity esta relación de herencia se establece de esa forma, si observan la línea 5 de la figura 1, al final termina con «: MonoBehaviour», esto le indica a Unity que la clase que se está definiendo extiende su comportamiento de la clase «MonoBehaviour», para más información sobre el tema dejo este artículo que habla sobre qué es una clase en Programación.
Podemos consultar la documentación de Unity para obtener más información acerca de la clase MonoBehaviour, ahí encontraremos todos los miembros que están definidos en esa clase, es decir las variables y las funciones, y también los miembros heredados de clases superiores, en la figura 4 vemos una captura de las variables heredadas y entre ellas las variables «gameObject» y «transform».
Fig. 4: Miembros heredados de la clase MonoBehaviour.
En las desscripciones nos dice que: la variable «gameObject» apunta al GameObject al cual este componente está asignado y dice que un componente SIEMPRE está asignado a un GameObject. Con «este componente» se refiere al MonoBehaviour sobre el que se esté trabajando, en nuestro caso los Scripts que estamos editando. Y la variable «transform» interpretando la descripción nos dice que apunta a la componente Transform del GameObject al cual este componente está asignado. Un detalle importante es que un GameObject SIEMPRE tiene asignado como mínimo un componente Transform.
Entonces si el GameObject que queremos utilizar dentro de nuestro Script es precisamente el mismo GameObject al cual el Script está asignado, la referencia de este GameObject ya está definida dentro de un campo interno de la clase MonoBehaviour, el campo llamado «gameObject» (primera letra con minúscula), este nombre hace referencia al mismo objeto al cual el Script está asignado.
Fig. 5: Instrucción que asigna la referencia del GameObject al cual el propio script está añadido.
En este caso no sería necesario definir el campo «objectToFind», sin embargo vamos a inicializarlo como venimos haciendo hasta ahora. En la línea 17 de la figura 5 asignamos «gameObject» a «objectToFind».
Al entrar en el modo juego, en la figura 6 vemos en el inspector que el objeto que está en el campo «Object To Find» es el mismo objeto que tiene asignado el Script, puede verse ya que el nombre del objeto en el campo «Object To Find» es el mismo que el nombre del GameObject (en la parte superior de la figura 6).
Fig. 6: Al entrar en el modo juego la referencia que se asigna es la del GameObject que tiene el Script.
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:
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 un GameObject de la escena por su TAG o ETIQUETA en Unity
Uno de los elementos que tiene todo GameObject en Unity es un Tag o etiqueta, se encuentra en la cabecera del inspector, como vemos en la figura 4. Podemos usar esta etiqueta para encontrar la referencia del GameObject de la escena en nuestro Script.
Por defecto los GameObjects tendrán asignado el Tag «Untagged», pero podemos asignar uno de los Tags que vienen predefinidos o crear nuevos Tags, en las figuras 4 y 5 muestro cómo crear un nuevo Tag en Unity.
Fig. 4: Pestaña para crear un nuevo Tag en Unity.
Fig. 5: Se introduce un nombre para el Tag y se guardan los cambios.
Una vez que hemos creado el Tag tenemos que asignarlo al objeto, volvemos a seleccionar el GameObject en el inspector desplegamos la ventana del Tag y lo elegimos, como se observa en la figura 6.
Fig. 6: Se asigna el Tag creado al objeto que se quiere encontrar la referencia en el Script.
Ahora estamos en condiciones de encontrar ese GameObject utilizando el Tag, para ello ejecutamos el método «FindGameObjectWithTag» de la clase GameObject y pasamos como parámetro el nombre del Tag que se quiere buscar. En la figura 7 vemos esta instrucción en la línea 16, noten que el nombre del Tag se ha definido en un String en la línea 11 y luego en la línea 16 pasamos como parámetro la variable.
Fig. 7: Instrucción para encontrar la referencia de un GameObject de la escena a través de su Tag.
Cuando se ejecute esta instrucción, Unity revisará todos los objetos de la jerarquía hasta que se encuentre con un GameObject que tenga ese tag asignado, en ese punto devuelve el objeto y nos queda almacenado en el campo «objectToFind». Si no hay ningún objeto que tenga ese Tag, el campo «objectToFind» tendrá valor null.
Para tener en cuenta, si tenemos más de un GameObject que tiene el mismo Tag asignado, Unity nos devolverá el primero de ellos 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
En este artículo vemos cómo encontrar un GameObject de la escena en Unity a través de su nombre, la idea de este procedimiento es aplicarlo dentro de un script, normalmente en una función de inicialización (como Awake o Start) y nos permite referenciar un GameObject de la escena desde el script y de esa forma aplicarle funciones o leerle variables.
Para encontrar un GameObject por su nombre en Unity se utiliza la siguiente instrucción:
GameObject.Find(«Nombre del GameObject»);
Esta instrucción se puede llamar desde cualquier Script y lo que hace es revisar cada uno de los elementos de la jerarquía hasta dar con aquel que se llama igual que el parámetro ingresado, en este caso «Nombre del GameObject«, este nombre podría ser cualquier nombre
En el siguiente vídeo muestro cómo encontrar objetos de la escena por su nombre en Unity.
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 un GameObject de la escena por su NOMBRE en Unity
Si conocemos el nombre del GameObject en la escena que queremos acceder podemos usar esa información para dar con la referencia en nuestro Script. Para eso utilizamos el método «Find» dentro de la clase GameObject y le pasamos como parámetro el nombre del objeto que se quiere encontrar, como se observa en la figura 4.
Fig. 4: Instrucción para encontrar la referencia de un GameObject de la escena por su nombre.
Cuando se ejecute esa instrucción, Unity recorrerá toda la jerarquía en busca de un GameObject con ese nombre, si lo encuentra lo devuelve y la referencia nos queda en la variable «objectToFind», pero si no lo encuentra esta variable tendrá valor null y nos dará el error de «NullReferenceException» si intentamos accederla.
Para tener en cuenta, si tenemos más de un objeto que tiene exactamente el mismo nombre, Unity nos devolverá el primero de ellos que encuentre en su registro, esto puede dar lugar a ambigüedades, es decir podríamos obtener la referencia de un objeto distinto al que estamos buscando.
Para evitar incrustar datos directamente dentro de las funciones lo que se puede hacer es definir un String con el nombre del objeto que se quiere encontrar y luego ejecutar la función «Find» pasando como parámetro el String, de esa manera evitamos hacer Hard-Coding, como se observa en la figura 5.
Fig. 5: Se declara un string con el nombre del objeto a encontrar y con esto se evita hacer Hard-Coding.
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 muestro cómo definir una variable en Unity para que aparezca en el inspector y así poder asignar un GameObject de la escena en ella.
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.
Declaración del campo con visibilidad pública
Los campos y variables que se declaran dentro de un Script pueden tener tres tipos de visibilidad: «pública», «privada» y «protegida». Consideremos solo los dos primeros casos, visibilidad privada y pública, en el primer caso el campo declarado como privado no será accesible desde contextos externos al propio Script en el que está definido, mientras que si es declarado con visibilidad pública se puede acceder directamente a ese dato desde otros Scripts. En Unity además se pueden ver los campos públicos en el inspector.
En la figura 4, línea 8 declaramos un campo de tipo GameObject llamado «objectToFind» indicándole la visibilidad pública colocando la palabra «public» por delante.
Fig. 4: Declaración del campo con visibilidad pública.
La figura 5 es una captura de la ventana Inspector del GameObject que tiene asignado el Script que estamos editando, como se observa, el campo «objectToFind» aparece en el inspector (algo que no se veía en la figura 3 con el Script de la figura 1), lo que significa que ahora podemos asignar manualmente el GameObject que queramos almacenar en la variable «objectToFind», es decir podemos asignar manualmente la referencia del objeto.
Esto puede hacerse de dos formas, una es tomando el GameObject de la jerarquía y arrastrándolo al campo, mientras que la otra forma es utilizando el ícono del círculo con el punto que se observa a la derecha del campo (en las figura 5 o 6), esto desplegará una ventana en la que podemos elegir el objeto que queremos asignar.
Fig. 5: En el inspector vemos que aparece el campo declarado como público.
Fig. 6: Se ha asignado manualmente el objeto que se quería encontrar.
Al entrar en el modo juego vemos el mensaje en consola que muestra el nombre del objeto que fue asignado en el campo, esto se produce debido a la ejecución de la instrucción que se observa en la figura 4 (línea 13) y nos confirma que tenemos la referencia del GameObject, ya que pudimos usarla para leer su nombre.
Fig. 7: Al entrar en el modo juego vemos el mensaje en consola con el nombre del objeto.
Alternativa: Declarar el campo como privado incluyendo [SerializeField]
Si se desea mantener la variable con visibilidad privada para que otros Scripts no puedan acceder directamente a ese campo, hay una alternativa para que el campo aparezca en el inspector, consiste en añadir «[SerializeField]» antes de la declaración, como se observa en la figura 8.
Fig. 8: Alternativa a definir el campo con visibilidad pública.
Con esto la variable «objectToFind» será visible desde el inspector y se puede asignar el objeto manualmente en el inspector.
Introducción
En este artículo vamos a ver cómo funciona un Joystick para Android para usar en Unity que se puede descargar e importar.
Descargar Joystick para Android
A continuación puedes descargar el paquete de Unity para importar en tu proyecto, dentro del paquete encontrarás todos los Assets necesarios para implementar este joystick para Android.
Explicación sobre cómo adaptar este joystick para Android en tu proyecto de Unity
En este artículo vamos a ver un algoritmo implementado en C# en Unity que se encarga de tomar un string que contiene una frase y separarlo en un array de strings que contiene las palabras que componen esa frase, luego intercambia dos de esas palabras aleatoriamente y finalmente rearma la frase en un nuevo string añadiendo los espacios.
Descargar paquete para Unity
En el siguiente vídeo explico como implementar un ALGORITMO para separar frase en palabras con lenguaje C# en Unity
En este artículo vamos a ver un prototipo de un sistema de teletransportación para Unity, que consiste en una serie de anillos interconectados, cuando un objeto que tiene asignado un componente Rigidbody ingresa por un anillo, saldrá por el anillo de salida designado, en el proceso se conserva su rapidez pero la dirección del movimiento será la dirección que tenga el anillo de salida.
🟢 VÍDEO: Descripción del funcionamiento del sistema de Teletransportación para Unity
En el siguiente enlace se pueden descargar el paquete para importar en Unity.
Introducción
La palabra instancia en informática se utiliza con distintos significados, por ejemplo podemos hablar de la instancia de un programa de computadora para referirnos al programa que se está ejecutando.
En este artículo vamos a ver el concepto de INSTANCIA en el ámbito de la programación orientada a objetos, osea las instancias que se crean a partir de una determinada CLASE de Programación.
Antes de enteder el concepto de INSTANCIA en programación es necesario saber qué es una clase en programación, puedes consultar el artículo detallado, pero para resumirlo, una clase es una estructura de datos donde se definen los campos y funciones que modelan el comportamiento de un determinado objeto.
Por ejemplo, si tenemos una clase llamada «Gato» algunos de sus propiedades pueden ser el «Nombre» y el «Color del pelaje», mientras que algunas de sus funciones podrían ser «Comer» y «Maullar».
La clase Gato permitirá crear objetos tipo Gato y cada uno de estos objetos será una INSTANCIA de la clase Gato, en su interior tendrán definidos las propiedades y las funciones que se definieron en la clase, pero la información que haya en sus campos será propia de cada INSTANCIA, es decir cada objeto será una instancia independiente con un estado propio, esto hace que podamos tener por ejemplo dos instancias de la clase Gato cada una con un nombre y pelaje distinto.
Los objetos de programación son entes abstractos que existen en la memoria de los ordenadores, el concepto es muy útil porque permite una gran abstracción para solucionar problemas.
Constructores
Para crear una INSTANCIA de una clase se utilizan los llamados «Constructores«, funciones que nos permiten ingresar los datos del objeto y nos devuelven como resultado la referencia del objeto creado.
Un ejemplo de un Constructor para la clase Gato en algunos lenguajes de programación como Java y C# podría ser el siguiente:
public Gato(string name,Color color){ nombre=name; colorDelPelaje=color; }
Luego para construir el objeto se usa la instrucción «new», por ejemplo de esta forma:
Gato unGato = new Gato(«Charles»,Color.white);
Esto creará un objeto de la clase Gato con nombre «Charles» color blanco y la referencia del objeto la tendremos almacenada en el campo «unGato».
Ejemplos de INSTANCIAS de objetos en Unity
En Unity en la gran mayoría de los casos no necesitaremos definir constructores para las clases ni usar la instrucción «new», ya que hay muchas cosas de las que se encarga el motor. En general los Scripts que se crean en Unity son MonoBehaviours por lo que Unity se encarga de crear estos objetos, nosotros simplemente tenemos que indicarle cuándo o dónde crearlos.
Vamos a ver el concepto de Instancia en programación aplicado al motor Unity con el siguiente ejemplo de la clase Gato, los nombres estarán en inglés pero en escencia es lo mismo que vimos al principio del artículo.
Definición de la clase Gato
Comenzamos creando un nuevo Script haciendo clic derecho sobre la carpeta Assets, entrando en «Create» y eligiendo «C# Script», le ponemos el nombre «Cat», este Script definirá la clase «Gato» de la que hablamos antes.
Fig. 1.a: Creamos un nuevo Script llamado «Cat» en Unity.
Al crear un nuevo Script, Unity se encarga de definir una clase que lleve ese mismo nombre, hará que herede de la clase MonoBehaviour y definirá algunas funciones útiles como Start y Update, en la figura 1.b se ve el Script tal cual lo definió Unity.
Fig. 1.b: Script genérico creado por Unity con algunos elementos definidos.
Vamos a modificarlo de la siguiente manera:
Fig. 2: Campos y métodos de la clase «Cat».
Como se observa en la figura 2 se han definidos dos campos, un string llamado «catName» para el nombre del Gato y un Color llamado «furColor» para el color del pelaje. Además se han añadido dos funciones, Eat() que hace que el Gato coma y Meow() hace que el Gato emita un maullido.
Crear INSTANCIAS de la clase Gato
La gran mayoría de Scripts que creemos en Unity van a ser similares a esto en el sentido en el que heredarán de la clase MonoBehaviour. Para crear una INSTANCIA de este tipo de objetos basta con añadirlos a algún GameObject de la jerarquía de Unity.
Comencemos creando objetos vacíos que contendrán las INSTANCIAS de la clase Gato, en la figura 3 se muestra cómo crear un GameObject vacío.
Fig. 3: Creamos objetos vacíos para asignar instancias de la clase.
En la figura 4 vemos dos GameObjects, uno llamado Cat1 y otro Cat2, ambos tendrán una instancia de la misma clase Gato.
Fig. 4: Dos GameObjects que tendrán una instancia de la clase cada uno.
Para crear las INSTANCIAS de la clase Gato hay que añadir el Script en cuestión como una componente del GameObject, esto se puede seleccionando el GameObject al que se le quiere añadir el componente y tomar el Script de la carpeta Assets y arrastrarlo al inspector. Otra forma de añadir el componente es usando el botón «Add Component» que aparece en el inspector.
En las figuras 5 y 6 se ve el inspector de los GameObjects Cat1 y Cat2 de la figura 4, como se observa, cada uno tiene una componente tipo «Cat», es decir cada uno tiene asignada una INSTANCIA de la clase Cat. Observen además como sus campos «catName» y «furColor» en cada caso tienen información diferente, ya que cada INSTANCIA representa a un Gato individual.
Fig. 5: Instancia de la clase «Cat» asignada el GameObject «Cat1».
Fig. 6: Instancia de la clase «Cat» asignada el GameObject «Cat2».
Con esto hemos creado dos instancias de la clase Cat, como un detalle extra las instancias pueden estar asignadas al mismo GameObject, como se muestra en la figura 7.
Fig. 7: Dos instancias de la clase «Cat» asignadas al mismo GameObject.
Introducción
Una de las cosas más importantes que tenemos que entender en programación orientada a objetos es el concepto de «REFERENCIA», saber qué es una referencia y cómo encontrarla nos permitirá manipular cualquier objeto, acceder a sus datos y a sus funciones públicas.
En este artículo veremos el concepto de Referencia en programación con un ejemplo en Unity. En un Script definiremos un campo que luego inicializaremos con la referencia de un objeto y la utilizaremos para cumplir alguna función.
He creado una lista de reproducción con vídeos mostrando distintos métodos para encontrar las referencias de los objetos, puedes verla a continuación:
🟢 VÍDEO: El concepto de REFERENCIA en programación orientada a objetos
Cuando hablo sobre el funcionamiento de los Scripts en mis vídeos suelo usar la palabra «REFERENCIA» con bastante frecuencia, es un término algo complicado de enteder si apenas se está comenzando a estudiar programación, ya que involucra conocimientos de programación orientada a objeto, como el concepto de clase, objeto e instancia. Veamos qué es una referencia en programación utilizando la siguiente analogía:
Imaginemos un contenedor donde podemos colocar un único objeto de alguna clase en particular, por ejemplo una caja que solo puede contener libros. Nos han encomendado la función específica de mirar dentro de la caja en algún momento y escribir en una pizarra el nombre del libro que está en su interior en ese momento.A medida que pasa el tiempo la caja podría quedar vacía o ir cambiando el libro que está en su interior, así que dependiendo del momento en el que ejecutemos nuestra acción podríamos observar distintos libros o incluso ninguno.
Lo importante es que podremos cumplir nuestro objetivo solo si hay un libro dentro del contenedor, ya que de esa forma podremos acceder a él y leer su nombre, en otras palabras, podremos acceder a ese objeto en particular y leer su nombre (además acceder a cualquiera de sus datos y hacer uso de él) sólo si contamos con la referencia de este objeto, ya que si la referencia es nula no hay ningún objeto al cual acceder ni leer su nombre.
Aquí termina la analogía, ahora intentemos llevar esto al campo de aplicación de la programación, con un ejemplo en Unity.
Ejemplo en C# Unity
Supongamos que en nuestro Script definimos una variable tipo GameObject, con la siguiente instrucción:
GameObject aParticularBook;
Como se observa en la siguiente imagen:
Fig. 1: Se define un campo para un objeto tipo GameObject llamado «aParticularBook».
Con esto estamos declarando un dato de este tipo, pero Unity no sabe quién es ese dato, podría ser cualquier GameObject que esté en la jerarquía o en la carpeta Assets, entonces lo que hace es asignarle el valor «null» a ese objeto.
Error «NullReferenceException» y «UnassignedReferenceException» en Unity
Si queremos hacer uso del objeto, es decir acceder a sus datos o a sus funciones, primero tenemos que encontrar la referencia de ese objeto en particular que queremos utilizar, es decir indicarle a Unity cuál es el objeto con el que vamos a trabajar. De lo contrario, si intentamos usar directamente ese objeto sin que Unity sepa de qué objeto se trata, osea es un objeto nulo, obtendremos un error en consola de tipo «NullReferenceException», es decir «excepción de referencia nula».
En la figura 2 coloco una instrucción en el método Start que imprimirá el nombre del GameObject que esté asignado en el campo «aGameObject», Start es una de las primeras funciones en ejecutarse.
Fig. 2: Instrucción para imprimir en consola el nombre del GameObject que esté asignado.
Para que el Script se ejecute hay que asignarlo al menos a un GameObject en la jerarquía, así que elijo uno de ellos y le asigno el Script, en la figura 3 vemos el GameObject que tendrá asignado el Script y en la figura 4 el inspector de ese objeto donde se ve asignado el Script.
Fig. 3: El GameObject que tiene el Script asignado y se encargará de ejecutar las instrucciones.
Fig. 4: En el inspector vemos el script asignado entre sus componentes.
Al entrar en el modo juego se ejecutará la línea 12 que se ve en la figura 2, pero como el objeto no fue inicializado y la referencia es actualmente nula, se obtiene el mensaje «NullReferenceException» en consola:
Fig. 5: Al entrar en el modo juego se obtiene el error «NullReferenceException» debido a que el campo es nulo.
Ahora vamos a definir el campo con visibilidad pública, esto tiene varias implicaciones, una de ellas es que podremos visualizar ese campo en el inspector de Unity y asignar la referencia manualmente, como se observa en la figura 7.
Fig. 6: Se añade visibilidad pública al campo.
Fig. 7: Una consecuencia de tener visibilidad pública en Unity es que ese campo aparece en el inspector.
Observen que ademas en el campo del inspector en la figura 7 nos está indicando «None» y entre paréntesis «GameObject», esto quiere decir que actualmente no hay ninguna referencia asignada y además nos indica el tipo de objeto que admite el campo, en este caso GameObject.
Si intentamos correr el juego en estas condiciones nuevamente obtenemos un mensaje de error, que esta vez dice: «UnassignedReferenceException», es decir un error de referencia no asignada.
Fig. 8: Al entrar en el modo juego el error cambia a «UnassignedReferenceException.
Asignación de referencias en Unity
Voy a crear tres empty GameObjects en la jerarquía y le voy a poner los nombres que se ven en la figura 9.
Fig. 9: Voy a crear tres GameObjects con distinto nombre a modo de ejemplo.
Una forma de asignar una referencia en el campo que aparece en el inspector es utilizar el botón a la derecha del campo y luego elegir el objeto de la lista, como se observa en las imágenes 10 y 11.
Fig. 10: Pulsando el botón a la derecha del campo podemos desplegar una lista de objetos para asignar.
Fig. 11: Elegimos algún GameObject de la lista, por ejemplo el GameObject llamado «BookA».
También se puede tomar el objeto de la jerarquía y arrastrarlo al campo en el inspector, como se observa en la figura 12.
Fig. 12: Otra alternativa sería tomarlo de la jerarquía y arrastrarlo hasta el campo.
Si ahora intentamos correr el juego, vemos que ya no tenemos errores en consola, el nombre del objeto que tenemos asignado se imprime en la consola, gracias a que hemos asignado una referencia en el campo, si colocáramos otro objeto con un nombre distinto en ese campo el mensaje en consola cambiaría porque estaríamos haciendo referencia a otro objeto.
Fig. 13: Ahora al entrar en el modo juego, la impresión del nombre se realiza exitosamente porque se cuenta con la referencia del objeto.
Introducción
En este artículo vamos a ver cómo hacer en Unity que una determinada acción ocurra hasta que el usuario decida lo contrario o que esta acción sólo se lleve a cabo la primera vez que se inicia el juego.
En el siguiente vídeo pueden ver la explicación sobre el funcionamiento de este prototipo.
Prototipo para descargar
A continuación puedes descargar un paquete de Unity con el sistema funcionando.
Introducción
Cuando exportamos un modelo 3D en formato FBX en Blender, en el interior del archivo no solo está la información del Mesh (malla 3d), sino que se añaden varios elementos extra, por ejemplo el mapa UV, los materiales e incluso los colores de los materiales. Estos elementos extra pueden ser recuperados en otro Software en el que usemos el modelo 3D, por ejemplo Unity, sin embargo las texturas no se suelen incluir automáticamente en el archivo FBX. En este artículo veremos cómo EXPORTAR un modelo 3D de Blender a Unity y también cómo empaquetar las texturas en el archivo FBX en Blender. Además encontrarás una serie de vídeos de mi canal relacionados al tema de exportar modelos de Blender a Unity y el problema con las texturas.
Algunas recomendaciones antes de exportar el modelo a Unity
Si pulsas los links de «Más información aquí» se abrirán en pestañas separadas, no perderás esta ventana.
Utiliza nombres representativos para tus objetos en Blender, los nombres de los objetos en el Outliner en Blender serán los mismos nombres de los objetos en la jerarquía de Unity.
Asegúrate de que no haya vértices duplicados en tu modelo. Más información aquí.
Asegúrate que las longitudes de tu modelo tengan sentido luego de normalizar la escala. Más información aquí.
Tengo 3 vídeos para recomendarte sobre exportar de Blender a Unity
#1 Método básico para exportar MODELO 3D con TEXTURAS de Blender a Unity
Esto es lo mejor que puedo ofrecerte si lo que buscas es simplemente llevar un modelo con texturas de Blender a Unity, este vídeo es la última parte de una mini serie que hice sobre modelado en 3D en Blender para Unity. Puedes ver la lista de 5 vídeos haciendo clic aquí.
#2 – Sobre exportar MATERIAL PROCEDURAL con nodos hecho en Blender a Unity
Cuando creamos un material en Blender utilizando nodos como el nodo de ruido, nodo mix RGB, entre otros, los colores que estamos aplicando al modelo 3D al final son el resultado de operaciones matemáticas, por esta razón, al exportar un modelo 3D e importarlo en Unity no se incluyen los nodos definidos en Blender, es decir no podremos ver esa textura generada proceduralmente sobre el modelo 3D.
Pero NO TODO ESTÁ PERDIDO, puedo ofrecerte la siguiente solución:
Podemos generar un conjunto de texturas para el color y mapa de normales a partir de los nodos aplicados al modelo 3D, este proceso se conoce como «BAKE». Luego esas texturas las podremos llevar a Unity y aplicarlas a un material que luego asignaremos al modelo 3D, de esa forma podremos aprovechar en Unity los materiales que tanto nos costó hacer en Blender.
Explico el procedimiento de «Baking» en el siguiente vídeo, no es un procedimiento fácil así que no te quedes solo con el paso a paso sino con los detalles que voy dando a medida que vamos avanzando:
#3 – Cómo EMPAQUETAR texturas dentro del archivo FBX
Este vídeo es un MÉTODO ALTERNATIVO al primer vídeo que hice por si necesitas algo un poco más específico. En el siguiente vídeo muestro cómo hacer que las texturas que se aplican a un material en Blender se copien dentro del archivo FBX que se exporta en Blender y luego muestro cómo extraer esas texturas en Unity.
Esto es un procedimiento muy particular y si no estás seguro de que esto es exactamente lo que necesitas RECOMIENDO VER EL VÍDEO 1.
Pasos resumidos para exportar modelo con texturas en Blender a Unity
1. Seleccionar los modelos que se quieren exportar, asegurándose que tienen aplicado materiales con texturas.
2. Ir a File > Export > FBX y marcar la casilla «Select Objects» para exportar sólo los objetos seleccionados.
3. Cambiar el parámetro «Path Mode» a «Copy» y pulsar el botón «Embed Textures» que se encuentra a la derecha del menú desplegable «Path Mode».
4. Darle un nombre, exportar y luego trasladar el archivo a Unity.
5. Seleccionar el modelo e ir a la pestaña materiales en el inspector. Hacer clic en la opción «Extract Textures» y elegir la carpeta de destino. Esto extraerá las texturas del archivo FBX y en mi caso se aplican automáticamente.
Proceso detallado para exportar modelo con texturas de Blender a Unity
Ahora vamos a ver detalladamente la secuencia de pasos anterior, consiste en dos partes, una parte que se hace en Blender y otra que se hace en Unity.
Blender
Partimos desde un modelo que tiene texturas aplicadas en Blender como el que se observa en la figura 1. Asegurarse de seleccionar todos los elementos que se quieren exportar.
Fig. 1: Partimos de un modelo 3D que tiene un material con una textura aplicada.
Vamos a la pestaña FIle > Export y elegimos la opción FBX, esto abrirá la ventana de exportación, ahí podemos elegir la carpeta de destino y el nombre del archivo, como una recomendación personal siempre marco la casilla «Selected Objects» para que solo se exporten los modelos que he seleccionado, de lo contrario se exportarían objetos en mi caso no deseados, por ejemplo las luces o cámaras que pueda haber en la escena.
Fig. 2: Se procede a exportar el modelo en formato FBX.
Fig. 3: En los parámetros de exportación se puede marcar la casilla «Selected Objects» para tener el control sobre los elementos a exportar.
Para que las texturas se incluyan dentro del archivo es necesario hacer dos cosas, la primera es cambiar el parámetro «Path Mode» a «Copy», como se observa en la figura 4. Lo segundo es marcar el botón «Embed Textures» que se encuentra a la izquierda del menú desplegable Path Mode, como se ve en la figura 5, esto incluirá las texturas dentro del archivo FBX.
Fig. 4: Para poder empaquetar las texturas en el archivo FBX cambiamos el Path Mode a «Copy».
Fig. 5: Activamos la opción «Embed» lo que incluirá las texturas en el archivo FBX.
Unity
Una vez exportado el modelo con el método anterior, llevamos ese archivo FBX a Unity, deberíamos ver algo similar a lo que se ve en la figura 6. Dentro del modelo solo vemos los meshes y materiales que estén incluídos, las texturas no están a simple vista.
Fig. 6: Llevamos el modelo 3D a Unity, las texturas no aparecen automáticamente.
Con el modelo seleccionado vamos a la ventana Inspector y entramos en la pestaña «Materials», figura 7. Dentro de Materials tenemos un botón para extraer las texturas, lo pulsamos y elegimos la carpeta de destino en la ventana emergente.
Fig. 7: En el inspector del modelo vamos a la pestaña materiales.
Fig. 8: Hacemos clic en la opción «Extract Textures» y seleccionamos la carpeta de destino.
Con esto se extraen las texturas que vengan dentro del modelo e incluso se aplican al material.
Fig. 9: Se extraen las texturas que vienen empaquetadas en el archivo FBX.
En este artículo muestro cómo se puede hacer un menú de selección de personajes, explicando el funcionamiento de un prototipo que implementa este sistema y que se pueden descargar e importar.
Descargar el prototipo de selección de personajes para Unity
Dos vídeos que explican el funcionamiento de este sistema de selección de personajes
A continuación tienes dos vídeos en los que se explica cómo funciona el sistema de selección de personajes para Unity que te puedes descargar en el enlace de arriba. El vídeo de la izquierda es la parte 1 en la que se habla en general de cómo está compuesta la escena y un poco sobre el funcionamiento del sistema al pulsar los botones de la interfaz gráfica. En el vídeo de la derecha vemos el funcionamiento interno de los scripts que controlan este sistema de selección de personajes para Unity.
En la figura 1 se ven los Assets que contiene el paquete, hay dos escenas, una para el menú de selección de personaje y otra para la escena del juego en la que aparece el personaje elegido en el menú.
Hay tres Scripts, CharacterSelectionMenu se encarga de la lógica del menú de selección, GameControl se encarga de la lógica de la escena del juego, es decir colocar el personaje elegido en la escena y el Script PlayerController permite controlar al personaje en la escena del juego.
En la carpeta Assets están los Sprite sheets de los personajes y las animaciones y en la carpeta Prefab los GameObject de los personajes que aparecen en el menú y en la escena del juego.
Fig. 1: Assets que vienen en el paquete del menú de selección de personajes para Unity.
Importante – Prueba de funcionamiento del prototipo
Al importar los Assets es necesario añadir las escenas del menú de selección y el juego a la compilación, de otra forma no va a funcionar el botón que pasa a la escena del juego. Para eso abrimos la escena del menú, vamos a File > Build Settings y hacemos clic en el botón «Add Open Scene», luego hacemos lo mismo para la otra escena. Si ambas escenas están añadidas deberían ver algo como lo que se observa en la figura 2 en la ventana Build Settings.
Fig. 2: Asegurarse de añadir las escenas de la figura 1 en File – Build Settings.
Escena del menú de selección de personajes
La escena del menú de selección se ilustra en la figura 3, consiste en un personaje situado al centro de la pantalla, dos botones para pasar al siguiente personaje o volver al personaje anterior y un botón para empezar a jugar.
Fig. 3: Escena del menú de selección de personajes con botones para cambiar de personaje y empezar el juego.
En la jerarquía tenemos un objeto que tiene asignado el script con la lógica de control del menú de selección de personajes, es el objeto resaltado en la figura 4.
Fig. 4: Jerarquía de la escena del menú, el GameObject seleccionado tiene el script de control.
En el inspector podemos ver el Script con sus campos, tenemos un array llamado «Player Objects» que se utiliza para almacenar los distintos personajes que el jugador puede elegir. Se le puede indicar el tamaño modificando el valor «Size» y luego arrastrar los objetos de los personajes a los campos que aparecen.
Fig. 5: Inspector del script de control del menú de selección de personajes.
Este prototipo funciona de la siguiente manera, en la escena colocamos todos los personajes disponibles, luego le damos el tamaño al array para que pueda almacenar esos objetos y luego arrastramos los objetos de los personajes desde la jerarquía hasta los espacios del array.
En la figura 6 vemos los objetos de los jugadores que están asignados en los espacios del array en la figura 5.
Fig. 6: Los objetos de los personajes disponibles se encuentran en la escena en posición.
Escena del juego
Cuando se pulsa el botón verde que se ve en la figura 3 se va a cargar la escena del juego en la que aparecerá el personaje elegido en el menú, como se ve en la figura 7.
Se puede controlar al personaje con las teclas WASD y para volver al menú principal se puede pulsar Escape o el botón azul del Canvas.
Fig. 7: Escena del juego en la que se utiliza el personaje elegido en la escena anterior.
En la jerarquía de la escena del juego tenemos un objeto llamado GameControl que tiene asignado el Script «GameControl» con la lógica para hacer aparecer en la escena el personaje que se ha elegido.
Fig. 8: Jerarquía de la escena del juego, el GameObject GameControl tiene asignado el script de control.
En el inspector podemos ver los parámetros de este Script, nuevamente tenemos un array de objetos para los personajes.
En este caso vamos a colocar los prefabricados de los objetos de los personajes, es decir GameObjects que debemos colocar en la carpeta Assets, el Script se encargará de instanciar el personaje elegido en el menú. Es importante que este array tenga el mismo tamaño que el array del menú y que los personajes estén añadidos en el mismo orden.
Fig. 9: Inspector del script GameControl que se encarga de colocar el personaje correcto en la escena.
El personaje elegido será colocado en la posición del GameObject que asignemos en el campo «Player Start Position» de la figura 9, en este caso he creado un objeto vacío llamado «StartPosition», lo vemos en la figura 10.
Fig. 10: El GameObject resaltado indica la posición donde aparecerá el personaje elegido.
Script de control del menú de selección de personajes
Vamos a analizar el script que se encarga de la lógica de la selección de personajes.
Campos
Comenzamos analizando los campos definidos en el Script, en la línea 9 de la figura 11 se define un array de GameObjects llamado «playerObjects», al estar definido como público aparece en el inspector. Luego tenemos una variable entera que funciona como índice para el personaje elegido, con esa variable accedemos al GameObject del array.
El string «gameScene» indica el nombre de la escena que hay que cargar cuando se pulsa el botón verde, es importante que el nombre coincida exactamente y se respeten mayúsculas, además la escena a cargar tiene que estar añadida en la ventana Build Settings.
El string «selectedCharacterDataName» es el nombre que se le dá a un dato que se guardará en memoria para saber cuál es el personaje elegido y poder colocarlo correctamente en las siguiente escena.
Fig. 11: Campos del Script de control del menú de selección de personajes.
Funciones
Ahora vamos a ver los métodos que están definidos en el Script de control del menú de selección.
Tenemos un método llamado «HideAllCharacters» que se va a encargar de ocultar todos los personajes de la escena, en el interior de esta función se recorren todos los elementos del array y se ejecuta la función SetActive con parámetro false para cada uno de sus elementos. En el artículo sobre cómo activar o desactivar GameObjects en Unity se explica el funcionamiento de este método, también puedes ver el vídeo aquí.
Fig. 12: Función para ocultar todos los objetos de los personajes. Esta función se llama al iniciar el juego.
Luego tenemos dos funciones públicas, una llamada «NextCharacter» y la otra «PreviousCharacter», estas funciones permiten seleccionar el personaje, lo primero que se hace es desactivar el GameObject actualmente seleccionado y luego se incrementa o decrementa el índice del personaje, reseteándolo si excede la cantidad total de elementos o haciéndolo igual a la cantidad de elementos menos uno si al decrementarlo resulta negativo. Finalmente se activa el personaje de acuerdo al valor del índice.
Fig. 13: Funciones para pasar al siguiente o al anterior personaje respectivamente. Estas funciones las ejecutan los botones del menú.
Luego tenemos una función pública llamada «StartGame» que será llamada por el botón «Play» del menú, esta función guarda en memoria el valor del índice utilizando PlayerPrefs, esta es una forma de pasar datos entre escenas en Unity, al tener el índice del personaje elegido en memoria, en la siguiente escena se lee ese valor y eso permite colocar el personaje correcto. Luego se ejecuta la función LoadScene de SceneManager para cargar la siguiente escena, para hacer esto se necesita implementar el namespace UnityEngine.SceneManagement (línea 4 de la figura 11).
Fig. 14: Función para empezar a jugar, esta función la ejecuta el botón verde de la figura 3.
La función Start se ejecuta al iniciar el juego, en ella lo primero que hacemos es ocultar todos los personajes usando la función «HideAllCharacters», línea 19 de la figura 15. Luego recuperamos el valor del índice almacenado en memoria, nos permite mostrar el último personaje elegido, en caso de no haber ningún valor en memoria se inicializará con el valor 0.
Finalmente se hace visible el GameObject del personaje elegido con el índice, ejecutando sobre éste la función SetActive con parámetro «true», línea 23 de la figura 15.
Fig. 15: Función Start en la que se establece el estado inicial del menú de selección de personajes.
Scripts de la escena del juego para instanciar el personaje elegido
Ahora vamos a analizar el Script de Control que se encuentra en la escena del juego, este Script identifica el personaje que fue elegido en la escena del menú de selección y lo coloca en una determinada posición.
Campos
Comenzamos analizando los campos definidos, en la figura 16 vemos un fragmento del Script GameControl, en la línea 9 tenemos un array público de GameObjects, este campo aparece en el inspector y ahí colocamos los prefabs de los personajes, es importante respetar la misma cantidad y el orden de los personajes como fueron definidos en el menú de selección.
En la línea 10 tenemos un componente Transform público, aquí colocaremos el objeto que indicará la posición donde aparece el personaje. Luego tenemos dos Strings, uno con el nombre de la escena del menú de selección y otro con el nombre del dato en memoria en el que está almacenado el índice del personaje. En la línea 13 se define una variable entera para almacenar el valor del índice y por último, en la línea 14 definimos una referencia para un GameObject donde almacenaremos la referencia del personaje que colocaremos en la escena, en caso de necesitarla más adelante.
Fig. 16: Campos y función Start del Script GameControl de la escena del juego.
Funciones
En la figura 16 vemos la función Start que es donde se hace la lectura del valor almacenado en memoria usando la clase PlayerPrefs y luego se realiza la instanciación del personaje, es decir lo creamos y lo colocamos en la escena.
Luego tenemos una función pública llamada «ReturnToMainMenu» que cuando se ejecuta carga la escena del menú de selección de personajes, podemos verla en la figura 17. Esta función la llamará el botón azul que se encuentra en la escena del juego, se puede ver en la figura 7. Además esta función se ejecuta al pulsar la tecla «Escape», como vemos en la línea 27 de la figura 17.
Fig. 17: Función de actualización y función para regresar al menú principal, esta última función se ejecuta con escape o al pulsar el botón de la interfaz gráfica.
Introducción
En este artículo les voy a mostrar cómo modificar variables de manera gradual en el tiempo, esto tiene muchas aplicaciones, por ejemplo oscurecer gradualmente la pantalla para una efecto de transición, bajar gradualmente el volumen en Unity, cambiar gradualmente de un color a otro, entre muchísimas otras aplicaciones.
A continuación puedes descargar el paquete de Unity con los Assets que utilizo en el vídeo.
Introducción
En este artículo vemos cómo configurar los parámetros de renderizado de Eevee para renderizar el fondo con transparencia. En la imagen de abajo vemos una previsualización de un render en Blender utilizando Eevee, se trata de uncubo con un material transparente y en el fondo una textura ambiental HDR. Lo que haremos es eliminar la textura del fondo para que obtener una imagen del modelo 3D con fondo transparente.
Fig. 1: Esta es la escena que se quiere renderizar con fondo transparente.
En el siguiente vídeo muestro en un minuto cómo RENDERIZAR con FONDO TRANSPARENTE en Blender, esto sirve tanto para Cycles como para Eevee.
Vemos a la pestaña «Render Properties» que se observa en la figura 2, aquí podemos activar distintos efectos.
Vamos a la sección «Film» y activamos la casilla «Transparent», esto hará que el fondo no aparezca en el render final. En la figura 4 vemos la previsualización del renderizado, el fondo con la textura no aparece como en la figura 1, sin embargo sus propiedades siguen siendo aplicadas sobre el objeto, la iluminación y los reflejos, como se observa.
Fig. 2: Para hacer el fondo transparente vamos a la configuración del renderizado.
Fig. 3: En la sección «Film» activamos la casilla «Transparent».
Fig. 4: En el Viewport de Blender vemos que desaparece el fondo de la previsualización.
Resultado del modelo 3D con fondo transparente
Al presionar F12 obtenemos el render final, una imagen con fondo transparente, al guardar la imagen hay que asegurarse de que el formato tenga transparencia, sugiero usar el formato PNG. La imagen de la figura 5 es el render del modelo de la figura 4 en formato PNG que luego convertí al formato WebP.
Fig. 5: Este es el resultado del render con fondo transparente.
Introducción
En este artículo vamos a ver cómo configurar el Shader Principled BSDF para hacer objetos transparentes en Blender con el motor de renderizado Eevee, con esto lograremos que el objeto permita ver otros objetos que hay detrás, además podemos configurar parámetros como Roughness que determinan qué tanta luz se refleja o se refracta sobre el objeto, incluso podemos aplicar una textura a estos parámetros y distribuirlas en el modelo 3D a través del mapeado UV para lograr zonas con mayor o menor rugosidad.
Descargar archivo Blender con Shader transparente implementado
Elementos que se van a utilizar
Para mostrar cómo hacer objetos transparentes en Blender, voy a utilizar los objetos que se ven en la figura 1. Son tres esferas de distintos colores y el objeto que se encuentra por delante es el que vamos a hacer transparente. La figura 2 muestra la vista de la cámara, como se observa, está completamente obstruida por el objeto.
Fig. 1: Estos son los objetos que se van a utilizar.
Fig. 2: Vista de la cámara, no se puede ver a través del objeto.
Pasos para crear un objeto transparente en Blender Eevee
Vamos a ver cómo hacer objetos transparentes en el caso del motor Eevee.
1. Primero vamos a las propiedades de renderizado y activamos la opción «Screen Space Reflections» y en el interior de esta opción activamos la casilla «Refraction», como se observa en las figuras 3 y 4.
Fig. 3: En los parámetros del motor activamos «Screen Space Reflections».
Fig. 4: Dentro del parámetro anterior activamos la casilla «Refraction».
2. Luego seleccionamos el objeto que queremos hacer transparente y vamos a la configuración del material, si no tiene ningún material asignado creamos uno nuevo tipo «Principled BSDF».
3. En las propiedades del material hacemos scroll hasta llegar a la parte de «Settings», ahí activamos la opción «Screen Space Refraction» (figura 6) y escribimos un valor para el parámetro «Refraction Depth» (figura 7), este valor se utiliza para calcular el trayecto de la luz en el interior del material.
Fig. 5: Seleccionamos el material que queremos hacer transparente.
Fig. 6: En Settings activamos la casilla «Screen Space Refraction».
Fig. 7: Configuramos un valor distinto de cero para el parámetro «Refraction Depth».
4. En las propiedades del «Principled BSDF» Shader aumentamos el valor del parámetro transmisión.
Fig. 8: Aumentamos el valor del parámetro transmisión.
Resultados
Al seguir estos pasos logramos que el objeto sea transparente, como se observa en la figura 9.
Fig. 9: El objeto ahora es transparente, podemos ver los objetos que se encuentran detrás.
Para lograr que el material sea más traslúcido podemos disminuir el valor del parámetro «Roughness».
Fig. 10: Configuramos la rugosidad del material, cuando más baja, más lisa se verá la superficie.
De esa manera los objetos que están detrás no se ven tan distorsionados, en la figura 11 se ve el resultado. También se podría utilizar una textura para darle rugosidad.
Fig. 11: Los objetos que se encuentran detrás no se ven tan distorcionados como en la figura 9.
Vídeo tutorial sobre cómo crear MATERIAL TRANSPARENTE en Blender
En este vídeo muestro cómo configurar MATERIAL TRANSPARENTE en Blender Eevee, utilizando el Shader Principled BSDF.
Esta página utiliza cookies para analíticas y ads, continua navegando en él si estás de acuerdo. Ajustes de CookiesACEPTAR
Política de Privacidad y Cookies
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are as essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.