そういうのがいいブログ

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

アプリ開発覚え書き

国名別でiOSアプリページのアドレスを設定する

iOSのアプリページを国別でみたいときのメモ

方法

iOSアプリページアドレスの下記の部分を国別のコードに設定することで
各国のページをみることができます。

私のアプリ ダンスドリーム MVのアドレス
https ://apps.apple.com/ここに国別コード/app/dancedreammv-mmd-livesimulator/id1545151149

<参考> memorva.jp

国別コード
アメリカ:us 
https://apps.apple.com/us/app/dancedreammv-mmd-livesimulator/id1545151149

日本:jp
https://apps.apple.com/jp/app/dancedreammv-mmd-livesimulator/id1545151149

イギリス:gb
https://apps.apple.com/gb/app/dancedreammv-mmd-livesimulator/id1545151149

おわりに

アプリ内でのレビュー依頼の言語別アドレスとしても活用できそうです。

役に立てたらどうか星5のご慈悲を。

ダンスドリームMV MMD VRoidライブシミュレーター

ダンスドリームMV MMD VRoidライブシミュレーター

  • Yuji Onishi
  • エンターテインメント
  • 無料
apps.apple.com

play.google.com

Please fill in the improvement points of the Dance Dream MV app. ダンスドリーム MV アプリ改善点の記入お願いします。

Thank you for always playing Dance Dream MV.
We are updating every day to make it the best dance app in the world.
Please write down what you noticed in the comment section!

Press the comment button here at the bottom of the page (this is an image)
f:id:marumaro7:20210208092304p:plain
We look forward to your continued support of Dance Dream MV.

いつもダンスドリーム MVをプレイいただき誠にありがとうございます。
世界最高のダンスアプリにするべく毎日アップデート作業中です。
ユーザーの皆様のお気づきの点をページ下部のコメント欄に記入お願い致します!

これからもダンスドリーム MVをよろしくお願い致します。

【Unity】DOTweenまとめ

いつも忘れるのでDOTweenの自分用まとめ

DOTweenとは

unity-yuji.xyz
面倒な処理も1行でかける f:id:marumaro7:20210117161717p:plain

DOTweenでできるアニメーションのイメージ

game-ui.net

初期設定

DOTweenの使い方 Tweenアニメーション入門【Unity】|アマガミナブログ

公式ドキュメント

dotween.demigiant.com

DOTweenを使うにはusing設定必須

using DG.Tweening;

1つのアニメーションにオプションをつける

transform.DOLocalMove(new Vector3(10f, 0, 0), 1.0f)//ローカル座標移動 座標,移動にかける時間
           .SetDelay(1f)//SetDelay(待機時間/秒)
           .SetRelative()//SetRelative() 相対的に移動する 例:Tween前の座標が(5, 0, 0)の時に(15, 0, 0)へ動くようになる

           .SetLoops(2, LoopType.Incremental)//SetLoops(ループ回数, LoopType) ループ回数は-1で永久ループ
            //Incremental:前回の位置を基準にしながら差分移動
            //Restart:同じ動きを繰り返す
            //Yoyo:ヨーヨーのように、進んでは戻るを繰り返す

           .SetEase(Ease.OutQuad);//SetEase(Ease or AnimationCurve) アニメーションの進み具合を指定する。
            //DOTweenで用意されているEase型で指定するか、Unity標準のAnimationCurve型を渡します。
           //Ease型なら https://easings.net から選ぶ

順番にアニメーション

Sequence sequence = DOTween.Sequence()//Sequence型の変数 sequenceを宣言
.Append(transform.DOScale(1.1f, 1.0f)                   
.SetEase(Ease.OutQuart)
.SetLoops(4, LoopType.Restart))//オプション付きアニメーション
.Append(transform.DOScale(1.0f, 0.8f))//オプション無しアニメーション
.OnComplete(() => Debug.Log("全部終了"));//完了のコールバック

//Tweenの追加
//Append() 前のTweenが終わってから実行
//Join()   前のTweenと同時に実行
//Prepend()    再生済のものを除いて、先頭に追加


 //注意!オプションはAppend()などのカッコの中に書かないとsequence全体に適用されてしまう

