Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wp-plugin-bluehost domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/spotsail/public_html/martra/wp-includes/functions.php on line 6114

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893
{"id":1129,"date":"2017-09-30T20:44:59","date_gmt":"2017-09-30T20:44:59","guid":{"rendered":"http:\/\/martra.uadla.com\/?p=1129"},"modified":"2017-09-30T20:44:59","modified_gmt":"2017-09-30T20:44:59","slug":"usando-el-acelerometro-como-metodo-de-entrada-para-un-juego-en-android","status":"publish","type":"post","link":"https:\/\/martra.uadla.com\/usando-el-acelerometro-como-metodo-de-entrada-para-un-juego-en-android\/","title":{"rendered":"Usando el acelerometro como m\u00e9todo de entrada para un Juego en Android."},"content":{"rendered":"

Los juegos que usan el acelerometro no abundan, pero los que lo usan si hacen una buena implementaci\u00f3n se convierten en juegos muy especiales.<\/p>\n

En el tutorial de desarrollo de juegos para Unity<\/a> hemos creado un juego que funciona en PC o MAC. Lo vamos a utilizar para explicar como podemos pasar un juego de STANDALONE a Mobile, o mejor a\u00fan, veremos como podemos mantener el mismo proyecto para generar los dos ejecutables cambiando tan solo ela plataforma destino en las opciones de Build<\/em>.<\/strong><\/p>\n

Pod\u00e9is bajaros el proyecto final del tutorial en este link: megafastball-final<\/a>.<\/p>\n

Como mantener dos plataformas con un mismo c\u00f3digo<\/h2>\n

Hay dos apartados donde podr\u00edamos tener diferencias entre una aplicaci\u00f3n para PC o MAC y una entre mobil: El c\u00f3digo de los scripts y los assets importados, como im\u00e1genes o m\u00fasica.<\/p>\n

Indicando especificaciones diferentes<\/h3>\n

En el caso de las im\u00e1genes o la m\u00fasica las diferencias se encuentran en la optimizaci\u00f3n<\/strong>. Para mobil, tienen que ser menos pesados, quiz\u00e1 con menos calidad, en realidad todo lo que podemos para ayudar al mobil a mover nuestro juego sin que vaya muy apurado. Estas optimizaciones se pueden hacer en la secci\u00f3n Inspector de cada uno de los objetos, que nos dar\u00e1 la opci\u00f3n de cambiar las opciones de importaci\u00f3n para cada una de las plataformas que tenemos configuradas en nuestro entorno de desarrollo Unity.<\/p>\n

\"\" <\/picture><\/a>
Optimizaciones para diferentes plataformas.<\/figcaption><\/figure>\n

En cada fichero que importemos se le puede indicar que opciones queremos usar para cada plataforma.<\/strong> En el recuadro rojo se puede ver que mi entorno de Unity esta configurado para crear aplicaciones standalone (Pc y MAC), Android o Webgl. Si queremos indicar unas optimizaciones diferentes tenemos que marcar el recuadro de Override<\/em>, y ya podremos trabajar con unas especificaciones diferentes a las generales.<\/p>\n

Scripts que funcionen para varias plataformas en Unity<\/h3>\n

Gran parte de la gesti\u00f3n de la complejidad del desarrollo multiplataforma lo gestiona Unity por si solo, pero a\u00fan as\u00ed, a veces las plataformas son tan diferentes, como puede ser el caso de un PC y un Android, que el c\u00f3digo que escribimos no puede ser el mismo.<\/strong> Para este caso Unity nos ofrece los preprocesadores. Es una forma de indicarle que parte del c\u00f3digo queremos que se ejecute en cada plataforma.
\nAlgunos de los preprocesadores disponibles para diferenciar las diferentes plataformas s\u00f3n:
\nUNITY_STANDALONE_WIN
\nUNITY_STANDALONE_LINUX
\nUNITY_STANDALONE
\nUNITY_WII
\nUNITY_IOS
\nUNITY_ANDROID
\nUNITY_PS4
\nUNITY_SAMSUNGTV
\nUNITY_XBOXONE
\nUNITY_TIZEN
\nUNITY_TVOS
\nUNITY_WEBGL
\nLa forma de usarlos es muy sencilla, vamos a ver un peque\u00f1o ejemplo.<\/p>\n

[code language=”csharp”]
\n#if UNITY_STANDALONE
\n Debug.Log("Solo se ejecuta cuando creamos el juego para STANDALONE Unix\/Windows\/MAC");
\n#elif UNITY_ANDROID
\n Debug.Log("Solo se ejecuta cuando creamos el juego para Android");
\n#else
\n Debug.Log("Se ejecutara en cualquier otra plataforma");
\n#endif
\n[\/code]<\/p>\n

Como vemos el uso de la compilaci\u00f3n dependiente de plataforma es muy sencillo.<\/p>\n

Controles de movimiento por acelerometro.<\/h2>\n

Partimos de la base de que disponemos de un juego ya creado, que usa la entrada standard de teclado para mover al protagonista, y que lo que queremos hacer es incorporar la posibilidad de moverlo cuando creemos la versi\u00f3n para Android.
\nVamos a estudiar nbuestro codigo fuente, el que hemos creado en el
tutorial de Unity<\/a>, y que os pod\u00e9is bajar de este enlace<\/a>.<\/p>\n

[code language=”csharp”]
\nprivate void Update()
\n {
\n \/\/ Get the axis and jump input.
\n float h = CrossPlatformInputManager.GetAxis("Horizontal");
\n float v = CrossPlatformInputManager.GetAxis("Vertical");
\n\t jump = CrossPlatformInputManager.GetButton("Jump");<\/p>\n

\/\/ calculate move direction
\n if (cam != null)
\n {
\n \/\/ calculate camera relative direction to move:
\n camForward = Vector3.Scale(cam.forward, new Vector3(1, 0, 1)).normalized;
\n move = (v*camForward + h*cam.right).normalized;
\n }
\n else
\n {
\n \/\/ we use world-relative directions in the case of no main camera
\n move = (v*Vector3.forward + h*Vector3.right).normalized;
\n }
\n }<\/p>\n

private void FixedUpdate()
\n\t{
\n\t\t\/\/ Call the Move function of the ball controller
\n\t\tball.Move(move, jump);
\n\t\tjump = false;
\n\t}
\n[\/code]<\/p>\n

Estas dos funciones forman parte de un script que hemos incorporado en nuestro protagonista, y que se encarga de controlar sus movimientos.<\/p>\n

Las dos funciones, Update y FixedUpdate son llamadas por Unity<\/strong>. Entonces, \u00bfPor que utilizamos las dos funciones? Bueno, la diferencia principal entre Update y FixedUpdate es el momento en el que se produce la llamada. Update se llama en cada cambio, en cada frame, sin tener en cuenta si hay diferencias entre el frame y el framerate, que si se tiene en cuenta para las llamadas a FixedUpdate. Resumiendo, FixedUpdate normalmente se llamara menos veces que Update<\/strong>. Digamos que un juego que corre a 25 fps llamara menos a FixedUpdate que otro que corra a 30fps, pero los dos realizaran el mismo numero de llamads a Update.<\/p><\/blockquote>\n

En la funci\u00f3n Update las tres primeras lineas se encargan de recoger la pulsaci\u00f3n del usuario mediante una llamada a las funciones CrossPlatformInputManager<\/strong>. Estas funciones estan incluidas dentro de los Assets standard de Unity y nos devuelven las entradas de teclado o joystick que tengamos conectado. Las teclas que usa las podemos definir desde el men\u00fa Edit->Project->Settings->Input.<\/em><\/p>\n

\"Men\u00fa <\/picture><\/a>
Parte de la configuraci\u00f3n de controles de entrada.<\/figcaption><\/figure>\n

Aunque podemos cambiar las teclas, las que vienen por defecto son las conocidas por la mayor\u00eda de los jugadores<\/strong>.
\nDespu\u00e9s de capturar las teclas calculamos las variables que usaran en la funci\u00f3n FixedUpdate para indicarle a nuestro jugador que se mueva.
\nPara incorporar la posibilidad de controlar nuestro juego con el acelerometro tan solo tenemos que incorporar unas lineas, y tan solo tenemos que modificar la funci\u00f3n Update<\/em>. Vamos a ver como queda:<\/p>\n

[code language=”csharp”]
\nprivate void Update()
\n {
\n \/\/ Get the axis and jump input.
\n #if UNITY_STANDALONE
\n float h = CrossPlatformInputManager.GetAxis("Horizontal");
\n float v = CrossPlatformInputManager.GetAxis("Vertical");
\n\t jump = CrossPlatformInputManager.GetButton("Jump");
\n\t #else
\n\t \/\/controles de android.
\n\t\tfloat h = Input.acceleration.x;
\n\t\tfloat v = Input.acceleration.y;
\n\t\tjump = (Input.touchCount > 0);
\n\t #endif
\n \/\/ calculate move direction
\n if (cam != null)
\n {
\n \/\/ calculate camera relative direction to move:
\n camForward = Vector3.Scale(cam.forward, new Vector3(1, 0, 1)).normalized;
\n move = (v*camForward + h*cam.right).normalized;
\n }
\n else
\n {
\n \/\/ we use world-relative directions in the case of no main camera
\n move = (v*Vector3.forward + h*Vector3.right).normalized;
\n }
\n }
\n[\/code]<\/p>\n

Primero podemos ver el uso de los preprocesadores. El c\u00f3digo para MAC o Windows se ejecutara cuando creemos la aplicaci\u00f3n para STANDALONE, para cualquier otra plataforma ejecutaremos el c\u00f3digo contenido entre #else y #endif. Es decir, ese c\u00f3digo se ejecutar\u00e1 cuando decida crear la versi\u00f3n para Android.<\/strong> La modificaci\u00f3n no puede ser mas sencilla, para recuperar los datos Usamos el control Input<\/em> y para el salto usamos Input.TouchCount<\/em> que nos devuelve el numero de dedos que hay en la pantalla, en el caso de que se toque la pantalla con alg\u00fan dedo, informamos la variable jump y nuestro protagonista saltar\u00e1.<\/p>\n

Probando los nuevos controles.<\/h2>\n

Para probar el acelerometro tenemos que crear nuestra aplicaci\u00f3n para Android y tener nuestro tel\u00e9fono con el modo de depurar USB activado conectado mediante USB a nuestra maquina. Para ver como preparar el entorno podeis leer el post: Desplegando nuestra aplicaci\u00f3n Unity en android y WebGL.<\/a>.<\/p><\/blockquote>\n

Tambi\u00e9n necesitaremos bajar en nuestro tel\u00e9fono el programa Unity Remote<\/a> y arrancarlo<\/strong>. Para que el IDE de Unity espere la entrada desde nuestro dispositivo tenemos que indicarlo en: edit->project settings->editor<\/em> y escoger que device de Android queremos usar, o indicar any<\/em>, es decir, cualquiera.
\n
\"\" <\/picture><\/a>
\nAhora ya podemos ejecutar el juego como siempre, pero esta vez aunque se ejecute en nuestro entorno de desarrollo el control re hara desde el dispositivo que tenemos conectado \ud83d\ude42<\/p>\n

Esto es todo! En unos minutos hemos pasado de tener una aplicaci\u00f3n para PC o MAC, a una aplicaci\u00f3n multiplataforma que se puede ejecutar en Android usando el Acelerometro.\u00a0 \u00bfY si queremos crearla para Iphone? Solo son cambios de configuraci\u00f3n y instalaci\u00f3n de la plataforma, y optimizar las imagenes. Los script ya funcionan, no hace falta tocarlos.<\/p>\n

Ole Unity!!<\/p>\n

\r\n
\r\n\r\n
\r\n \r\n \r\n Configurando el IDE de Unity e importando Assets para nuestro primer proyecto. <\/a>\r\n\r\n
\r\n \r\n\r\n \"\" <\/picture>\r\n\r\n <\/a>\r\n <\/div>\r\n

\r\n Ahora que ya tenemos instalado Unity, vamos a crear un peque\u00f1o proyecto. Aprovecharemos para conocer un poco el IDE, estructurarlo Read more<\/a> <\/p>\r\n <\/div>\r\n

\r\n \r\n \r\n Instalando Unity y mucho mas! <\/a>\r\n\r\n
\r\n \r\n\r\n \"Primer <\/picture>\r\n\r\n <\/a>\r\n <\/div>\r\n

\r\n Unity es un IDE de desarrollo de juegos. Con el se puede desarrollar para multitud de plataformas. Depende de las Read more<\/a> <\/p>\r\n <\/div>\r\n

\r\n \r\n \r\n Como subir un juego Unity a la Google Play Store. <\/a>\r\n\r\n
\r\n \r\n\r\n \"\" <\/picture>\r\n\r\n <\/a>\r\n <\/div>\r\n

\r\n Unity es un entorno de desarrollo de juegos multiplataforma. Lo que significa que una vez tenemos un juego, no cuesta\u00a0 Read more<\/a> <\/p>\r\n <\/div>\r\n

\r\n \r\n \r\n Musica y explosiones un Unity. <\/a>\r\n\r\n
\r\n \r\n\r\n \"El <\/picture>\r\n\r\n <\/a>\r\n <\/div>\r\n

\r\n La m\u00fasica o los efectos de sonido, son una parte muy importante de cualquier juego, estoy seguro que si alguna Read more<\/a> <\/p>\r\n <\/div>\r\n \r\n <\/div>\r\n\r\n