のにっき

クラス配列作成時に要素がnullになるのを防ぐ方法

最近、Listばっかり野郎から、配列も使ってやろうに変化したのですが、

クラス型の配列を作成した時の問題と対応をまとめておきます。

配列定義時の中身が・・・

適当なクラスの配列を作成してみます。

        // 適当クラス
        public class TestClass
        {
            public int _Id = 0;
            public string _Name = "";
        }
        // 起動時イベント
        void Start()
        {
            TestClass[] a_TestClass;
            a_TestClass= new TestClass[10];
            // ↓↓変数に値を設定しようとするとエラーになる↓↓
            a_TestClass[0]._Id = 1;
        }

こんな感じでクラス配列を作成した後、
要素のクラスに変数を設定しようとするとエラーになるはずです。
この理由は、
「クラス型の配列作成時、要素は全てnullになっている!」からです。
なので、すべての要素にインスタンスを作成する処理

    a_TestClass[0]= new TestClass();

この処理を行わないと変数の設定ができません。。。

LINQをつかって一気にやってしまおう!

インスタンス作成処理をfor文で回してもいいのですが、
ただの配列作成処理なんだからスッキリさせたいです。
こんな時に重宝するのがLINQです。
配列作成の処理にSelect文をつかって1行で完結させましょう

        // 起動時イベント
        void Start()
        {
            TestClass[] a_TestClass;
            a_TestClass= new TestClass[10].Select(x => { return new TestClass(); }).ToArray();
            // ↓↓エラーにならない!↓↓
            a_TestClass[0]._Id = 1;
        }

こんな感じで配列作成と要素にインスタンス作成の処理を1行でできます。

配列を使うメリットって何だろう?

最近、なんとなくですがListの必要がないものは
なるべく配列で組み込むようにしているのですが、
まぁまぁ良かったことをまとめときます

◆ 良かったこと

  • 配列は作成した瞬間から要素が出来ているので、一時的にクラスを作る必要がない
  • 高さが変動しないので、範囲外系のエラー時の原因追及がしやすい
  • ToLinq、ToArrayがあるのでそこまで自由度が低くなることはそんなにない
  • 「高さが変わらないなら配列」という明確なルールを持ってListと使い分けることで、型を見ただけで自分の意図が分かるからコードを読み返すときに楽

以上です
今更ですが配列は配列できっちりしていて好きになりました。

UnityでNuGetパッケージを使用してIL2CPPを使用した時の参照エラー対策

初めてUnityでNuGetパッケージを使用してみたのですが、

IL2CPPでビルドした場合のみでバグが発生してしまいました。

今回、解決までの四苦八苦をまとめておきます。

 

NuGetパッケージ導入方法

qiita.com

この記事を参考にNuGetパッケージを導入しました。

「Scropting Backend」の設定をIL2CPPではなく、Monoで

ビルドを行った際には何も問題なく動いていました。

 

エラー内容

公開前に、いざ64bitに対応させようと思いIL2CPPに切り替えてビルドした結果、

実機でデバッグした際に上手く動かない!

f:id:apuridasuo:20190926111653p:plain

図:実機ログのエラー内容


今回、私はNuGetパッケージから「Taglib」というパッケージを導入していました。

その中のクラスが見つからない。。。という参照エラーが発生していました。

 

対応内容

1. Projectの「Assets」フォルダ内に「link.xml」という名前のファイルを追加

※「Assets」フォルダ以下ならどこでもOKらしい・・・

2.「 link.xml 」に以下のコードを記入

<linker>
       <assembly fullname="DLLファイル名(拡張子を除く)" preserve="all"/>
</linker>

f:id:apuridasuo:20190926113111p:plain

図:今回のエラー対応を行ったlink.xmlファイル内容

対応は以上です。あとはいつも通りビルドしていただければ
参照エラーは直っています。

エラー原因

docs.unity3d.com

上記の参考サイトにも書いているのですが、

自分なりにかみ砕いた解釈をまとめると・・・(間違ってたらすみません)

IL2CPPでビルドすると、ユーザーが手動で追加したdllは削除される。

だから、「link.xml」で手動追加dllの削除・保持を指定する必要がある。