//オプションおさらい
  //SetDelay(待機時間/秒)
  //SetRelative() 相対的に移動する 例:Tween前の座標が(5, 0, 0)の時に(15, 0, 0)へ動くようになる
   //SetLoops(ループ回数, LoopType) ループ回数は-1で永久ループ
   //Incremental:前回の位置を基準にしながら差分移動
   //Restart:同じ動きを繰り返す
   //Yoyo:ヨーヨーのように、進んでは戻るを繰り返す
   //SetEase(Ease or AnimationCurve) アニメーションの進み具合を指定する。
   //DOTweenで用意されているEase型で指定するか、Unity標準のAnimationCurve型を渡します。
   //Ease型なら https://easings.net から選ぶ
 //等速ならEase.Linear       

任意のタイミングでアニメーション

using UnityEngine;
using DG.Tweening;

public class ButtonAnime : MonoBehaviour
{
    private Tween t;
   
    void Start()
    {
        t = transform.DOScale(1.1f, 0.8f)
          .SetEase(Ease.OutQuart)//オプション
          .SetLoops(-1, LoopType.Restart);//-1で無限ループ

        t.Play();//再生
    }
    
 //ボタンにこの関数を割り当て
    public void AnimeStop()
    {        
        t.Kill();//アニメの破棄 無限ループはKillで破棄する
        transform.DOScale(1.0f, 0);//元のスケールに戻す
    }
}
//一時停止
t.Pause();

// 最初から再生
t.Restart();

//終了(無限ループの終了には使えない)
t.Complete();

魅力的なUIノウハウ

unity-yuji.xyz

おわりに

ゆーじさん天才

【Unity】AdMobのUnityAdsメディエーションでiOSリリース直後から広告を表示する 

前提

AdMobの広告を実装できている方向け
GoogleMobileAds-v5.4.0
GoogleMobileAdsUnityAdsMediation-2.5.1

はじめに

AdMobの広告を使用する上で、
iOS版は2020年11月頃からアプリリンクしないと広告が表示されなくなりました。
この影響でAppleの審査が落ちるという事態も発生しているようです。

このAppleの審査を通す対策として、2つの方法があります。

①「広告無しで審査を通す→AdMob上でアプリリンクする→広告実装する」
 メリット
  簡単
 デメリット
 ・再審査が面倒
 ・広告前提の構成の場合、審査のためにアプリの構成を調整する必要がある
 ・アプリリンク5日以上かかるため、もやもやする


AdMobメディエーションを使用しAdMob以外の広告ソースから広告を表示する
 メリット
 ・メディエーションを使用することで、単価が高い広告が表示されるようになる。
 ・リリース直後からiOS版でも広告表示が可能になる。
 デメリット
  ①の方法より手間がかかる

今回はタイトルにもあるように
②の方法(広告ソースはUnityAdsを使用)で
iOSリリース直後から広告を表示できるようにします。
この記事では、私がメディエーション設定を実装した際の
"つまづいたこと"を中心に書いていきます!

<追記>
Unityのダッシュボードの構成が変わっていたので、
つまづいたところを中心に書きました。
marumaro7.hatenablog.com

前準備

メディエーション設定をするうえで、8割は公式の説明書を順に追っていくだけでいけました。

説明書
Unity広告とメディエーションの統合  |  Google Developers

ただ、英語で書いてあるので英語ができない私には非常に読みにくかったです。
そこで、Chromeのページ全体を翻訳機能を使って読み進めました。

Chrome拡張機能実装手順
ChromeでGoogle翻訳の拡張機能を使おう。英語サイトも怖くないぞ!

つまづいたポイント

1.eCPMいくらでいれたらいいかわからない問題

説明書の項目<UnityAdsを広告ソースとして追加する>のところで

eCPMを自動で調整する設定にしていても、最初は入力する必要があります。
youtubeで調べたら2ドルで入れていたので、真似して2ドルで設定しました。
(よくわかってない)
f:id:marumaro7:20210116162312p:plain:w300

2.xmlファイル編集方法わからない問題

説明書のこちらの内容は次の方法で設定します。 f:id:marumaro7:20210116163817p:plain

