タグ: Unity

同じ動きなら、Animatorは一つで大丈夫

Unity始めた時は、わからんかった

なに当たり前なこと言ってんだよってことかもしれませんけど。

私は知らなかったの!知ったのはほんの、一個前のアプリ作った時でした。

つまり、Prefubすごいってこと。アニメーターもまとめてプレハブ化できるー。

こんな感じのパネルがあるとしましょう。

こんな感じで動く。今は「Info」だけにしている。

で、同じ大きさのオブジェクト(ま、パネルですけど)を後3つ、作る。ShopとかSmsとかね。

初心者の私は、それぞれのパネルにAnimatorをそれぞれ作り(つまり4つ)、それぞれを動かしていました。

無駄だね!だって「Info」パネルを作って、Animatorまでつけた状態でPrefubしちゃえば良かったもんね。

スクリプトで区別してやれば良いだけの話。

Prefub化したInfoから、もう一つ作成してやる。

スクリプトは、ボタンを利用するところにつけてます。そこにPublicでAnimatorを設定させる。すると、できちゃう。

ねー。

Animator同じやつめっちゃ作ってたんだよねー。しかもその状態で公開したんだよね(一番初期のやつ)。

2個目のアプリの方が、色々と突っ込んでいるわりには軽いのですが、その理由の一つはこういう余計なものが集約されたからだと思うのね。

恥さらしということで、公開。

Unity パネルを開く

パネル表示しよう

真ん中の黄色い矢印のボタンは「ComputerButton」これをクリックすると「GamePanel」が現れます。

ということで、これがトップ画面。右のパネルのど真ん中にあるイメージ(ボタンコンポーネントつき)をクリックすると、左の子が表示されます。

アプリを稼働させると、こんな感じ。

Triggerが一般的かしら

初期状態 →  ボタンをクリックして、オープン → オープンした状態 (作ってはおいたけど、実装はしていない「クローズ」

ここの説明のブロガーさんは山ほどあるので、説明スキップ。

作成したTriggerは「Open」「Close」の二つ。どんな動きなのかは、名前のとおり。

Triggerをスクリップで設定する。

これもいっぱいあるけど、一応。

スクリプト名は「SubPanelControl.cs」c#です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SubPanelControl : MonoBehaviour {

	public Animator PanelAnim;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	public void OpenPanel(){
		PanelAnim.SetTrigger ("Open");
	}
}

上記スクリプトは「GamePanel」につけています。動かしたいのは、このパネルだから。

AnimatorをPublicにしているので、スクリプトのところで、アニメーションをつけている、己を設定してあげる。

で、これを呼び出すボタンは、こう。

On Click()時に呼び出すのは、「GamePanel」なので、引っ張って設定。「GamePanel」に設定されている、スクリプト「SubPanelControl.cs」の「OpenPanel」関数を設定。

これで終了。

スクリプトなしでTriggerを稼働させる

この記事が、見つからなかったので書く。もっと探せばあるとは思いますけど、やっぱりスクリプトを作成してやるのが主流なのでしょうね。

やり方は簡単。

今回、TriggerさんはString型なので、それを選択し、Triggerを設定すれば良い。

完結な動きをするなら、スクリプトを作成して動かすメリットはないでしょうね。これでいいじゃん。Unityさんが楽にしてくれたし。

ただ、ボタン押してから数秒後に開きたい、もしくは他のパネルやらボタンを推せなくするとか、「アニメーション動かす以外」を混ぜ込みたかっただ、どうしてもスクリプトが必要になる。

全くの余談

椿さんのツイッターで、これすごいって思っていたUnity2017.3の機能。

ズームできる!!!

感動した。ものすごく便利。

Unity Canvas Scalerについて

個人的な設定

そういえば、Unity最初に触った時に、特に何も考えていなくて痛い目を見たのが、CanvasScalerでした。

私の場合は今のところAndroid端末した開発していませんが、ご参考までと、私の設定を記事にします。

今は流れるかのようにこの設定をしてしまうのですが、久しぶりに開いてあ、そういえばと思ったので。

Scale With Screen Sizeで固定

初期で開くと、この状態。

・Unityマニュアル:Constant Pixel Size
・リンク:https://docs.unity3d.com/ja/540/Manual/script-CanvasScaler.html

マニュアルによれば、「UI 要素をスクリーンサイズによらずピクセル単位で同様のサイズに保ちます。」となっています。

なるほど、わからん。

ちょっと記憶が曖昧ですが、これを設定して実機テストをした時に、UIがはみ出る、切れるなどがありました。

