lunes, 29 de febrero de 2016

¿Por qué corres? Nerdy Run día 2 | Why you run? Nerdy Run day 2

Español | English

¿Por qué corre nuestro protagonista? Esa es una pregunta que quedo sin responder y que le da poco sentido a un Infinite Runner, ¿por qué hay que correr y saltar y evadir obstáculos? En este juego como pueden ver en entradas anteriores, nuestro personaje va a ser un "Nerd", por lo que podemos optar por dos alternativas:
  1. Corre de un Bully
  2. Llega tarde a clases
El primero puede ser más cómico para los chicos ya que conlleva a la acción y un poco a la adrenalina de estar en peligro. Pero rápidamente nos tenemos que dar cuenta que esto conlleva a violencia, lo que hace preguntar: ¿Por qué debemos correr de este Bully? ¿ No nos podemos defender? ¿ Y si nos atrapa? ¿Es correcto perseguir a estos "Nerds"? Todas estas preguntas llevan connotaciones negativas, que si bien uno puede no preguntárselo directamente, llegan al inconsciente del jugador.

Por lo que decidí por la segunda opción, este "Nerd" tiene que llegar temprano a clases, por lo que se puede pensar en dos modos: modo lineal, en el que debe pasar un nivel en el menor tiempo posible y modo Infinite Runner en el que debe juntar la mayor cantidad de puntos posibles. Esta opción además de no ser ofensiva o contener violencia, me da también dos modos de juegos, por lo que podemos ver claramente los beneficios.

El hecho de que se puede hacer por niveles me da más ventajas todavía, puedo hacer niveles especiales en donde se refieran a mini-juegos de un tipo, otro nivel con otros mini-juegos. Además puedo utilizar la técnica que Candy Crush utiliza, hacer actualizaciones que contengan más niveles, por lo que si el juego tiene mucho éxito, se le puede cada vez añadir más niveles (además de tener siempre posible la opción de Infinite Runner).


Por ahora ya he terminado los Spawner de los que hablé en la entrada anterior y ahora debo enfocarme en cómo hacer estos mini juegos. Por otra parte, tuve más resultados con Tappx, el día 28 no generó ninguna impresión lo que me preocupó, yo estimo que esto ocurrió ya que no tenía suficientes Tappx (un mínimo de 500 estimo yo), pero hoy me dio más de 900 impresiones y tuve 10 clicks, de nuevo, por cuestiones de demora en los datos de Google Play, no puedo ver si aumentó el número de descargas. Si pude ver que ocurrió una instalación en el día que Tappx empezó a funcionar, por lo que puede que este plan funcione.

-L


----------------------------------------------------------------------------
English


Why does our main character run? That is a question that was left unanswered and give little sence to an Infinite Runner. Like, why do we have to run, jump and avoid obstacles? This game as I said on my previous entries, our character will be a "Nerd", so we can have two alternatives:

  1. Running from a Bully.
  2. Being late for class.

The first option may be funnier for little kids as it has action and a little bit of adrenaline because of the danger. But quickly we have to realize that this brings violence, which makes us wonder: Why do we have to run from this Bully? Can't we defend ourselves? What if he/she catch us? Is it right to persue "Nerds"? All this questions brings negative feelings or line of though, which, although one may not make this questions directly, they will reach the unconscious of the Player.

That is why I've chosen the second option, this "Nerd" can't be late for his class and this brings two game modes: lineal mode, in which he needs to pass through a level in the shortest time possible, or Infinite Runner mode, in which he needs to score the highest amount of possible points. This option besides of the advantage of being non violent , gives me twe game modes, so we can clearly see the benefits.

The fact that it can be made by levels also gives another extra advantage, I can do special levels in which some might have one type of mini-game and other levels other mini-games. Besides, I can use the technique that Candy Crush uses, do Updates that will include more levels, so if the game has a lot of success, I can always add more levels (besides of always having the Infinite Runner mode).

For now I've finish with the Spawners I'v talked about on my last entry and now I must focus on the mini-games. On the other hand, I have more results of Tappx, on the day 28, it didn't generate any impression which made me worry for a while, what I think that happened was that I run out of Tappx and I didn't have the "minimum" required (which I think is 500 Tappx), but today it generated more than 900 impressions and I had 10 clicks, again, because of Google Play, I can't see if the number of downloads increased. I did could see that on the day I started using Tappx I had a new download, so this plan might work.

-L

domingo, 28 de febrero de 2016

Nerdy Run Día 1 | Nerdy Run Day 1

Español | English

Nerdy Run, ese es el nombre que había decidido para el momento y hasta ahora es con el que voy a seguir usando, siempre es importante que halla Tags en los nombre, así es más fácil de ser enontrado por Google.

Después de estar un rato tratando de descifrar las mecánicas que quiero utilizar me pude decidir, como siempre hago, primero voy a hacer el juego con comando para PC (por lo que voy a usar las flechitas del teclado) y para cuando vaya terminando el juego traspaso esos controles a los controles de Android.

El juego tiene una lógica parecida al anterior salvo que para nuestro personaje, la gravedad no afecta (esto se logró modificando el valor de gravity Scale a cero en el Rigidbody2D de nuestro Player). Lo único que iremos haciendo es subir o bajar para esquivar obstáculos, el código que utilicé para esto fue:

        player.position += new Vector3(velocidad, 0, 0);
        if (Input.GetKey(KeyCode.UpArrow)) {            
            player.Translate(Vector3.up * desplazamiento);
        }
La primera parte es la que hace que siempre vayamos para adelante, mientras que la segunda hace que si presionamos la flecha para arriba, el Transform del jugador se traslade hacia arriba. Por lo que multiplicamos a Vector3.up (vector unitario en Y) por la velocidad a la que queremos que se desplace.

