Hola Gente! Regresando esta semana con formas de hacer money 😛 esta vez toca Unity Ads, que es solo vídeo y que está pagando por encima del mercado en CPM.
Para los que no saben CPM es que te pagan por vistas, a diferencia de CPI donde te pagan cuando presionan el Ad, ahora para considerarse una vista, tiene que ser visto todo el vídeo.
La verdad es muy simple implementar Unity Ads en Unity 3D, solo hay que bajarse el SDK que en realidad es un plugin que pueden encontrar en Asset Store de Unity, no esperen encontrar Banners o Interstitial como Admob u otros.
Tiene juegos muy populares que lo implementan, como Crossy Road que llego a ganar 1 millón de dólares en 45 días, claro que tienen que tener un juego como ese para ganar esa cantidad 😛
El único gran problema que tiene por ahora es que paga por deposito bancario y no por Paypal lo que lo hace bastante dificil de cobrar, ojala arreglen eso en el futuro
En todo caso no lo probé en Android pero no creo que haya ningún problema, al final salio que estaba corriendo bien el Ad así que me imagino que todo irá bien
Links:
Página de Unity Ads : https://unityads.unity3d.com/
Plugin de Unity Ads : https://www.assetstore.unity3d.com/en/#!/content/21027
Guia para implementarlos bien (esteticamente): http://blogs.unity3d.com/2015/04/15/a-designers-guide-to-using-video-ads/
Mi recomendación es que jueguen Crossy Road para que vean lo bien implementados que están: https://play.google.com/store/apps/details?id=com.yodo1.crossyroad&hl=en
Código
VideosUnityScript
using UnityEngine; using System.Collections; using UnityEngine.Advertisements; using UnityEngine.UI; public class VideosUnityScript : MonoBehaviour { public Button botonVideo; public Text textoBotonVideo; void Awake() { if (Advertisement.isSupported) { Advertisement.Initialize ("11111", true); //Modod prueba, utilizar el de abajo al momento de ir a produccion //Advertisement.Initialize ("11111"); } else { Debug.Log("Plataforma no soportada"); } } public void MostrarBoton() { if(Advertisement.IsReady()) textoBotonVideo.text = "Mostrar Ad"; else textoBotonVideo.text = "Esperar..."; botonVideo.gameObject.SetActive(true); } public void ShowAd(string zone = "") { if (string.Equals (zone, "")) zone = null; ShowOptions options = new ShowOptions (); options.resultCallback = AdCallbackhandler; if (Advertisement.isReady (zone)) Advertisement.Show (zone, options); } void AdCallbackhandler (ShowResult result) { switch(result) { case ShowResult.Finished: Debug.Log ("Ad Entregado. Entregando Monedas..."); break; case ShowResult.Skipped: Debug.Log ("Ad Descartado. No damos nada..."); break; case ShowResult.Failed: Debug.Log("Ad Fallo. No hay dinero :( "); break; } } }
flappyScript
using UnityEngine; using System.Collections; public class flappyScript : MonoBehaviour { //Declaramos la velocidad inicial del pajaro sea igual a zero, Vector3.zero = 0,0,0 //1,1,0 Vector3 velocidad = Vector3.zero; //Declaramos un vector que controle la gravedad, no usaremos la fisica de unity public Vector3 gravedad; //Declaramos un vector que define el salto (aleteo) del pajaro public Vector3 velocidadAleteo; //Declaramos si se debe aletear, si se toco la pantalla o se presiono espacio bool aleteo = false; //Declaramos la velocidad maxima de rotacion del pajaro public float velocidadMaxima; public TubosScript tubo1; public TubosScript tubo2; private Animator anim; private bool juegoTerminado; private bool juegoIniciado; public RectTransform botonesMenu; public VideosUnityScript videosUnity; // Use this for initialization void Start () { anim = this.gameObject.GetComponent<Animator> (); } // Update is called once per frame void Update (){ //aumenta con el numero de presiones en la pantalla int numPresiones = 0; foreach (Touch toque in Input.touches) { if (toque.phase == TouchPhase.Ended) numPresiones++; } //Si la persona presiona el boton de espacio o hace clic en la pantalla con el mouse, o tocas con el dedo if (Input.GetKeyDown(KeyCode.Space) | Input.GetMouseButtonDown(0) | numPresiones > 0) { if(juegoTerminado == false) aleteo = true; juegoIniciado = true; tubo1.juegoIniciado = true; tubo2.juegoIniciado = true; } if(juegoTerminado) MostrarBotones(); } //Este es el update de la fisica, que es ligeramente mas lento que el update del juego void FixedUpdate () { if(juegoIniciado) { //A la velocidad le sumamos la gravedad (Para que el pajaro caiga) velocidad += gravedad * Time.deltaTime; //Si presionaron espacio o hicieron clic if (aleteo == true) { //Que solo sea una vez aleteo = false; //El vector velocidad recibe el impulso hacia arriba al pajaro velocidad.y = velocidadAleteo.y; } //Hacemos que el pajaro reciba la velocidad (la gravedad lo hace caer mas rapido) transform.position += velocidad * Time.deltaTime; float angulo = 0; if (velocidad.y >= 0) { //Cambiamos el angulo si Y es positivo que mire arriba angulo = Mathf.Lerp (0, 25, velocidad.y/velocidadMaxima); } else { //Cambiamos el angulo si Y es negativo que mire abajo angulo = Mathf.Lerp (0, -75, -velocidad.y/velocidadMaxima); } //Rotamos transform.rotation = Quaternion.Euler (0, 0, angulo); } } //Cada vez que haya una colision con cualquier objeto que tenga un collider se actiavara esta funcion //Collider son Box Collider 2D, Circle Collider 2D, etc. void OnCollisionEnter2D (Collision2D colision) { //Si colisionamos con el tubo, que se detengan los tubos if(colision.gameObject.name == "TuboAbajo" | colision.gameObject.name == "TuboArriba"|colision.gameObject.name == "Piso") { //Hacemos que la velocidad de los tubos se haga cero tubo1.velocidad = new Vector3(0,0,0); tubo2.velocidad = new Vector3(0,0,0); anim.SetTrigger("JuegoTerminado"); juegoTerminado = true; } if(colision.gameObject.name == "Piso") { gravedad = new Vector3(0,0,0); } if(colision.gameObject.name == "TuboAbajo") { colision.gameObject.GetComponent<BoxCollider2D>().enabled = false; } } private void MostrarBotones() { // botonesMenu.gameObject.SetActive(true); videosUnity.MostrarBoton(); } }
Suerte!