画面サイズに合わせて、UIの要素を替える必要があるということかしら、となって「Scale With Screen Size」にしたところ、これがビンゴ。

で、Reference Resolutionとは、「スプライトがこの ‘Pixels Per Unit’ 設定を有していれば、スプライトの 1 ピクセルは UI 内での 1 ユニットをカバーします。」となっています。

なるほど、わからん。

私の認識なので、あくまで参考。

このキャンバスの画像度を設定しているようなものだと思っています。作ろうとしているのは、Android端末のアスペクト比  16:10のもの。ということで、画像度は1920×1200に設定。

で、今、MatchをHeightにしているのですが、高さに合わせて調整して欲しいから。(横に合わせたかったら、Width)

上で一個ボタンを配置していたので、MatchをWidth⇄Heightして見ましょう。

という状態になります。

Canvas Scalerは初期で設定しておかないと大変

私は基本的に以下のように設定します。

・UI Scale Mode : Scale With Screen Size
・Constant Pixel Size : Reference Pixels Per Unit
・Reference Resolution :
アスペクト比が10:16 → 1200 x 1920
アスペクト比が16:10 → 1920 x 1200
・Match :
アスペクト比が10:16 → Width
アスペクト比が16:10 → Heigth

画像度は、高ければ画像もそれなりの画像度を揃えないといけないということです。ま、スマホでみる分はわからないとは思いますけどね。

これが、初期で設定を忘れてUI配置終わってから気づいたとしましょう。

惨事です。

設定変えて全てのUIが移動するのが見えますよ。まだ地道に修正してやらないといけないんで、シーン作成時に必ず初期で済ましています。

Android端末のバックボタンでアプリを終了する。

iOSとは関係のないお話

Android端末の「戻る(Back)」ボタンでアプリを終了させるのは、多分普通のお話。

しかし、私が作っていた3つのアプリは、どれも終了してくれません。

何故なら、実装していないから

何故実装していないかというと!テストしていないから!わからなかったの!!

先日何も考えず自分のアプリつけてバッグボタンで終了させようとしたら、終了したしない!私のお古いiPhoneさんは、戻るで終了してくれました。

ということで、ググる。

以下の記事を発見。

・記事:UnityでのAndroidバックボタン対応
・リンク:https://qiita.com/WassyPG/items/12030494688cba02ce1b

そうか!対応が必要だ!

実機じゃないとわからん

ということで、めちゃめちゃ簡単かつわかりやすく説明いただいているので、ここではソースは割愛。

リンクかけていますので、元記事よりご確認願います。

で、やってみよう。

※Unity 2017.3 of 3で実施

あ、スクリプト名「buootn」なってる。ま、いいか。

とにかく、打ち込んで見たら、ランタイムプラットフォーム判定用のあれが出ますね。なるほどねー。

	if (Input.GetKeyDown (KeyCode.Escape)) {
		Application.Quit ();
		return;
	}

とにかくAndroidプラットフォームの判定を消して(テストしたいんで)稼働させてみる。

※静止画じゃないです。Gifです。
※Macで「Esc」押しています。

これはつまり、実機じゃないとわからんと。

うむ。そうね。テスト保留。これだけのために実機繋ぐにはちょっと設定面倒臭すぎる!

そしてこうやってバグを仕込むのでしょう。

テストは大事けどね。流石に無駄たと思うのです。

実際に実機テストするレベルでやって見ますか。

パッケージ一覧を作成した

一つ作っておけば、別のアプリでもただインポートするだけで使えるようにしたい。ということで一覧を作成しましたの。

有難やGoogleさま。

というか、どんどんお仕事やっているように見えて悲しい。

時間経過でのパラメーター加算2

解決した

DeltaTimeを用いて、1秒を加算していき、数秒で一回ごとにパラメーターを変えて行くやつ。

家族で外食に行っていた時に、急に思いつきました。

そうか。「=」じゃないんや。バカですねー。参考にした所にも書いていましたよね「>=」って。

そうね。そうだよねー。もう本当に嫌。こういうしょうもないことに引っかかって

時間経過でのパラメーター加算

直して結果物はこれ。

1個目のパラメーターが順調に加算していきます。

