そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】課金設定 Unity IAPにGoogle 公開鍵を設定する

<追記 2021.10.6>
Dashboard上での設定は不要になりました!
(Dashboard上の設定項目自体が消えています・・・)
公開鍵を入れて「Verify」を押せば設定できました。


Unity IAPへのGoogle公開鍵設定ではまったのでメモ

前提条件

Google Play Consoleにapkファイルがアップロードされている
・Unity IAPが有効になっている

1.Google Play Console上で公開鍵の取得

公開鍵の取得

2.Unity IAPで公開鍵を設定する

注意 Unity上からは設定できない

Optionsのところで入力欄がありますが、入力しても無効となってはじかれます。 f:id:marumaro7:20201119051019p:plain:w400

2-1 Unity Analyticsへ移動

Unity IAP画面右上の Go to Dashboardをクリック ダッシュボード

2-2 公開鍵を入力

Settings
→Analytics Settings
Google License Keyに公開鍵を入力
→保存ボタンを押す

公開鍵入力

2-3 Unityへ戻って公開鍵を反映

Unity IAPへ戻って入力欄に公開鍵を入力してVerfyボタンを押す



設定完了!

aa

おわりに

課金設定なにがなんやらわからんですねー。


最後に宣伝させてください。
アプリ開発を始めて丸2年が経ち、
節目としてなにか形にしたいと思い、Udemy講座を出しました!
www.udemy.com

ブログ限定割引リンクは私のプロフィールページにあります。
アプリ開発収益化を時短したい方向けの講座となっております。

参考

develop.hateblo.jp

DanceDreamMV プライバシーポリシー

制定日:2021/1/1

このページは、Maruyu Apps(以下「私」と言います。)が提供するスマートフォンアプリ「DanceDreamMV」(以下「本アプリ」と言います。)における利用者情報の取扱いについて、以下のとおりアプリケーション・プライバシーポリシー(以下「本ポリシー」といいます。)を定め、公表しております。本アプリをインストールする前に本ポリシーをご確認いただき、内容をご理解の上で本アプリをご利用下さい。
なお、本ポリシーにおいて、「利用者情報」とは、お客様の識別に係る情報、通信サービス上の行動履歴、その他お客様のスマートフォンにおいてお客様と結びついた形で生成、利用又は蓄積されている情報であって、本ポリシーに基づき当社が取得するものを意味するものとします。

本アプリが利用する利用者情報

 
本アプリが利用する利用者情報は、下記の3つです。
  • アプリの広告表示のためにお客様の情報の一部を送信する可能性があります。
  • アプリではアクセス解析ツールを用いてアプリの利用状況を収集しております。
  • 問い合わせの際に利用者情報の一部を送信します。
  1. アプリの広告表示本アプリは広告表示のためにお客様の情報の一部を送信する可能性があります。広告表示は、下記2社のサービスを利用しており、本アプリは2社に利用者情報の提供を行います。それぞれのサービスが利用している利用者情報と目的については各社のサービスのプライバシーポリシーをご確認ください。

  2.アプリのアクセス解析
  本アプリではアクセス解析ツールを用いてアプリの利用状況を収集しております。

  アクセス解析Google Analyticsを利用しております。

  本アプリは画面遷移を行った際に、画面IDと利用者情報をGoogle Analytics

  に送付します。

  1. 問い合わせ
    本アプリでは問い合わせの際に利用者情報の一部を送信します。
    問い合わせはメールで行い、メール本文に下記情報が埋め込まれます。また、メールで送信されるため、メールアドレスも送信されます。
    • 名前、メールアドレス
    • 端末名、OSバージョン、その他端末情報(画面サイズ、ピクセル密度、利用可能ヒープメモリ量)
    • アドオン購入状況

利用目的

利用者情報はそれぞれ下記目的に利用されます。

  • 三者の広告の配信・表示のため
  • 当社のサービスに関連して、個人を識別できない形式に加工した統計データを作成するため
  • 本アプリに関するご案内、お問い合せ等への対応のため

