Generar Animaciones de tu Character para Unity

Buenas,

Para realizar animaciones de personajes para un videojuego, lo normal es que utilices un programa de modelado 3D (Blender, 3DS Max, etc) para recrear las animaciones que necesites directamente sobre tu modelo.

Si quieres ahorrar tiempo y que tus animaciones parezcan más reales o si eres un desarrollador de videojuegos pero no se te da bien el modelado en 3D (como es mi caso), puedes utilizar el dispositivo Microsoft Kinect para grabar tus animaciones y después exportarlas a Unity a formato fbx (que es el mejor que va con Unity) con uno de los siguientes programas:

iPi Motion Capture Studio Express cuesta 95$ un año. Este programa se puede utilizar con  Microsoft Kinect  / Microsoft Kinect v2,  ASUS Xtion o PrimeSense Carmine 1.08. Nota: Para grabar las animaciones tenéis que utilizar el software iPi Recorder que es gratuito y para exportar la animación el iPi Mocap Studio. URL: http://ipisoft.com/download/

Brekel Pro Body v2 cuesta 139$ para toda la vida. Sólo puede utilizar Microsoft Kinect v2. URL: http://brekel.com/brekel-pro-body-v2/

Brekel Pro Hands se utiliza para grabar las animaciones de las manos puesto que utiliza Leap Motion para poder grabar y como bien se sabe con Microsoft Kinect no es posible realizar movimientos precisos con las manos ya que los joints que tiene definidos sólo nos permite realizar una motricidad gruesa. URL: http://brekel.com/brekel-pro-hands/

iPi Motion Capture Studio Express te permite tener tu propio modelo 3D, donde puedes ajustarle las articulaciones para que el movimiento de la animación sea más fiable. Además se le puede realizar un tracking hacia delante y atrás para ganar en precisión y tiene la opción de jitter removal para evitar los «tembleques» que a veces podemos ver en alguna animación de personajes. La interfaz es muy fácil e intuitiva y al exportarlo en fbx a Unity las animaciones van correctamente. A mí personalmente me convenció más a la hora de realizar las animaciones que Brekel Pro Body v2, eso sí si tengo que realizar alguna animación con las manos utilizo Brekel Pro Hands.

Un saludo.

Funciones OnEnable y OnDisable

Buenas,

Existen unas funciones que se nos crean por defecto cuando creamos un script y son las famosos métodos Start() y Update() de la clase base MonoBehaviour, sin embargo existen otras funciones que puede que no conozcamos pero que nos pueden facilitar nuestra tarea de programación. En este caso me refiero a las funciones OnEnable() y onDisable().

El método OnEnable() se ejecuta cuando activamos el script y aquí podemos decidir qué queremos que haga o modifique nuestro script cuando éste se activa. Análogamente la función OnDisable() se ejecuta cuando el script se desactiva.

Para activar o desactivar un script, sólo tenéis que acudir a una propiedad que tienen denominada enable que es del tipo Boolean y modificarla a true si queréis activarlo o a false si pretendéis desactivarlo.

Un saludo.

Detectar una Colisión con CharacterController

Buenas,

Cuando se quiere realizar una colisión en Unity, lo primero que se piensa es en utilizar el método OnCollisionEnter(Collision collision). Esta opción funciona cuando tienes un rigidbody y un collider asociado a un GameObject pero cuando tu personaje tiene asignado un CharacterController no reconoce este método y se suele utilizar el método OnControllerColliderHit(ControllerColliderHit hit).

Este método funciona de manera similar al OnCollisionEnter, así que si tenemos una escena con un cubo que tiene un BoxCollider con un tag denominado «Box»  y nuestro personaje con un CharacterController. Añadimos al avatar un script con el siguiente contenido que simplemente lo que hace es que cuando hace colisión con el cubo nos escribe un mensaje avisándonos de ello.

colliderHitUn saludo.

Cambiar la Velocidad de una Animación con Mecanim

Buenas,

Para cambiar la velocidad de una animación en concreto, se puede hacer sin escribir código, ya que sólo hay que ir a la ventana de Animator donde está abierto vuestro Animator Controller y seleccionar el estado donde está asociada la animación.

