Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者40代後半中年中間管理職おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Google Admob 広告プレースメントを使ってみた!! Reward編

Google Admob 広告プレースメントを使ってみた!! Reward編

 

今回は広告プレースメントのベータ版を使ったリワード広告の実装方法を解説する

 

リワード広告とは、ゲームのライフの回復など、動画広告を見る見返りとして何かを付与するタイプの広告となっている

 

なので、ゲームが終了したタイミングとかに挟み込むのはインタースティシャル広告と似ているが、ゲームをリトライしたいが再プレイするコインがないので獲得したいとか、プレイヤーの欲求によるボタン操作時に表示するなどとなるので、表示タイミングの仕様、動画を見た後に渡す報酬の仕様検討、スクリプト制御が必要になってくる

 

developers.google.com

 

◆実装方法

以下では、下記のような仕様でリワード広告を表示する場合の例について解説する

 

〇仕様例

・ゲームをプレイするにあたりポイントが必要だがポイントがない

・ポイントがない状態でゲームをプレイしようとすると下記のようなメッセージが表示

f:id:Harukichi:20210214135825p:plain

 

・「はい」を押すとリワード広告が表示される

【テスト広告 イメージ】実際は動画が一定時間再生される

f:id:Harukichi:20210214140222p:plain

 

・広告を見た見返りとしてポイントを付与

f:id:Harukichi:20210214140457p:plain

 

〇実装方法の例

◆概要

①広告オブジェクトをHierarchyに追加

スクリプトで広告オブジェクトの初期化とプレイヤーの操作によるメッセージ表示、広告表示および動画広告の再生が終了した場合の報酬の付与の処理を追加

③リワード広告オブジェクトのコールバック関数をInspectorにて設定

 

 

①まずは下記のように広告オブジェクトをHierarchyに追加

f:id:Harukichi:20210214140612p:plain

 

スクリプト

using GoogleMobileAds.Api;
using GoogleMobileAds.Placement;

 

//広告オブジェクトの定義
RewardedAdGameObject RewardAd;

 

ア 初期化

シーンのStart関数内で下記を実行する
void InitAds()
{
  RewardAd = MobileAds.Instance.GetAd<RewardedAdGameObject>("Rewarded Ad");

  MobileAds.Initialize((initStatus) => { });

}

 

イ プレイヤーによるゲームスタート操作 

この場合はスタートボタンを押したとき

public void OnStartButtonClick()
{

   //現在所持しているポイントは0以下?

   if (StartSceneManager.CurrentPoints <= 0)
   {

    //リワード広告をロード

    RewardAd.LoadAd();

   }
   else

    Invoke("LoadSpecSelectScene", 0.2f);

   } 
}

 

実際の動作としては、上記の操作により、下記のウインドウを表示したい

上記のリワード広告のロード後に、広告がロードされたことを確認して下記を表示するスクリプトを追加してもよいが、このあたりの処理はリワード広告の読み込み時のコールバック関数に下記を表示する関数を追加して表示している(SetActive(true)関数にて表示)

詳細は下の方のInspectorでの設定を参照

f:id:Harukichi:20210214135825p:plain

 

ウ プレイヤーによる動画広告表示操作

上記のメッセージ表示後、「はい」が押された場合に下記を呼び出して、広告を表示している

public void ShowRewardAds()
{

 RewardAd.ShowIfLoaded();
}

「はい」ボタン押したときの関数呼び出しはInspectorにて割り付け

f:id:Harukichi:20210214144111p:plain

 

 

エ 動画広告が最後まで再生され、報酬を付与する条件が成立した場合

条件がそろった場合に下記を実行

public void EarnReward()
{

 //所持ポイントを回復

 StartSceneManager.CurrentPoints = 15000;

 //所持ポイントの表示を更新

 Sm.GetComponent<StartSceneManager>().UpdateMessage();

}

 

 

③リワード広告オブジェクトのコールバック関数をInspectorにて設定