【Unity】AndroidとiOSで処理を分ける方法

すぐ見れるようにメモ

公式 docs.unity3d.com

private void Start()
    {
#if UNITY_ANDROID //アンドロイドだったら処理

        //Androidの処理を書く

#endif //アンドロイドの処理範囲終わり


#if UNITY_IOS //iOSだったら処理

        //iOSの処理を書く

#endif //iOSの処理範囲終わり
    }

#if UNITY_IOS
の代わりに #if UNITY_IPHONEでもできるが非推奨なので使用しない!!




おまけ #elseを使ってそれ以外の動作を指定することも可能

#if UNITY_ANDROID
   //Androidの処理
#else
   //Android以外の処理
#endif




<追記>

Application.platformを使っても判別できます。(変数一覧)
こちらは、読めれば良いでしょう。

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
 {
    void Start ()
   {
        if (Application.platform == RuntimePlatform.Android)
        {
            //Androidの場合の処理
        }  
        else if (Application.platform == RuntimePlatform.IPhonePlayer) 
        {
            //iOSの場合の処理  (iPadで動作するかは未確認)
        } 
        else
        { 
            //その他の端末での処理
        }
    }
}

【Unity】これでラムダ式への耐性アップ!ラムダ式の記述方法まとめ

はい!今回は勉強した過程を書いていきます!
ラムダ式の存在は知っていましたが、読み方がなにもわからない"まる"です。

サンプルコードが読めないと処理が把握できないので、
重い腰を上げて勉強することにしました。
STEPを踏んで勉強の過程を残していきます。

ラムダ式とは

ざっくりいうと"要点だけ書いた関数の書き方"と理解しています。

ラムダ式書き方

まずusing Systemを追加する。

using System;

・引数無し 戻り値無しの関数の場合

Action型の変数に関数を入れてその変数に括弧()をつけて実行する。

Action aaa  = () => { 実行したい処理 }; 
aaa();


・引数有り 戻り値無しの関数の場合

Action型の変数に関数を入れてその変数に括弧()をつけて実行する。
引数の型はActionの直後に<>で記述する。

Action<引数の型> aaa  = (引数の型 引数の変数) => { 実行したい処理}; 
aaa(引数);


・引数無し 戻り値有りの関数の場合

Func型の変数に関数を入れてその変数に括弧()をつけて実行する。
Funcの直後に<>をつけてその中に戻り値の型を記述する。

Func<戻り値の型> aaa  = () => { return○○ }; 
Debug.Log(aaa());//戻り値をもっているので好きな変数に入れたりする


・引数有り 戻り値有りの関数の場合

Func型の変数に関数を入れてその変数に括弧()をつけて実行する。
Funcの直後に<>をつけてその中に引数の型、戻り値の型の順で記述する。

Func<引数の型,戻り値の型> aaa  = (引数の型 引数の変数) => 
{
 実行したい処理
 return○○ 
}; 
Debug.Log(aaa(引数の値));//戻り値をもっているので好きな変数に入れたりする

注)
引数が複数の場合、戻り値の型の記入は最後に記述する。
<第一引数の型,第二引数の型,・・・・・・,戻り値の型>

(ラムダ式を使ううえで、先にデリゲートの考え方を覚えた方がいいようです。)

ポイント

戻り値が無い場合はAction
戻り値が有る場合はFunc
を使うことだけ覚えておく。

サンプルコード

サンプル1 引数無し 戻り値無し 関数

・ 通常の関数の書き方

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

public class Ramudatest : MonoBehaviour
{    
    void Start()
    {
        aaa();
    }

    private void aaa()
    {
        Debug.Log("通常 引数無し 戻り値無し 関数");
    }      
}


ラムダ式での書き方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//ラムダ式を使用する場合 追加