説明書に書いてある通り、こちらのファイルを開きます。
Assets/GoogleMobileAds/Editor/UnityMediationDependencies.xml f:id:marumaro7:20210116164230p:plain:w400

開くとこちらのようになっていると思います。

<dependencies>
  <androidPackages>

   <androidPackage spec="com.google.ads.mediation:unity:3.5.1.1">
      <repositories>
        <repository>https://jcenter.bintray.com/</repository>
      </repositories>
    </androidPackage>

    <!-- If using the Unity Ads Service from Unity3D, use this dependency instead to exclude the
    Unity Ads SDK and avoid conflicting dependency issues. -->
    <!--
   <androidPackage spec="com.google.ads.mediation:unity-adapter-only:3.5.1.1">
      <repositories>
        <repository>https://jcenter.bintray.com/</repository>
        <repository>https://google.bintray.com/mobile-ads-adapters-android</repository>
      </repositories>
      </androidPackage>
    -->

  </androidPackages>

  <iosPods>
    <iosPod name="GoogleMobileAdsMediationUnity" version="3.5.1.1">
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
  </iosPods>
</dependencies>

次のように変更します。

<dependencies>
  <androidPackages>
  
        <!--ここから
    <androidPackage spec="com.google.ads.mediation:unity:3.5.1.1">
      <repositories>
        <repository>https://jcenter.bintray.com/</repository>
      </repositories>
    </androidPackage>
        ここまで無効-->
        
        
    <!-- If using the Unity Ads Service from Unity3D, use this dependency instead to exclude the
    Unity Ads SDK and avoid conflicting dependency issues. -->
    <!--ここから-->
    <androidPackage spec="com.google.ads.mediation:unity-adapter-only:3.5.1.1">
      <repositories>
        <repository>https://jcenter.bintray.com/</repository>
        <repository>https://google.bintray.com/mobile-ads-adapters-android</repository>
      </repositories>
    </androidPackage>
    <!--ここまで有効-->

  </androidPackages>

  <iosPods>
    <iosPod name="GoogleMobileAdsMediationUnity" version="3.5.1.1">
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
  </iosPods>
</dependencies>

やっていることは
xmlコメントアウトコメントアウトの解除だけです。

 <!--コメントアウトする内容-->

おわりに

xmlの編集方法を調べる良い機会になりました。

最近「ダンスドリームMV」というダンスアプリをリリースしました。
もしこの記事が役に立ったら、このアプリの⭐️5評価お願いします!(懇願)
iOS
http://urx3.nu/QvFa
Android
http://urx3.nu/iRcv

Twitter
twitter.com

【Unity】returnに"?" 条件演算子とは

returnに"?"マークあるんですけど????

ブログを見ていたら

returnに"?"が書いてあって、内容が理解できなかったのでメモ

正体は条件演算子

結論として条件演算子というみたいで、
こちらの情報で解決しました。
"?"と":" のセットで使うみたいですね。

組込み演算子 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C f:id:marumaro7:20201227093504p:plain

具体例

あとから見たときにまたわからなくなりそうなので、 具体例書いておきます。

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

public class Test : MonoBehaviour
{
    private string a;//string型の変数aを宣言
    private bool c;//bool型の変数cを宣言

    private string b;//string型の変数bを宣言

    void Start()
    {
        a = "あ";//変数aに文字列 あ を代入

        b=AAA();//関数AAA()を実行し、その返り値を変数bに代入

        Debug.Log(b);//コンソールに変数bの文字列を表示
    }      


    //返り値の型がstring型の関数AAAを作成
    private string AAA()
    {
        if (a == "あ")
        {
            c = true;//aの文字列が あ だったら変数cをtrueにする
        }
        else
        {
            c = false;//aの文字列が あ ではなかったら変数cをfalseにする
        }

        //cがtrueなら返り値は "変数aには あ が入っています。" になる
        //cがfalseなら返り値は "変数aには あ は入っていません。" になる
        return c ? "変数aには あ が入っています。" : "変数aには あ は入っていません。";
    }    
}