解決したー。前回から直した所は、一箇所だけ。「=」が「>=」。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PrmControl : MonoBehaviour {

	//時間表示用
	public Text TimeT;
	private bool TimeF;

	//3x5 = 15で時間制御
	private float timeN;
	private float timeC = 15f;

	//パラメーター用
	public Slider S1;
	public Text S1t;
	private int numS1;
	private float S1f = 2f;
	private float S1n = 0;

	public Slider S2;
	public Text S2t;
	private int numS2;
	private float S2f = 3f;
	private float S2n = 0;

	public Slider S3;
	public Text S3t;
	private int numS3;
	private float S3f = 5f;
	private float S3n = 0;

	// Use this for initialization
	void Start () {
		//時間制御
		TimeF = false;
		timeN = 0;

		//初期化
		S1n = 0;
		S2n = 0;
		S3n = 0;

		//パラメーター表示
		numS1 = 2;
		numS2 = 5;
		numS3 = 9;

		S1.value = numS1;
		S1t.text = numS1.ToString ();

		S2.value = numS2;
		S2t.text = numS2.ToString ();

		S3.value = numS3;
		S3t.text = numS3.ToString ();
	}
	
	// Update is called once per frame
	void Update () {
		
		if (TimeF == true && timeN <= timeC ) {
			TimeT.text = timeN.ToString ("00");

			if (S1n >= S1f) {
				numS1 = numS1 + 1;
				S1.value = numS1;
				S1t.text = numS1.ToString ();
				S1n = 0;
			} else {
				Debug.Log (S1n);
				Debug.Log (S1f);
				S1n += Time.deltaTime;
			}

			timeN += Time.deltaTime;
		}

		//初期化
		if (timeN == timeC) {
			timeN = 0;
			TimeF = false;
		}
	}

	public void PushButton(){
		TimeF = true;
	}
}

 

Unity ドラッグを試す その2

ドラッグ先のものを残す

せっかくだからドラッグ処理をもっと深掘りしようと思います。

いや、ちょっとだけ触って見てこのまま使わなかったら完全に忘れるからそのまとめ。

前回やったのは、ドラッグの動きを簡単に動かすこと。

Unity ドラッグを試す その1

ドラッグをするとちょっと自由に動きしすぎる(求める以上に自由に動ける)ので、やはり今回のアプリでは使わない予定。・・・Y軸固定とかすればいいけど。

とりあえず、やろう。

ドラッグ先のオブジェクトを残す

この状態だど、ドラッグするオブジェクトを丸ごと動かす状態。

今画像で動かして「1」をそのまま残してドラッグの動きをさせたい。参考にしたのは、こちら。

・記事名:uGUIでドラッグドロップ
・サイトリンク:http://qiita.com/ayumegu/items/c07594f408363f73008c

ドラッグ先のオブジェクトのコピーを作り

ドラッグ先のオブジェクトを残したい、つまり、ドラッグするものを新たに作り(コピーして)それを動かす

もしくは、ドラッグ先のオブジェクトの初期状態のコピーを作りを固定させてあげて、元のオブジェクトを動かすか。その2択かな?

私は、まずコピーを作りその子を動かすことにしました。(その方がDragEndの時破壊しやすい・・・?)

「1」のボタン(あれはボタンです)をドラッグすると、テキストオブジェクト「COPY!」が現れます。

結果物がこちら。

以下はそのソースC#です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DragAndDrop: MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {

	private Transform canvasTran;
	private GameObject CopyTextObject;
	private Text CopyText;

	private Text thisText;
	private RectTransform thisTextRect;
	private Vector3 thisTextPosition;
	private Vector3 mousePosition;

	// Use this for initialization
	void Start () {
		canvasTran = transform.parent;
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	// ドラック開始時
	public void OnBeginDrag(PointerEventData eventData)
	{
		Debug.Log("drag Start");

		//ドラッグ先テキスト
		thisText = this.GetComponentInChildren<Text> ();
		thisTextRect = GetComponent<RectTransform>();
		thisTextPosition = thisTextRect.localPosition;

		CreateDragObject ();

	}

	// ドラック中
	public void OnDrag(PointerEventData eventData)
	{
		Debug.Log("dragging");


		mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10);

		CopyText.transform.position = Camera.main.ScreenToWorldPoint (mousePosition);
	}

	// ドラック終了時
	public void OnEndDrag(PointerEventData eventData)
	{
		Debug.Log("dragEnd");

		Debug.Log("thisText = " + thisText.text);
		Debug.Log("copyText = " + CopyText.text);
	}

	private void CreateDragObject(){
		CopyTextObject = new GameObject ("copyText");
		CopyTextObject.transform.SetParent (canvasTran);
		//最前面表示
		CopyTextObject.transform.SetAsLastSibling ();
		CopyTextObject.transform.localScale = Vector3.one;

		CopyTextObject.transform.localPosition = thisTextPosition;

		CopyText = CopyTextObject.AddComponent<Text> ();

		CopyText.text = "Copy!";

		CopyText.font = Resources.FindObjectsOfTypeAll<Font>()[0];
		CopyText.fontSize = thisText.fontSize;
		CopyText.color = Color.white;
		CopyText.alignment = TextAnchor.MiddleCenter;

	}
}