public class Ramudatest : MonoBehaviour
{    
    void Start()
    {
        Action aaa = () =>{Debug.Log("ラムダ式 引数無し 戻り値無し 関数");};
        aaa();        
    }
}

サンプル2 引数有り 戻り値無し 関数

・通常の関数の書き方

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

public class Ramudatest : MonoBehaviour
{
    void Start()
    {       
        Test1(5);
    }

    private void Test1(int number)
    {
        Debug.Log(number*2);
    }
}


ラムダ式での書き方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//ラムダ式を使用する場合 追加

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Action<int> aaa = (int number) => { Debug.Log(number*2);};
        aaa(5);
    }
}

サンプル3 引数無し 戻り値有り 関数

・通常の関数の書き方

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

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Debug.Log(Test1());
    }

    private int Test1()
    {
        return 1;
    }
}


ラムダ式での書き方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//ラムダ式を使用する場合 追加

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Func<int> aaa = () => { return 1; };
        
        Debug.Log(aaa());//返り値確認
    }
}

サンプル4 引数有り 戻り値有り 関数

・通常の関数の書き方

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

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Debug.Log(Test1(6));
    }

    private int Test1(int number)
    {
        number = number * 3;
        return number;
    }
}

ラムダ式での書き方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//ラムダ式を使用する場合 追加

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Func<int, int> aaa = (int number) =>
        {
            number = number * 3;
            return number;
        };

        Debug.Log(aaa(6));//戻り値をもっているので好きな変数に入れたりする
    }
}

省略した書き方

次の条件の時に一部を省略して書くことができます。
・引数が1つの場合()と型を省略できる。
・メソッド部分が1行の場合{}を省略できる。

実際にこちらのコードを省略してみます。

Action<int> aaa = (int number) => { Debug.Log(number * 2);};


・引数が1つの場合()と型を省略できる

Action<int> aaa=number=> { Debug.Log(number * 2);};


・メソッド部分が1行の場合{}を省略できる。

Action<int> aaa=number=>Debug.Log(number * 2);



また、引数が複数の場合、型のみ省略することができます。
・引数2つの基本コード

Action<int,float> aaa = (int number,float kazu) => { Debug.Log(number*kazu*2);};

・型のみ省略

Action<int, float> aaa = (number,kazu) => { Debug.Log(number * kazu * 2);};


・さらに、メソッド部分が1行なので{}を省略。

Action<int, float> aaa = (number,kazu) =>Debug.Log(number * kazu * 2);

おわりに

戻り値が無い場合はAction
戻り値が有る場合はFunc
を使うことだけ覚えておく。

有効な使い方はまだ見えていませんが、
ある程度ラムダ式のコードに心の耐性がついた気がします!
実際コードを読む場面では、省略されて書かれていることがほとんどなので、
省略のところは要チェックですね。

参考

squmarigames.com

【Unity】InputFieldのテキストをスクリプトから変更する 

問題点

InputFieldのテキスト(ユーザーの入力が反映されるテキスト)
が普通にText型を参照しただけでは変更できなかったのでメモ

インンプットフィールド

解決策

InputField型の変数を使う

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//追加

public class TextChangeTest : MonoBehaviour
{
    //InputField型の変数を宣言 対象のInputFieldのオブジェクトをアタッチする
    [SerializeField] private InputField TestInputField;
   
    void Start()
    {
        //インプットフィールドのテキスト変更
        TestInputField.text = "インプットフィールドのテキスト変更";
    }

}

【Unity】ボタン 「通常、ハイライト時、押し込み時、選択時、無効時」の各状態色をスクリプトから動的変更する方法

ボタン状態による色変更をするスクリプトのメモ

半年前に参考にした元サイトが見つかりませんでした。すいません。