スクリプトで追加した処理については、プレイヤーの動画広告を見るための操作時と、動画広告を見終わったタイミングにて呼び出される必要があるため、Inspectorにてコールバック関数の設定を行う必要がある

 

今回は二つのコールバック関数を使用している

・On Ad Loaded()  

 広告が読み込まれたタイミングで何か処理したい場合に処理を追加

・On User Earned Reward(REWARD) 

 動画広告の再生が終わり報酬を付与するタイミングで何か処理したい場合に処理を追加 

 こちらは今回の広告の性質上処理の追加は必須(何もないと詐欺呼ばわりされるかも)

f:id:Harukichi:20210214141540p:plain

今回の例で追加している処理

・On Ad Loaded()  

 下記のウインドウをアクティブ(表示)にする処理を割り付け

 このようにすることで、広告が読み込まれたかどうかを確認する処理の追加が不要になる(Google Admobから推奨)

 だが、広告が正常に読み込まれなければ、下記のウインドウが表示されないので、その場合の対処も必要になってくるよね・・・

 f:id:Harukichi:20210214135825p:plain

 

・On User Earned Reward(REWARD)

 動画広告の表示が終了して報酬を付与する条件がそろったタイミングで、下記を呼び出し、ポイントを付与している

 EarnReward()

 

 

◆感想

 広告プレースメントを使用しない以前のスタイルだと、広告オブジェクトのコールバック関数もスクリプトで用意したり、呼び出したりする必要があり、それをInspectorで割り付ける形になったのは整理されていてわかりやすくなったように感じる

 

以上、今回はここまで

 

Google Admob 広告プレースメントを使ってみた!! Interstitial編

Google Admob 広告プレースメントを使ってみた!! Interstitial編

 

今回はInterstitial広告の実装の仕方を解説する

 

インタースティシャル広告とは、ゲームオーバーとなってタイトル画面に戻るようなときに表示される全面広告である

 

イメージ 下記はテスト時に表示されるもの

f:id:Harukichi:20210213213555p:plain

 

〇やり方

1 Hierarchyの上部の+を押して、メニューからInterstitial adを選択して、広告オブジェクトを追加

2 スクリプトで、広告オブジェクトの初期化と表示したいタイミングで表示させるメゾットを使用して表示

 

1 Hierarchyの上部の+を押して、メニューからInterstitial adを選択して、広告オブジェクトを追加

 

f:id:Harukichi:20210213214307p:plain

 

2 スクリプトで、広告オブジェクトの初期化と表示したいタイミングで表示させるメゾットを使用して表示

 

using GoogleMobileAds.Api;
using GoogleMobileAds.Placement;

 

//オブジェクト変数の定義

InterstitialAdGameObject interstitialAd;

 

//初期化 Start関数内で下記を実行

void InitAds()
{
   interstitialAd = MobileAds.Instance.GetAd<InterstitialAdGameObject>("Interstitial Ad");

   MobileAds.Initialize((initStatus) => { });

}

 

//広告を表示

 下記の例ではゲームのリザルト画面内に配置された「タイトルに戻る」ボタンを押したときに広告を表示するメゾットを実行している

public void OnReturnButtonClick()
{

 // 広告を表示
  interstitialAd.ShowIfLoaded();

 

 //
  Invoke("ReturnTitleScene",0.2f);

}

 

説明は以上

 

Hierarchyに追加した広告オブジェクトをスクリプトで定義した変数とリンクさせているわけではないので、Hierarchyに追加する必要ないんじゃないかとオブジェクトを削除して実行してみたらアクセスエラーになったのでどうやり必要な様子

 

余談

 今まで、バナー、インタースティシャル広告、リワード広告と実装してみたが、正直バナーは収益的な効果は低い印象

 とりあえず、ストレスにならない程度にインタースティシャル広告を挟み込むのが有効に感じる

 リワード広告は広告をみてもらう引き換えにライフを回復とかする感じなので、ゲーム自体のはまり度に左右される印象

 

 

今回は以上

 

 

 

 

 

Google Admob 広告プレースメントを使ってみた!! Banner編

