Bienvenido

Esta sitio web es un portal para la comunidad de usuarios del motor y editor de aplicaciones Unity. Aquí podrás encontrar tutoriales, foros y una sección de preguntas y respuestas con información que te ayudara a resolver tus dudas sobre el manejo del software. También podrás ayudar a otros usuarios al compartir tus conocimientos. El portal es gratuito y su único objetivo es crear un lugar donde todos podemos colaborar y compartir nuestra pasión por Unity.

Así que bienvenido y utiliza el menú para ir a a las diferentes secciones del portal.

Posted in Noticias | Leave a comment

Prefabs

Que son los Prefabs?

Los prefabs son un tipo de objeto especial en Unity. Su nombre viene de “prefabricados” un concepto que es usualmente dado para aquellos elementos de construccion (http://es.wikipedia.org/wiki/Vivienda_prefabricada) que cumplen una funcion específica y se reusan en multiples lugares. Algunas usos de este tipo de objetos es de items que se recogen en un nivel, enemigos, puertas que se abren y cierran, elementos de interaccion, etc. Podemos tomar como ejemplo un item de salud comun a muchos juegos. Estos pueden aparecer en muchos lugares, en distintos “niveles” y usualmente despues de una interaccion, es decir a veces sabremos exactamente donde estara en la escena. Cuando el jugador se acerca a este item se ejecuta un codigo que le da mas energia al jugador. Para este ejemplo el elemento podría tener :  el modelo geometrico, un componente de animacion que lo hace mover y un script que le permite interactuar con el jugador. Si queremos crear uno de estos dinamicamente a partir de un script durante la ejecucion del juego, seria muy tedioso escribir el codigo que le añade cada uno de estos componentes a un GameObject y además tener que asignarles los valores iniciales a cada componente. Similarmente si queremos tambien en el Editor ubicarlo en la escena, seria muy tedioso tener que construir uno por uno, o tener que buscar en la escena uno que ya existe para copiarlo. Seria mejor poder tener uno ya “prefabricado” que podemos simplemente instanciar ya sea en el Editor o durante la ejecución.

Como se crean?

Un prefab se puede crear basicamente en 3 formas:

  1. Si tenemos un objeto en nuestra escena que queremos convertir en un prefab, simplemente tenemos que arrástralo desde la ventana de Hierarchy a la ventana Project. Unity creará un Asset (cuando hablo de Assets me refiero a los archivos que Unity identifica como recursos en nuestro proyecto) de Prefab al soltar el botón del mouse.

    Prefab creado arrastrando

    Prefab creado arrastrando desde la Jerarquia

  2. Podemos crear un Asset de Prefab directamente desde el Menu de Assets o en la ventana Project. Este Prefab estará inicialmente vacío.  Cuando queramos hacer algún objeto en la escena un Prefab, simplemente debemos soltarlo sobre nuestro Prefab vacío.

    Crear un Prefab

    Crear un Prefab

  3. Usando las funciones que provee el Editor podemos crear nuestro Prefab utilizando scripts, a través de la clase PrefabUtility. Veremos como usar esta clase más adelante en el tutorial.

Instanciando un Prefab (añadiendolo a la escena)

Para usar un Prefab podemos simplemente arrastrar el elemento desde la ventana del Proyecto hacia la ventana de Hierarchy o en la ventana de la Escena. El prefab se convierte en un GameObject en la escena, y podemos reconocer que es un Prefab porque aparece de color azulen la jerarquía.

Prefab Seleccionado

Prefab Seleccionado

Si miramos en el Inspector podremos ver en la parte de arriba que el GameObject tiene tres botones : Select, Revert, Apply.

Botones disponibles para una instancia de un Prefab

Select: Al hacer click en este botón se seleccionará en el Project view el Prefab del cual es originario el GameObject. Este nos sirve para ubicar el Prefab en nuestro proyecto. Revert: Usando este botón podremos revertir todos los cambios que le hayamos hecho a la instancia del Prefab para que retorne a su estado original. igual que el Prefab. Apply: Este botón aplica las modificaciones que se le hayan hecho a la Instancia al asset Prefab.

Como se modifican?

Es importante entender bien el paradigma de uso de los Prefabs desde el principio para poder aprovechar al máximo sus beneficios. Un Prefab en Unity es un Asset. Como todos los assets esta disponible en todas las escenas :  hace parte de todo el Proyecto. Esto lo hace increiblemente útil ya que es un objeto reusable entre escenas, en toda nuestra aplicación. Pero este es también su punto débil : si modificamos un Prefab modifica en todas las escenas las instancias de los prefabs que esten conectados. Un prefab conectado es aquel que mantiene su relación con el prefab original, es decir, después de hacer modificaciones a la instancia esta es todavía similar al Prefab. Por el contrario si cambiamos la estructura del Prefab la conexión se perderá. Por ejemplo si tenemos una instancia de un prefab que tiene una jerarquía de objetos y eliminamos algun objeto de la jerarquía, se romperá la conexión con el prefab.

Rompiendo la Conexion

Rompiendo la Conexión al eliminar un GameObject de una Instancia de un Prefab

Cuando la conexión se rompe el Prefab ya no se muestra de color azul en la jerarquía. Si se rompe la conexión los cambios hechos al Asset del Prefab original no ya no afectarán a la instancia del Prefab en la escena. Usando el botón Revertpodemos recuperar la conexion. Para modificar un Prefab podemos directamente hacer cambios si lo seleccionamos en la ventana del Proyecto. Los cambios que se hacen ahí son immediatos y afectan a todos los prefabs conectados.

Al cambiar el Prefab se modifican todas las Instancias

Alternativamente podemos hacer cambios sobre una instancia de un Prefab. Estos cambios sólo afectan a esa instancia y no al asset Prefab. Es decir son únicos para esa instancia en la escena. Los cambios que se hacen a las propiedades de un Componente de un Prefab hacen que esa propiedad se desconecte del Prefab. Podemos saber si una propiedad esta desconectada si su texto aparece en negrita (bold). Por ejemplo si el Prefab tiene una escala de (x=1, y=1, z=1) y nuestra instancia tiene escala de (x=1, y=2, z=1), la propiedad y esta desconectada. Si modificamos la escala del Prefab a (x=3, y=3, z=3) la instancia tendrá como escala (x=3, y=2, z=3). El valor yde la escala ha sido desconectado y ya no es afectado por los cambios hechos al Prefab. Es posible retornar la propiedad al valor del Prefab usando el menú de contexto y así recuperar la conexion.

Con el menú de contexto se puede restaurar el valor defecto del Prefab y reconectar la propiedad.

Este comportamiento de desconexión de las propiedades de los Prefabs es algo útil, nos provee la flexibilidad de reusar los prefabs cambiando sus propiedades sin tener que crear otros Prefabs.

También podemos aplicar los cambios de una instancia al Prefab original usando el botón Apply. Unity reemplazará todos los GameObjects, Componentes y valores de las propiedades del Prefab con los valores de la instancia.

Scripts para trabajar con Prefabs

Unity nos provee con las herramientas disponibles para crear nuestros Prefabs a través de código, modificarlos y obtener información útil para la edición:

Crear una instancia de un Prefab

Podemos instanciar un Prefab en el Editor o durante la ejecución de nuestra aplicación usando Instantiate :

public Transform prefab;
public Vector3 posicion;
public Quaternion rotacion;
void Start () {
    for(int i = 0 ; i < 10 ; i++) {
       Instantiate(prefab, position, rotacion;
    }
}

Crear un Prefab vacío

Podemos crear un Prefab vacío similar como se hace el menu de Assets del Editor:

using UnityEditor;
using UnityEngine;
class Prefabs
{
    [MenuItem("Prefabs/Crear un prefab vacio")]
    static void CrearPrefabVacio (){
        // Ruta que usaremos para el nuevo prefab
        // La funcion GenerateUniqueAssetPath nos retorna una ruta que esta disponible
        // para usar en el disco. Es decir, ningun archivo existe en esa ruta
        string pathUnico = AssetDatabase.GenerateUniqueAssetPath ("Assets/miPrefab.prefab");
        Object prefab = PrefabUtility.CreateEmptyPrefab(pathUnico );
    }
}

Es nuevo Prefab aparecerá en la ventana Project y es además un archivo la carpeta del Proyecto. Hay que notar que se incluyo la librería UnityEditor. Esta librería sólo funciona en el Editor, el código no se podrá ejecutar en la aplicación final. Notese tambien el atributo MenuItem. Este será reconocido por Unity durante la compilación y creará un Item en el Menú superior del Editor, que en este caso se llamara “Prefabs” y tendrá un subitem llamado “Crear un prefab vacio”. Al ser seleccionado ejecutará la función CrearPrefabVacio().

Crear un prefab a partir de un objeto

Esto se hace de forma similar al ejemplo anterior:

using UnityEditor;
using UnityEngine;
class Prefabs
{
    [MenuItem("Prefabs/Crear un prefab del objeto seleccionado")]
    static void CrearPrefabDeObjeto (){
        string pathUnico = AssetDatabase.GenerateUniqueAssetPath ("Assets/miPrefab.prefab");
        Object prefab = PrefabUtility.CreatePrefab (pathUnico, Selection.activeGameObject);
    }
}

El utilitario Selection.activeGameObject guarda la referencia al GameObject que este seleccionado en el Editor.

Ver modificaciones hechas al Prefab

Si queremos saber que tiene de diferente nuestra Instancia del Prefab comparado con el Prefab del que fue creado podemos usar la función GetPropertyModifications :

using UnityEditor;
using UnityEngine;
class Prefabs
{
    [MenuItem("Prefabs/Listar modificaciones")]
    static void ListarModificaciones(){
        PropertyModification[] modificaciones = PrefabUtility.GetPropertyModifications( Selection.activeGameObject );
        foreach(PropertyModification m in modificaciones){
            Debug.Log ("Objeto: " + m.target.name + ", Propiedad: " + m.propertyPath);
        }
    }
}

Ver más

http://unity3d.com/support/documentation/Manual/Prefabs.html http://unity3d.com/support/documentation/ScriptReference/PrefabUtility.html

Posted in Tutoriales | Tagged , , , , | Leave a comment

GameObjects

Que son los GameObjects?

En Unity un GameObject es el elemento básico que se usa para crear objetos en una escena. Un GameObject es un contenedor de Componentes y tiene siempre inicialmente un componente de tipo Transform (ir a la entrada sobre  Transforms). Añadiendo mas  componentes le damos distintas funcionalidades a un GameObject. En Unity, en general todos los objetos que existen en una escena son GameObjects.

Como se crean?

Los GameObjects se pueden crear de dos formas: Usando el editor (para artistas) o usando scripts. Con el editor simplemente vamos al menú superior -> GameObject -> Create Empty. Este ítem en el menú crea un GameObject nuevo al frente de nuestra cámara en el Scene View. El GameObject se puede seleccionar en el Hierachy View.

Menus para crear un GameObject

Otra forma de crear GameObjects es utilizando los GameObjects prefabricados que vienen incluidos en el Editor. Estos son GameObjects que tienen ciertos componenetes que les dan una funcionalidad especifica. Por ejemplo si en el menú superior hacemos click en GameObject -> Create Other -> Cube, crearemos un Cubo. A diferencia de Create Empty, el comando anterior le añade otros dos componentes al GameObject que muestran un cubo en la escena : MeshFilter y MeshRenderer. También le agrega un componente de BoxCollider para que se puedan hacer colisiones físicas con el cubo.

Finalmente, también se pueden crear GameObjects usando código. La forma más sencilla es creando un objecto de tipo GameObject de la siguiente forma:

GameObject objeto = new GameObject("Mi Objeto");

Components vs GameObjects

Es fácil al principio confundirse entre estos dos tipos de objetos, pero en realidad la diferencia es simple. Un GameObject contiene Components. Los Components existen en los GameObjects y son los que les proveen funcionalidad. No pueden existir en la escena los Componentes, sin un GameObject que los contenga.

Inspector de el GameObject seleccionado

En la imagen anterior podemos ver al GameObject Cube seleccionado en la escena. Tiene 4 componentes : Transform, MeshFilter, Box Collider y MeshRenderer.

Como se agregan Components?

Los componentes se pueden agregar a través del menú superior.  En el menú “Components” están todos los componentes que le podemos añadir a un GameObject. Si por ejemplo queremos que nuestro GameObject reproduzca un sonido, simplemente seleccionamos Components -> Audio -> Audio Source. Esto la agregará un Componente de tipo Audio Source (un reproductor de sonidos) a nuestro GameObject seleccionado. Si el menú de Components esta deshabilitado es porque no hemos seleccionado ningún GameObject.

Añadir un Component de tipo Audio Source a un GameObject seleccionado

Propiedades de los GameObjects

Los GameObjects tienen unas propiedades con distintas funciones. Sus propiedades son:

  • Nombre: El nombre nos permite identificarlo en el Hierarchy View. Además podemos usar código para obtener la referencia a un GameObject buscándolo por su nombre (Nota: buscar un GameObject por nombre no es eficiente).
  • Tag: Los Tags son palabras que usamos para identificar el GameObject. Por ejemplo, si estamos haciendo un juego de barcos, podremos colocarlos a cada barco un tag de “barco”. Los tags se pueden utilizar también para rápidamente encontrar un GameObject (ya que la búsqueda no compara el texto, sino el numero del tag en la lista de tags).
  • Layer: El layer es otra palabra que se utiliza para identificar un GameObject, pero su uso es distinto. Los Layers nos sirven para filtrar la colisión entre objetos, definir cuales objetos son iluminados por una luz y especificar cual Cámara puede ver un objeto. Los layers tambien nos permiten escoger cuales objetos queremos mostrar en el SceneView mientras trabajamos en una escena.
  • Static: Esta propiedad nos define si un objeto es estático. Cuando un objeto es estático se toma en cuenta para el calculo de lo Lightmaps (iluminación estática). Además un GameObject marcado como estático se utiliza para el calculo de Oclusión.

Ver más

Finalmente les recomiendo leer mas sobre GameObjects, Tags y Layers en los siguientes enlaces:

http://unity3d.com/support/documentation/Components/class-GameObject.html
http://unity3d.com/support/documentation/Components/class-GameObject.html
http://unity3d.com/support/documentation/Components/Layers.html
http://unity3d.com/support/documentation/Components/Tags.html

Posted in Tutoriales | Tagged , , , | Leave a comment

AssetBundles

Una de las características de los juegos actuales es la posibilidad de descargar nuevo contenido el cual no estaba inicialmente incluido en el juego. Estas descargas pueden ser nuevos niveles, nuevas unidades, expansiones, etc. En Unity es muy fácil incorporar contenido dinámico a través de AssetBundles.

Un AssetBundle es literalmente un paquete (bundle) de recursos (assets).  Los AssetBundles por ahora solo funcionan con la versión Pro del Editor, la version Free no puede hacer uso de ellos. El proceso de utilizar los AssetBundles tiene los siquientes pasos:

  1. Creamos un archivo AssetBundle para un grupo de assets que queremos exportar. Estos assets pueden ser texturas, sonidos, prefabs, etc. Los AssetBundles no pueden contener escenas en conjunto con otros assets. La escenas deben crearse en AssetBundles separados. Los archivos de AssetBundle se pueden guardar en un servidor online, o se pueden incluir en la aplicación.
  2.  Una vez en tiempo de ejecución descargamos los AssetBundles utilizando la clase WWW. Cuando la descarga se completa cargamos los assets que estan en el paquete.
  3. Instanciamos los assets para usarlos en nuestro juego, o de forma similar cambiamos a la escena que hemos descargado.

Veamos cada uno de estos pasos en detalle:

Creando el AssetBundle

La creación de un AssetBundle se hace usando algunas funciones del API de Unity. Para crear un AssetBundle de una selección de objetos en el Proyect View, podemos utilizar el siguiente código:

using UnityEngine;
using UnityEditor;
public class ExportarAssetBundles {
   [MenuItem("Assets/Crear AssetBundle de Seleccion con Dependencias")]
   static void ExportarConDependencias () {
      string archivo = EditorUtility.SaveFilePanel ("Guardar Recurso", "", "Nuevo AssetBundle, "unity3d");
      if (archivo.Length != 0) {
         Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
         BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, archivo, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.StandaloneWindows);
         Selection.objects = selection;
      }
   }
   [MenuItem("Assets/Crear AssetBundle de Seleccion sin Dependencias")]
   static void ExportarSinDependencias() {
      string archivo= EditorUtility.SaveFilePanel ("Guardar Recurso", "", "Nuevo AssetBundle, "unity3d");
      if (archivo.Length != 0)
         BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, archivo, BuildAssetBundleOptions.CompleteAssets, BuildTarget.StandaloneWindows);
   }

En el código anterior estamos definiendo dos funciones que se pueden llamar usando el Menú superior. También se pueden llamar haciendo click derecho en los Assets en el Project View.

La primera función, ExportarConDependencias, crea un AssetBundle con todos los Assets seleccionados. Con los parámeteros BuildAssetBundleOptions.CollectDependencies y BuildAssetBundleOptions.CompleteAssets se le esta indicando a Unity que para los objetos seleccionados debe también incluir todas las dependencias (texturas, modelos, sonidos, etc) y se deben exportar los objetos completos, es decir, en una jerarquía de objetos, se exportara desde el objeto raíz.

La segunda función es similar, pero no exporta las dependencias. Esto es útil si no estamos interesados en incluir las dependencias ya sea porque van a estar incluidas en la Aplicación, o porque no son necesarias.

Al ejecutar este código se crea un archivo con los Assets seleccionados. La extensión del archivo AssetBundle no es importante, sin embargo es común usar unity3d para diferenciarlo. El ultimo parámetro de ambas funciones especifica para cual plataforma estamos creando los AssetBundles. Esto es muy importante saberlo de antemano, ya que los Assets que Unity crea internamente varían dependiendo la plataforma, y AssetBundles para una plataforma pueden no funcionar en otra.

Descargando y usando el AssetBundle

Una vez tenemos un archivo de AssetBundle podemos descargarlo en nuestra aplicación. Para esto usamos la funcion estatica LoadFromCacheOrDownload de la clase WWW. El codigo de la forma mas simple es el siguiente:

IEnumerator Start ()
{
   WWW www = WWW.LoadFromCacheOrDownload ("http://miservidor.com/miassetbundle.unity3d", 5);
   yield return www;
   if (www.error == null &amp;&amp; www.isDone = true) {
      AssetBundle assetBundle = www.assetBundle;
      var asset = assetBundle.mainAsset;
   }
}

Este código hace lo siguiente

  1. La función es iterable, es decir, retorna un IEnumerator. Esto permite que se pueda hacer yield. El yield se usa para que podamos en una sola linea de código esperar para que una operación que es asíncrona se complete, de forma que parezca sincrona.
  2. Se hace un yield sobre la clase WWW. Esto lo que hará internamente  es esperar hasta que el archivo se descargue. También retornara en caso de error, como por ejemplo cuando el archivo no existe.
  3. Cuando el archivo esta descargado y no han habido errores cargamos el AssetBundle utilizando la propiedad .assetBundle.
  4. Finalmente cargamos el Asset principal del AssetBundle usando la propiedad mainAsset. Este puede ser un GameObject, una Textura, un Mesh, en general, cualquier objeto que derive de la clase Object.

Cargando objetos del AssetBundle

Además del Asset principal que se obtiene a través de la propiedad mainAsset, podemos descargar los demás objetos que hemos incluido en el AssetBundle. La forma recomendada para hacer esto es utilizando la función LoadAsync. El siguiente codigo muestra como podemos usar LoadAsync para carga un objeto del AssetBundle:

IEnumerator Start ()
{
   WWW www = WWW.LoadFromCacheOrDownload ("http://miservidor.com/miassetbundle.unity3d", 5);
   yield return www;
   if (www.error == null &amp;amp;&amp;amp; www.isDone = true) {
      AssetBundle assetBundle = www.assetBundle;
      AssetBundleRequest request = assetBundle.LoadAsync("modelo", typeof(GameObject));
      yield return request;
      if (request.asset != null)
         Instantiate(request.asset, Vector3.zero, Quaternion.identity);
      }
   }
}

Similar a como se descarga una AssetBundle, LoadAsync nos permite cargar un objeto del AssetBundle de forma asincrona para que no afecte el flujo del juego.

Creando AssetBundles para Escenas

Ademas del caso simple de AssetBundles que incluyen por ejemplo un nuevo modelo de automóvil, o un nuevo personaje, también podemos crear AssetBundles de escenas completas. Esto nos permite aumentar la duración y rejugabilidad de nuestros juego ya que podremos crear nuevo contenido que nuestros jugadores pueden descargar. Para hacer esto utilizamos la función BuildStreamedSceneAssetBundle de la clase BuildPipeline. El siguiente código nos muestra como podemos hacer esto:

[MenuItem ("Build/Crear AssetBundle de Escenas para WebPlayer")]
static void Crear(){
   var levels : String[] = ["Assets/Nivel1.unity", "Assets/Nivel2.unity"];
   BuildPipeline.BuildStreamedSceneAssetBundle( levels, "escenasExtra.unity3d", BuildTarget.WebPlayer);
}
[MenuItem ("Build/Crear AssetBundle de Escenas para Aplicación Windows")]
static void Crear(){
   var levels : String[] = ["Assets/Nivel1.unity", "Assets/Nivel2.unity"];
   BuildPipeline.BuildStreamedSceneAssetBundle( levels, "escenasExtra.unity3d", BuildTarget.StandaloneWindows);
}

En este caso hemos definido dos funciones. Una crea un AssetBundle de dos escenas en nuestro proyecto para WebPlayer y la otra crea un AssetBundle para Windows. Los AssetBundles de escenas se descargan y se usan de forma similar:

IEnumerator Start ()
{
   WWW www = WWW.LoadFromCacheOrDownload ("http://miservidor.com/miassetbundle.unity3d", 5);
   yield return www;
   if (www.error == null &amp;&amp; www.isDone = true) {
      AssetBundle assetBundle = www.assetBundle;
      Application.LoadLevel("miNuevaEscena");
   }
}

Cache

Cuando descargamos nuestros AssetBundles utilizando LoadFromCacheOrDownload Unity guardará los archivos en una carpeta en nuestro computador. Si estamos utilizando el WebPlayer la cantidad máxima que podemos almacenar es 50MB. Este espacio es compartido con todos los otros juegos que estén usando AssetBundles. Para saber si un archivo debe ser cargado del Cache or debe ser descargado de nuevo, pasamos un valor entero al descargarlo. En los ejemplo anteriores hemos pasado “5″, queriendo decir que estamos descargando la versión 5 del AssetBundle.

Si queremos utilizar mas espacio debemos comprar una licencia separada, la cual es negociada con Unity. Sin embargo, los AssetBundles también son almacenados en el cache del navegador. Este puede ser lo bastante grande para almacenar nuestros AssetBundles y de tal forma, hace innecesario una licencia de Caching separada.

Finalizando

Los AssetBundles son la herramienta que Unity provee para tener contenido dinámico en nuestra aplicación. Son fáciles de usar (si pensamos en la complejidad de programar esto) y con ellos podemos extender la vida de nuestros juegos, agregar mas elementos y reducir el peso de nuestros WebPlayer al solo incluir lo mínimo para comenzar a jugar. Si quieres saber mas acerca de ellos te recomiendo leer los siguientes enlaces:

http://unity3d.com/support/documentation/Manual/AssetBundles.html
http://unity3d.com/support/resources/example-projects/assetbundles
http://unity3d.com/support/documentation/ScriptReference/WWW.LoadFromCacheOrDownload.html
http://unity3d.com/support/documentation/ScriptReference/AssetBundle.LoadAsync.html 

Posted in Tutoriales | Tagged , , , , , , , | Leave a comment

Unite 11: Keynote & Unity 3.5

La semana anterior (semana 39 del 2011) se llevo a cabo el evento de Unite 11 en la ciudad de San Francisco, a la cual tuve la fortuna de asistir. Se llevaron a cabo conferencias, charlas, stands con productos afines, en fin una gran variedad de informacion y la posibilidad de compartir ideas y retos con los creadores y usuarios de Unity. Alrededor de 1200 personas asistieron a este evento, el cual tuvo una duracion de 3 dias.

Flash

Una charla previa al evento, pero tambien parte de Unite, fue la demostracion de como exportar a Flash 3D desde Unity (algo ya sabiamos  de esto : unity->flash). Esta fue realizada por tres de los empleados de Unity: Lucas Mejer, Ralph Hauwert y Carl Callewaert. El mensaje mas importante de esta fue que muy pronto sera posible exportar a Flash y lo demostraron en vivo durante la charla. Algo bien interesante es que el motor de juego en Flash pesara alrededor de 1.5 MB, lo cual no es mucho considerando que tiene fisica, sonido, graficos 3d, scripting, etc. Ademas el archivo que Unity  crea se puede utilizar inmediatamente en un navegador, no hay necesidad de usar algun otro Flash IDE.

Keynote

El keynote fue la presentacion inaugural del evento, desarrollada por los tres fundadores de la Unity: David Hegalson, Nicholas Francis y Joachim Ante, como tambien por el desarrollador de la serie Diablo y fundador de Gazillion, David Brevik y Lucas Mejer con una pequena demostracion del exportador de Unity a Flash. La presentacion se dividio en 5 partes, una para cada presentador. David Helgason hablo en general sobre el crecimiento de Unity desde una pequena empresa de 3 fundadores en un garaje, a la gran empresa de casi 200 empleados que es hoy. Ademas nos compartio un dato nostalgico : cuando los visito un potencial inversionista este les dio la siguiente proporcion : 1:1000. Esta era la probabilidad de que la empresa tuviera exito. Ellos imprimieron y pegaron notas con este dato en su oficina, como una motivacion : querian vencer las probabilidades. Y hasta ahora lo han logrado con gran exito.

La siguiente presentacion hecha por Nicolas F. nos hablo sobre el progreso del Asset Store, el exito de las ventas y algunas de las nuevas caracteristicas que vendran en el futuro. Como dato de exito, el usuario que mas dinero hizo el mes de Septiembre en el Asset Store obutvo 20mil dolares.  De las nuevas caracteristicas hablo de una unificacion de las redes sociales con Unity, de sistemas de monetizacion y de analisis de las ejecuciones de las aplicaciones (tipo Google Analytics). Todo esto hecho de forma simple para el usuario y con el hosting proveido por Unity. Esto le permitiria a cualquier empresa obtener informacion de como actuan los jugadores en sus juegos para mejorar la experiencia de juego y aumentar ganancias.

La presentacion de cierre estuvo a cargo de David Brevik, uno de los creadores de Diablo (un hito en los juegos RPG) y fundador de Gazillion Entertainment. El nos hablo de sus pensamientos de que la Edad dorada de los videojuegos es ahora, y que Unity nos permite aprovecharla al poder crear juegos para todas las plataformas.

Unity 3.5

La tercera presentacion estuvo a cargo de Joachim Ante y hablo de las nuevas caracteristicas en Unity 3.5. Joachim nos mostro en vivo algunas de ellas.

La primera nueva caracteristica fue el nuevo sistema de Niveles de Detalle (LOD) que estaran incluidos en el editor. Este permitira escenas de mayor complejidad que podran adaptar las mallas usadas al movimiento de la camara. Esta no es una tecnologia nueva, pero si es una que es todavia vigente y permitira crear juegos de mayor escala. En el ejemplo que nos mostro la escena tenia 70millones de triángulos, una cifra nada despreciable.

Otra caracteristica nueva es la inclusión de Inteligencia Artificial en el Editor. Esta nos permitirá construir mallas de navegación (NavMeshes) a partir de la geometría en nuestra escena, la cual los ‘Agentes’ podran recorrer automaticamente. Este es un paso hacia adelante en el mejoramiento de la jugabilidad.

Una muy innovadora característica nueva en 3.5 son los “Light Probes” o “Sondas de Luz”. Lo que estas hacen es guardar la informacion de luz que existe en un punto en el espacio, calculada usando todas las luces de la escena. Durante la ejecución Unity utiliza estas sondas para simular iluminación dinamica usando una interpolacion de las sondas mas cercanas, con un método de tetraedros. Este método de interpolación es novedoso porque no genera saltos cuando se cambian las sondas usadas.  Lo que esto nos permite es aplicar iluminación dinámica a nuestra escena a partir de datos calculados offline, similar a los lightmaps, con un muy bajo costo. Nos dio como ejemplo el juego ShadowGun, juego recién publicado en el App Store, el cual no usa ninguna luz dinámica y sin embargo parece que lo hiciera gracias a los Light Probes.

Para aquellos quienes hemos usado el Occlusion Culling the Unity 3.x, sera un gran alivio ver que la nueva version reemplazara el sistema de Occlusion Culling por uno nuevo mas efectivo el cual utiliza voxeles. Ademas de acortar del tiempo que toma calcular la visibilidad de los objetos, el nuevo algoritmo usado no permite que objetos sean erróneamente escondidos y ademas, permite crear portales para esconder grupos de objetos.

Otra de las mejoras nuevas es la integración del los sitemas de control de versiones SVN y Perforce con el editor, permitiendo que estos funcionen transparentemente para el usuario.

Finalmente, algunas de las otras caracteristicas nuevas son:

  • Sistema de Particulas con curvas llamado “Shuriken”.
  • Perfilador del GPU.
  • Renderizado Multi-hilos.
  • Renderizdo HDR.
  • RNM – Lightmaps de Normalmaps con Radiosidad.
  • Servidor de Cache de Assets para acelerar tiempo de importación.
  • Edicion de Múltiples objetos.
  • Soporte para Micrófono y Cámaras (Incluyendo en el Webplayer)

El Keynote se puede ver completo aqui : http://video.unity3d.com/video/3411036/unite11-keynote-part-1

Posted in Noticias | Tagged , , , | Leave a comment

Materiales

En este tutorial hablaremos de que son y como se usan los Materiales en Unity.

Que son los Materiales?

Los materiales son un concepto abstracto que busca recoger en un solo objeto las propiedades de la superficie de un modelo 3d. Un modelo geométrico (Mesh) esta representado en su forma mas básica por los vértices y triángulos que forman un volumen visible en el espacio 3d. Por ejemplo, la siguiente imagen nos muestra los vértices y triángulos que conforman un modelo.

Izq: Modelo plano sin textura. Der: Modelo con material difuso. La malla de triángulos esta dibujada sobre los modelos.

Esta representación con vértices y triángulos por si sola carece de las características de textura y color que tienen los objetos reales. Estas propiedades son definidas a través de materiales.

Materiales en Unity

Un material en Unity es el objeto que encapsula las propiedades que pueden ser usadas para darle color y sombreado a un objeto. Un modelo geométrico puede tener uno o mas materiales y estos se le asignan usando el Inspector o también usando código. La propiedad principal de un material es el Shader que utiliza.

Material con Shader Diffuse, el cual usa una textura.

Un Shader en Unity es un script escrito en un lenguaje propio de Unity llamado ShaderLab. Este script esta compuesto por dos partes : las propiedades del material expuestas en el editor y la forma en que se usan estas propiedades. Las propiedades son variables por ejemplo el Color, Textura y valores numéricos. La forma en que se usan estas propiedades están definidas por los Subshaders. El siguiente es un ejemplo de un Shader en Unity:

Shader "Ejemplo/Diffuse" {
	Properties {
		_MainTex ("Textura", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType" = "Opaque" }
		CGPROGRAM
		#pragma surface surf Lambert
		struct Input {
			float2 uv_MainTex;
		};
		sampler2D _MainTex;
		void surf (Input IN, inout SurfaceOutput o) {
			o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
		}
		ENDCG
	}
	Fallback "Diffuse"
}

El código anterior se escribe en un archivo de texto el cual debe tener la extensión .shader. Unity importa este archivo automáticamente al ser incluido en nuestra carpeta Assets del Proyecto. Al importarlo el Editor lee el código y agrega otras instrucciones para conectar el shader con Unity, y  asi definir la interacción del material con las luces en la escena y agrega otras instrucciones como por ejemplo realizar Lightmapping. Este paso de compilación puede ser configurado por nosotros para por ejemplo no crear Lightmaps automáticamente u omitir compilación para Xbox 360 si no estamos usando esta plataforma.

“Shader” vs “shader”

Un shader (no sólo en Unity, sino el concepto genérico) es un pequeño programa que se ejecuta en la tarjeta de video. Este recibe datos de geometría del GPU y usando estos calcula el color final de cada píxel que compone los triangulos del objeto en la pantalla. Notese que estoy usando las palabras “Shader” y “shader”. Usare la palabra “Shader” para hablar de los archivos escritos en el lenguaje ShaderLab de Unity y “shader” para referirme al programa que se ejecuta en el GPU.

En Unity un shader esta encapsulado dentro del código de script de ShaderLab (un Shader). Los shaders pueden ser escritos es el lenguaje Cg (nVidia), HLSL  (DirectX) o GLSL (OpenGL). Estos son tres distintos lenguajes de programación de shaders. Los shaders que vienen incluidos en Unity están todos escritos en Cg. No es necesario entender como funcionan los shaders para poder usarlos ya que el Editor incluye una gran selección (+60) que abarca los casos de uso más comunes. Sin embargo si lo deseamos también podemos escribir nuestros propios shaders.

Crear un Material

Para crear un Material podemos vamos al menú superior -> Assets -> Create -> Material. Esto también se puede hacer usando el Project View. Cuando creamos un Material Unity le asigna automáticamente el Shader Diffuse.

Creando un nuevo material usando el Project View

Propiedades de los Materiales

La propiedades definidas en el Shader son automáticamente expuestas en el inspector del material. Por ejemplo en el Shader Diffuse una propiedad de tipo 2D nos permite asignar un objeto Texture2D a el material. Los pixeles de esta textura son usados por el shader para definir como darle color al modelo que este usando el material. El objetivo de tener propiedades expuestas es permitirnos fácilmente asignar los datos que serán usados en el programa que se ejecuta en el GPU. Cada propiedad se puede usar internamente dentro del shader como una varible. Por ejemplo:

Shader "Ejemplo/Color" {
	Properties {
		_Color ("Color", Color) = (0.5, 0.5, 0.5, 0.5)
	}
        ...
}

expone una variable de tipo Color en el Inspector así:

Propiedad "Color" del Shader expuesta en el Material Inspector

Unity nos permite exponer varios tipos de propiedades en nuestros shaders. Algunas de las propiedades que podemos usar son:

  • Float, Range : Un float. Range limita los valores a usar.
  • Texture2D, Cubemap y Rect: Referencian texturas de distintos tipos.
  • Vector4, Color: Un vector de 4 floats. Color nos permite usar el Color Picker.

Ademas de ser asignables en el Inspector del material, también es posible mediante código cambiar el valor  de las propiedades. Veremos un ejemplo de esto mas adelante.

Asignar un Material

Los materiales son asignados a los componentes de tipo Renderer, como el MeshRenderer o Skinned Mesh Renderer. El numero de materiales que tiene un objeto se define desde la aplicación de modelado, dependiendo de el numero de canales UV que se hayan creado. Lo mas usual es tener un solo material. Para asignar un material a un Renderer podemos hacer click en el campo de Material del Componente en el inspector, lo cual abre el Object selector que nos permite seleccionar un Material, o también podemos arrastrar el material desde el Project View hacia el campo.

Cual Shader usar?

Unity trae un gran numero de Shaders incluidos por defecto como : Diffuse, Specular, Bump Mapping, Parallax Mapping, Transparent Diffuse, Transparent Cutout Diffuse, etc.

Comparacion de dos Shaders. Izq : Shader Diffuse. Der: Shader Bumped Specular. El Shader Bumped Specular tiene mas detalles, pero es también cada pixel es mas costoso de calcular.

Cual usar depende de el efecto que queremos conseguir y las optimizaciones que necesitemos para mejor rendimiento. Por ejemplo, para un personaje principal, el cual es visto y detallado por el jugador durante la mayoría del juego es común usar un Shader “pesado” como Bump Specular, el cual utiliza una textura de normales para darle mayor detalle al modelo (Normal Map) y ademas calcula la iluminación incluyendo los brillos por pixel. No tiene mucho sentido hacer esto con toda la geometría del nivel pues consumirá demasiados recursos. Para esos casos, es mas usual utilizar un Shader Diffuse combinado con Lightmapping, es decir, usando una textura con la iluminación pre-calculada. Esto reduce los cálculos que se deben hacer permitiendo usar la GPU en otros trabajos (por ejemplo, en tener mucha mas geometría en la pantalla).

Una clave para usar Shaders es : Si el arte no se ve bien con un shader Diffuse, no se verá mejor con un Shader mas complejo. Claro siempre habrá un caso en que esto no aplica, pero en mayoría de las ocasiones la geometría del nivel se debe ver bien con un Shader diffuse. Tener toda la geometría dibujada usando materiales con shader Diffuse te permitirá medir la utilización de GPU. Si tu juego es lento con estos shaders debes reducir el numero de triángulos (asumiendo que no es el CPU el que lo frena). Si al contrario es muy rápido, puedes pensar en usar Shaders mas sofisticados, o añadir efectos como partículas.

Materials y Shaders en Código

Unity nos permite acceder a los Materiales y los Shaders asignados a los materiales en código. Algunas de las aplicaciones de esto son por ejemplo cambiar los materiales de los objetos dependiendo la escena en que se encuentre el personaje, cambiar las texturas de los materiales para cambiar el ‘look’ de un personaje, animar las propiedades de los materiales, entre otros. A continuación algunos ejemplos:

Cambiar de material:

using UnityEngine;
public class CambiarMaterial : MonoBehaviour {
	public Material nuevoMaterial;
	public Renderer elRenderer;
	void Start () {
		elRenderer.material = nuevoMaterial;
	}
}

Cambiar el Shader:

using UnityEngine;
public class CambiarShader : MonoBehaviour {
		public Shader nuevoShader;
	public Renderer elRenderer;
	void Start () {
		elRenderer.material.shader = nuevoShader;
	}
}

Cambiar la Textura:

using UnityEngine;
public class CambiarTextura : MonoBehaviour {
	public Texture2D nuevaTextura;
	public Renderer elRenderer;
	void Start () {
		elRenderer.material.mainTexture = nuevaTextura;
	}
}

Cambiar propiedades: El siguiente código nos muestra como animar las coordenadas UV de la propiedad de Textura2D de un Shader Diffuse:

using UnityEngine;
public class AnimarUV : MonoBehaviour {
	public Renderer elRenderer;
	void Update () {
		float posicion = Time.time * 0.2f;
		elRenderer.material.SetTextureOffset ("_MainTex", new Vector2(posicion,posicion));
	}
}

Leer Mas:

Posted in Tutoriales | Tagged , , , , | Leave a comment

Transforms

Este tutorial tratará de explicarte como usar el componente Transform en Unity.

Que es el Transform?

El componente Transform en Unity está en todos los GameObjects. Sirve para informar a Unity acerca de donde dibujar los modelos en la escena, o donde posicionar un sonido, o donde estaría localizada una caja de colisión, en general, cualquier elemento que necesite estar presente en la escena.

Componente Transform con las propiedades : Posición, Rotación y Escala

Las posiciones de los vértices de un modelo están almacenadas en relación a un origen (el punto donde x=0, y=0 y z=0) local. Cuando agregamos el modelo a la escena las posiciones de sus vértices deben ser calculadas con respecto al origen de la escena para poder ser dibujado. El origen local puede ser distinto al origen de la escena y estoy requiere que se recalculen las posiciones de los vértices.

El origen y los ejes x, y, y z se llaman el Sistema de Coordenadas cartesiano en tres dimensiones. Cuando un punto en un sistema de coordenadas local es colocado en el sistema de coordenadas de la escena, también llamado el sistema de coordenadas del mundo, Unity debe hacer la transformación de la posición del objeto de su sistema de coordenadas local a la posición del objeto en el sistema de coordenadas global (el de la escena).

Objetos con sus sistemas de coordenadas locales y el sistema de coordenadas del mundo (global) en el centro

Posición, Rotación y Escala

La posición del Transform define el origen del sistema de coordenadas local del objeto. Los vértices del modelo serán dibujados con respecto a ese punto.

Posición

Posición

La rotación nos dice como esta orientado el objeto. Hay muchas formas de expresar esto matemáticamente, pero la usualmente mas fácil de entender es usando ángulos de giro respecto a los ejes x, y, y z, también llamados ángulos de Euler. En Unity un valor positivo es un giro en el sentido de las manecillas del reloj. Un valor negativo es un giro en el sentido contrario a las manecillas del reloj. Los giros en cada ángulo están expresados en grados sexagesimales (0 a 360) en el inspector. Internamente Unity usa Quaterniones los cuales representan la rotación con 4 valores. No es necesario ser un experto en Quaterniones ya que Unity nos da herramientas para trabajar con ángulos de Euler y para luego convertirlos a Quaterniones.

Rotación

Rotación

La escala nos permite cambiar el tamaño del objeto en cada eje de coordenadas o dimensión. Una escala de x=1, y=1 y z=1 muestra el objeto en su tamaño original como fue importado. Un valor mayor a 1 agranda el objeto, un valor menor a 1 lo empequeñece. Un valor negativo refleja el objeto en el respectivo eje, como un espejo.

Escala

Escala

Jerarquías

Otra de las ventajas de los transforms es que nos permiten crear jerarquías de objetos, es decir, un objeto puede ser padre de otro objeto, y equivalente a decir que el otro objeto es hijo de el. La relación padre-hijo de los Transforms crea un efecto cascada de las transformaciones donde el Transform del padre afecta a todos sus hijos. Las jerarquías afectan todas las propiedades del Transform : posición, rotación y escala. Si se mueve el padre se mueven todos los hijos. Si se escala el padre, se escalan todos los hijos de igual forma. En Unity las jerarquías se pueden observar en el Hierarchy View.

Dos objetos con relacion de jerarquía - Padre e Hijo

Para hacer a un GameObject hijo de otro solo tienes que en el Hierarchy View arrastrar el objeto y soltarlo sobre el GameObject que será el padre. Si quieres que no sea mas el padre, lo arrastras y lo sueltas esta vez sobre ningún GameObject.

Local vs. Global

Cuando hablamos de un sistema de coordenadas local, nos referimos a que los valores de posición, rotación y escala son relativos a el sistema de coordenadas del objeto. En el sistema de coordenadas global estos valores son relativos a ese sistema. Se podría decir que el sistema de coordenadas global es el padre de todos los Transforms sin padre.

Por ejemplo, las posiciones de los vértices de un modelo cuyo Transform está en la posición (10, 0, 0) con una rotación de (0, 0, 0), es decir, alineado con los ejes, siguen siendo las mismas en el sistema de coordenadas local. Pero en el sistema de coordenadas global las posiciones de los vértices están desplazadas 10 unidades en el eje x. Si el modelo se mueve a la posición (20, 0, 0), la posición final de sus vértices sera la posición en el en el sistema local mas 20 unidades en el eje x. Esto afecta de manera similar la rotacion y la escala.

Que podemos hacer con el  Transform?

El componente Transform es una parte vital de la interacción ya que nos permite cambiar la posición, rotación y tamaño de los objetos en cualquier momento, habilitando la posibilidad de crear movimiento y hacer cambios en la escena. Hay dos formas de modificar los valores del Transform en Unity : en el editor y usando scripts.

Para cambiar la posición, rotación y tamaño en el editor simplemente seleccionamos el objeto y directamente modificamos los valores en el inspector del componente Transfom.

Cambiar la posición usando un script (C#):

using UnityEngine;

public class ModificarTransform : MonoBehaviour {
    private Transform _elTransform;
    public float velocidad = 3f;
    public float radio = 1f;
    public float posicionY;

    void Start () {
        _elTransform = GetComponent<Transform>();
    }

    void Update () {
        Vector3 pos = new Vector3(
            Mathf.Cos(Time.timeSinceLevelLoad * velocidad) * radio,  // x
            posicionY,                             // y
            Mathf.Sin(Time.timeSinceLevelLoad * velocidad) * radio); // z
        _elTransform.localPosition = pos;
    }
}

Crea este script en el editor (Menu Superior -> Assets -> Create -> C# Script) y agregáselo a un GameObject en la escena. Asegúrate que el nombre del archivo con el script sea igual al nombre de la clase : ModificarTransform.cs.

El objeto se moverá en forma circular sobre el plano xz. Algo útil es que posible cambiar la posición local y la posición global. Si en este mismo ejemplo haces el objeto con el Transform hijo de otro GameObject y rotas a este (el padre) en el eje x verás como la rotación ya ocurre en el plano xz en el sistema de coordenadas local. Si cambias

_elTransform.localPosition = pos;

por

_elTransform.position = pos;

la posición siempre cambiara en el plano xz sin importar la posición, rotación y escala del padre.

Cambiar la rotación usando un script (C#):

Usando el ejemplo anterior vamos a hacer que el objeto gire a medida que se mueve:

using UnityEngine;

public class ModificarTransform : MonoBehaviour {
    private Transform _elTransform;
    public float velocidad = 3f;
    public float radio = 3f;
    public float posicionY;

    public void Start () {
        _elTransform = GetComponent<Transform>();
    }

    public void Update()
    {
        float anguloEnRadianes = Time.timeSinceLevelLoad*velocidad;
        float anguloEnGrados = anguloEnRadianes * Mathf.Rad2Deg;
        Vector3 pos = new Vector3(
            Mathf.Cos(anguloEnRadianes) * radio,    // x
            posicionY,                              // y
            Mathf.Sin(anguloEnRadianes) * radio);   // z
        _elTransform.localPosition = pos;
        _elTransform.localRotation = Quaternion.Euler(0, -anguloEnGrados, 0);
    }
}

En este caso estamos creando un nuevo quaternion de rotación utilizando los ángulos de Euler y el método utilitario Quaternion.Euler. El angulo lo multiplicamos por -1 ya que las funciones Sin y Cos giran en el sentido contrario a las manecillas del reloj para valores positivos, contrario al método Quaternion.Euler.

Cambiar la escala usando un script (C#):

Finalmente y continuando con el código anterior vamos a cambiar la escala de nuestro objeto también utilizando el seno y coseno:

using UnityEngine;

public class ModificarTransform : MonoBehaviour {
    private Transform _elTransform;
    public float velocidad = 3f;
    public float radio = 3f;
    public float posicionY;
    public float escalaMinima = 0.5f;
    public float escalaMaxima = 2f;

    public void Start () {
        _elTransform = GetComponent<Transform>();
    }

    public void Update()
    {
        float anguloEnRadianes = Time.timeSinceLevelLoad*velocidad;
        float anguloEnGrados = anguloEnRadianes * Mathf.Rad2Deg;
        float escalaUpdate = Mathf.Abs(Mathf.Cos(anguloEnRadianes)) * (escalaMaxima - escalaMinima) + escalaMinima;
        Vector3 pos = new Vector3(
            Mathf.Cos(anguloEnRadianes) * radio,    // x
            posicionY,                              // y
            Mathf.Sin(anguloEnRadianes) * radio);   // z
        _elTransform.localPosition = pos;
        _elTransform.localRotation = Quaternion.Euler(0, -anguloEnGrados, 0);
        _elTransform.localScale = new Vector3(escalaUpdate, escalaUpdate, escalaUpdate);
    }
}

Este código cambia la escala local del objeto a medida que pasa el tiempo, de forma uniforme (igual) en las tres dimensiones.

Todavía hay mas por aprender y te sugiero que veas la pagina del manual en linea de Unity acerca de este componente : http://unity3d.com/support/documentation/Manual/Transforms.html

Posted in Tutoriales | Tagged , , , , , , , | Leave a comment

Hola Unity

Este tutorial esta hecho para dar un vistazo general de Unity. El objetivo es que después de leerlo puedas entender las distintas partes del Editor y como crear una aplicación.

Que es Unity?

Unity es un software para la creación de aplicaciones interactivas en general, pero por sobretodo, juegos. Unity esta compuesto de dos partes: El editor y la aplicación de reproducción (o player). El Unity Editor permite ensamblar todos los objetos (GameObjects) más sus componentes (Components) para elaborar escenas (Scenes). Una escena es lo que podríamos llamar un nivel de juego. Así que un juego podría estar compuesto de varias escenas.

Antes de empezar, si no lo haz hecho, descarga Unity del sitio web oficial: http://www.unity3d.com/download

Crear un proyecto

Un proyecto en Unity es una carpeta donde existen todos los archivos que hacen parte del desarrollo de nuestra aplicación y usualmente creamos un proyecto para cada aplicación que hagamos. Para empezar debes abrir Unity haciendo click en el icono.  Luego de abrirlo vamos al menu superior -> “File -> New Project…” para crear un nuevo proyecto.  Si el menú superior no es visible es probable que Unity haya abierto directamente en el Project Wizard, en tal caso no tienes que hacer el paso anterior.

A continuación debes seleccionar el tab “Create New Project” y en el campo de texto “Project Location” escoges el lugar donde vas a guardar tu proyecto. Trata de utilizar un lugar en tu disco duro que no te vaya a producir problemas de acceso. No uses la carpeta de “Windows” o “Archivos de Programas” para crear tu proyecto porque seguro te darán problemas. Si queremos que el “Project Wizard” aparezca o no automáticamente cuando iniciamos Unity vamos al menú superior -> Edit -> Preferences -> “Show Project Wizard at Start up” y activamos o desactivamos esa opción.

Una vez tu proyecto es creado Unity abrirá una nueva escena automáticamente. La escena solo contendrá un objeto : MainCamera. Esta existe para que podamos ver nuestra nueva escena inmediatamente en el Game View (y en el juego). No es obligatorio que este objeto exista y por el momento podemos simplemente dejarlo allí.

Interfaz del Editor

Unity en su interfaz esta dividido en 4 secciones generales: Menú Superior, Barra de Herramientas, Vistas de trabajo y Barra de Estatus:

Tratando de ser lo mas breve posible, las funciones de cada parte son:

  • Menu Superior: Tiene las funciones típicas de abrir, guardar, salir, etc de una aplicación (File). Tambien tiene los comandos de copiar/pegar (Edit). Además están otros comandos para crear GameObjects y agregar Components. Esta el menú para crear Terrenos (Terrain), otro para mostrar las distintas ventanas del editor (Window) y finalmente la sección de Ayuda (Help).
  • Barra de Herramientas : Las herramientas de la izquierda permiten cambiar la función de edición que el mouse realiza en el Scene View : mover la cámara del Scene view (con la cual vemos nuestra escena en el escene view), mover un objeto, girar un objeto o escalar un objeto. Las opciones de Center y Global seleccionan el punto y la orientación del la herramienta para mover, rotar y escalar los objetos. Las funciones de Play, Pause y Step permiten probar nuestro juego, pausar la ejecución o avanzar un cuadro (frame) en la ejecución de nuestro juego. El botón de layers sirve para seleccionar las capas visibles en el editor. Y finalmente el botón layout permite escoger como organizar las vistas de trabajo.
  • Vistas de Trabajo : Cada vista tiene una función especial. El Scene View es la vista que usamos para editar en el espacio 3D los objetos en nuestra escena. El Game View nos permite probar nuestro juego dentro del editor. El Proyect View nos muestra un listado de los archivos que hay en nuestro proyecto. El Hierarchy View nos muestra la jerarquía de objetos en la escena. Finalmente el Inspector View nos permite inspeccionar las propiedades de cada objeto. Todas estas ventanas son bastante útiles y usualmente las tendremos todas abiertas a la vez.
  • Barra de Status: Esta barra sirve para mostrarnos mensajes relevantes al proyecto en que estamos trabajando, como errores en nuestro programa, errores en algún archivo, y en ocasiones consejos para mejorar nuestro juego.

La interfaz puede parecer compleja a primera vista, pero en realidad luego de su uso nos daremos cuenta que es muy fácil de usar.

Scene View

En esta vista podemos editar nuestras escenas. El scene view tiene muchas opciones y no voy a explicarlas todas aquí, pero lo mas importante es el control de la camara para poder navegar nuestra escena. Unity provee dos formas de controlar la cámara:

Estilo Maya:

  • Rotar la cámara: Debes mantener presionada la tecla Alt y arrastrar el mouse con el botón izquierdo del mouse presionado.
  • Mover la cámara: Debes mantener presionada la tecla Alt y arrastrar el mouse con el botón del centro del mouse presionado.
  • Zoom : Debes mantener presionada la tecla Alt y arrastrar el mouse con el botón derecho del mouse presionado.

Estilo FPS:

  • Rotar la cámara: Arrastrar el mouse con el botón derecho del mouse presionado.
  • Mover la cámara: Debes mantener presionada el botón derecho del mouse y usar las teclas W, A, S y D para moverte.
  • Zoom : Utiliza la rueda del mouse para acercarte alejarte.

GameObjects y Componentes

La esencia de Unity son dos tipos de elementos: GameObjects y Components. Un GameObject (Objeto de Juego) es la base para la creación de cualquier objeto en el juego. Un GameObject es un contenedor de componentes. Un Componente es un comportamiento que se le puede dar a un GameObject. Los Componentes se crean a través de scripts : código. Unity trae muchos componentes por defecto y  también podemos crear nuestros propios componentes. Todo GameObject tiene por lo menos un componente, el Transform. Este contiene las propiedades necesarias para localizar el objeto en la escena en el espacio tridimensional (3D).

Para crear un GameObject podemos usar las teclas Ctrl + Shift + N o en el menu superior ira GameObject -> Create Empty. Si queremos agregarle nuevos componentes a nuestro GameObject podemos hacerlo con el Menú Superior, en el submenú de Componentes. Allí se listan todos los componentes que puede ser agregados al GameObject que esta seleccionado.

Unity además trae algunos GameObjects ejemplo que vienen con varios componentes. Crea un cubo llendo a GameObject -> Create Other -> Cube. Este aparecerá en el Scene View. Para seleccionarlo podemos hacer click sobre el con el mouse en el Scene View. Si no es visible podemos seleccionarlo a través del Hierarchy View y luego presionar la tecla ‘f’ para enfocar la camara en el.

Una vez seleccionado veremos sus propiedades en el Inspector View. El cubo por defecto trae el componente Transform, el componente Mesh Filter, el componente Box Collider y el componente Mesh Renderer. El mesh filter tiene la referencia a un archivo de modelo que se va a dibujar. El box collider define el objeto fisico para las colisiones. El mesh renderer es el que dibuja el objeto.  Podemos agregar otro componente usando el menú superior, y si son  scripts también podemos arrastrarlos desde el Project View. Añadele un Rigidbody al cubo haciendo click en Menu -> Component -> Physics -> Rigidbody. El componenete de tipo RigidBody aparecerá en el inspector del objeto Cubo. Si le das Play con el botón en la barra de herramientas, podrás ver como ahora el cubo cae, por efecto de la gravedad. Si detienes la ejecución haciendo click una vez mas sobre Play veras como el cubo retorna a su lugar inicial.

Si no tienes el GameView visible por defecto, Unity la hará visible automáticamente. Si quieres regresar al Scene View solo tienes que seleccionar esa ventana o crear una nueva llendo a Menú -> Window o usando las opciones en la esquina superior derecha de cualquier otra ventana ya visible.

Los componentes se pueden habilitar y deshabilitar usando el cuadro la lado del nombre. Deshabilita el Rigibody y dale Play. Esta vez el cubo no caerá. Durante la ejecución puedes habilitarlo y verás como automáticamente otra vez comenzara a caer. Los componentes se pueden remover haciendo click sobre su nombre en el Inspector View y escogiendo “Remove Component”.

Si quieres guardar los cambios puedes ir a File -> Save Scene y le das el nombre a la escena que vas a guardar. Esta escena contiene los GameObjects y las referencias a los objetos de tu Proyecto. Las escenas NO contienen los modelos, las texturas, los scripts, etc. Estos deben permanecer en la carpeta de Assets en el directorio del proyecto.

Crear la Aplicación Final

Finalmente para este tutorial introductorio crearemos un ejecutable de nuestro pequeño demo. En Unity esto es bastante fácil.  Vamos a Menu -> File -> Build Settings. Aparecerá la ventana con las opciones para crear nuestro ejecutable. En la parte superior se añaden las escenas que van a ir en nuestro programa. Arrastra la escena nueva que has creado desde el Proyect View hasta la ventana de Build Settings, en el cuadro “Scenes in Build”. En la parte inferior se selecciona la plataforma para la cual queremos hacer nuestro ejecutable y las opciones. En este caso selecciona “PC or Mac Standalone”.

En la parte derecha selecciona la plataforma del sistema operativo que estas usando y finalmente dale click a “Build & Run”. Unity te preguntara por un lugar donde guardar el ejecutable de tu aplicación. Selecciona un lugar y dale un nombre a tu programa. Finalmente dale click a aceptar. Unity creara tu aplicación y la ejecutara inmediatamente. hemos creado una aplicación 3D en minutos!

Si quieres aprender mas te recomiendo explorar los diferentes componentes que trae Unity. También hemos omitido el área mas importante : scripting. Esta es muy extensa y la trataremos mas adelante.

Posted in Tutoriales | Tagged , , , , , | Leave a comment

Crear un Terreno usando un Heightmap

En Unity (y muchos otros engines y paquetes de modelado) es posible usar una imagen con información de alturas para crear un Terreno. En este tutorial usaremos una imagen para recrear una isla del mediterráneo.

1. Obtener el heightmap

Un heightmap (o mapa de alturas) es simplemente una matriz de valores donde cada coordenada representa una altura. Es usual guardar esto en un formato llamado RAW (los valores sin ningún procesamiento o compresión) donde cada altura es representada por 8 o 16 bits. Un heightmap que usa 8bits tiene valores de 0 a 255 para cada pixel. Un heightmap de 16bits tiene valores de 0 a 65535. Estos valores son relativos ya que una vez aplicados al terreno pueden ser escalados a el tamaño que queramos.

En este tutorial vamos a usar una imagen encontrada (prestada ;) ) en un blog (www.ramblemuse.com)  :

Heightmap Santorini

Es el heightmap de la isla de Santorini, famosa porque dicen que puede ser el continente que Platón llamó Atlantis y fue cubierto por el mar hace miles de años.

2. Crear el terreno

Como nuestro mapa es cuadrado y con escala uniforme (igual escala en ancho y alto), vamos a crear un terreno cuadrado. El ancho y alto del terreno es 256×256. La altura de nuestro heightmap es 50 metros. Es decir que cada valor se multiplica por 50/255 o 50/65535 dependiendo del numero de bits. Esta imagen es un PNG de 8 bits así que los valores de los pixeles son multiplicados por 50/255.

Para crear le Terrano en Unity vamos a Menu -> Terrain -> Create Terrain. Unity crea un GameObject con un componente de Terreno y lo coloca en la escena. Este componente referencia un TerrainData el cual es el archivo con la información del Terreno.

3.  Convertir el Heightmap a RAW

Existen muchos programas para convertir una imagen a formato RAW. Uno muy simple de usar y bastante ligero es IrfanView. Lo primero que debemos hacer es asegurarnos que la imagen es de 8 o 16 bits. En este caso usaremos 8bits. Para hacer esto en IrfanView abrimos la imagen y vamos en el menu superior a Imagen -> Convertir a Escala de grises. O usamos la tecla rapida Ctrl+G. Nuestra imagen original es de 8bpp asi que este paso no es necesario, pero vale la pena mencionarlo. Si queremos tambien podemos hacer que la imagen use 16bpp.

Una vez la imagen este convertida a escala de grises es solo guardarla en formato RAW usando el menu de archivo de IrfanView.

4.  Importar el Heightmap en Unity

Una vez tenemos nuestro mapa de alturas el siguiente paso es importarlo para modificar nuestro terreno. En Unity teniendo el Terreno seleccionado vamos a Terrain -> Import Heightmap – RAW… . En la ventana de opciones escogemos los bits por pixel y si el archivo fue creado en Mac o Windows (en verdad es si el archivo tiene formato big endian o little endian)

5.  Retoques finales

La topografía de nuestro terreno ya esta lista. Ahora podemos usar texturas en el terreno para darle mas realismo y añadir cualquier otra cosa que queramos. Si deseamos cambiar la escala del terreno podemos ir al menú superior y en “Terrain” seleccionar “Set Resolution”. Allí podremos cambiar el alto, ancho y profundidad del terreno.

Posted in Tutoriales | Tagged , , | 1 Comment

Unity 3.4!

Ha salido la nueva versión 3.4 del Editor de Unity. Además de los arreglos a algunos de los bugs, trae como novedad la inclusión en el Editor de los materiales paramétricos Substance que generan texturas a través de parámetros (En ingles: procedural textures), y las cuales pueden reducir enormemente el tamano de las aplicaciones. También hay algunas mejoras al editor como la posibilidad de cambiar el tamaño de los componentes de colisión (Colliders) con el mouse (sosteniendo la tecla Shift), cambiar el tamaño de los íconos en el Scene View y usar nuestros propios íconos para los GameObjects.

En el website de Allegoritmic se ha publicado un artículo explicando el uso de sus materiales en Unity: http://www.allegorithmic.com/unity. Algo muy interesante es que los materiales de Allegoritmic tambien se pueden usar directamente en 3DS Max y Maya. Para crear materiales se puede utilizar el Substance Designer o su otro producto bitmap2material.

En breve estas son las ventajas de los materiales de substance:

  • Son paramétricos lo que significa que se puede cambiar el look de las texturas fácilmente cambiando los parametros.
  • Son muy ligeros, típicamente unos pocos KBs por material.
  • La resolución de la textura final puede ser escogida desde 32×32 a 2048×2048 y manteniendo la misma calidad.
  • Se pueden animar en tiempo real a través de código.
  • Pueden usar bitmaps existentes como entrada. De esta forma se pueden obtener distintos efectos para la misma textura.

Los materiales paramétricos se pueden comprar en la página de Allegoritmic y directamente en Unity a través del AssetStore.

Aquí les dejo dos imágenes que muestan lo que se puede lograr con los materiales de substance, obtenidas del demo de substance que esta en la pagina de Unity (http://unity3d.com/gallery/live-demos/index.html#camper):

Y un video mostrando su uso en Unity:

Posted in Noticias | Tagged , , , , | Leave a comment