quinta-feira, 9 de agosto de 2012

Plugin admob para Unity3D




Inicialmente o propósito deste tutorial é de apenas mostrar como criar um simples plugin que exiba a propaganda do admob.

Futuramente em outros posts irei mostrar como utilizar o Android JNI para que através de um script C# você consiga comunicar-se com seu plugin Android.

Dentro do seu ambiente Unity você deverá criar uma pasta onde ficará o plugin. Por padrão a pasta deve ser chamar: Plugins e para cada plataforma, no caso Android, uma subpasta: Android . É dentro dessa pasta que iremos criar o nosso projeto pelo eclipse.


Agora iremos criar um configurar o projeto pelo Eclipse:
Crie um projeto no seu workspace Eclipse

Modifique o local onde ele irá criar o projeto para a Pasta Android que está no seu projeto Unity


Configure o nome do Pacote e o SDK mínimo necessário, para este escolhi 2.1, mas prefiro usar acima do 2.2
Agora nós vamos importar e configurar a biblioteca do admob! Configura sua campanha admob no site e baixe o SDK do admob. Para este tutorial estou usando a versão: 6.1 (GoogleAdMobAdsSdk-6.1.0.jar)
O JDK que estou usando é o JDK 1.6. Atualize também seu SDK Android.

Crie uma pasta chamada libs e adicione a biblioteca do admob
Adicione a biblioteca do Admob que está no seu workspace e a biblioteca da Unity3D Classes.jar Essa biblioteca está na pasta do Editor da Unity.


Não esqueça de selecionar todas as bibliotecas para o Export
Escolha o nível de compilação para o 1.5

O target do Admob deverá ser superiro ao Android 3.0
Agora teremos de configurar nosso manifest.xml para atribuir as permissões e outras configurações.
Note que todos os passos de configuração do Admob estão em : https://developers.google.com/mobile-ads-sdk/docs/admob/fundamentals


Agora poderemos começar a codificar e então faltará apenas mais 2 passos =D
Agora você só precisar configurar seu admob exatamente como mostra no site da Google

Note que a Activity principal é estendida da classe UnityPlayerActivity, isso irá fazer um override na classe principal de execução da Unity, tornando o seu plugin o ponto de partida da sua aplicação.


Este é o código para adicionar uma Layer na frente da view padrão da Unity, esse Layout irá receber o admob.

Agora a última etapa, exportar: dê um Clean no seu projeto e exporte!


Pronto! O jar foi exportado!
Você já pode fazer o build, lembre-se de em buildsettings alterar o nome do package para o mesmo do projeto do plugin!

Você pode baixar o projeto aqui.

7 comentários:

  1. Olá Fernando,
    Antes de mais nada parabéns pela iniciativa de compartilhar essas informações, sei bem que fazer um post da trabalho e demanda um tempo que normalmente os programadores não tem. :)

    Li seu post e notei que no manifest tem uma linha que no meu não tem, que é
    (retirei as tags) activity android:name="com.google.ads.AdActivity"

    Esta Activity deve ser adicionada manualmente? Ou algo que vc fez resultou nisto?

    Abraços
    Ronaldo Lombardi.

    ResponderExcluir
  2. Olá, Ronaldo,

    Toda Activity (seja sua ou de um sdk) que possa ser usada na aplicação deve ser citada no manifest. Isso é padrão para qualquer aplicação Android. Em outras palavras, sim, essa linha foi adicionada manualmente. Pode adicioná-la através do editor padrão do manifest.xml no Eclipse ou copiar o texto e colar no xml na seção correta do arquivo.
    ;D

    ResponderExcluir
  3. Então Fernando,
    Fui estudar um pouco sobre o manifest.xml e entendi o que você falou, inclusive percebi que a minha pergunta foi coisa de noob, então obrigado pela paciência. hehehehe

    Tenho um problema agora, vamos ver se você passou por isso.
    Comecei a criar um plugin no Unity desde o zero para entender mesmo o que eu estava fazendo, extendi a classe UnityActivity e por ai vai. Até ai, perfeito. Só que a partir do momento que eu incluo uma segunda Activity, no caso a "com.google.ads.AdActivity", ele não funciona mais, a aplicação até começa a abrir (black screen) mas após alguns segundo aparece a tela de mensagem do android informando que a aplicação caiu.

    Você já passou por isso alguma vez?

    ResponderExcluir
    Respostas
    1. No começo já me aconteceu coisas parecidas, tente ver se não é uma dessas possiblidades:
      1. Assinatura conflitante (você assinou na Unity de forma diferente do projeto do Eclipse)
      2. Esqueceu de por na pasta lib do projeto o SDK do Google AdMob
      3. Esqueceu de configurar as permissões de uso

      Excluir
    2. Consegui fazer rodar mas usei essa outra abordagem:
      https://github.com/keijiro/unity-adbanner-example

      Achei essa outra também, ela estende a classe como você e também usa "runOnUiThread", não cheguei a testar mas estou de olho, afinal meu app está travando aleatóriamente com os ADs.
      http://www.e-nature.ch/tech/unity3d-show-a-admob-banner-in-an-existing-unity-android-game-scene/

      Ta complicado isso...

      Abraços.

      Excluir
    3. Comece simples, essa última abordagem é um pouco exagerada e ao meu ver desnecessária para o que ele propõe (apenas carregar um ad).

      Tente implementar o ad numa aplicação android qualquer,
      Depois tente apenas criar um plugin para a unity que escreva uma mensagem Log.d(TAG,"Hello World");
      E por último tente fazer a integração com o SDK do admob

      Excluir
    4. Consegui fazer funcionar com aquela abordagem do keijiro, mas ainda estou com problema de travamento do app, fiz algumas mudanças no projeto e agora eu consigo fechar e abrir o ad quando é preciso, fiz isso porque meu jogo é um multiplayer, economia de banda é sempre bom, além de que nao quero que o jogador saia durante a partida pq clicou em um ad, isso seria o fim da partida para dois jogadores, seria ruim...
      Agora que eu consegui entender bem as coisas eu notei que essa abordagem não tem nenhum tratamento para o caso do adRequest falhar e pode ser que ai esta o problema, então vou usar a sua que tem listener e tudo mais para fazer um tratamento para essa situação, espero que seja esse o problema. Iremos descobrir em breve, porque eu postarei o resultado aqui.

      Excluir