Google Mobile Ads Unity プラグインの新しいタイプのベータ版が公開されていたので使ってみた

 

これはUnityで作成したスマホアプリにGoogle広告を実装するためのものだが、実装にあたっての作業が簡単になるらしい?!ので、以下では使い方の概略と感想を記載する

 

なお、通常のGoogle広告の実装に関する手順等は触れていませんのであしからず

 

developers.google.com

 

1 パッケージのダウンロード

2 Unityのプロジェクトへインポート

3 広告の実装

 

1 パッケージのダウンロード

 上記のページの「ダウンロード」からGoogleMobileAds-Ad-Placements .unitypackageをダウンロード

f:id:Harukichi:20210207212347p:plain

2 Unityのプロジェクトへインポート

先ほどダウンロードしたPackageファイルをプロジェクトにインポート

※なお、すでに従来の広告プラグインをインストールしている場合は、先にパッケージのファイルをすべて削除しておく必要あり

上書きしようとしてもうまくいかず

 

f:id:Harukichi:20210207212749p:plain


プラグインがうまくインポートされたら、下記のように各広告のテンプレート的なものの表示が可能になる

 

 

そして、シーンに広告をGameObjectのように配置できるようになる

f:id:Harukichi:20210207213401p:plain

 

3 広告の実装

上記の要領でシーンに表示したい広告オブジェクトを配置

 

◆Banner広告の設定

〇Ad Placement

Ad Placementsのメニューをクリックすると下記のような広告の初期設定ができる画面が表示される

 

f:id:Harukichi:20210207215448p:plain

Placement Name わかりやすい名前を付ける

Ad Format           広告の種類を選択

ID                        Google Admobにて発行されたIDを入力

Persistent            こいつをチェックしておくとシーンをまたいでも削除されずに表示

        されるとのこと

Auto Load Enable これにチェックしておくと、スクリプトを書かなくても自動に配置される

 

 

〇配置した広告オブジェクトをInspectorにて初期設定

f:id:Harukichi:20210207215142p:plain

Ad Placement  先に広告IDとかを設定しておいたテンプレート的なものを選択

       テスト用と、製品用を作っておけば、コード上でコピペしなくても、選択を変更すればよいので便利

 

Banner confguration  サイズと表示位置の設定

CallBacks   広告が読み込まれたとき、閉じられた時など各イベント発生時に処理を行いたいときに設定

 

◆コード

ライブラリを使えるように下記を追加

using GoogleMobileAds.Api;
using GoogleMobileAds.Placement;

 

シーンのStart関数内に下記を入力

MobileAds.Initialize((initStatus) => {  });

 

Ad Placementの方でAuto Load Enableをオンにしておいたので、初期化だけすれば広告が読み込まれる

 

広告のリクエストとか、サイズとかをコードで記載することがなくなったので、かなり簡単!!

かずはサイズをSmartBannerにして、配置はBottomにした時のもの

f:id:Harukichi:20210207220910p:plain

なお、Persistentをオンにしたら、シーンはまたいでもBannerのオブジェクトは削除されないのに表示がされなかった

 

なので、シーンごとに上記と同じことをしてとりあえずしのいだ

 

今回は以上

 

【93%Rushチャレンジ!! その連荘どこまで続く?!】プライバシーポリシー

【93%Rushチャレンジ!! その連荘どこまで続く?!】プライバシーポリシー

 

Y’Mfc(以下「当方」という)は、当方の提供する【93%Rushチャレンジ!! その連荘どこまで続く?!】の利用者(以下「ユーザー」という)に関する個人情報を含んだ情報(以下「ユーザー情報」という)の取扱いについて、以下のとおりプライバシーポリシー(以下「本ポリシー」という)を定めます。

 

1.情報を取得するアプリ提供者

Y’Mfc

 

2.取得するユーザー情報と目的

本アプリケーションで取得するユーザー情報と目的は以下のとおりです。

取得するユーザー情報

利用目的

 

端末に関する情報

なし

・なし

 
 

