lunes, 26 de mayo de 2014

Unity3D Scripting: Notificaciones locales en iOS

Hace un tiempo hice esta pequeña investigación para una pequeña prueba, dicha prueba consistía en parte en hacer las notificaciones locales de iOS y ahora procederé a explicar como lo logré.
Ciertamente no encontré mucha documentación mas que la documentación oficial de cada método disponible para crear notificaciones locales en iOS, así que me creé mi propia clase para usarlas, que en algún momento puede que la amplie para añadir notificaciones locales de Android, las cuales tendré que hacer desde nativo de otra manera ya que Unity3D no lo contempla de momento.

¿Que es una notificación local?
Es un mensaje de alerta que, al transcurrir cierto tiempo después de generarla se mostrará al usuario un mensaje de alerta, bien ya sea pues para avisar de que ya tienes de nuevo toda la energía recargada para poder seguir jugando o cualquier otro motivo que se te ocurra sin necesidad de tener que usar internet para que un servidor externo lo procese y te avise cuando sea necesario, lo calculará el mismo dispositivo partiendo de la hora actual hasta el tiempo que le digamos que tardará en mostrar esta alerta, es decir, si son las 10:00 y le decimos que nos avise en cinco minutos pues lo mostrará a las 10:05.

Aquí está el código que procederé a explicar:

using UnityEngine;
using System.Collections;
using System;

public class Notification : MonoBehaviour 
{
 #if UNITY_IPHONE

  //Añadir nueva notificación
  public void UseNotification(TimeSpan time, string title, string text)
  {
   NotificationServices.ScheduleLocalNotification(getNotification(time, title, text));
  }
  
  //Eliminar notificaciones pendientes de esta aplicación
  public void ClearNotifications()
  {
   NotificationServices.ClearLocalNotifications();
   NotificationServices.CancelAllLocalNotifications();
  }

  //Generación de la notificación local para iOS
  LocalNotification getNotification(TimeSpan time, string title, string text)
  { 
   LocalNotification notification = new LocalNotification();
   notification.alertAction = title;
   notification.fireDate = DateTime.Now.AddSeconds ((double) t.Seconds);
   notification.alertBody = text;
   notification.soundName = LocalNotification.defaultSoundName;
   return notification;
  }
 #endif
}
En primer lugar decir que, para usar este script debes de llamar desde otro componente a UseNotification para añadir una nueva notificación y a ClearNotifications para limpiar todas las pendientes, pero procederé a explicar paso a paso que queremos mostrar.

Pasemos a explicar como crear una notificación, sería tan sencillo como llamar a nuestro componente de esta manera:
  GetComponent<Notification>().UseNotification(TimeSpan.FromMinutes(5), "¡Alerta!", "¡Esto es una notificación local!");
El primer valor será el tiempo a transcurrir para la notificación, en este caso cinco minutos, el segundo valor el título de la notificación y por último el texto que queremos mostrar ampliando la información de la notificación.

Ahora veamos como limpiar nuestras notificaciones si ya no queremos que se muestren:

  GetComponent<Notification>().ClearNotifications();
Esta línea nos limpiará las notificaciones, en el caso de querer avisar de que tenemos recargada nuestra barra de energía, si volvemos a la aplicación no necesitamos que nos avise de ello ya que podemos verlo nosotros mismos mientras jugamos así que limpiaríamos las notificaciones y cuando sea necesario volveremos a crear las notificaciones necesarias.

Aunque esta clase se podría ampliar como para cambiar el sonido de la notificación por ejemplo, he querido mostrar la versión mas simple de la cual podrémos partir en nuestro proyecto, espero que sea de utilidad.

viernes, 16 de mayo de 2014

Unity3D Scripting: Unity3D dentro de Android (II)

Primera parte del tutorial: Unity3D dentro de Android


En primer lugar debemos tener Eclipse y el SDK de Android instalado, aconsejo encarecidamente por facilidad y ahorro en instalar plugins a Eclipse, descargar ADT, que es un Eclipse preparado ya para programar en Android.

Una vez descargado debemos instalar al menos la versión 2.3 de Android o una posterior ya que en las últimas versiones de Unity3D no está soportado las versiones inferiores a este y tampoco los que tengan un procesador inferior a ARM7 en las últimas versiones de Unity3D.

Una vez tengamos nuestro Eclipse con la SDK que queramos usar (Insisto, 2.3 o superior) crearemos un nuevo proyecto de Android.
Aquí nuestro nuevo proyecto
Pulsaremos next, después pulsaremos finish y ya tendremos creado el proyecto de ejemplo en el que añadiremos Unity.

El nombre de paquete se llama com.hagamosvideojuegos como el que usaremos en Unity3D, si bien puede tener otro nombre, para hacerlo mas simple. ambos estarán en un mismo paquete.

En este caso le he puesto que el mínimo requerido sea la versión 2.3 de Android como especifiqué anteriormente y la máxima sea la última que hay hoy día, la versión 4.4.

Hecho esto, nos generará automáticamente una carpeta con el proyecto de Android, copiaremos dicho proyecto y sustituiremos los archivos de nuestro proyecto de eclipse por estos.

Una vez sustituidos debemos volver a nuestro Eclipse y pulsar en Proyect -> Clean... y seleccionar el proyecto que queremos compilar.


Por último, este paso realmente es opcional en caso de haber habilitado la opción de "Start a build inmediatelly, pero para cubrirme en salud siempre lo hago y es pulsar en Proyect -> Build Proyect.