※.厳密には、手動追加かつGameObjectに設定したスプリクトファイルの

コードが呼び出していないクラスが削除される。と書いてましたが、

ちゃんと呼び出すようにコードを変更しても意味が無かったので

何をしても手動dllは削除される。という考えで対策することにしました。

 

最後に

今回出したアプリは、公開前に

「AppBundle」と今回の件で2つの初エラーが急に来たので

めちゃくちゃ泣きそうでした・・・

そんな直前に苦しめてくれたAndroidアプリ!

play.google.com

f:id:apuridasuo:20190926114912p:plain

通常の音楽プレーヤーに、

再生楽曲のテンポをあなたの走るテンポに合わせる!

という面白機能を合わせてみました。

皆さんぜひ、ダウンロードして色々文句言ってください!

個人製作でロクに宣伝もできないので入れてみました・・・

【Android】aabファイルを実機にインストールするbatファイル作成

Androidアプリを公開する際に必ず警告される「Android App Bundle」の項目。
対応してみたのですが、
「aab」ファイルを実機にインストールする方法について、
ネットに情報が少なくまとまっていなかったので
今回、まとめようと思いました。

対応した警告の内容

f:id:apuridasuo:20190925131202p:plain
図:アプリリリース時の警告
「AndroidAppBundleでサイズを小さくしよう!」という事でした。
個人製作のアプリなので100MBも超えたことが無かったので
小さくなろうが誰も気にしないだろうと思い、無視していました。
今回暇つぶしに対応してみたのですが、ビックリしたのが
ビルドして出力されるファイルの拡張子が「.apk」ではなく「.aab」になってる!
という事でした・・・
この「.aab」ファイルを実機にインストールする方法が全く分かりませんでした!
ネットで調べても、細かい部分は載っているのですが
初歩的な部分が全くなかったので素人には四苦八苦状態でした。
苦しみながらbatファイルを作って一発インストールできるまでいったので、
同じ様に困っている方がいましたら是非ご利用ください。

Android App Bundle」を利用して「aab」ファイル作成

これは簡単です。

f:id:apuridasuo:20190925132202p:plain
図:ビルド設定
上図のように、「Build App Bundle(Google Play)」にチェックを入れるだけです。
これで、「AndroidAppBundleでサイズを小さくしよう!」は達成です!
実機デバッグを行わない方は、できたファイルをアップすればOKです。

