81
広告ネイティブプラグインの 辛かった話しよっか 2015/12/05() 【年末だよ】Unity お・と・な のLT大会 2015【ポロりしてもいいのよ】 @RyotaMurohoshi

広告ネイティブプラグインの辛かった話しよっか

Embed Size (px)

Citation preview

Page 1: 広告ネイティブプラグインの辛かった話しよっか

広告ネイティブプラグインの辛かった話しよっか

2015/12/05(土)(【年末だよ】Unity(お・と・な(のLT大会(2015【ポロりしてもいいのよ】

@RyotaMurohoshi

Page 2: 広告ネイティブプラグインの辛かった話しよっか

みなさん!カン!or!コップをお持ち下さい

Page 3: 広告ネイティブプラグインの辛かった話しよっか

乾杯!

Page 4: 広告ネイティブプラグインの辛かった話しよっか

さて、本日写真撮影ですが

Page 5: 広告ネイティブプラグインの辛かった話しよっか

どんどんしちゃってくださいどんどんつぶやいてください

Page 6: 広告ネイティブプラグインの辛かった話しよっか

みなさんゲーム開発は好きですか?

Page 7: 広告ネイティブプラグインの辛かった話しよっか

作ったゲームを遊んでもらうのは好きですか?

Page 8: 広告ネイティブプラグインの辛かった話しよっか

嫌いな奴はこの場にいないよね

Page 9: 広告ネイティブプラグインの辛かった話しよっか

だけどゲーム開発で飯を食べるのならば、お金も稼がなくてはいけないですよね

Page 10: 広告ネイティブプラグインの辛かった話しよっか

食うためにやっぱり必要なのは

Page 11: 広告ネイティブプラグインの辛かった話しよっか

課金or

広告

Page 12: 広告ネイティブプラグインの辛かった話しよっか

そのために必要になのが、

Page 13: 広告ネイティブプラグインの辛かった話しよっか

ネイティブプラグイン!課金用の各プラットフォームのプラグインとか

広告各社が提供するモバイル広告ネイティブプラグインとか

Page 14: 広告ネイティブプラグインの辛かった話しよっか

ここで突然ですが

Page 15: 広告ネイティブプラグインの辛かった話しよっか

Unityモバイル広告ネイティブプラグイン

辛いことあるある!誇張なし、全部俺がリアルに経験した辛い事!

Page 16: 広告ネイティブプラグインの辛かった話しよっか

ドキュメントめっちゃ少ない

Page 17: 広告ネイティブプラグインの辛かった話しよっか

iOS・Androidプログラマ向けで、全然優しくないドキュメント

座標系とか、前提知識とか。もうちょっと優しくても

Page 18: 広告ネイティブプラグインの辛かった話しよっか

ドキュメントに記載されているファイルが無いorファイル名が違う

Page 19: 広告ネイティブプラグインの辛かった話しよっか

あきらかに足りないビルド手順

Page 20: 広告ネイティブプラグインの辛かった話しよっか

確実に足りないビルドオプション

Page 21: 広告ネイティブプラグインの辛かった話しよっか

乙女系のエッチィ奴で、iOS審査リジェクト!

Page 22: 広告ネイティブプラグインの辛かった話しよっか

そもそもunitypackageが開けない!

Page 23: 広告ネイティブプラグインの辛かった話しよっか

広告の実装、『何でこれできないの』って感じの

非エンジニアからの視線気持ちはわかるけど、これSDKのバグなんだよ!これ!

Page 24: 広告ネイティブプラグインの辛かった話しよっか

そしてそして

Page 25: 広告ネイティブプラグインの辛かった話しよっか

_人人人人人人_> 突然の死 <‾Y^Y^Y^Y^Y^Y^‾

Page 26: 広告ネイティブプラグインの辛かった話しよっか

サンプル単独では動くけど、本番だけエラーになる

Android広告ネイティブプラグイン

Page 27: 広告ネイティブプラグインの辛かった話しよっか

二つ合わせるとエラーが起こるAndroid広告ネイティブプラグイン

Page 28: 広告ネイティブプラグインの辛かった話しよっか

相性が悪い・混ぜるな危険Android広告ネイティブプラグイン

Page 29: 広告ネイティブプラグインの辛かった話しよっか

お金を稼ぐために大事な大事な広告ネイティブプラグインですが辛いことも多い、とても多いorz

Page 30: 広告ネイティブプラグインの辛かった話しよっか

だいぶ前置きが長くなりましたが

Page 31: 広告ネイティブプラグインの辛かった話しよっか

この世には単独では正しく動作するのに、他のネイティブプラグインと混ぜると

エラーが起こるようになるやつがあります!

Page 32: 広告ネイティブプラグインの辛かった話しよっか

私が体験したそんなプラグインのエラーの理由

それに関連するお願いをさせていただきます

Page 33: 広告ネイティブプラグインの辛かった話しよっか

なぜこんなことになるのか?

Page 34: 広告ネイティブプラグインの辛かった話しよっか

複数のAndroidネイティブプラグインが存在する場合、

Ac#vity中のレイアウトXMLのID等が

広告のjar生成時とUnityでのビルド時でずれるため

Page 35: 広告ネイティブプラグインの辛かった話しよっか

よくあるダメなネイティブプラグインの例

Page 36: 広告ネイティブプラグインの辛かった話しよっか

ダメな例だからね真似しないでね!

Page 37: 広告ネイティブプラグインの辛かった話しよっか
Page 38: 広告ネイティブプラグインの辛かった話しよっか

それぞれをUnityプロジェクトの適切な場所に追加• AndroidManifest(適切に編集したもの)

• 画像を表示するAc1vity(Java)をビルドしたjar

• レイアウトxmlと画像ファイル

Ac#vityはAndroidの画面を司るやつ

Page 39: 広告ネイティブプラグインの辛かった話しよっか

で、これをビルドしてapkを作りましょうapk:Androidのビルド成果物

Page 40: 広告ネイティブプラグインの辛かった話しよっか

Unityはapkをつくるため一度Androidプロジェクトを生成しますここでつくるRクラスがポイント!

↑yourgame.packagename.Rクラス

Page 41: 広告ネイティブプラグインの辛かった話しよっか

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

Page 42: 広告ネイティブプラグインの辛かった話しよっか

このレイアウトのIDが,

2個以上ネイティブプラグインにあるとずれることがある!!!

Page 43: 広告ネイティブプラグインの辛かった話しよっか

ではネイティブプラグインを2個にしよう

Page 44: 広告ネイティブプラグインの辛かった話しよっか
Page 45: 広告ネイティブプラグインの辛かった話しよっか

PluginXに加えて、PluginYを追加した!

Page 46: 広告ネイティブプラグインの辛かった話しよっか

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

Page 47: 広告ネイティブプラグインの辛かった話しよっか

はい、ここポイント!

Page 48: 広告ネイティブプラグインの辛かった話しよっか

レイアウトファイルに割り振られた0x7f030001みたいなID、

プラグインが2個になったら

Unityが割り振ったIDとjarの中のIDの値がずれる!

Page 49: 広告ネイティブプラグインの辛かった話しよっか

で、ネイティブプラグインのjarをビルドする時何がおこるか・何をしているか

広告会社さんがやっていることですね

Page 50: 広告ネイティブプラグインの辛かった話しよっか

ダメなネイティブプラグインの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); // ここがやばい!!! /*中略*/ }}

Page 51: 広告ネイティブプラグインの辛かった話しよっか

これをコンパイルしたのがやばい!

Page 52: 広告ネイティブプラグインの辛かった話しよっか

R.layout.ac*vity_plugin_y、

ビルドすると整数値がjarに埋め込まれる

PluginYビルド時は、0x7f030000(16進整数リテラル)

public'sta+c'final'intな値は、classに直接埋め込まれる

Page 53: 広告ネイティブプラグインの辛かった話しよっか

あれ?

Page 54: 広告ネイティブプラグインの辛かった話しよっか

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

Page 55: 広告ネイティブプラグインの辛かった話しよっか

ac#vity_plugin_yというレイアウトXMLのIDが

jarを作った時は0x7f030000、Unityで使うときは0x7f030001

Page 56: 広告ネイティブプラグインの辛かった話しよっか

複数ネイティブプラグインがあるとこんな感じでIDがずれる!

ていうか単独の時もけっこう綱渡り!

Page 57: 広告ネイティブプラグインの辛かった話しよっか

何が悪いか?

Page 58: 広告ネイティブプラグインの辛かった話しよっか

jarの中に、リソースを示すxxx.yyy.R

をベタ書きすること!

Page 59: 広告ネイティブプラグインの辛かった話しよっか

単独では動いてもネイティブプラグインが複数あると

死ぬことがある!

Page 60: 広告ネイティブプラグインの辛かった話しよっか

広告会社の作った

ネイティブプラグイン100%悪い!!!自己中なプラグイン!

「俺が動けばいいっしょ!」なプラグイン

Page 61: 広告ネイティブプラグインの辛かった話しよっか

もっと詳しい解説は今度ブログで書きます!

Page 62: 広告ネイティブプラグインの辛かった話しよっか

お願いが二つあります!

Page 63: 広告ネイティブプラグインの辛かった話しよっか

 ひとつめのお願い

Page 64: 広告ネイティブプラグインの辛かった話しよっか

みなさんがAndroidネイティブプラグインを作るとき

絶対にJavaのコードにR.layoutとかを直書きしないで下さい!

 これを使わずにいい感じにする方法あります!

Page 65: 広告ネイティブプラグインの辛かった話しよっか

 ふたつめのお願い

Page 66: 広告ネイティブプラグインの辛かった話しよっか

今回の内容をまとめた記事を月曜日に公開します

シェアしてくれませんか?

Page 67: 広告ネイティブプラグインの辛かった話しよっか

こういうネイティブプラグインを作っている人に届くように

これからネイティブプラグインを作る人に届くように

Page 68: 広告ネイティブプラグインの辛かった話しよっか

みなさんゲーム開発は好きですか?

Page 69: 広告ネイティブプラグインの辛かった話しよっか

1分1秒でも多く、ゲームをおもしろくしたいですよね?

Page 70: 広告ネイティブプラグインの辛かった話しよっか

なるべくなら広告の実装などに手間取りたくないですよね?

Page 71: 広告ネイティブプラグインの辛かった話しよっか

ゲームを面白くするのと広告の不具合対処徹夜するならどっちでしたいですか?

Page 72: 広告ネイティブプラグインの辛かった話しよっか

ゲームを楽しくするために頑張りたい!時間をかけたい!

Page 73: 広告ネイティブプラグインの辛かった話しよっか

忘れもしない今年のGW

ずっと広告SDKと戦っていました

Page 74: 広告ネイティブプラグインの辛かった話しよっか

つらかった

Page 75: 広告ネイティブプラグインの辛かった話しよっか

だいぶ時間を持っていかれてしまいました

リリース前の大事な時期に、あれがなかったら

何か違ったんじゃないかなってネガティブになることもあります

Page 76: 広告ネイティブプラグインの辛かった話しよっか

駆逐したい!!!

Page 77: 広告ネイティブプラグインの辛かった話しよっか

こんな不具合に俺たちの時間がうばれれるのはおかしい!

Page 78: 広告ネイティブプラグインの辛かった話しよっか

だいぶ遅くなってしまったけどよかったらシェアしてください!

Page 79: 広告ネイティブプラグインの辛かった話しよっか

aar使おうぜ!!!

Page 80: 広告ネイティブプラグインの辛かった話しよっか

広告ネイティブプラグインの辛かった話しよっか

@RyotaMurohoshi

Page 81: 広告ネイティブプラグインの辛かった話しよっか

追記!:!記事公開しました!h"p://qiita.com/RyotaMurohoshi/items/3b95daeb8eaa6b487a20