噛み砕いて行こう

あくまで私の理解ですよ。間違いも多々あると思います。

さて、まず、宣言のところ。

	private Transform canvasTran;
	private GameObject CopyTextObject;
	private Text CopyText;

ゲームのオブジェクトを配置しているキャンバスと親子関係を持たせるための「canvasTran」。
ドラッグ先のコピー用テキストのゲームオブジェクトしての宣言のための「CopyTextObject」。
そのゲームオブジェクトにつけるコピー用テキスト「CopyText」。

初めは、「CopyText」だけでゲームオブジェクトとして成り立つかと思ったのですが、どうやら、ゲームオブジェクトの中のテキストという位置付けのよう。単体では表示されませんでした。

	private Text thisText;
	private RectTransform thisTextRect;
	private Vector3 thisTextPosition;

ドラッグ先の(コピー元の)テキスト情報を保持するためのもの。位置(ポジション?)情報などをコピー先に渡すためのもの。

	void Start () {
		canvasTran = transform.parent;
	}

スクリプトでオブジェクトを作成するのですが、他オブジェクトと同じくキャンバスさんの子供として扱って欲しいのです。なので、親子関係の情報を取って置きます。コピーオブジェクトにも持たせてやるから。

ドラッグのたびにやる必要はないので、スタートで取っておく。

・記事名:オブジェクトの親子関係のまとめ
・サイトリンク:http://qiita.com/hiroyuki7/items/95c66aee26115cf24a19

	// ドラック開始時
	public void OnBeginDrag(PointerEventData eventData)
	{
		Debug.Log("drag Start");

		//ドラッグ先テキスト
		thisText = this.GetComponentInChildren&lt;Text&gt; ();
		thisTextRect = GetComponent&lt;RectTransform&gt;();
		thisTextPosition = thisTextRect.localPosition;

		CreateDragObject ();

	}

ドラッグを開始したら、ドラッグ先のテキスト情報を取っておいて、コピーオブジェクト作成メソッドへ。

	private void CreateDragObject(){
		CopyTextObject = new GameObject ("copyText");
		CopyTextObject.transform.SetParent (canvasTran);
		//最前面表示
		CopyTextObject.transform.SetAsLastSibling ();
		CopyTextObject.transform.localScale = Vector3.one;

		CopyTextObject.transform.localPosition = thisTextPosition;

		CopyText = CopyTextObject.AddComponent&lt;Text&gt; ();

		CopyText.text = "Copy!";

		CopyText.font = Resources.FindObjectsOfTypeAll&lt;Font&gt;()[0];
		CopyText.fontSize = thisText.fontSize;
		CopyText.color = Color.white;
		CopyText.alignment = TextAnchor.MiddleCenter;

	}

ここでちょっと手こずった。やはりuGUIは偉大ですねぇ。スクリプトオブジェクト作るの面倒臭い。全部設定してやらないと出てこない。

初期状態の位置とか、どう表示させるか、フォントのサイズから種類から真ん中寄席の情報やら。

先に枠だけおいておいた「CopyTextObject」をチャット、ゲームオブジェクトして名前を与えて宣言してあげます。これによって、ドラッグを開始した時に初っ端はなかった「copyText」というオブジェクトがキャンバスにできます。

まだ、DragEnd処理で削除とかしないので、ドラッグが終わってもそのままオブジェクトは残っています。

	// ドラック中
	public void OnDrag(PointerEventData eventData)
	{
		Debug.Log("dragging");


		mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10);

		CopyText.transform.position = Camera.main.ScreenToWorldPoint (mousePosition);
	}

前回はドラッグ先オブジェクトにmousepositionを入れていたけど、それをCopyTextさんに設定すればこの状態に。

こんなものかな

コピーオブジェクトがずっと残りっぱなしだとうっとおしので、削除する処理をちらりと入れました。

	// ドラック終了時
	public void OnEndDrag(PointerEventData eventData)
	{
		Debug.Log("dragEnd");

		Destroy (CopyTextObject);
	}

これだけ。
あとは、コピーオブジェクトのテキストを、ドラッグ先のテキストにしてやりました。あとはカーソルのせいで文字がうまく見えないので大きくして見た。

結果はこう。

終わり。

ドロップ処理は、今のところ予定ない。

Unity ドラッグを試す その1