「aab」ファイルを実機にインストールする方法

  1. 最新の「BundleTool」をダウンロード
  2. github.com 上記URLから、最新の「 bundletool-all-○.○.○.jar 」ファイルをダウンロード
    ※○=バージョン情報
    落としてきたファイルは好きなところに置いて大丈夫です

  3. batファイルを1.のファイルと同階層に作成
  4. 落としてきた「 bundletool-all-○.○.○.jar 」と同じ階層に
    適当なファイル名で「.bat」ファイルを作成して下さい。
    batファイルに記入するコードは後ほど説明します
  5. 「.aab」ファイルを1.のファイルと同階層に移動
  6. Unityでビルドしてできた「.aab」ファイルを
    batファイル等と同階層のフォルダに移動させてください
    f:id:apuridasuo:20190925140231p:plain
    図:フォルダ構成参考例
  7. batファイルのコードを記入
  8. まずは、以下をコピペして下さい

    @echo off
    cd /d %~dp0
    @rem ↓↓必要事項を記入↓↓
    set File_Bundle=落としてきた「bundletool」のファイル名【例】bundletool-all-0.10.3
    set File_App=Unityから出力したアプリのファイル名【例】TestAppName
    set Path_Key=アプリで使っている「.keystore」ファイルのパス【例】D:/Unity/TestAppName/user.keystore
    set Pass_Key=パスワード
    set Alias=エリアス名
    set Pass_Alius=エリアスのパスワード
    @rem ↑↑必要事項を記入↑↑
    @rem ----変数設定
    set Path_Now=%~dp0
    set Path_Get=%Path_Now%%File_App%.aab
    set Path_Out=%Path_Now%%File_App%.apks
    set Path_Out_Srch=%File_App%.apks
    set File_Bndle_Fix=%File_Bundle%.jar
    @rem ----apks作成済みなら削除
    if exist %Path_Out_Srch% ( del %Path_Out%)
    @rem ----apks作成処理
    java -jar %File_Bndle_Fix% build-apks^
     --bundle=%Path_Get%^
     --output=%Path_Out%^
     --ks=%Path_Key%^
     --ks-pass=pass:%Pass_Key%^
     --ks-key-alias=%Alias%^
     --key-pass=pass:%Pass_Alius%
    @rem ----apksをインストール※USB接続している実機が対象
    java -jar %File_Bndle_Fix% install-apks^
     --apks=%Path_Out%\
    pause \
    

    次に、コードの中の、各自記入しないといけない部分があるので解説します。
    ※ コードの「@rem ↓↓必要事項を記入↓↓」の部分です

    ・set File_Bundle=
    ・set File_App=

    拡張子を除いたファイル名を記入

    f:id:apuridasuo:20190925142322p:plain
    図:記入内容

    ・set Path_Key=
    ・set Pass_Key=
    ・set Alias=
    ・set Pass_Alius=

    キーファイル(Unityの「Player Settings→Publishing Settings→Keystore」項目)
    エリアス名(Unityの「Player Settings→Publishing Settings→Key」項目)
    両パスワードを記入

    f:id:apuridasuo:20190925142831p:plain
    図:パス系記入欄記入内容
    記入例

    @rem ↓↓必要事項を記入↓↓
    set File_Bundle=bundletool-all-0.10.3
    set File_App=MusicTempoCnv
    set Path_Key=D:\Unity\CmnKey\user.keystore
    set Pass_Key=11110000
    set Alias=username
    set Pass_Alius=00001111
    @rem ↑↑必要事項を記入↑↑
    

    これで準備はOK!
    後は、AndroidをUSBに接続して作成したバッチを実行して下さい。
    apksという拡張子のファイルが作成されて、その後に実機にインストールされます。

これで、特に難しいこともなくaabファイルで
実機デバッグを行うことができます。

ただ、調べていて思ったのですが、
「bundletool」の詳細情報が無さすぎるので、
そもそも、abbファイルを手動で実機にインストールすること自体
普通は行わないのではないか?

と思ってしまいました。。。

自分が遠回りなことをしている気しかしないので、
こんな事しなくても、もっと簡単に実機デバッグできるし!
という方法があったらさわりだけでも誰か教えてください!!

【アプリ】GoogleAdmobで広告が表示されなくなった時

最近の1か月間ぐらい、

私が作成したアプリの収益が急に0円になりました。

その時の対応と解決までの道のりをご紹介します。

※.今回解決した理由はほとんど謎です!

状況(環境)

AndroidアプリにGoogleAdmob広告を導入していた

・すべてのアプリで正常に広告表示されていた

・バナー広告、インタースティシャル広告を導入

・総DL数:約700、収益:約700(円 / 日)

収益が0円になった!

f:id:apuridasuo:20190717105129p:plain

図:収益レポート

6月の15日ぐらいに、急にアプリ収益が0円になってました。

アプリを開くと、広告が表示されなくなってました。

 

この時、GoogleAdmobサイト・GooglePlayConsoleサイトを見ても

注意や警告等の表示は何もなく、アカウントは問題なく見えました。

GoogleAdmobへの問い合わせ

まず、GoogleAdmobに問い合わせを行おうと思いました。

しかし、問い合わせが分かりずらい!!

ですので、分かりやすく以下にまとめます。

f:id:apuridasuo:20190717105744p:plain

図:お問い合わせ種類

調べたところ、お問い合わせフォームは2種類ありました。

・【A】問い合わせ

https://support.google.com/admob/contact/implementation_issues_new

こちらは、普通のお問い合わせフォームになります。

だたし、たどり着くまでにメンドクサイ手順が満載でした。

上記のURLでジャンプしていただければいいのですが、

一応フォームまでの手順をまとめましたので図示しておきます。

f:id:apuridasuo:20190717110456p:plain

図:お問い合わせまでの道のり

・【B】スペシャリスト相談

モバイル スペシャリストにご相談ください - Google AdMob

こちらは、問い合わせで調べたら一発で出たので分かりやすいフォームです。