位置情報

なし

・ユーザーに最適化された広告の提供

・位置情報に基づく広告の提供

・パフォーマンス分析

・アプリケーションの改善

・ユーザーへのサポート

 

 
 

広告に関する情報

・表示場所

・クリックの有無

・閲覧回数

・広告の製品またはサービスの利用状況

 

 

3.取得方法

当方は、情報収集モジュールを内蔵した本アプリケーションにより、ユーザー情報を自動取得します。

 

4.通知・公表または同意取得の方法・利用者関与の方法

(1)通知・公表

当方は、本ポリシーに関する通知・公表は本アプリケーションまたは当方のホームページに掲載する方法で行います。

 

(2)同意取得の方法

同意の取得は、本アプリケーションの初回起動時に取得する方法で行います。

 

(3)利用者関与の方法

ユーザー情報の取得は、本アプリケーションをアンインストールすることで中止することができます。

 

5.お問い合わせ

当方のプライバシーポリシーに関する、ご意見、ご質問、苦情の申出その他ユーザー情報の取扱いに関するお問い合わせは、以下の窓口にご連絡ください。

 

ys.mfc.sp@gmail.com

 

6.改定

当方は、当方の裁量に基づいて、本ポリシーを変更します。但し、取得するユーザー情報、利用目的、第三者提供に変更が発生した場合、本アプリケーションまたは当社のホームページで通知するとともに、本ポリシー変更後、本アプリケーションの初回起動時に改めてユーザーから同意を取得します。

 

7.Y’s MFCプライバシーポリシー

本ポリシーに定めのない事項については、Y’s MFCプライバシーポリシーが適用されます。

 

 

8.制定日・改定日

制定:2021年2月7日

Unity ゲームパーツづくり 回転する的に矢を当てる

現在作成中のスマホアプリのあるシーン用に、回転する的に矢を当てる、いわゆるダーツのようなシーンを作ったので、作り方を簡単に書き残しておく

 

◆作ったもの

f:id:Harukichi:20210104230503g:plain

ダーツもどき

◆機能、ポイント

1 的が回転

 Rotate関数で回転

 コルーチンの中で、徐々に回転スピードを上げ下げ

 

2 ダーツの矢を投げる

 AddForceで投げている

 

3 ダーツの矢が的に刺さる

 ダーツの矢を、矢が当たったエリアのオブジェクトの子にして、刺さったように見せている

 

4 刺さったエリアに対応したポイントがマイナスされる

 刺さったエリアの情報をSendMessgeで管理用のオブジェクトに送信

 

◆各機能の実装方法

必要なもの

 ・的 blenderで自作

 ・矢 こちらもblenderで自作

 ・文字 UnityのUI Text

 

1 的が回転

f:id:Harukichi:20210104231712p:plain

コルーチンの中で

6,7行目

 徐々に加速するために一定のスピードになるまでは、スピードを毎フレーム1.005倍している

 

12行目

 上記とは逆にゆっくり止めるために、一定のスピードになるまでスピードに0.997倍している

 

22行目

 上記で設定した回転速度で回転させる

 

23行目

 高速回転状態になったら、矢を投げられるようにフラグを更新

 

2 ダーツの矢を投げる

f:id:Harukichi:20210104232409p:plain

矢が投げられる状態になり、的がクリックされたら、矢を生成(7行目)

AddForce関数を使って投げている(20行目)

矢のゲームオブジェクトは、prefab化されており、Rigedbodyがアタッチされている

 

3 ダーツの矢が的に刺さる

f:id:Harukichi:20210104233128p:plain

ダーツの的

ダーツの的は、上記のようにエリアごとにオブジェクトが分かれており、それぞれにMeshColliderをアタッチしている

さらにそれぞれに下記のコードをアタッチしてある

f:id:Harukichi:20210104232957p:plain

的の中の各エリアのコライダーに矢が侵入してきた場合に、

Rigidbodyの作用を停止(18行目)

矢の親オブジェクトを、的の中の矢が当たったエリア(オブジェクト)に設定(19行目)

 