イメージと実際のものは違ったりする

勝手に、こうすればすぐできるだろうと思うこむことがよくあって、変に詰まることがよくある。本当によくある。

この思い込みでものすごい時間をかけたりする。

今日は「ドラッグ&ドロップ」をやってみようと思いました。

簡単なパズルゲーム(またもや算数系アプリで)を作ってみようと思っているのですが、ドラッグ&ドロップを使うかは、まだ未定。だったのですが。

ドラッグの動きを見て「これじゃない」と思ったので、ドロップまで行かなかった。使わないと思った瞬間からやりたくなくなったから。

とりあえず、やって見たところまでは記事にします。

ちなみに、ゲームそのものは、純粋にクリックするだけの動きにしようとも思っています。

参考にしたサイト。
・記事名:uGUIでドラッグについてちょっとだけ詳しく
・サイトリンク:http://qiita.com/okuhiiro/items/4c313038798da6923205

オブジェクトをドラッグしてみよう

まずはuGUI配置と簡単な実装

配置したuGUIの「Text」さんは、下の四つのボタンを押すと、押したボタンの数字に変化するようにしました。

で、私がこの「ドラッグ&ドロップ」でここから何がやりたかったというと、「1」のボタンをドラッグして「2」のボタンにトロップさせると、「3」になるという足し算仕組み。

実装しよう

ソースはこちら。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class DragAndDrop: MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	// ドラック開始時
	public void OnBeginDrag(PointerEventData eventData)
	{
		Debug.Log("drag Start");

	}

	// ドラック中
	public void OnDrag(PointerEventData eventData)
	{
		Debug.Log("dragging");
	}

	// ドラック終了時
	public void OnEndDrag(PointerEventData eventData)
	{
		Debug.Log("dragEnd");
	}
}

drag&dropは「EventSystems」にある機能らしい。なので、使わせての宣言をする。
これを抜かして怒られました。

using UnityEngine.EventSystems;

ドラッグ開始時は「OnBeginDrag」というメソッドで、ドラッグ中は「OnDrag」、ドラッグ完了後(離した後?)「OnEndDrag」でそれぞれ行われます。これを実際に動かしてみると、以下の通り。

「1」にこのスクリプトをアタッチしています。ただ、オブジェクトが動く処理は入れていないので・・・。
Debugは吐き出しているけど、動いているのかいまいちわからない状態に。

オブジェクトを動かす

「1」を動かすよう、「OnDrag」処理に位置情報を追加してやります。

	// ドラック中
	public void OnDrag(PointerEventData eventData)
	{
		Debug.Log("dragging");
		Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10);
		this.transform.position = Camera.main.ScreenToWorldPoint(mousePosition);
	}

スクリプトが付いているオブジェクトさんをマウスポジションに動かしてあげます。

どこ?!

ドラッグっぽい動きを0.1秒くらいして消えました。左下にいます。「1」さん。

数字すら見えない状態。ということは、もしかして位置情報が、uGUIさんたちと、マウスさんで噛み合っていないということかしら。

ということで、調べると、おそらくこれでしょう。

今回もお世話になります、椿さんのテラシュールブログ。

World SpaceをScreenSpace-Cameraへ変更

Canvasの「Render Mode」wp「ScreenSpace-Camera」へ変更。

「Render Camera」カメラは、一つあるMain Cameraを追加してあげます。そうするとほら。治った。

やってみるとわかる

やはり、簡単なテストプロジェクトを開いて作って見てからやればどんな感じなのかわかりますね。

ドラッグ&ドロップ処理をしようとして、ドラッグの時点でこれじゃないと思ったので、ドロップ処理は、無視。

こんなに滑らかに動いてほしい訳でもなく、自由に色々動いて欲しい訳でもなく、範囲を決めて動かせればいいじゃんという感じの動きでもない。もっと硬い感じで動いて欲しかった。

結局使わなかったけれど、おそらくこれが一番参考になるのではと思った記事。

・記事名:uGUIでドラッグドロップ
・サイトリンク:http://qiita.com/ayumegu/items/c07594f408363f73008c

Unity ドラッグを試す その2

Unity ボタンを非表示にしたい

ただ、ボタンを表示させたくない

以外に対応に時間がかかっていたのでまとめておこう。

「ボタンは存在する」けど、「見せたくない」または「見えないようにしたい」。

◆参考サイト

enabledと、interactalbeと、setActiveで動きが微妙に違う。注意点もそれぞれ違うので、必要に応じて使い分けた方が良いみたい。

多分、サンプルを作って見て自分で動きを確認した方が一番良いと思われる。

