Upload
ryota-murohoshi
View
634
Download
0
Embed Size (px)
Citation preview
広告ネイティブプラグインの辛かった話しよっか
2015/12/05(土)(【年末だよ】Unity(お・と・な(のLT大会(2015【ポロりしてもいいのよ】
@RyotaMurohoshi
みなさん!カン!or!コップをお持ち下さい
乾杯!
さて、本日写真撮影ですが
どんどんしちゃってくださいどんどんつぶやいてください
みなさんゲーム開発は好きですか?
作ったゲームを遊んでもらうのは好きですか?
嫌いな奴はこの場にいないよね
だけどゲーム開発で飯を食べるのならば、お金も稼がなくてはいけないですよね
食うためにやっぱり必要なのは
課金or
広告
そのために必要になのが、
ネイティブプラグイン!課金用の各プラットフォームのプラグインとか
広告各社が提供するモバイル広告ネイティブプラグインとか
ここで突然ですが
Unityモバイル広告ネイティブプラグイン
辛いことあるある!誇張なし、全部俺がリアルに経験した辛い事!
ドキュメントめっちゃ少ない
iOS・Androidプログラマ向けで、全然優しくないドキュメント
座標系とか、前提知識とか。もうちょっと優しくても
ドキュメントに記載されているファイルが無いorファイル名が違う
あきらかに足りないビルド手順
確実に足りないビルドオプション
乙女系のエッチィ奴で、iOS審査リジェクト!
そもそもunitypackageが開けない!
広告の実装、『何でこれできないの』って感じの
非エンジニアからの視線気持ちはわかるけど、これSDKのバグなんだよ!これ!
そしてそして
_人人人人人人_> 突然の死 <‾Y^Y^Y^Y^Y^Y^‾
サンプル単独では動くけど、本番だけエラーになる
Android広告ネイティブプラグイン
二つ合わせるとエラーが起こるAndroid広告ネイティブプラグイン
相性が悪い・混ぜるな危険Android広告ネイティブプラグイン
お金を稼ぐために大事な大事な広告ネイティブプラグインですが辛いことも多い、とても多いorz
だいぶ前置きが長くなりましたが
この世には単独では正しく動作するのに、他のネイティブプラグインと混ぜると
エラーが起こるようになるやつがあります!
私が体験したそんなプラグインのエラーの理由
それに関連するお願いをさせていただきます
なぜこんなことになるのか?
複数のAndroidネイティブプラグインが存在する場合、
Ac#vity中のレイアウトXMLのID等が
広告のjar生成時とUnityでのビルド時でずれるため
よくあるダメなネイティブプラグインの例
ダメな例だからね真似しないでね!
それぞれをUnityプロジェクトの適切な場所に追加• AndroidManifest(適切に編集したもの)
• 画像を表示するAc1vity(Java)をビルドしたjar
• レイアウトxmlと画像ファイル
Ac#vityはAndroidの画面を司るやつ
で、これをビルドしてapkを作りましょうapk:Androidのビルド成果物
Unityはapkをつくるため一度Androidプロジェクトを生成しますここでつくるRクラスがポイント!
↑yourgame.packagename.Rクラス
Unityがつくるyourgame.packagename.Rクラスpackage your_game.package_name;
public final class R { /*中略*/ public static final class layout { public static final int activity_plugin_x=0x7f030000; } /*中略*/}
ネイティブプラグインのレイアウトXMLファイルのIDが含まれる。値は、0x7f030000
このレイアウトのIDが,
2個以上ネイティブプラグインにあるとずれることがある!!!
ではネイティブプラグインを2個にしよう
PluginXに加えて、PluginYを追加した!
Unityがつくるyourgame.packagename.Rクラスpackage your_game.package_name;
public final class R { /*中略*/ public static final class layout { public static final int activity_plugin_x=0x7f030000; public static final int activity_plugin_y=0x7f030001; } /*中略*/}
ac#vity_plugin_xは0x7f030000、ac#vity_plugin_xは0x7f030001
はい、ここポイント!
レイアウトファイルに割り振られた0x7f030001みたいなID、
プラグインが2個になったら
Unityが割り振ったIDとjarの中のIDの値がずれる!
で、ネイティブプラグインのjarをビルドする時何がおこるか・何をしているか
広告会社さんがやっていることですね
ダメなネイティブプラグインのjarの中のAc&vityの例(Java)
package com.mrstar.pluginy; /*中略*/public class PluginYActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_plugin_y); // ここがやばい!!! /*中略*/ }}
これをコンパイルしたのがやばい!
R.layout.ac*vity_plugin_y、
ビルドすると整数値がjarに埋め込まれる
PluginYビルド時は、0x7f030000(16進整数リテラル)
public'sta+c'final'intな値は、classに直接埋め込まれる
あれ?
Unityがつくるyourgame.packagename.Rクラス(再掲)
package your_game.package_name;
public final class R { /*中略*/ public static final class layout { public static final int activity_plugin_x=0x7f030000; public static final int activity_plugin_y=0x7f030001; } /*中略*/}
ac#vity_plugin_xは0x7f030000、ac#vity_plugin_xは0x7f030001
ac#vity_plugin_yというレイアウトXMLのIDが
jarを作った時は0x7f030000、Unityで使うときは0x7f030001
複数ネイティブプラグインがあるとこんな感じでIDがずれる!
ていうか単独の時もけっこう綱渡り!
何が悪いか?
jarの中に、リソースを示すxxx.yyy.R
をベタ書きすること!
単独では動いてもネイティブプラグインが複数あると
死ぬことがある!
広告会社の作った
ネイティブプラグイン100%悪い!!!自己中なプラグイン!
「俺が動けばいいっしょ!」なプラグイン
もっと詳しい解説は今度ブログで書きます!
お願いが二つあります!
ひとつめのお願い
みなさんがAndroidネイティブプラグインを作るとき
絶対にJavaのコードにR.layoutとかを直書きしないで下さい!
これを使わずにいい感じにする方法あります!
ふたつめのお願い
今回の内容をまとめた記事を月曜日に公開します
シェアしてくれませんか?
こういうネイティブプラグインを作っている人に届くように
これからネイティブプラグインを作る人に届くように
みなさんゲーム開発は好きですか?
1分1秒でも多く、ゲームをおもしろくしたいですよね?
なるべくなら広告の実装などに手間取りたくないですよね?
ゲームを面白くするのと広告の不具合対処徹夜するならどっちでしたいですか?
ゲームを楽しくするために頑張りたい!時間をかけたい!
忘れもしない今年のGW
ずっと広告SDKと戦っていました
つらかった
だいぶ時間を持っていかれてしまいました
リリース前の大事な時期に、あれがなかったら
何か違ったんじゃないかなってネガティブになることもあります
駆逐したい!!!
こんな不具合に俺たちの時間がうばれれるのはおかしい!
だいぶ遅くなってしまったけどよかったらシェアしてください!
aar使おうぜ!!!
広告ネイティブプラグインの辛かった話しよっか
@RyotaMurohoshi
追記!:!記事公開しました!h"p://qiita.com/RyotaMurohoshi/items/3b95daeb8eaa6b487a20