Hola Gente! Esta semana este es el ultimo vídeo tutorial prometido que me faltaba y es como hacer los banners e interstitials con el plugin de Revmob en Unity 3D, realmente es bien simple, no se ni porque lo hago 😛 pero intente hacerlo un poquito ameno, al menos al comienzo, bueno este vídeo usa el proyecto de Flappy Bird sin ads ni google services.
De Revmob podemos decir que es una empresa seria, paga alto, no tanto como Admob pero podemos decir que es segundo lugar, tiene fácil instalación en Unity, paga cada $50 que es un plus, Leadbolt te paga llegando a los $100 recién.
Y bueno así lo tienen este ultimo tutorial para implementar el SDK de revmob en unity 3D y creo que ese será el último en buen tiempo en lo que refiere a Ad networks.
Solo me queda hacerles recordar que cuando terminen de configurar el revmob no se olviden de cambiar los ads de testing:
Proyecto de Flappy Bird
https://app.box.com/s/jhqczcgwkr6f9zvl32xp
Código
revmobScript
using UnityEngine; using System.Collections; using System.Collections.Generic; public class revmobScript : MonoBehaviour, IRevMobListener { private static readonly Dictionary<string, string> REVMOB_APP_IDS = new Dictionary<string, string>() { { "Android", "123456789abcde"}, { "IOS", "copy your iOS RevMob Media ID here" } }; private RevMob revmob; public static revmobScript RevmobScript; void Awake() { #if UNITY_EDITOR Debug.Log("Session iniciada."); #elif UNITY_ANDROID revmob = RevMob.Start(REVMOB_APP_IDS, "Revmob"); #endif if(RevmobScript != null) GameObject.Destroy(RevmobScript); else RevmobScript = this; DontDestroyOnLoad(this); } public void cargarFullScreen() { #if UNITY_EDITOR Debug.Log("cargarFullScreen Revmob."); #elif UNITY_ANDROID revmob.CreateFullscreen (); #endif } public void cargarBanner() { #if UNITY_EDITOR Debug.Log("cargarBanner Revmob."); #elif UNITY_ANDROID revmob.CreateBanner (RevMob.Position.TOP, 0, 0, 250, 50); //revmob.CreateBanner(); #endif //revmob.CreateBanner (RevMob.Position.TOP, 0, 0, 250, 50); } public void MostrarFullScreen() { #if UNITY_EDITOR Debug.Log("MostrarFullScreen Revmob."); #elif UNITY_ANDROID revmob.ShowFullscreen(); #endif } public void MostrarBanner() { #if UNITY_EDITOR Debug.Log("MostrarBanner Revmob."); #elif UNITY_ANDROID revmob.ShowBanner (); #endif } public void EsconderBanner() { #if UNITY_EDITOR Debug.Log("EsconderBanner Revmob."); #elif UNITY_ANDROID revmob.HideBanner (); #endif } #region IRevMobListener implementation public void SessionIsStarted () { // Debug.Log("Session started."); } public void SessionNotStarted (string revMobAdType) { // Debug.Log("Session not started."); } public void AdDidReceive (string revMobAdType) { // Debug.Log("Ad did receive."); } public void AdDidFail (string revMobAdType) { // Debug.Log("Ad did fail."); } public void AdDisplayed (string revMobAdType) { // Debug.Log("Ad displayed."); } public void UserClickedInTheAd (string revMobAdType) { // Debug.Log("Ad clicked."); } public void UserClosedTheAd (string revMobAdType) { // Debug.Log("Ad closed."); } public void InstallDidReceive(string message) { // Debug.Log("Install received"); } public void InstallDidFail(string message) { // Debug.Log("Install not received"); } public void EulaIsShown() { // Debug.Log("Eula is displayed"); } public void EulaAccepted() { // Debug.Log("Eula was accepted"); } public void EulaRejected() { // Debug.Log("Eula was rejected"); } #endregion }
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; private revmobScript revmob; private bool fullScreenMostrado; // Use this for initialization void Start () { revmob = revmobScript.RevmobScript; anim = this.gameObject.GetComponent<Animator> (); revmob.cargarBanner (); revmob.MostrarBanner (); revmob.cargarFullScreen (); } // 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; } } //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; } } void OnGUI() { GUIStyle customButton = new GUIStyle("button"); customButton.fontSize = 20; int anchoBoton = Screen.width / 3; int altoBoton = Screen.height / 7; if(juegoTerminado) { // Dibujamos un boton de Reinicio if(!fullScreenMostrado) { revmob.EsconderBanner(); revmob.MostrarFullScreen(); fullScreenMostrado = true; } if ( GUI.Button( new Rect( Screen.width / 2 - (anchoBoton / 2), (1 * Screen.height / 3) - (altoBoton / 2), anchoBoton, altoBoton ), "Reiniciar!",customButton ) ) { // admob.ShowBanner(); Application.LoadLevel("escena1"); } } } }
Manifest
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="flappy.gordo" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> <application android:theme="@android:style/Theme.NoTitleBar" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false"> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" /> <meta-data android:name="android.app.lib_name" android:value="unity" /> </activity> <activity android:name="com.revmob.ads.fullscreen.FullscreenActivity" android:theme="@android:style/Theme.Translucent" android:configChanges="keyboardHidden|orientation"> </activity> </application> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="21" /> <uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> </manifest>
Suerte!