しかし、一か月間返信が来ることはありませんでした。。。

おそらく、アプリのDL数が少ないと返信が後回しになるのだと思います。

 お問い合わせ応対内容

今回、【A】【B】2種類のお問い合わせに質問を送った内容をまとめます。

・【B】スペシャリスト相談

返事なし・・・・・( ;∀;)

・【A】問い合わせ

1.広告が急に表示されなくなったことを相談した

2.返答メールが2,3日後に来た

f:id:apuridasuo:20190717110801p:plain

図:GoogleAdmobさんからの返答

3.無効なトラフィックについて確認するも、違反内容がわからず四苦八苦する

  →後日、お支払いの「ご利用履歴」を確認しても

   「無効な操作による返金」が無かったため、違反してなかったと思ってます

4.修正する点が分からないので直しようがない!

  とりあえずメール文面の「トラフィック品質の評価期間」について

  期間はどれくらいなのかメールに返信してみた。

5.返信なし。。。問い合わせフォームで質問してみた!

6.返信なし。。。諦めて放置していた。。。。

 

一か月後・・・・

 

7.気づいたら収益が0円じゃなくなっていた!

  実機で確認してみると、アプリ広告が表示されるようになっていた!

考えられる原因

 1.支払い基準額100%手前だった(98%)のでトラフィック品質の評価を行った

広告を止められる直前、総収益が支払い基準額直前の7800円でした。

よって、支払いを行っていいアカウントなのか調べるため

トラフィック品質の評価を行ったのではないかと思います。

確認期間中に支払い基準額を達成されては困るので広告表示が止められたのでは?

 

2.急に広告収益が高くなったのでトラフィック品質の評価を行った

広告を止められる直前、新しいアプリを公開したのですが、

広告収益が一日500円ぐらいアップしました。

急激に収益が上がったのでトラフィック品質の評価を行ったのではないかと思います。

 

まとめ

急に広告表示が止められたら、

トラブルシューティングからの問い合わせを行う!

よく分からなかったら一か月ぐらい放置してみる!

個人製作ですと、