A continuación en el Inspector, cambiar el parámetro denominado Speed y así de fácil podéis hacer que vaya más rápida o más lenta la animación. Yo lo utilicé para que mi personaje hablara más deprisa en una conversación.

animatorSpeed

Un saludo.

Errores con Unity 5 y el SDK de Oculus Rift DK2

Buenas,

Cuando se importa el paquete de Unity Integration que viene con el SDK 0.4.4 de Oculus Rift, nos aparece el siguiente error:

errorUnity5VR

 

Haciendo doble click nos llevará hasta la línea de código que está dando este error (el script que presenta el error es OVRMainMenu.cs), como se puede observar en la siguiente imagen:

errorUnity5VR Code

 

Para solucionarlo, sólo hay que cambiar «World» por «Worldspace»

errorUnity5VR Solution

 

Un saludo.

Unity 5

Buenas,

Por fin llega el motor de juegos que los desarrolladores estaban esperando, después de lanzar sus 3 release candidates, estábamos esperando cuál iba a ser la versión oficial del programa y parece ser que la release candidate 4 ha sido elegida para presentarse de manera oficial a la comunidad de desarrolladores de videojuegos.

Se esperaba con impaciencia la tan anunciada versión de Unity por su mejora en el motor de físicas, su nuevo sistema de iluminación, el shader para la renderización de materiales, mejoras en cuanto al audio… y algunas características más que harán que nuestro juego sea mucho más realista y mejore sustancialmente la calidad.

Se puede descargar el software desde la siguiente URL:

https://unity3d.com/es/get-unity

Un saludo.

LooKRotation para saber la dirección de un GameObject

Buenas,

Me he encontrado la circunstancia de que necesitaba saber si el avatar que tenía en la escena estaba orientado al objetivo que tenía que dirigirse para mostrar un mensaje de que no  está yendo por la dirección correcta. Lo primero que hice fue utilizar la típica función LookAt() pero este método lo que hace es que te orienta el avatar hacia el objetivo haciendo un giro brusco y no queda muy bien, además no quiero cambiar el movimiento del jugador, sólo mostrar un aviso.

Así que la función que se adaptaba mejor a mis especificaciones es la función Quaternion.LookRotation(), en el que sólo hay que pasarle por parámetro la estructura Quaternion del GameObject que hemos identificado como objetivo. Esta función devuelve un Quaternion el cual comparo con la propiedad rotation del personaje para saber si está orientado en el sentido correcto.

En este script se puede apreciar un ejemplo de uso de esta función.

lookRotation

Un saludo.

¿Cómo saber qué nivel se ha cargado en Unity?

Buenas,

Si queréis saber cuando se ha cargado un nivel determinado, la API de Unity dispone de una función denominada OnLevelWasLoaded (int level), donde el parámetro «level» indica el nivel en el que se encuentra, .Este parámetro de tipo Integer, se corresponde con el número que aparece en la pantalla de Build Settings (File –> Build Settings…) al lado del nombre de cada escena que tengáis añadida de vuestro proyecto.

buildSettings

 La cuestión es que si se cambia la escena de orden en este panel o simplemente desactivando el checkbox junto al nombre de la escena, el número asociado al nivel también se modificará y esto puede provocar errores en el código. Por eso yo prefiero utilizar el nombre de la escena ya que es más difícil que se modifique (aunque no imposible) y estará sujeto a un índice de error menor.

levelLoaded

En este script os he dejado como se comprobaría qué nivel se ha cargado usando el nombre de la escena y en comentarios como se haría con el número correspondiente a la escena.

Un saludo.

Acceder a todos los Componentes Hijos de un GameObject

Buenas,

Si estáis programando en Unity y necesitáis acceder a todos los componentes hijos de un GameObject os podéis ver tentados a hacer algo parecido a esto:

GetComponentsInChildren(typeof(GameObject))

pero lamentablemente a mí no me funcionó, así que me creé un foreach para acceder a cada uno de los componentes Transform del GameObject que quería obtener sus hijos y a partir de este componente ya se puede acceder al GameObject del componente hijo.

En este ejemplo lo que hace es que recorre cada uno de los hijos y llama a la función DontDestroyOnLoad(), que se utiliza cuando se pretende que este GameObject permanezca en la siguiente escena que se cargue del juego y no se destruya al pasar a la siguiente escena.

getChildren

Un saludo.