SetActiveで非表示

私がやりたいのは、「広告非表示」を購入してくれた場合は、「Disable Ads(広告非表示)」ボタンそのものを見せないこと。

なので、一度初期で購入を確認したら、永遠に表示する必要はなし。SetActiveで簡単に済ませるとしました。

GetComponentであの子を探すという作業も負荷が高いので、pulicにして、直接アタッチさせるつもりです。

これはおそらく、ボタンが少ないからできるんでしょうねー。ボタンが多ければ多いほど、GetComponentでFindするなりした方が楽(あくまで楽)だと思われます。

GetComponentは負荷が大きいらしいのでほどほどに使おう。

まずは、UI使うね宣言。

using UnityEngine.UI;

あとはpulic Button枠を準備。

public Button disableAdsButton;

実際は、課金してくれたら非表示にする予定ですが、とりあえずsetActiveをfalseにして非表示にさせます。

// Use this for initialization
void Start () {
  disableAdsButton.gameObject.SetActive (false);
}

disableAdsButtonさんのGameObjectの状態を「false」にしてやりました。これで終了。

私の場合、Admobを表示している、空のオブジェクトのスクリプトにこれを入れています。なので、それを開くと、publicのボタンが設定できるように。

そこに、非表示にしたボタンをアタッチ。動かしてみると、非表示になっています。

 

簡単ですが、初めてやるときはもっと簡単にできるものだと思っていたので、ちょっとまどろっこしいというのが感想です。

UnityでAdmobのバナー広告を表示する

アンドロイド版

こちらのサイトでは未来の私への伝言のようなものです。

今日の私昨日の私のコードに悩むことがよくあるので、さらにたまにしかやらないようなことを、知識がない前提で書いて見る予定です。

なので、全く初めての方でもわかるように書きたいですね。

とりあえず、UnityアプリにAdmobをいれて行きましょう。

全面広告とか他にも数種類はる広告の表示方の中で、私の場合は全面広告大っ嫌いなので、下にでるバナー広告にします。

本当に、全面広告撲滅してほしい。全面広告が表示されるブログ様だと、そのまま消してしまいますね・・・。

でも人によっては、下にバナーがずっと表示される方が嫌いな人もいて(うちの先輩)、一回全面広告出るのは見てやるよってなるんだそうです。

私自身が実際にやったことがあり、テスト確認できたのがアンドロイドだけなので、アンドロイド版のみの説明になります。(おそらくiPhoneでもあんまり変わりない。と思う)

前提

AdmobのパブリッシャーIDを持っていること。

・実機でテストができること

つまりは、Google Adsenseを持っていること!

広告収入をGoogle側から支払うとき、Adsenseから支払われるんだそうです。なので、二つのアカウントが必要になります。

私の場合は、Adsenseを持っていたので、Admobは審査なしで通過しました。(Adsense審査には1ヶ月ほどかかりました。)

AdmobからAdsense審査をされる場合、すでに配信しているアプリ(ダウンロード実績があるアプリ)で依頼を出した方が良いでしょう。審査期間は、どうでしょう。Adsenseと同じくらいかしら。

また、Admobは実機でしか表示されないので、テストがしたかったらテスト端末で稼働させましょう。

1.Admobで広告を表示するアプリを登録する

 

Admobにログインしてトップ表示。「新しいアプリを収益化」を押す。

次に表示される画面で、アプリの情報を登録して行きます。

GooglePlayやらApple Storeに登録済みのアプリなら検索して登録できるようなんですが、私の場合はローカルに置いたままテストをしてから、アプリをストアに登録したいので、「手動で追加」を選択していれて行きます。

プラットフォームは「Android」。プラットフォームごとに作ってやる必要があるみたい。(多分、どのアプリで広告が押されたのかという区別のためだと思うけど)

広告フォーマットは「バナー」他の設定はいじらず、ユニット名だけ「Bottom」としておきました。そして保存。

とりあえず、Firebaseアナリティクスは無視して、設定完了すると広告ユニットIDが出来上がります。Googleさんも次のステップで「アプリに組み込んでね〜」という案内をしてくれます。

2.UnityにAdmobを組み込む

1.Google Mobile Ads Unity Plugin のダウンロード

Google で提供しているツールをUnityアプリにインポートします。その前にダウンロード。

◆サイトリンク:https://firebase.google.com/docs/admob/unity/start?hl=ja

少し前まで、UnityにAdmobを組み込むためには個人の好意で公開してくれたプラグインで対応していたみたい。今はGoogleさんが提供してくれています。