Por supuesto había que crear una especie de "área" en donde el jugador se puede mover, por lo que para eso creé un cubo alargado (modificando su escala en X) que sea de la medida del área de la cámara y que este, uno justo encima de esta y otro, por debajo. Esto lo que hace es limitar hasta donde nos podemos mover, creando unos "bordes" o "paredes".





Lo que queda por hacer es terminar los Spawn (unos objetos que van a hacer que aparezcan otros objetos) de obstáculos y con eso tenemos un nuevo Infinite Runner. Pero recordemos que por ahora estoy utilizando solamente cubos, luego hay que añadir el arte. Pero el segundo paso sería crear los "mini-juegos" que el juego va a tener.

-L




-------------------------------------------------------------------------
English


Nerdy Run, thats the name I've decided at that moment and its the name I'll keep using, its always important that you use Tags on the name, so it is easier to be found by Google.

After being a while trying to figure out the mechanics I want to use I finally decided. As I always do, I'll first make the game with controlls for the PC  (so it can use the keyboard arrows) and when I've finish the most parts of the game I switch the controlls to let the game be played on Android.

The game is going to have a similar logic to my last game but this time the character is not effected by gravity (this was achieved by setting the gravity Scale value to 0 on the Rigidbody2D of the Player). The only thing the player is going to do is to move up and down, for this I used this code:

 player.position += new Vector3(velocidad, 0, 0);
        if (Input.GetKey(KeyCode.UpArrow)) {            
            player.Translate(Vector3.up * desplazamiento);
        }

The first part makes us always move forward, while the second one checks if we have pressed the "up arrow", if we did, the Transform of the Player will be translated up. For that we multiply the unitary vector "Vector3.up" with the velocity for which we want the player to move.

Of course it need to be created an "area" where the player can moves, for this I created a cube and modified its X value so it is the same size as the camera screen area, then I placed one above and one below this camera's area, creating this "borders" or "walls" where we can move.



What it's left is to finish the Obstacles' Spawners (objets that will spawn other objects) and we have a new Infinite Runner. But remember that I'm currently using cubes, the art will need to be added later. The second step would be to create the "mini-games" the game will have.

-L

sábado, 27 de febrero de 2016

De borrador a proyecto | From a draft to a project

Español | English


Ya que me decidí volver a mi antiguo proyecto es hora de ver donde lo dejé. Me di cuenta que solo había hecho un par de Sprites (que compartí en la entrada anterior) y unas animaciones, además de esto:



Que iba a ser uno de los obstáculos, claramente se puede notar como no soy un experto del Pixel Art y que debo mejorar, por lo que tengo que crear los Sprites de cero. Para esto voy a utilizar un programa que esta hecho exclusivamente para crear Pixel Art: Aseprite, pueden descargar una versión gratis desde la página oficial: http://www.aseprite.org/older-versions/ son las versiones antiguas del programa pero son gratis.

De todas formas puedo programar las mecánicas usando cubos de nuevo y luego añadir los Sprites y animaciones, por lo que debo empezar a programar con Unity. Si bien estas mecánicas pueden hacerse relativamente rápido, el problema más grande para mí por ahora va a ser el arte, ya que al no tratarse de vectores, al escalar, ya sea agrandar o achicar la imagen, esta pierde calidad. Por lo que voy a tratar de crear estos Sprites de las medidas casi exactas para que no se pierda calidad, generalmente al ser un juego para Mobile, unos Sprites 100x100 pueden ser de la medida exacta.

Por otra parte, con Tappx hasta el día de hoy (hasta este momento) tuve de nuevo unas 500 impresiones de mi publicidad, lo que me parece un muy buen número. Recordemos que esto es gratis, por lo que el costo de promocionar mi juego no fue económico sino de otras formas (tiempo en implementar, el peso que le agrego al APK, etc). Por ahora estoy muy feliz con los resultados que me dio, falta que se actualice la Consola de Desarrollador de Google Play para poder ver si el número de descargas subió.

-L


--------------------------------------------------------------------------------------------
English


Now that I've decided to resume my old project its time to see where I left it. I realized  that I've made some Sprites (Which I shared on the last entry), some animations and this:


Which was going to be an obstable, it can be seen clearly that I'm not a Pixel Art expert and I need to improve, so I need to create the Sprites from cero. For this I'm going to use a program made exclusively for Pixel Art: Aseprite, you can download it for free from its official page: http://www.aseprite.org/older-versions/ they are older versions but they are free.

Anyways I can program the game mechanics using cubes and then add the Sprites and animations, so I can start programming with Unity. Although this mechanics can be made relatively quick, the biggest problem for me now is the art, as we are not dealing with vectors, when scaling, either making them bigger or smaller, they lose quality. So I'm gonna try to make the Sprites of the exact perfect size so I don't lose quality, generally im mobile games, 100x100 Sprites can be just the exact size.

On the other hand, with Tappx to this day ( until this moment) I had more than 500 impressions of my ad, which I think is a good number. Remember that this is free, so the cost of promoting the game wasn't economic but it was on other ways (time of implemmentation, the size it added to the APK, etc). For now I'm very happy with the results it gave me, I only need for the data of the Google Play Developer Console to update so I can see if the number of downloads changed.

-L

viernes, 26 de febrero de 2016

Primeros resultados de Tappx | First results with Tappx

Español | English

Luego de publicar mi Update de Infinite Squared Run con el SDK de Tappx era hora de que me activen la cuenta y ya empiece a promocionar mi juego, si bien esto no se hizo instantáneamente, al mandar un mail con los chicos de soporte técnico (muy amables y dispuestos a ayudar en todo) ya me lo pudieron solucionar, con lo que ya tengo mis primeros resultados de mi experiencia con Tappx en 1 día.

Lo que obtuve apenas estuvo activo medio día mi aplicación fue: 360 Impresiones (veces que se mostró mi juego), 1 click (alguien que clickeó en la publicidad) y 500 Tappx (lo que me "costó"). Recordemos que Tappx se centra en esta mecánica de que 1 click = 500 Tappx, por lo que si alguien clickea en nuestra publicidad son 500 Tappx menos y si alguien clickea en la publicidad de otro en mi juego me dan 500 Tappx (se pueden ganar Tappx de otras formas también).