このスクリプトを"空のオブジェクト"にセットして
f:id:marumaro7:20201227094342p:plain:w400



実行すると 関数AAA()の返り値の値は
「"変数aには あ が入っています。"」
が返ってきていることがわかります。
f:id:marumaro7:20201227094445p:plain:w400

おわりに

return A ? B : C
のBとCには"返り値のある関数"を入れることもできるようです。

私が初めてみたのは関数が入っていたので、大混乱でしたー!!

【Unity】iOSアプリ申請 却下理由と対策 メモ

f:id:marumaro7:20201220085819p:plain

iOSのアプリ却下理由と対策をメモとして残していきます。
※まだ対策していない内容も含まれます。

1.Guideline 3.1.1 - Business - Payments - In-App Purchase

f:id:marumaro7:20201220083739p:plain

題名

0.1.9 バイナリでの却下 2020年12月18日 AppReview Guideline 3.1.1 - Business - Payments - In-App Purchase Your app uses intermediary currency to purchase items that function as

訳:AppReview ガイドライン3.1.1-ビジネス-支払い-アプリ内購入アプリは、中間通貨を使用して、次のように機能するアイテムを購入します。

本文

Guideline 3.1.1 - Business - Payments - In-App Purchase

Your app uses intermediary currency to purchase items that function as non-consumable products but does not include a restore mechanism.

Users restore transactions to maintain access to content that they've already purchased.

Next Steps

To resolve this issue, please modify your app to include an optional user-registration feature that allows users to restore their purchases to all of their iOS devices.

We recommend indicating that account registration is necessary to restore previously purchased in-app purchase products and providing a way for users to register later if they wish to access this content in the future.

Please see attached screenshot for details.

訳:ガイドライン3.1.1-ビジネス-支払い-アプリ内購入

アプリは中間通貨を使用して、非消耗品として機能するアイテムを購入しますが、復元メカニズムは含まれていません。

ユーザーはトランザクションを復元して、購入済みのコンテンツへのアクセスを維持します。

次のステップ

この問題を解決するには、アプリを変更して、ユーザーが購入したものをすべてのiOSバイスに復元できるオプションのユーザー登録機能を含めるようにしてください。

以前に購入したアプリ内購入商品を復元するにはアカウント登録が必要であることを示し、ユーザーが将来このコンテンツにアクセスしたい場合に後で登録する方法を提供することをお勧めします。

詳細については、添付のスクリーンショットを参照してください。

添付のスクリーンショット
f:id:marumaro7:20201220084415p:plain

内容解釈

今回のアプリではコイン(無課金で取得可)を使用し、
アプリ内のショップで買い切りのアイテムを販売しています。

この買い切りアイテムの購入データは端末に保存していますが、
それだけではダメで、購入データとユーザーを特定できる仕組みを
用意しないといけないということでしょうか?
ユーザー登録の仕組みって難しくないですか(汗)

とりあえずダメ元で問い合わせ

お世話になります。
審査ありがとうございます。

ご指摘の無課金で購入できる買い切りアイテムについて、

こちらの購入データはアンインストール後、
再インストールしても端末のデータから情報が復元されるのですが、
この設計では問題があるということなのでしょうか?

お忙しいところ恐れ入りますが、ご回答よろしくお願い致します。

Apple返信

Hello,

Thank you for providing this information.

Regarding 3.1.1, we found that your app allows the user to unlock non-consumable items such as characters, using an intermediary currency, but does not include a restore mechanism.

To resolve this issue, please modify your app to include an optional user-registration feature that allows users to restore their purchases to all of their iOS devices.

We look forward to reviewing your resubmitted app.

Best regards,

App Store Review

訳:こんにちは、

この情報を提供していただきありがとうございます。

3.1.1に関しては、アプリでユーザーが中間通貨を使用してキャラクターなどの非消耗品のロックを解除できることがわかりましたが、復元メカニズムは含まれていません。

この問題を解決するには、アプリを変更して、ユーザーが購入したものをすべてのiOSバイスに復元できるオプションのユーザー登録機能を含めるようにしてください。

再送信されたアプリを確認することを楽しみにしています。

宜しくお願いします、

AppStoreレビュー

【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