細かい部分がよく分からないので待ってみるのも一つの手です(´;ω;`)

スマホアプリを無料で宣伝する方法

自作したアプリを宣伝したい。

色んなやり方はありますが、今回ご紹介するのは

スマホアプリレビューサイト」へのレビュー依頼です

 

アプリレビューサイトとは?

あなたが例えばネット検索で「アプリ 暇つぶし」などで検索したとき、

条件に対応するアプリをまとめて紹介してくれているサイトのことです。

レビューサイトに載ることで、自分の作成したアプリを

本当に必要としているユーザーに宣伝することができます。

 

大手レビューサイト-Appliv-アプリヴに依頼してみた

android.app-liv.jp

今回自作したアプリを上記サイト様に実際にレビュー依頼してみました。

料金はなんと無料でした!

素人で個人製作の私にも分かりやすく、丁寧に対応して下さったので

初心者には超おススメのサイト様だと思います。

以下に実際の依頼手順を記入していきます。

 

 ①.HPのレビュー依頼ボタンクリック

HPの一番下の項目の「アプリ開発者様へ」の部分をクリック

f:id:apuridasuo:20190617094921p:plain

図:レビュー依頼場所

②.必要事項をフォームに記入

私は個人製作でしたので、「法人名・プロモコード」の部分は記入しませんでした。

 

③.メールで何度かやり取りをする

依頼フォーム送信後、確認メール等で2回ほどやり取りをしました。

このメールのやり取りが素人の私には一番ハードルが高いなと思っていたのですが、

料金もかからない上に、とても分かりやすいメールの内容でした。

特に、こちら側がやらなければダメな事が無かったのは驚きでした!

 

④.5日間ぐらいでレビューが掲載された

依頼後、5日後ぐらいにレビューが掲載されました。

レビュー内容を確認しましたが、分かりやすく具体的な内容を掲載していただき

無料とは思えない内容で驚きでした。

※実際のレビュー内容は以下URLです。

【Appliv】パチツール パチンコ・スロット補助ツール 全国レア台設置店や全開放パスワードリストなど掲載

 

無料・かつお手軽なのでやらない理由はない!

以上がレビューサイトへの依頼手順です。

今回レビューサイトに依頼してみて思ったことは、

依頼する側にはデメリットが全くないという事です。

レビュー依頼は個人製作者はハードルが高いイメージでしたが

全くそんなことはなく、対応も驚きの丁寧さでした!

自作アプリのDL数がなかなか上がらない方はぜひ、お試しください

【Unity】Android用フリック対応ボタン作った

Unityパッケージ公開してるのでぜひ落として使ってください!

 

一回公開すると記法が変えられないなんて・・・泣

今回は、Android用の汎用ボタンを作りました。

細かい機能詰め込んだので使いやすくなってると思います。

ダウンロードリンク

github.com

 概要

f:id:apuridasuo:20190606165719p:plain

図:ボタン仕様説明

パッケージの中に テストシーンを入れてるので開いてみてください。

使ってみると大体わかると思います。

 

使い方【事前準備】

 このパッケージは、C#6への対応が必要です。

下記リンクの「 事前準備【C#6.0導入手順】 」の項目を読んで

NET4.6に対応させてください。※めちゃくちゃ簡単ですので!

【C#6】別スクリプトの関数・定数を簡潔に呼び出す方法 - のにっき

 

使い方【初期設定】

  • インポート

ダウンロードしたパッケージの「Prfb_Button」が汎用ボタンのプレハブになります

f:id:apuridasuo:20190606170104p:plain

図:パッケージ内容

・テストシーン・・・ボタンを実際に使用しているシーン

・中身・・・プレハブで使用しているオブジェクト詰め合わせ

 

  • inspectorで編集が必要な場所 

プレハブをヒエラルキーに追加した後、一部カスタマイズできる部分があります

f:id:apuridasuo:20190606170421p:plain

図:Inspector内容

①.ボタンのID
ボタンの情報(角度など)は、すべてのボタンをまとめた

1つのディクショナリー変数で管理されています。

このボタンIDは、ディクショナリー変数のキーになります

複数ボタンを設置した時は、ボタンごとに別々のIDを設定してください

 

②ボタンの画像

この変数で、「ボタン・タップ範囲」の画像を編集できます。

spriteを自由に設定していただければ反映されますのでカスタマイズしてみてください

Imageコンポーネントに直接画像を設定しても意味ないので注意!

 

③ボタン縮小倍率

ボタンタップ時に画像が赤く+小さくなるのですが、

小さくなる度合いをこの変数で調節できます。

タップ時に画像が小さくなりすぎたり、大きすぎたら調整してください。

この値を大きくするほど小さくなるので注意してください

 

  • 「Btn_MainCntrl」ソースの編集可能な部分

インポート時の「中身」フォルダ内のソースファイルです。

f:id:apuridasuo:20190606171741p:plain

図:ソースの編集可能部分

 ①.入力無効範囲

タップした後、ちょっと右にずれただけでボタンが反応するとウザい場合があります。

それを防止するため、一定範囲のずれは入力を無効化しています。

この値を大きくすると無効化範囲が拡大します

 

②.角度反転許可変数

カメラの向きによっては取得した角度が180度反転している場合があります。

この変数を「true」にすると、取得角度を反転して保持するようになります。

 

使い方【ボタンの情報を毎割り込み更新する方法】

「Update」関数から「SetTapInfo_Time()」を呼ぶだけ!

どのスプリクトファイルでもいいので「Update」関数の中に

「SetTapInfo_Time();」を組み込んでください。全ボタンをこの関数で更新します。

 

使い方【ボタンの情報を取得する方法】

ボタンがタップされているかどうか:dic_AllBtnIf[ キー番号 ].cls_State クラス

bl_IsTapNow・・・ボタンがタップされているかどうか

( true )タップされている、( false )タップされていない

 

タップ情報:dic_AllBtnIf[ キー番号 ].cls_Out クラス

  • i_Houkou_X・・・左右どっちにフリックしてるか

 enum型の変数になってます※「Btn_GetValue」ファイルで定義

eVctr_X.Nom=どっちでもない

eVctr_X.Right=右方向にフリック

eVctr_X.Left=左方向にフリック

  • i_Houkou_Y・・・上下どっちにフリックしてるか

 enum型の変数になってます※「Btn_GetValue」ファイルで定義

eVctr_Y.Nom=どっちでもない

eVctr_Y.Up=上方向にフリック

eVctr_Y.Down=下方向にフリック

  • f_Kakudo・・・フリック角度

float型変数です。角度をそのまま格納しています

  • vct3_Position・・・タップしている座標

Vectro3型です。現在タップしている座標をそのまま格納しています

 

使用例※テストシーンの中身

f:id:apuridasuo:20190606173943p:plain

図:テストシーンのUpdate関数の内容

 テストシーンでは、3つのボタンを作成して各ボタンの情報を

背景のテキストファイルに表示しています。

ボタン情報変数の呼び方の参考にしてください。

 

①3つのボタン情報を更新する関数を呼ぶ

「 SetTapInfo_Time() 」関数を呼ぶだけでOK!

②ボタン情報をテキスト表示している

まず、各ボタンがタップされているかどうかを

「 dic_AllBtnIf[i_LpCnt].cls_State.bl_IsTapNow 」の変数で判定

そして、タップされている場合、

「 dic_AllBtnIf[i_LpCnt].cls_Out 」のクラス内変数から読み取って出力

 

ほめて欲しいところ!

 なんといっても、複数ボタンに対応するために

staticの定義を最小限に抑えて組み込んだところです!

組み込んでる途中は何度もこんがらがったんですが終わってみれば

めちゃくちゃスッキリしたなーと感動しました。。。

 

以上です。

パッケージ化すると色んなアプリに使えるから便利ですよねー

皆さんが個人的に汎用化している物とかできれば見てみたいです。。。

GoogleAdMobインポート後に必要な作業 ※ver 3.17以降

以前、GoogleAdMobをインポートするとアプリが起動しなくなって
バージョン落ちのパッケージ使ったよ。という記事を書きました。
apuridasuo.hatenablog.com

昨日、新しいアプリを作成したときに同じバグになって
キチンと原因を探ってみましたところ、
完全に私の作業不足だったことが判明しました。
過去記事に追記したいので、リンク用に記事にしようと思います。

ver17.以降では「AndroidManifest.xml」への追記が必須!

まずは、公式マニュアルのリンクを確認してください
スタートガイド  |  Unity  |  Google Developers

下記の項目が、今回アプリが起動しなくなった原因でした。

f:id:apuridasuo:20190605095308p:plain
図:AndroidManifestへの追記方法

GoogleAdMobのサイトで取得したアプリIDを
「Assets/Plugins/Android/GoogleMobileAdsPlugin/AndroidManifest.xml
のファイルに記入しないといけなかったんです。
今までは必須ではなかった?のでやらなくても問題なく動作していたのですが、
最新のパッケージでは必須になっていました!

今回の私のアプリでの記入方法を例としてご紹介します。
まずは、例の「AndroidManifest.xml」を開きましょう。
unityエディター上から開けるので場所を貼っておきます。

f:id:apuridasuo:20190605101247p:plain
図:AndroidManifest保存場所
こいつを開いて、ソースの

android:value="YOUR_ADMOB_APP_ID"/>

の行のみを変更します。
「"YOUR_ADMOB_APP_ID"」の部分に自分のアプリIDを入力するだけです。
書き方は、以下の例を参考にしてください

  <application>
    <uses-library android:required="false" android:name="org.apache.http.legacy"/>
    <!-- Your AdMob App ID will look similar to this sample ID: ca-app-pub-3940256099942544~3347511713 -->
    <meta-data
    android:name="com.google.android.gms.ads.APPLICATION_ID"   
    android:value="ca-app-pub-7777777777777777~7777777777"/>
  </application>
</manifest>

あとは、いつも通りの処理で広告がでるはずです。

ここで注意が必要なのは
デバッグ等でテスト広告を表示したい時は
上記で記入するIDはテスト広告のIDを記入してください。
そして、本番IDに切り替えるときに忘れず切り替えてください。

以上が、新バージョンのGoogleAdMob導入時の注意事項になります。
作業に慣れると、
マニュアルに変更があった時に気付かずアタフタしてしまいがちです・・・