Me gustaron los números inicialmente, 360 veces que se mostró mi publicidad es bastante, lo cual si bien no clickearon, pudieron ver que mi juego estaba ahí, que existía. Gracias a que la consola de Desarrollador de Google Play no esta nunca al día sino que siempre muestra con 1 o 2 días de retraso las instalaciones, no puedo ver si esa persona instaló o no mi juego.

Pero por sobre todo, suponiendo que cada día se muestran 300 o más impresiones de mi juego haciendo su promoción me dejan tranquilo ya que a mi parecer ese número esta bien. Por lo que como proyecté, puedo dejar el juego "solo" y que se haga la promoción por sí mismo.

Actualización: A la hora de actualizar esta entrada (que casualidad) se actualizaron los datos de Tappx, por lo que ahora mis datos son: 595 impressions,  5 clicks y 2500 Tappx. Lo cual enfatiza la conclusión.

-L


-----------------------------------------------------------------------------------------
English
After publishing the Infinite Squared Run Update with Tappx's SDK it was time for them to active my account so I could start promoting my game, although this wasn't done instantly, after sending a mail to the guys of tech support ( which are very nice and willing to help you at anything) the could solve the problem, so I now how my first experience of 1 day of Tappx.

What I got after being active for half a day was: 360 impressions (times the ad of my game was shown), 1 click (someone who actually clicked the ad) and 500 Tappx (what it "cost" me). Lets remember the way Tappx works: 1 click = 500 Tappx, so if someone clicks on my ad that is 500 Tappx less for me but if someone clicks on the ad of another dev on my game, I gain 500 Tappx (the Tappx can be earned in other ways also).

I liked the initial numbers, 360 times my ad was shown, which is a big number, althoug they didn't click too much, the could see my game was there, that it exists. Thanks to Google Developer Console I can't see if there was an increase in the number of installs as it always shows up to two or three days before, like a "delay".

But among all things, assuming that every day 300 ads of my game are displayed leaves me calm as to me that number is fine. As I planned, it seems I can leave my game "alone" and let it promote itself.

Update: Right after publishing this entry, the numbers of Tappx got updated so now I have: 595 impressions, 5 clicks and 2500 Tappx. Which emphasizes the conclution.

-L

jueves, 25 de febrero de 2016

Nuevo proyecto | New Project

Español | English

Ya que terminamos el proyecto de Infinite Squared Run, doy paso a un nuevo proyecto que decidí que va a ser también con arte 2D y para Android, el motivo de esto es para seguir realizando proyectos relativamente "simples" para ganar experiencia. Para esto tengo dos potenciales candidatos:

Otro Infinite Runner. Podría retomar un boceto que tuve sobre un proyecto de Infinite Runner mezclado con rompe cabezas y mini juegos, que casi ningún juego de este estilo (para no decir nadie) optó por tomar, sería por ejemplo ir corriendo, en caso de chocarte con (ej) una foto, debemos encontrar cierto elemento en esta para ganar más puntos. Este tendría un estilo artístico de Pixel Art.

Ventajas:
  • Ya se como se hacen los Infinite Runner.
  • Cualquier duda para programar puedo utilizar el código de Infinite Squared Run.
  • Ya que estoy haciendo de nuevo el mismo estilo que mi anterior juego, el tiempo en el que lo desarrollaré será menor por lo tanto, tendré un juego nuevo en relativamente poco tiempo.
  • El arte es Pixel Art, un arte que es relativamente sencillo hacer.
Desventajas:
  • No ganaría mucha experiencia ya que estoy haciendo el mismo tipo de juego que el anterior.
  • El arte podría hacer que el juego tarde más de lo planeado.
  • Podría tener la misma respuesta de la audiencia que mi juego anterior.

Si bien las desventajas son a considerar, el hecho de que pueda hacer en corto tiempo (ya que voy a hacer las cosas más rápido) otro juego me alientan ya que sumaría otro juego a mi colección. Por otra parte creo también que el Pixel Art atraerá a los más chicos ya que comparan todo este tipo de arte con Minecraft, además de que el hecho de añadir los rompecabezas al juego creo que le añadirá un toque de originalidad muy único.

Acá dejo dibujo de lo que había hecho que iba a ser el personaje principal (si, la idea es que sea "nerd") y a su profesor de matemática:


Por lo que se dan cuenta el juego va a tomar lugar en un ámbito académico. También se podría pensar en un estilo de juego lineal en vez de Infinite Runner pero es lo que más acorde es para lo que tengo pensado.


La otra alternativa es un proyecto en le que tengo mucha fe por su idea original ( que por ahora va a ser secreta) pero podemos decir que este juego ofrece una temática única con una jugabilidad única, el tema que me preocupa con respecto a este juego es que debe realizarse a la perfección, desde las texturas (arte 2D no Pixel Art) hasta la jugabilidad, por eso creo que debería dejar este juego para un poco más adelante ya que sería como el "As bajo la manga". Lo que puedo decir de este juego es que tendría una jugabilidad inversa a la de un tower defense (podría llamarse tower attack?).  

Las ventajas que podrían realizar la creación de este juego son potencialmente grandes, por eso lo decido guardar para que cuando tenga más experiencia tanto en el área de programación como en arte (arte sobre todo), como desventaja, la más grande sería el tiempo que me podría llegar a tomar realizar este juego.

Por lo analizado, se ve que la opción más favorable a mi punto de vista es crear otro Infinite Runner con el objetivo de realizarlo en un lapso de tiempo relativamente corto (3 meses o menos) y sumar otro juego a mi colección.

-L

---------------------------------------------------------------------------------
English