矢が刺さったこと及び当たったエリアの名前をゲームの管理をしているオブジェクトに通知(21行目)

 

ルーレットの回転を止めるために、ルーレットの管理オブジェクトに通知(22行目)

 

4 刺さったエリアに対応したポイントがマイナスされる

f:id:Harukichi:20210104234206p:plain

送られてきた的の中のエリア情報を照合して、的のエリア分のポイントデータが格納された変数のインデックスを設定して、ポイントを決定している

 

今回は以上

 

なお、ダーツの的の矢が刺さった個所の判定方法については、的の色情報で判定するとかもっと負荷の軽い方法がよいかもしれない

Unity 小ネタ Unityで作ったアプリを関連付けられたファイルから起動

以前VideoPlayerコンポーネントを使用して、簡易的な動画再生アプリを作ったが、それを使ってくれている大変珍しいユーザーから、「mp4のファイルをダブルクリックしたらこのアプリで再生されるようにしてほしい」との依頼を受ける(-_-メ)

 

そんなんUnityで作ったアプリでは無理やろ・・

 

というか、そんなことするアプリをそもそもUnityで作る????

 

とかただめんどくさそうだからやらないで済めば・・・・

 

 

いや貴重な私のアプリのユーザーのサポートをしないのは、アプリ製作者として恥だ!!

 

 

無駄な前置きはここまでにして

 

 

 

めちゃくちゃ簡単だった

 

C#で用意されている関数により、アプリ起動時にデータ(文字列)を取得できるようでそいつから抜き出せばいいだけ

 

Start関数に下記のコードを入力

string args=System.Environment.GetCommandLineArgs();

 

 

 

試しにどんな文字列が取得できるのか一行ずつ取得してみる

void Start()
{

   string args = System.Environment.GetCommandLineArgs();
   for (int i = 0; i < args.Length;i++)
       pathtext.text += args[i] + "\n";

}

 

上記を実行した結果が下記の通り

f:id:Harukichi:20201210225056p:plain

 

中身はよくわからないが、おそらくは二番目のパラメーターだろうと予測して

 

string[] args = System.Environment.GetCommandLineArgs();
pathtext.text = args[1];

 

に書き換えてアプリをビルド

 

 

拡張子をtxeという存在しなそうなファイルを作成し

そのファイルを右クリックしてメニューの「プログラムから開く」を選択

f:id:Harukichi:20201210225106p:plain

 

 

 

このファイルを開くアプリを先ほどビルドしたアプリに設定

f:id:Harukichi:20201210225100p:plain

 

 

 

で、このtest.txeというファイルをダブルクリックするとすると・・・・

 

f:id:Harukichi:20201210225113p:plain

いつものMade with Unity画面の表示後

上記のようにダブルクリックしたファイルのパスを取得することができた!!!!

 

この要領で、VideoPlayerのSourceのURLに上記のパスを指定して、再生すれば

ファイルをダブルクリックして作ったアプリを通して動画を再生することが可能となる

 

 

はずだ!!!

 

まだ試してないけど(-_-メ)

 

今日はここまで

 

 

 

 

 

 

 

Unity 小ネタ スマホで録音してWavファイルで保存

今回は、現在Google Play Storeで公開中のスマホアプリ「Sound Effect Player」に追加した、録音機能の実装方法について覚書として残しておく

 

play.google.com

 

youtu.be

 

〇概要

このアプリでの録音機能について一応簡単に触れておく

このアプリにはタップして音を鳴らすためのボタン(音楽機材のサンプラー的にPadと呼んでいる)が複数あり、それぞれのPadに音声ファイルを登録して鳴らすような仕様となっている

 

その中で、自分でスマホで録音してWavファイルとしてスマホ内に保存して、これをPadに登録して鳴らすことも可能にしている

 

ということで・・・・・(あれ、前置きいらんかったかも)

 

スマホでの録音

➁Wavファイルとして保存

 

までを書き残しておく

 

流れとしては、

