Unityでmaioを実装する話

伝説のマニアです♪U・ω・U


前回のブログから大分期間が空いてしまいましたが、、、、
またブログの更新を再開していきたいと思います!!


今回は、Unityでmaioの動画広告を実装した話をしていきます。
maioとは、動画広告プラットフォームで、アイモバイルさんが提供しているサービスです。
http://maio.jp/

私はプログラミングはほとんどC/C++で書いていますので、正直Objective-Cの知識は相当浅はかですw

それでも何とか実装できましたw
もし、Unityでmaio使いたい!けどプラグインがないから、、、、と思っている方がいらっしゃいましたら参考になれば幸いです。
(「じゃあお前がプラグイン作れよ」とかは言わないであげて下さい。。。w)


なお、現段階では、maioSDKはiOSのみの対応となっています。


【Unity上から任意のタイミングで動画を再生する】
Unityのスクリプト(C#)からObjective-Cのコードを呼び出す
まず初めに、Unity側のスクリプトに、Objective-Cのコードを呼ぶための関数を宣言します。以下、ソースコードの一部抜粋したものです。

C#


ソースコードを解説していきます。

コードの5行目のSystem.Runtime.InteropServicesは、UnityのスクリプトからObjective-Cのコードを呼び出すさいに必要になり、[DllImport("__Internal")]を使うためのものです。

コードの11行目と12行目で、Objective-Cで使用する関数を宣言しています。これは正確にはC言語の関数を呼び出すさいに使うものです。Objective-Cであれば他にもっといい方法があるかもしれませんが、私は前からこれを使っていたのでこれ使います♪U・ω・U

そして、コードの23行目で実際に動画を再生する関数を呼びます。この関数は、動画の再生に成功すれば0を返し、失敗すると−1を返すように書いています(正確には違いますが(汗)。

なお、ここで気をつけるべきことが、maioの動画を再生しても、Unity上で再生しているBGM等は音が流れ続けてしまいます。よって、AudioSource.volumeのボリュームを0.0fにする等して動画再生前に消音し、動画が終わり次第再度ボリュームを戻す等行って下さい。

次に、Objective-C側のコードを見ていきます。

Objective-C



ソースコードを解説していきます。

コードの1行目で、maioSDKのヘッダーファイルをインクルードしています。

コードの9行目の[Maio show]で、実際に動画の再生がスタートします。その前のコードの7行目の[Maio canShow]で、動画の再生が可能かどうかを判定できます。これが真を返せば、動画の再生を開始し、0をリターン。再生が不可能であれば、動画の再生はせずに−1をリターンします。


ここまで実装できれば、とりあえず動画広告を再生することができるようになります。


【動画再生時にデリゲートで呼ばれるイベントを実装する】
MaioDelegateを採用したインスタンスを用意する
maioの動画再生が始まると(始まる前も)、生成済みインスタンスの中で、MaioDelegateを採用したインスタンスの、特定のイベント関数(いくつかあります)が呼ばれることとなっています。要は、@interface hoge <MaioDelegate>〜@endみたいなインスタンスを用意しないといけないってことですね。。。この辺でObjective-Cの仕組みがわからなくて時間を費やしてしまいましたw

私は、UnityAppControllerのインスタンスにMaioDelegateを適用することとしました。UnityAppControllerは、多分、AppDelegateみたいなものです。多分。。。

以下、UnityAppDelegate.hとUnityAppDelegate.mmを一部抜粋したソースコードです。

Objective-C


ソースコードを解説していきます。

UnityでXcodeプロジェクトを吐き出した時、このヘッダーファイルが生成されているはずです。まず、5行目でmaioSDKをインクルードしています。その後、13行目にMaioDelegateを追加しています。
こうすることで、UnityAppDelegateクラスでMaioDelegateのイベント用関数を実装すると、動画再生に関するイベント発生時に、実装した関数が呼ばれる事になります。

UnityAppControllerクラスにイベント関数を実装する
実装できるイベントはいくつかありますが、私は、「動画再生完了時に呼ばれる関数」だけを使いました。SDKの仕様書に記載されていますが、実際には、以下の通り関数が用意されています。

全てのゾーンの広告表示準備が完了したら呼ばれます。
- (void)maioDidInitialize {}

広告の配信可能状態が変更されたら呼ばれます。
- (void)maioDidChangeCanShow:(NSString *)zoneId newValue:(BOOL)newValue {}

広告が再生される直前に呼ばれます。
最初の再生開始の直前にのみ呼ばれ、リプレイ再生の直前には呼ばれません。
- (void)maioWillStartAd:(NSString *)zoneId {}

広告の再生が終了したら呼ばれます。
最初の再生終了時にのみ呼ばれ、リプレイ再生の終了時には呼ばれません。
- (void)maioDidFinishAd:(NSString *)zoneId playtime:(NSInteger)playtime skipped:(BOOL)skipped rewardParam:(NSString *)rewardParam {}

広告がクリックされ、ストアや外部リンクへ遷移した時に呼ばれます。
- (void)maioDidClickAd:(NSString *)zoneId {}

広告が閉じられた際に呼ばれます。
- (void)maioDidCloseAd:(NSString *)zoneId {}

SDK でエラーが生じた際に呼ばれます。
- (void)maioDidFail:(NSString *)zoneId reason:(MaioFailReason)reason {}


次に、UnityAppController.mmの実装を見ていきます。
Objective-C

ソースコードを解説していきます。
コードの13行目〜16行目で、maioSDKの初期化を行います。このコードはdidFinishLaunchingWithOptions内に実装して下さい。MAIO_MEDIA_IDは、アプリ別にふられた固有のIDを記載します。

コードの23行目のmaioDidFinishAdは、動画再生が完了したさいに呼ばれるイベント関数です。この中の25行目で、Unityのソースコードを呼び出しています。Unityのソースコード内で、動画広告再生完了時の報酬等を実装していけばいいかと思います。


【まとめ】
ぶっちゃけ、Objective-Cには全く自信がないので、この実装で大丈夫かなぁ。。。と思うところもありますが、とりあえずこれで正常に動作したので、、、良しとしましたw

Sponsored Links
テーマ: Unityゲーム制作 | ジャンル: コンピュータ