As we finished the Infinite Squared Run project, I step aside to start a new project which I decided it will alse be in 2D art and for Android, the motive for this is to keep making games relatively "simple" to gain experience. For this I have two candidates:

Another Infintie Runner. I could resume a scratch I had about an Infinite Runner mixed with puzzles and mini-games, which almost any of its kind (to don't say none) decided to take, it would be for example running and stepping into a (eg) picture, from there we need to find an element inside it to win extra points. This game would have Pixel Art style

Advantages:
  • I now know how to do Infinite Runners.
  • If any doubt comes, I can use the code I used for Infinite Squared Run.
  • As I'm doing the same type of game as my last project, the time that it will take me to develop will be less, so, I would have a new game in relatively short time.
  • The Pixel Art style is relatively simple to do.
Disadvantages:
  • I won't gain that much experience as I am doing the same type of game as the one before.
  • The art could take more time that I had planned.
  • Could have the same respond from the audience as my last game.

Although the disadvantages are to be considered, the fact that I can make another game in a short amount of time (as I'm gonna do things quicker) it encourages me as I would have another game to my collection. On the other hand, I think Pixel Art will attract the little children who compare everything made with this art style wirh Minecraft, besides, the fact of adding puzzles to the game will give the game an unique touch of originality.

Here are some drawings I've made of what was going to be the main character (yes, the idea is to make him look like a "nerd") and his math professor.


For what you can realize the game will take place in an academic place. I can think also of a linear style for the game rather than Infinite Runner but this last one is more suitable for what I have on my mind.

The other alternative is a project in which I got a lot of faith because of its origianlity on its idea ( which for now will remain secret) but we can say this games offers an unique theme with unique gameplay, what concerns me about hits game is that it needs to be done perfectly, from the textures (2D art not Pixel Art) to its gameplay, for that I think I should leave this game for the future as it will be my "unleashed the Kraken" thing. What I can say about this game is that its gameplay would be the inverse of a tower defence (might be called tower attack?).

The advantages that could come by doing this game are potentially huge, for that I decided to save it for when I have more experience in the programming area as the art area (specially on the art area), as a disadvantage, the greatest one would be the time that it can take me to do this game.

By the things considered, the most favorable option from my point of view is to create another Infinite Runner with the objective of doing it in a lapse of time relatively short ( 3 months or lesS) and add another game to my collection.

-L

miércoles, 24 de febrero de 2016

Como instalar Tappx y Admob en una misma App | How to install Tappx and Admob in the same app

Español | English


Como mencioné en mi entrada anterior, esta entrada será sobre los pasos a seguir para implementar Admob y Tappx. Repaso para lo que no saben, Admob es una red publicitaria que nos permite poner publicidad en nuestros juegos mientras que Tappx en vez de publicidad muestra juegos de otros desarrolladores y a cambio, ellos muestran nuestro juego. Aviso: Este tutorial será para instalar publicidades de pantalla completa (Interstitial) y será dirigido para Android.

Por qué hacer este proceso? : Si bien Admob muestra publicidades y puede hacernos ganar dinero, Tappx se encargará de que nuestro juego sea más conocido, ya que estaríamos promocionándolo. Lo más conveniente para mi es intercalar entre mostrar 1 publicidad de Admob y 1 de Tappx y repetir esa secuencia. 

Para lo siguiente empecemos por implementar Admob:


  1. Para eso debemos descargarnos el plugin de Admob para Unity desde su página en Github: https://github.com/googleads/googleads-mobile-unity/releases tienen que bajarse la última versión que este disponible (la versión debe ser desde la 3.0 en adelante).
  2. Importamos el paquete en Unity: Assets/Import/Custom Package y seleccionamos el plugin que nos acabamos de descargar.
  3. Una ventana se nos abrirá indicando que archivos queremos importar, para esto recomiendo que si nuestro juego es solo para Android no para IOS, destildar las casillas que digan "IOS" ya que no las vamos a necesitar.
  4. Abrimos el Manifest que esta dentro de la carpeta Plugins/Android/GoogleMobileAdsPlugin y quitar un par de líneas de código: Desde la línea de código 22 que empieza con " <!-- Google Mobile Ads Activity -->" hasta la línea 28 que termina con "android:theme="@style/Theme.IAPTheme"/>" . Con esto nos aseguramos de borrar la actividad que complica la compatibilidad con Google Play Services y la actividad de "nAppPurchase Activity" que es para juegos con micropagos. (En caso de que el juego tenga micropagos deshacer este último paso y borrar solamente la actividad de Google Mobile Ads Activity).
Y listo, ya tenemos instalado Admob, la parte de código la haremos al final todo junto pero lo que falta en el caso de que queramos solamente instalar Admob sería, por código, insertar nuestra ID the Admob y especificar cuando hacer el AdRequest, AdLoad y AdShow.

Implementación de Tappx (más fácil):

  1. Crear una cuenta en www.tappx.com
  2. Añadir nuestra app haciendo click en "Añadir App" y completando el formulario
  3. Descargamos su SDK desde su página oficial http://www.tappx.com/es/manual/?os=uni#0_gettingStarted
  4. De nuevo ir a Assets/Import/Custom Package y ahora con cuidado, des-seleccionamos el AndroidManifest que aparece cerca del principio ya que nuestro proyecto lo tiene.

  5. En caso de ya haber instalado Google Play Services en nuestro proyecto, des-seleccionamos también esta carpeta y de nuevo, si no utilizamos IOS podemos des-tildarla también.
  6. Una vez importado vamos a TappxManagerUnity.prefab e introducimos nuestra ID de Android o IOS o ambas si utilizaremos los 2 servicios y tambien tildamos si solo utilizaremos banners o interstitials.




Abajo explico donde podemos encontrar nuestra ID de Tappx. Por último vamos a el Android Manifest que está dentro de la carpeta /Plugins/Android/GoogleMobileAdsPlugin y al final, antes de </application> copiamos lo que va a servir para el "Track" de la aplicación:


<receiver android:name="com.tappx.unity.InstallReferrerReceiver" android:exported= "true" > 
<intent-filter> 
<action android:name="com.android.vending.INSTALL_REFERRER" /> 
</intent-filter> 
 <meta-data android:name="forward.GoogleAnalytics" android:value="com.google.android.apps.analytics.AnalyticsReceiver" />
 </receiver>

Ahora compilamos para ver que no haya errores. Hacemos esto yendo a File/Build Settings/Build, primero nos fijamos que la plataforma Android este seleccionada, en caso de ser otra, seleecionamos Androidy apretamos en "Switch Platform". Luego nos preguntará a donde queremos guardar el archivo (APK), elegimos y le damos Build. Antes de compilar vamos a "Player Settings" y en "Other Settings" vamos a "Identification" y ahí a "Bundle Identifier" que el default suele ser "com.Comany.ProductName" y cambiamos "Company" y "ProductName" por lo que queramos, yo puse para esta prueba "com.companiaprueba.prueba" y ya eso funciona para probar si compila.

Ahora la parte de código. Necesitamos un Script "General" que funcione para el comportamiento "General" del juego en caso de no tenerlo, podemos crearlo o podemos poner el código en el lugar que más le parezca conveniente.

Debemos entender que las publicidades funcionan con tres pasos:

  1. AdRequest: La publicidad le "pide" a su red que le envíe una publicidad para mostrar
  2. AdLoad: Esta parte se encarga de cargar la publicidad pedida para que este lista para mostrar
  3. AdShow: Mostrar la publicidad, este evento solo se cierra cuando el usuario cierra la publicidad.
Para ello un script sencillo podría ser:


using System;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using GoogleMobileAds;
using GoogleMobileAds.Api;
using GooglePlayGames;

using UnityEngine.SocialPlatforms;

//variables a utilizar más adelante
 private InterstitialAd interstitial;
 AndroidJavaObject interstitialControl;
int ad = 1;


void Start() {  //Es conveniente poner en Start los request para que se inicien cuando carga el juego                              aunque puede hacer que el juego se tilde al iniciar



 RequestInterstitial(); //admob request

        interstitialControl = new AndroidJavaObject("com.tappx.unity.interstitialTappx", "TappxID", "TappxManagerUnity"); //tappx request
}

void Perder(){ //esta parte será para cuando nuestro jugador pierda trate de lo que se trate el jeugo

 if (ad % 2 != 0)  //más abajo explicaré esta parte del código
        {
            ShowInterstitial(); //admob interstitial
            ad++;
        }
        else
        {
            //interstitial.Show();
            interstitialControl.Call("showInterstitial");     //tappx interstitial
            ad++;

}



Poner los Request en la función Start funciona para los juegos que al perder se reinician, en caso de usar otro método habría que ubicarlos en otra función. Ahora toda la parte siguiente es la parte que hay que agregar de parte de Admob y Tappx, son funciones que ellos mismos proveen: 


 private void RequestInterstitial() //request inter
    {

#if UNITY_EDITOR
        string adUnitId = "unused";
#elif UNITY_ANDROID
            string adUnitId= "Insert AdmobID";
#else
        string adUnitId = "unexpected_platform";
#endif

        // Create an interstitial.
        interstitial = new InterstitialAd(adUnitId);

        // Load an interstitial ad.
        interstitial.LoadAd(createAdRequest());
    }
    

    // Returns an ad request with custom ad targeting.
    private AdRequest createAdRequest()
    {
        return new AdRequest.Builder()
                .AddTestDevice(AdRequest.TestDeviceSimulator)
                .AddTestDevice("AC98C820A50B4AD8A2106EDE96FB87D4")
                .AddKeyword("game")
                .SetGender(Gender.Male)
                .SetBirthday(new DateTime(1990, 1, 1))
                .TagForChildDirectedTreatment(false)
                .AddExtra("color_bg", "9B30FF")
                .Build();
    }


    private void ShowInterstitial()
    {
        if (interstitial.IsLoaded())
        {
            interstitial.Show();
        }
        else
        {
            print("Interstitial is not ready yet.");
        }
    }

    // Tappx
    
    public void InterstitialLoaded()                        //check ad loaded
    {
        UnityEngine.Debug.Log("Interstitial Load");
    }

    public void InterstitialFailedToLoad(string error)
    {
        UnityEngine.Debug.Log("Interstitial Error " + error);
    }




Borre un par de datos por lo que copiar y pegar no funcionará, deben agregar en sus IDs de Admob y Tappx en las partes correspondientes y en AddTestDevice puse lo que viene por default en la guía de Admob.

La ID de Tappx la podemos ver haciendo click en nuestra lista de Apps de nuestra cuenta

Luego de todas esas cosas volvemos al perder: Cuando uno pierde sea cual sea el motivo del juego mostramos una publicidad de Admob y cuando pierda de nuevo, una publicidad de Tappx, puede ser al revés si se quiere.

Para esto estuve mucho tiempo pensando y se me ocurrió que lo mejor sería hacer una escala de par-impar. Tenemos nuestra variable "ad" con valor inicial en 1, al perder la función se pregunta si es par (si "ad" dividido 2 da como resto 0), si es el caso, mostrar una publicidad de Admob y sumarle 1 a "ad", para la próxima vez, "ad" será 2, por lo que al perder, se preguntará de nuevo si es par o impar, como 2 es par esta vez se mostrará una publicidad de Tappx y se sumará de nuevo 1 a "ad" y así sucesivamente.

Aparte de la personalización que cada uno debería agregar para ajustar esto a su juego, esto es a grandes rasgos el mejor método que encontré para agregar publicidad y promocionar el juego al mismo tiempo. Cualquier consulta puede dejarla en los comentarios.

-L


-------------------------------------------------------------------------------
English



I as mentioned on my last entry, this entry will be about the steps to implement Admos and Tappx. A note for whose who doesn't know, Admob is a plublicity net which enable us to put ads on our games while Tappx instead of ads it shows game of other devs, in return, they show ads of our game.  Note: This tutorial will be to install full screen ads (Interstitial) and will be adressed to Android.

Why to do this process? : Although Admob shows ads and we can earn money, Tappx will take care of getting our game some downloads, so we would be promoting it. The most convinient is to switch between 1 Admod ad and 1 Tappx ad and repeat this sequence.



Which the following steps we will implement Admob:
  1. We need to download the plugin of Admob for Unity, from their Github page https://github.com/googleads/googleads-mobile-unity/releases and download the lastest version available ( the version needs to be from 3.0 onwards)
  2. We Import the package in Unity by going to Assets/Import/Custom Package and we select the downloaded plugin
  3. A window will opwn indicating the files we want to import, for this I recommend that if our game is only for Android and not for IOS, uncheck all the IOS folders as we won't need them
  4. We open the Manifest which is inside the folder  Plugins/Android/GoogleMobileAdsPlugin and we are gonna eliminate a few lines of code: From line 22 which starts with " <!-- Google Mobile Ads Activity -->" to line 28 which ends with "android:theme="@style/Theme.IAPTheme"/>" . With this we make sure to eliminate the activity that causes troubles with Google Play Services and the "InAppPurchase Activity" which is for games that have In App Purchase (In the case that our game does includes in app purchase, we undo this last step and only erase the "Google Mobile Ads Activity" Activity).
And done, we already have Admob installed, the part of coding will be done in the end all together but what it needs to be done in case we only wanted to install Admob wil be, by code, instert our AdmobID and specify when we want to do the AdRequest, AdLoad y AdShow.

Tappx Implementation (easier):


  1. Create an account on www.tappx.com
  2. Add your app by clicking on "Add App" and complete the form
  3. Download the SDK form their official page http://www.tappx.com/es/manual/?os=uni#0_gettingStarted
  4. Go again to Assets/Import/Custom Package and now with care, we uncheck the AndroidManifest which is near the top as our project already has one.

  5. In case that your project already has installed the Google Play Services, we uncheck the folder and if we won't use IOS, we uncheck them too.
  6. Once imported we go to the TappxManagerUnity.prefab and introduce our ID of Android or IOS or both if we are gong to use both services and check if we are going to use banners or interstitials.





Below I explain where you can find your Tappx ID. Finally, we go to the Android Manifest which is inside the folder /Plugins/Android/GoogleMobileAdsPlugin and before the </application>, we copy what Tappx will use for tracking the app:


<receiver android:name="com.tappx.unity.InstallReferrerReceiver" android:exported= "true" > 
<intent-filter> 
<action android:name="com.android.vending.INSTALL_REFERRER" /> 
</intent-filter> 
 <meta-data android:name="forward.GoogleAnalytics" android:value="com.google.android.apps.analytics.AnalyticsReceiver" />
 </receiver>

Now we compile in order to see there are no errors. We do this by going to File/Build , first we check our platform to Android, if it wasn't checked before we select Android and we press on "Switch Platforms". Then it will ask us where we want to save the file (APK) we select and press Build. But before we compile we go to "Player Settings" and "Other Settings", then we go  to "Identification" and ther to "Bundle Identifier", the default is "com.Comany.ProductName" where we will change the "Company" and "ProductName" for whatever we like, I chosed for this test "com.testcompany.test" and with that you are ready to see if it compiles.

Now the code part. We need a  "General" Script which works for the general behaviour of the game, in case of not having one, we can create it or put this code where you thinks it suits your game.

But first we need to understand how ads works in three simple steps

  1. AdRequest: The ad "asks" to its network for an ad to show
  2. AdLoad: This part handles the request and prepares the ad to be shown
  3. AdShow: Show the ad, this event closes when the user closes the ad

A simple Script could be:

using System;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using GoogleMobileAds;
using GoogleMobileAds.Api;
using GooglePlayGames;

using UnityEngine.SocialPlatforms;


//variables that will be use forward

private InterstitialAd interstitial;
 AndroidJavaObject interstitialControl;
int ad = 1;


void Start() {  //Its convinient to put the request on Start so when the game starts the ads are loaded                               although it might make the game to freeze a little bit




 RequestInterstitial(); //admob request

        interstitialControl = new AndroidJavaObject("com.tappx.unity.interstitialTappx", "TappxID", "TappxManagerUnity"); //tappx request
}

void Lose(){ //This part will be for where the player loses

 if (ad % 2 != 0)  //Below I'll explain this part of the code
        {
            ShowInterstitial(); //admob interstitial
            ad++;
        }
        else
        {
            //interstitial.Show();
            interstitialControl.Call("showInterstitial");     //tappx interstitial
            ad++;
}

Putting the Requests on the Start function works for those game that restart after the player loses, in the case of using another method this should be reallocated  to another function. Now the whole next part is what you need to add by Admob and Tappx, its code they provide:

 private void RequestInterstitial() //request inter
    {

#if UNITY_EDITOR
        string adUnitId = "unused";
#elif UNITY_ANDROID
            string adUnitId= "Insert AdmobID";
#else
        string adUnitId = "unexpected_platform";
#endif

        // Create an interstitial.
        interstitial = new InterstitialAd(adUnitId);

        // Load an interstitial ad.
        interstitial.LoadAd(createAdRequest());
    }
    

    // Returns an ad request with custom ad targeting.
    private AdRequest createAdRequest()
    {
        return new AdRequest.Builder()
                .AddTestDevice(AdRequest.TestDeviceSimulator)
                .AddTestDevice("AC98C820A50B4AD8A2106EDE96FB87D4")
                .AddKeyword("game")
                .SetGender(Gender.Male)
                .SetBirthday(new DateTime(1990, 1, 1))
                .TagForChildDirectedTreatment(false)
                .AddExtra("color_bg", "9B30FF")
                .Build();
    }


    private void ShowInterstitial()
    {
        if (interstitial.IsLoaded())
        {
            interstitial.Show();
        }
        else
        {
            print("Interstitial is not ready yet.");
        }
    }

    // Tappx
    
    public void InterstitialLoaded()                        //check ad loaded
    {
        UnityEngine.Debug.Log("Interstitial Load");
    }

    public void InterstitialFailedToLoad(string error)
    {
        UnityEngine.Debug.Log("Interstitial Error " + error);
    }


I deleted some data so copying and pasting won't work, you should add your Admob and Tappx Id on the corresponding parts of the code and on "AddTestDevice" I used the default value that Admob's guide uses.

You can see your Tappx ID by clicking on your App on the app's list of your account

Now we come back to losing: When one loses by whatever the reason to be, we show an Admob ad, when we lose again, we show a Tappx ad, it can be in the other way if you want.

For this I've been thinking a lot and I think that the best way of doing it is by cheking if a number is odd or even. For this we use the variable "ad" with an initial value of 1, when losing the function ask if "ad" is even (if the rest of dividing "ad" by 2 is 0), in that case, show and Admob ad and add 1 to "ad", for the next time, "ad" will be 2, so when losing, the function will ask again and as 2 is even it will show a Tappx ad and add 1 to "ad" and so on.

Besides the personalization that one sould add to adjust this code to its game, this is roughly the best way I found to show ads and promoting the game at the same time. Any questions will be accepted on the comments.

-L

martes, 23 de febrero de 2016

3,2,1 Despegue! | 3,2,1 Launch!

Español | English

Al fin! Versión 4.2 del Infinite Squared Run lista! Luego de tantos errores y complicaciones finalmente todo se pudo arreglar, la integración de Tappx, la intercalación de publicidades, la nueva forma de reiniciar el juego, todo. Tengo una sensación de alivio pero otra de preocupación, ya que este juego no alcanzó su objetivo en descargas que había planeado (+100 descargas). Esto se debe en parte a culpa mía de no iniciar el Marketing de este juego antes y en parte a que el juego no llama mucho la atención, lo cual es aceptable ya que soy consciente de la simplicidad que tiene.

Pero estoy feliz de las cosas que he aprendido, que no fueron pocas, desde como se publica un juego y su distribución hasta resolver partes lógicas para la programación, todo esto va a servir para mi próximo juego, del cual voy a escribir en el futuro. También, mi próxima entrada será sobre como hice para implementar Tappx con Admob y Google Play services intercalando las publicidades.

Por ahora solo queda decir que este juego seguirá disponible con la nueva versión, cada tanto mantendré el trabajo de promocionarlo para tratar de conseguir más descargas para este. Me decidí que en caso de que el juego mejore en descargas y supere su objetivo de descargas, saldrá otro nuevo Update. Pero hasta eso, a dedicarme a otro juego, lo más probable es que siga trabajando para Android y luego pasarme a PC.

Ahora voy a hacer una lista de las cosas que no me gustaron de mi propio juego y que debo mejorar para no hacer estas cosas de nuevo en mi siguiente proyecto:

  • Diseño demasiado simple: Quitando el fondo de pantalla que si me agradó y lo utilicé como fondo de pantalla para Twitter, pero quitando eso, el personaje era un cubo rojo y las plataformas un rectángulo con diseño muy simple. Por suerte en caso de querer cambiarlo solo debería modificar los Sprites y listo.
  • Música: La música si a mi me gustó para el juego pero soy consciente de que es muy simple y repetitiva, para el próximo proyecto debe ser más elaborada.
  • El peso del juego: Al empezar calculaba que el juego  debía pesar una vez instalado 30Mb máximo , lo preferible eran 20 Mb y resultó ser 40Mb, lo cual se debe a los plugins como de Google Play Services que pesan mucho y el hecho de que ya que todos los juegos de Unity para Android pesan +7Mb debido a que Android no tiene un reprodctor de Unity.
Así que eso es todo Infinite Squared Run, ya puedo guardar tu carpeta aparte y empezar un proyecto de cero.

-L

----------------------------------------------------------------------------------

English




Finally! Version 4.2 of Infinite Squared Run is ready! After many errors and other complications finally all could be fixed, the Tappx integration, the ads switch, the new way of resetting the game, all. I have a sensation of relief but at the same time of worry, as this game didn't reach its download objective (+100 downloads). This is partially my fault of starting too late the Marketing campaign  and also the fact that the game don't draw too much attention, which is acceptable as I am aware of its simplicity.

But I'm happy with the things I've learned, which weren't few, from how to publish a game to its distribution or resolving logical problems for its programming, all of this is going to be useful for my next game, which I'll write about it on the future. Also, my next entry is going to be on how I did for implementing Tappx with Admob and Google Play Services, switching between ads.

But for now this game will remain available with this new version, every now and then I'll keep up the work of promoting it to try to get for downloads for it. I decided that if the game improves on downloads and reaches its download-objective, I'll launch a new Update. But until then, I'll be dedicating my time to other games, it will probably be for Android too and later on move to PC.

Now I'm gonna do a list of all the things I didn't like about my own game and that I'll have to improve to don't make them again on my next project:
  • Too simple design: Taking away the background which I really liked and I'm currently using as wallpaper for my Twitter, the player is a red cube and the platforms where rectangles with a design too simple. Luckily, in case I want to change that, all I have to do is to modify the Sprites and done.
  • Music: I liked the music, but I'm conscious that is too simple and repetitive, for the next project it needs to be more complex
  • Game size: When I was starting I calculated that the game should weight once installed 30 Mb. The preferable were 20 Mb but it resulted to be 40 Mb, which is caused by the plugins such as Google Play Services which are heavy and the fact that every Unity game for Android does weigth +7Mb. as Android don't have a Unity player.
So that is all Infinite Squared Run, I can now keep your folder apart and start a new game from scratch.

-L

lunes, 22 de febrero de 2016

Errores inesperados | Unexpected errors

Español | English

Y justo cuando todo iba bien.. Me levanto con la intención de retomar donde dejé ayer, en la intercalación de las publicidades entre Admob y Tappx. Por lo que quería jugar el juego en la PC para ver que errores tiraba, pero al inicial me aparece " Null Reference: Object Reference not set to an instance of an Object" que en pocas palabras quiere decir que el código que debería comunicarse con el jugador, se rompió. 

Por un extraño motivo que todavía sigo sin entender el mismo código que vengo usando hace meses se arruino prácticamente solo, ya que aparecieron errores en partes del código que no toqué o en cosas que ya estaban solucionadas. Este error no permitía que el jugador se pueda mover o saltar. Por suerte utilizando unos métodos que no quería usar logré solucionar este problema, ahora la parte de los cubos que caen del cielo: estos caían desde que se iniciaba el juego, cosa que antes no pasaba.

Todo esto sumado a que todavía debía solucionar el problema con las publicidades. Inventé un sistema que, cuando una variable sea impar, se muestren las publicidades de Admob y cuando sea par, de Tappx. Lamentablemente las publicidades de Tappx no se muestran y las de Admob se muestran una sola vez.

Lo que empezó siendo una sola cosa a solucionar terminaron siendo tres errores que salieron de la nada. Por suerte, luego de solucionar estos tres errores, podré dar por terminado este proyecto, espero encontrar las soluciones pronto.

Actualización: Al parecer, era el AdRequest de Tappx lo que causaba los errores mágicos que aparecían antes, al remover esa línea de código vi como los errores desaparecieron y le volví todo a la normalidad. Luego veo que tengo un error: "exception jni init'd androidjavaclass with null ptr unity" que después de buscar averiguo que es no solo normal sino obvio que iba a tener ese error ya que estaba corriendo el juego desde la PC y no desde un dispositivo Android! por lo que volvimos al paso 1 de la intercalación de publicidades.

-L

--------------------------------------------------------------------------------------------
English

Just when things were going fine.. I wake up with the intention of picking up from where I left yesterday, the Admob and Tappx ad switch. So I wanted to play the game on the PC so I could see what errors it gave me, but after pressing play I get "Null Reference: Object reference not set to an instance of an Object", which in other words is saying that the code that should be communicating with the player, broke,

By some weird motive that I still can't understand the same code I've been using for months broke almost by itself, as there were errors in parts of the code I didn't touch or in things that were already solved. This error didn't allow the player to move or jump. But luckily, after using some methods which I was trying to avoid, I managed to solve this problem, know the cubes that fall from the sky: they begin to fall when I launch the game, which it didn't before.

All this plus that I have to solve the ads problem. I invented a system that, when a variable is odd, it shows Admob's ad, and when not, Tappx's. But Unfortunately the Tappx ads don't show and Admob's only show once.

Which began as only I thing to solve ended up being three errors which came from nowhere. Luckily, after solving this three erros, I can end this project, I hope to find the solutions soon.

Update: Apparently, Tappx's AdRequest was the one who caused the magical errors that I mentioned before, after removing that line of code I saw the errors disappear I set everything back to normal. then I see this error "exception jni init'd androidjavaclass with null ptr unity" which after searching its meaning I find out that it wasn't only normal but obvious that I'll get that error as I was playing in the PC and no from an Android device! So I came back to step one, the ads switch.

-L

domingo, 21 de febrero de 2016

Casi listos para el despegue! | Almost ready for launch!

Español | English

Ya solucionado el problema que sobre el reinicio del juego en Infinite Squared Run, queda solo la implementación de Tappx a la aplicación. Luego de este proceso el juego quedará ya como "caso cerrado" y sera archivado, dando lugar a futuro proyectos.

Para solucionar el problema con el diseño de los mapas, opte por la opción de que, al perder, todos los bloques se eliminen, sería como "limpiando" el mapa para que se pueda generar devuelta sin problemas. Luego de esto empezó la implementación con Tappx.

La implementación fue la más fácil por ahora, ya que de todos los archivos que tenía que importar del plugin para Unity, algunos como el Google Play Services y un Manifest estaban resueltos, lo único que debí hacer es agregar los demás 4 archivos y agrega unas pocas lineas de texto al Manifest que aparecen en su documentación, que servirián para que ellos puedan hacer un "tracking" de la aplicación.

Ahora lo que hay que hacer es intercalar las publicidades de Admob con las de Tappx. Ambos servicios funcionarán por cuenta propia, lo único que varía sería en que momento se muestran las publicidades.

En esta última parte es donde estoy luchando un poco con el código, funciona la principio, muestra publicidad de Tappx, luego de Admob y luego deja de mostrar. Por lo que tendré que solucionar esto y tras arreglar otras pequeños detalles, saldrá la segunda actualización!

- L

-------------------------------------------------------------------------------------------
English

After solving the problem with every restart on Infinite Squared Run, what it's only left is the implementation of Tappx to the app. After this process, the game will be as "closed case" and will be archived, leaving space for future projects.

To solve the map design problem, I decided to eliminate, after the player loses, all the remaining platforms. So the map can be "clean" and the map can be generated again without problems. After this, the Tappx implementation began.

It was the easiest implementation up to now, as every file that I had to import from the Unity plugin, after already having Google Play Services and a Manifest, they were already solved, so the only thing I had to import were the other 4 files and adding a few lines to the Manifest which appear on their documentation, which they will use for "tracking" the app.

Now what I have to do is change between the Admob' ads with Tapp's. They will both work separately, but what it changes its when they are displayed.

With this last part is where I'm struggling with the code, it works at first, it shows a Tappx ad, then a Admob ad and then it doesn't show anymore. So I'll have to solve this problems and fix some other little issues and the second update will come!

-L