・Microphoneクラスを使用

・使えるデバイスの検索

・Start関数で録音開始 AudioClipとして記憶

・End関数で録音終了 

・AudioClipをWav形式のファイルとして保続 

 

 

スマホでの録音

コード全体////////////////////////////////////////////////////////////////////////////////// 

using UnityEngine;

AudioClip SamplingClip;

 

 //まずは使用可能なデバイスを検索

 if (Microphone.devices.Length == 0) 
 {
  return;
 }

 //いくつか列挙される場合もあるが、主に使われる(?)一番目のデバイス名を取得

 string mic = Microphone.devices[0]; 

 

  //録音中かどうかにより、処理を分岐

 //アプリの操作の流れ的には、録音ファイルを登録するPadをタップして録音開始する 

 if (!isRecording)
 {

  //録音中でない場合は録音開始

  SamplingClip = Microphone.Start(mic, false, 10, 44100);

 

  if (SamplingClip) {
   isRecording = true;
   CurrentFileLabel.text = "録音中"; //状態の表示を更新
  }

 }

//録音中にPadが押された場合
 else { 

   //録音終了
   Microphone.End(mic);

   if (SamplingClip == null)
   {
    CurrentFileLabel.text = "録音失敗";
   }
   else {

    //AudioClipがnullでない場合はWav形式でファイルを保存

    SaveWavFile();
    isRecording = false;

   }
 }/////////////////////////////////////////////////////////////////////////////////////////

〇Microphoneクラス 使用関数

//デバイスの検索

public static string devices ; 

 

//録音開始

public static AudioClip Microphone.Start (string deviceName, bool loop, int lengthSec, int frequency);


deviceName  デバイス
loop

 ループ録音を行なうかどうか、行なう場合は lengthSec に到達したときにクリップの最初に戻って録音を継続する
lengthSec  録音するオーディオクリップの長さ
frequency  録音するオーディオクリップの周波数

 

//録音終了

End (string deviceName);

 

 

➁Wavファイルとして保存

流れとしては

・ファイル名を入力するダイアログを表示

・ファイル名が入力されてOKボタンが押されたら、ファイルを保存

 

//ファイル名を入力するダイアログを表示

public void SaveWavFile()
{
 FileBrowser.SetDefaultFilter(".wav");
 FileBrowser.ShowSaveDialog(OnSaveSuccess, OnSaveCancel, false, false, null,
"Save", "Save");

}

 

 ファイルダイアログについては、フリーのアセットを使用させてもらっているので、下記を参照 

harukichi.hatenadiary.jp


 //ファイル名が入力されてOKボタンが押された場合の処理

void OnSaveSuccess(string paths)
{

 //ファイルダイアログで入力したファイル名と、アプリの保存されているパスを

 合成して保存先のパスを生成

 string destpath = 

 Application.persistentDataPath+"/"+FileBrowserHelpers.GetFilename(paths[0]);

 

 //保存先とAudioClipを渡してWavファイル保存処理へ

 if (!SavWav.Save(destpath, SamplingClip))
  CurrentFileLabel.text = "音声ファイルの保存失敗";

 

 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
}

 

なお、AudioClipをWavファイル形式で保存するコードは、「darktable」さんの「SavWav.cs」を使用させてもらったのと、中身はよくわからないので・・・(-_-メ)

Unity3D: script to save an AudioClip as a .wav file. · GitHub

 

 

Androidのファイルの保存について

 現状Google Play StoreにアップロードできるアプリのAPIレベルは29以上になってしまい、以前のように自由にファイルブラウザでアクセスするというようなことはできなくなってしまったので、この点非常に面倒になってしまった

 

 セキュリティの問題とか・・・・

 

 なので、スマホにファイルを保存するには、許可されたフォルダにしかできない

 

 ということで、「 Application.persistentDataPath」というアプリ自体が保存されるパスを取得してきてその中に保存するという形でwavファイルを保存している

 

 このやり方が正解かも正直よくわからないが・・・・<m(__)m>

 

今回は以上