プラグインをダウンロードしておきましょう。

ソースコート(zip)にはデモアプリが入っています。ま、稼働したの見たかったらこれも実機稼働させないと行けないですけどねー。それに、Admobを単純に表示したかったらここまで複雑なスクリプトは不要のようです。(公式サイトによれば)

参考までかな。

2.プロジェクトのシーン(画面)を開く

スタート画面、画像のメニュー画面、あとは4つの演算ゲーム画面の6画面構成のプロジェクトです。

Admobは1箇所につけておくと、それ以降の画面にも表示がされるとか。

私の場合は、メニュー画面にAdmobオブジェクトを作成します。(スタート画面には表示されなくてもいい)

3.ダウンロードしたパッケージをインポート

メニューバーの「Assets」の「Import Package」から「Custom Package」。

このままでインポート。

今までなかったプラグインやらフォルダーが出来上がります。これで準備は終わり。

4.空のオブジェクトにスクリプトでAdmobを表示させる

Admobという名の空のオブジェクトに「AdmobScript」を作成しました。

スクリプト用のソースは、Google公式サイトで教えてくれています。

◆リンク:https://firebase.google.com/docs/admob/unity/start?hl=ja#basic_interstitial_request

まず、私が書いたソースがこちら(公式のまま)。ちなみにC#。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;

public class AdmobScript : MonoBehaviour {

	// Use this for initialization
	void Start () {
		RequestAdmob();
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	private void RequestAdmob()
	{
		//if UNITY_ANDROID
		string adUnitId = "ca-app-pub-XXXXXXXXXXXX";

		// Create a 320x50 banner at the top of the screen.
		BannerView bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Bottom);
		// Create an empty ad request.
		AdRequest request = new AdRequest.Builder().Build();
		// Load the interstitial with the request.
		bannerView.LoadAd(request);
	}
}

説明すると、まずは頭にGoogleAdsを使わせて宣言。

using GoogleMobileAds.Api;

課金購入すると広告を非表示にさせたいので、RequestAdmobメソッド呼び出し方にしました。

公式の説明だと、Androidか、iPhoneかを区別できるようにしていますので、一つのプロジェクトでandroidとiPhoneの対応をされる方はそちらの通りにすればよかろうと。

// if UNITY_ANDROID
		string adUnitId = "ca-app-pub-XXXXXXXXXXXX";

ここには、上のAdmobで作成したUnitの広告IDをいれます。

こいつ。

ソースの流れとしては、初期化して、Admob表示させてというリクエストキーを作成して、リクエストする。という流れ。

bannerView.LoadAd(request);

ちなみにこのバナーの大きさは一番どこでも見えるタイプ(320×50)。

「AdPosition」を変えればトップにも表示できます。私は「Bottom」にしました。こちらも公式サイトで説明があります。

全面広告のソースについても公式サイトにありますよ。

書き方をちょっとだけ変えてこれを自分用にカスタマイズすると、以下の通りになりました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;

public class AdmobScript : MonoBehaviour {

	//UnitID情報
	string adUnitId;
	BannerView bannerView;
	AdRequest request;

	// Use this for initialization
	void Start () {

		//if UNITY_ANDROID
		adUnitId = "ca-app-pub-XXXXXXXXXXXX";

		// Create a 320x50 banner at the top of the screen.
		bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Bottom);
		// Create an empty ad request.
		request = new AdRequest.Builder().Build();

		//広告表示
		RequestAdmob();
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	private void RequestAdmob()
	{

		// Load the interstitial with the request.
		bannerView.LoadAd(request);
	}
}

うん、変数外出しに書いただけ。
課金入れて表示非表示切り替えたいからこうしています。

5.javaファイルを作成する

スクリプトの作成が終わったら、最後の作業へ。

Assetの「Play Services Resolver」→「Android Resolver」→「Resolve Client java」でjavaファイルを作成します。

もし「Play Services Resolver」が表示されない場合は、Build SettingでAndroid(またはiOS)になっているのか確認。

成功したよって、言われたらOKを押して終了です。

「Plugins」の「Android」にこんな子達が作成されました。

Admodが表示された

いちいち実機で確認しないと行けないから面倒臭い・・・。ちなみにこちらは「テスト版」ではなく、本物の広告です。

テスト用Admobを表示することができるようですが、かなりの手間そうだったのでヤラナカッタ。

自分で広告をクリックしないことを念頭にそのままリアルもので確認しました。

はまったところ

javaファイルを作成してねって、知らなんだ。5番手順を抜かしてビルドしたら表示されなくて困りましたわ。