ボタンの色は、
”ボタンコンポーネント”の中の”ColorBlock”の中の”変数”を変更することで色変更できます。

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


 ///【機能】 ボタン状態による色変更
 ///【第一引数】色を変更したいボタン
 ///【第二引数】変更したい色(new Color32(byte a,byte b,byte c,byte d)) 
 ///【第三引数】色を変更したい状態(0:normalColor 1:highlightedColor 2:pressedColor 3:selectedColor 4:disabledColor)
    private void ButtonStateColorChange(Button button, Color32 color, int changeState)
    {
        ColorBlock colorblock = button.colors;
        switch (changeState)
        {
            case 0://normalColor
                colorblock.normalColor = color;
                break;
            case 1://highlightedColor
                colorblock.highlightedColor = color;
                break;
            case 2://pressedColor
                colorblock.pressedColor = color;
                break;
            case 3://selectedColor
                colorblock.selectedColor = color;
                break;
            case 4://disabledColor
                colorblock.disabledColor = color;
                break;
        }
        button.colors = colorblock;
    }



    //例-----------------------------------------------------

    [SerializeField] private Button stage_button;//ボタンコンポーネントの変数を宣言 変更したいボタンをアタッチ
    private Color32 button_color;//Color32型の変数を宣言


    private void Start()
    {
        //色設定
        button_color = new Color32(10, 40, 255, 255);

        //設定した色をstage_buttonを押した時の色へ設定
        ButtonStateColorChange(stage_button, button_color, 3);
    }

Unity本を出版しました!

突然ですが、Unity本を出版しました!
こちらを読むことで、スクリプトの基礎固めができます!
現在、kindle unlimitedで読み放題設定中です。今のうちにどうぞ!


もっと早く教えてほしかった!Unity C#入門

【Unity】配列の中の配列 Listでジャグ配列を使う際の初期化の方法

Listを二重に使った際のメモ

初期化はこちら

//配列[1]の中の配列を初期化
Test_List[1] = new List<int>();


テストで作ったスクリプト

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


public class TestScript : MonoBehaviour
{
    public List<List<int>> Test_List = new List<List<int>>()//リストの宣言
    {
      // Listの中にListを追加して初期化
      new List<int>(),//[0]の中の配列
      new List<int>(),//[1]の中の配列
      new List<int>(),//[2]の中の配列
    };


    void Start()
    {    
        Debug.Log("配列[0]の中の配列[0~2]に5,6,7をいれる");
        for (int i = 0; i < 3; i++)
        {
            Test_List[0].Add(i+5);
            Debug.Log(Test_List[0][i]);
        }

        Debug.Log("配列[1]の中の配列[0~5]に8,9,10,11,12,13をいれる");
        for (int n = 0; n < 6; n++)
        {
            Test_List[1].Add(n+8);
            Debug.Log(Test_List[1][n]);
        }

        Debug.Log("配列[2]の中の配列[0~8]に10,11,12,13,14,15,16,17,18をいれる");
        for (int p = 0; p < 9; p++)
        {
            Test_List[2].Add(p+10);
            Debug.Log(Test_List[2][p]);
        }

        Debug.Log("配列[0]の中の配列[1]は" + Test_List[0][1]);
        Debug.Log("配列[1]の中の配列[1]は" + Test_List[1][1]);
        Debug.Log("配列[2]の中の配列[1]は" + Test_List[2][1]);

        //配列[1]の中の配列を初期化
        Debug.Log("配列[1]の中の配列を初期化");
        Test_List[1] = new List<int>();

        //配列0の中の配列の中を全部見る
        Debug.Log("配列[0]の中身");
        for (int i1 = 0; i1 < Test_List[0].Count; i1++)
        {
            Debug.Log(Test_List[0][i1]);
        }

        Debug.Log("配列[1]の中身");
        for (int n1 = 0; n1 < Test_List[1].Count; n1++)
        {
            Debug.Log(Test_List[1][n1]);
        }

        Debug.Log("配列[2]の中身");
        for (int p1 = 0; p1 < Test_List[2].Count; p1++)
        {
            Debug.Log(Test_List[2][p1]);
        }
    }
 }

参考

ict119.com

smdn.jp