Introducción
Proyecto acabado junio de 2012, y la idea básica consiste en conectar el motor de juego Unity3D con el dispositivo kinect de Microsoft para el reconocimiento tanto de movimientos corporales como de voz humana.
Unity3d (o Unity) es un Motor 3D para el Desarrollo de Videojuegos creado por Unity Tecnologies2. Está disponible para la Plataforma Windows y Mac OS X, y permite crear juegos para Windows, Mac, Xbox 360, PlayStation 3, Wii, iPad, iPhone y también para la plataforma Android. Gracias al Plug-In Web de Unity, también se pueden desarrollar juegos de Navegador, para Windows y Mac, pero no Linux. Además de su uso para crear juegos, Unity permite una vista guiada que permite usarse también para diseños arquitectónicos y animaciones 3D.
Kinect para Xbox 360, o simplemente Kinect es “un controlador de juego libre y entretenimiento” creado por Alex Kipman, desarrollado por Microsoft para la videoconsola Xbox 360, y desde junio de 2011 para PC a través de Windows 7 y Windows 8. Kinect permite a los usuarios controlar e interactuar con la consola sin necesidad de tener contacto físico con un controlador de videojuegos tradicional, mediante una interfaz natural de usuario que reconoce gestos, comandos de voz, y objetos e imágenes.
En definitiva, el objetivo principal es hacer un plugin, wrapper o envoltorio y así poder usar el motor de juego de Unity3d con los gestos y órdenes de voz a través del dispositivo Kinect.
Parte principal del juego

1. Muestra la información del skeleton
2. La palabra actual que reconoció la kinect
3. Información de los gestos recibidos
4. Cámara RGB
5. Cámara de profundidad
6. Representación del esqueleto en 2D
Órdenes por voz
Estas órdenes son las que podemos indicar al juego, tal y como se muestra en el vídeo:
Siéntate: El perro se sienta
Levántate: El perro vuelve a estar en sus cuatro patas
Baila: El perro se levanta a dos patas y gira.
Órdenes por Gestos
Wave (Saludar): Esto lo hacemos con la mano derecha (por ahora sólo con esa) y si lo hacemos el perro salta.
Manos arriba (UpHands): Si levantamos las dos manos hacia arriba, por encima de la cabeza, el perro se hace el muerto.
Manos abajo (downHand): Si nos agachamos y ambas manos están por debajo de la rodilla, el esqueleto coge la pelota del escenario.
Lanzar: Si tenemos la pelota en la mano, lo que hacemos es poner la mano hacia atrás y después hacia delante y la pelota saldrá disparada.
Comportamiento del juego
El perro está estático mientras no digamos lo contrario.
El esqueleto se mueve y sigue nuestros movimientos.
El perro tiene animaciones “estáticas” que se van repitiendo. Por ejemplo, mueve la cabeza y la cola mientras espera órdenes.
Un segundo después de lanzar la pelota el perro irá a buscar la pelota y nos la traerá. Tiene una inteligencia artificial muy básica. Va al punto donde cae la pelota y la trae al punto del esqueleto. Para esto por ejemplo usamos vectores y buscamos la distancia entre dos puntos, aunque Unity nos ayudamucho en esto.
Breve Descripción de la realización del proyecto
La idea básica consiste en hacer un plugin o dll intermedia que conecte el código de unity3d con el código de la Kinect. El proyecto está realizado con Microsoft Kinect 1.5 y Unity 4

En Unity, un plugin o dll puede estar programado en C++ o C#. Después desde C# en Unity3D, podemos llamar a dicha dll. Los pocos ejemplos que había en su comienzo para entender el funcionamiento de Kinect están hechos en C#, ya que es un lenguaje más “fácil” de usar y más intuitivo que C++.
En codeproject.com hay una buena explicación de cómo hacer librerías en C++ y C#, así que opté en hacer una librería en C# (que se convierte en una dll), para cargarlo en otro C# desde Unity3D. La idea es muy buena hasta que te dice Unity3D: “no puedo cargar esta librería dll porque está hecho en el framework 4.0” (que es el necesario para Kinect y Unity no lee, debí imaginarlo, pero no perdía nada en probarlo).
Por tanto, hay que intentar entender el único ejemplo que había en ese momento en C++ de Kinect, y buscando en Internet, nuevamente, y gracias a Andrew Devine21 citado anteriormente (y que recientemente en mayo publicó parte de su código), pude comprender gran parte de lo que estaba escrito en C++. Por tanto, se consiguió hacer una librería en C++ (ya no hace falta el .NET
Framework, porque el C++ es un lenguaje de más bajo nivel), y desde Unity3D con C# se pudo leer la dll (programada en C++) “sin problemas”.
El problema vino en la parte del audio, que no había ningún ejemplo del reconocimiento de voz en C++, sólo en C#. Entonces, esto me llevó a usar doble pasarela, es decir a realizar dos procesos de conversión. Tenemos una dll programada en C# de audio, esta librería la lee nuestra librería en C++ (que hace de puente). Después nuestro código en Unity sólo pregunta a la librería C++.

Código fuente del proyecto
Este proyecto se hizo como Proyecto Fin de Grado de la Universidad de León y el código está liberado y puede ser aquí .