Como último paso vamos a crear nuestra clase Ejemplo dentro del paquete com.hagamosvideojuegos aunque realmente podríamos tener la clase en el paquete que queramos, pero por simple limpieza y organización del ejemplo de manera sencilla he preferido tener la clase que te genera Unity3D llamada UnityPlayerNativeActivity junto a nuestra nueva clase.

Veamos el código java que va a contener nuestro proyecto android para comunicarse con nuestro proyecto de android.

package com.hagamosvideojuegos;

import android.util.Log;

public class Ejemplo {
 public float numero;
    
 public Ejemplo()
 {
  numero = 0.3; // Al crear nuestra clase desde Unity3D le asignaremos por defecto este valor
 }
 
 public void Numero()
 {
  Log.d("Unity", String.valueOf(numero)); // Nos mostrará en LogCat el valor que tiene actualmente el número
 }
    
 public void Doble(float valor)
 {
  Log.d("Unity", String.valueOf(numero*2)); // Nos mostrará en LogCat el doble del número
 }
}
Con esta clase dentro de nuestro paquete, todo debería funcionar correctamente, por último decir que, desde android también podemos comunicarnos con Unity3D, no solamente extrayendo datos de java si no al revés, desde java extraer datos de Unity3D, pero eso lo veremos mas adelante.

Creo que no se me escapa nada, en caso de que algo no os funcione correctamente podéis dejar en los comentarios si ha fallado e intentaré corregirlo o ayudar en la medida de lo posible ;)

lunes, 12 de mayo de 2014

¡Primeras jornadas de desarrollo indie de videojuegos en sevilla!

 Por primera vez en Sevilla se organizan unas jornadas sobre videojuegos independientes, esto permitirá a los desarrolladores del mercado y el público final. Está en la fase de organización, la iniciativa de Indiefest Sevilla está ganando apoyos rápidamente con casi 300 likes en facebook mientras escribo esta entrada, apoyo en varios medios y por supuesto, el apoyo de los creadores de dichos videojuegos y gamers.

Indiefest Sevilla es la unión de varios estudios de desarrollo independiente, concretamente el medio informativo sevillano IndieLocus, el estudio independiente sevillano Onikami Games y el estudio Estosehunde Studio, sumados a varios colectivos individuales partícipes de la idea.

El festival contará con varias actividades y talleres, proyectos educativos y clases que serán impartidas por invitados distinguidos, así como diferentes presentaciones de juegos, conferencias de desarrolladores, torneos, venta en stands de comercio y un café bar. A más de que se repartirán premios a los visitantes tales como códigos de descarga, DLC’s

Aún no hay fecha confirmada pero presuntamente, el encuentro se celebraría del 26 al 28 de Septiembre, con el siguiente horario:
  • Viernes: 12.00 – 22.00
  • Sábado: 10.00 – 22.00
  • Domingo: 10.00 – 20.00
A día de hoy no está fijado tampoco el sitio donde se hará, pero en cuanto lo tengan claro lo haré saber por aquí.

Por supuesto, pienso asistir a estas primeras jornadas que seguro que van a dar mucho de que hablar, aunque quizás no asista como desarrollador solitario. ;)

Web oficial: www.indiefest.es
Twitter: https://twitter.com/IndiefestSev
Facebook: https://www.facebook.com/JornadasIndieSevilla

jueves, 8 de mayo de 2014

Unity3D Scripting: Como usar el giroscopio

Aquí vuelvo a dejar un pequeño script que tuve que usar en su momento y que es bastante sencillo de usar realmente.
¿Que es un Giroscopio?
Creo que Wikipedia da una muy buena definición del mismo, pero a nivel funcional dentro de nuestro smartphone podríamos resumirlo en que, es el que se encarga de saber cual es la rotación del mismo, en Unity3D a través del mismo componente nos facilita también detectar la gravedad que se está ejerciendo en el dispositivo al dejarlo caer o la aceleración al desplazarlo.

El principal uso del giroscopio que podemos encontrar en muchas aplicaciones móviles de manera nativa sin que tengamos que tratar con el mismo es saber si está en vertical, en horizontal, boca abajo...

Aquí un ejemplo muy básico sobre las propiedades del giroscópio en Unity3D:

using UnityEngine;
using System.Collections;

public class Giroscopio : MonoBehaviour
{
 void Start()
 {
  Input.gyro.enabled = true; //Habilitar el giroscopio
 }
 
 void FixedUpdate ()
 {
  Debug.Log("Rotacion: "+Input.gyro.attitude); //Rotación del giroscopio
  Debug.Log("Aceleracion: "+Input.gyro.userAcceleration); //Aceleración del dispositivo
  Debug.Log("Gravedad: "+Input.gyro.gravity); //Gravedad  del dispositivo
 }
}
Lo primero de todo es habilitar el giroscopio por si no estaba habilitado ya, así que en el inicio de nuestro script lo habilitamos de esta manera.

Input.gyro.enabled = true;
Una vez habilitado, cuando queramos ver la información es tan sencillo como estos tres ejemplos que he mostrado:

  Debug.Log("Rotacion: "+Input.gyro.attitude); //Rotación del giroscopio
  Debug.Log("Aceleracion: "+Input.gyro.userAcceleration); //Aceleración del dispositivo
  Debug.Log("Gravedad: "+Input.gyro.gravity); //Gravedad  del dispositivo
Algo que podríamos hacer para probar que funciona sería cambiar la rotación de un cubo delante de la cámara y usar la rotación dada en Input.gyro.attitude para entender un poco mejor el comportamiento y de ahí, aplicarlo como queramos en nuestro videojuego.

Utilidades para esto hay miles, solo hay que pensar un poco en que te gustaría hacer.