「Admobが表示されない」で検索した時に「Ja」ファイル作ったか?って回答があって(テラテイルだったかな?)、対応できました。

公式サイトで教えてくれよ・・・Googleさん。

iOS対応だと、ここからさらにもう一手間が必要な様子。私は現段階ではiPhoneへの配信は予定していないので、置いておきました。

Unity Adsを導入する

ユーザの意思で広告をみる

Unityが提供するアプリへの組み込みタイプの広告。忘れないため、Unity Adsから記事にします。

設定は、どうやらUnity5.3よりものすごく簡単になった様子。確かにものすごく簡単でした。

久しぶりにGoogle先生にお世話になった回数が少なかった。

Unity Ads概要

◆サイトリンク:https://unityads.jp/monetize

15秒の動画が流れ、その動画からアプリをダウンロードした場合に支払いが発生するというタイプ。

日本ではあまり種類っぽい感じではなかったですね(検索してポスティングが少なかった)。NendとかAdmobのようなバナータイプの方がよく選ばれている感じ。

海外サイトをみた感じ、組み込む感じとしては、『ライフがゼロ → 広告を1度見るとライフが1回復』といったタイプでよく使われているようです。

ローカルによって、また、広告が子供でも見れるか見れないかによって広告そのものが流れなかったりするので、収益の面としてはどうなのだろう。

クリックすればとりあえず1円あげるタイプの広告よりは、ダウンロード数に比べて、収益にならない気がします(気だけですけど)。

そんなこと言いつつ組み込んでいる

『Menu』シーンのレベルボタンの下に『Watch Ads』ボタンを入れておきました。

これを押すと、ダミーのAds画面に移動します。左上のクローズを押すと先ほどの画面に戻る。実機でテストすると実際に動くテスト動画が流れます。

縦固定のゲームなのですが、広告が流れる時は強制的に横になりました。

私がこの子に収益を求めているのかというと、全く求めていない

ゲーム自体をUnityに慣れるために作ったもので、単純算数アプリだから子供向けに設定しました。

子供向けのスマホはそもそも決済機能をオフにしているケースも多く、「子供向けアプリ」と設定した時点でGoogleさんも、厳しく確認していました。

この動画広告も、数がそもそも少ないのに、子供対応可能アプリの広告を表示させるという制約があり広告自体が表示されないことも多いらしい(検証未済みです)。

本当にやりたかったのは、Admobでバナー広告を表示して、課金でバナー非表示にしたかったのですが、Admob自体が子供向けアプリに設定した時にテストがほぼ不可能だった(笑)。これはまた、別で書くと。

Unity Adsを設定しよう

実はUnity側だけの設定で事足りる

Unity側の設定の際に参考したサイトさんが、こちら。

◆サイト管理人:Magnagames

◆記事リンク:http://magnaga.com/unity/2016/01/30/unityads/

ただ、これだけだと、実際にどれくらいの人が広告をみて、いくらくらい落としてくれるのかわからない

そして支払い請求はどうするのか正直わからない。なので、Unity社にAdsを使わせて〜という登録を行う。この場合、Unity側で設定されたGameIDが変更となるので、修正してやらないといけない。

Unity Adsを申請する

◆サイトリンク:https://unityads.jp/

サイトに入って、Unityのプロジェクトを作っているアカウントでログイン(違ってもいいけど)。

「EARN MONEY WITH YOUR GAMES」と、「あんたのゲームで儲けようぜ」と書いている方を選ぼう。

全くの初めての作成の場合は、この画面が開くはず。2回目以降の場合は管理画面が表示されます。

こんな感じ。

とりあえず、上の新規追加のところで、プラットフォームを選んで次に進むと、プロジェクトIDとAppleとGoogle用のゲームIDが割り振られる。

Unityに戻って、AdsのAdvancedにあるGameIDを上の方に合わせに行く。

設定完了。これで終わりです。テストすれば、勝手に動き出します。

注意事項と拾った情報

Adsの「Test mode」を、実際のリリース時には必ずチェック外す

これがチェックが入っていると、テスト用広告しか流れない!

ちなみにこのゲームは現時点ではAndroidのみでリリースしています。クローズベータ版でテストしていた時、こちらは外してやっていました。

子供向けのアプリで、Admob系の広告は大変嫌われるよう。特にアップルさんはすごぶる嫌がるようで、子供向けで、無料で、広告を組み込みたい場合はUnity Adsの方が審査に通るようです。

・・・子供向けアプリがやたらと厳しいのはよくわかった。

© Copyright 2017 「It Happens」 All rights reserved.