個人アプリ開発で月収5万円目指す

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

アプリ開発覚え書き

【Unity】複数のタイムラインを使い分けて好きなタイミングでスクリプトを実行する

はじめに

タイムライン勉強メモです。
場面によって同じメソッドをタイミングを変えて実行したかったので調査しました。

手順概要

1.タイムライン新規作成
2.Signalを新規作成
3.タイムライン上にSignalを配置
4.実行したい処理を作成
5.タイムラインの呼び出し設定
6.実行確認

1.タイムライン新規作成

プロジェクトウインドウ>+ボタン>タイムライン


タイムラインの名前はTimelineTest1にしました。
タイムライン2

タイムラインを複数作成

同様にタイムラインを2つ新規作成します。
名前はTimelineTest2とTimelineTest3にしました。
f:id:marumaro7:20210302062116p:plain

2.Signalを新規作成

タイムライン上に配置するSignalを新規作成します。
このSignalがタイムラインに配置されたタイミングでメソッドを呼び出します。

プロジェクトウインドウ>+ボタン>Signal
タイムライン3

Signalの名前はSignalTestにしました。

3.タイムライン上にSignalを配置

タイムラインウインドウをTimelineTest1をクリックして開きます。

f:id:marumaro7:20210302063752p:plain

マーカーボタンを押してマーカーウインドウを表示します。 f:id:marumaro7:20210302063941p:plain

先ほど作成したシグナルのSignalTestをドラッグアンドドロップし、
メソッドを呼び出したいタイミングに配置します。 f:id:marumaro7:20210302064118p:plain

タイムライン「TimelineTest2」「TimelineTest3」でも同様にシグナルを設定します。

4.実行したい処理を作成

処理するスクリプト内容を作成します。 今回はSignalScriptという名前でスクリプトを新規作成し、 下記の内容で作成しました。

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

public class SignalScript : MonoBehaviour
{
    public void SignalScriptTest()
    {
        Debug.Log("メソッドを実行しました。");
    }
}

空のゲームオブジェクトを作成し、このスクリプトを割り当てておきます。 f:id:marumaro7:20210302065527p:plain

5.タイムラインの呼び出し設定

5-1.タイムラインを使い分けるスクリプトの作成

EventManagerという名前でスクリプトを作成しました。

タイムラインを再生するPlayableDirectorコンポーネント
指定したタイムラインを再生させる内容になります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

[RequireComponent(typeof(PlayableDirector))]
public class EventManager : MonoBehaviour
{
    // ここにインスペクター上であらかじめ複数のセット
    [SerializeField] private TimelineAsset[] timelines;

    private PlayableDirector director;//PlayableDirector型の変数directorを宣言

    void Start()
    {
        //同じオブジェクトに付いているPlayableDirectorコンポーネントを取得
        director = this.GetComponent<PlayableDirector>();        
    }

    //イベント再生メソッド ボタンに割り当てる
    public void EventPlay(int id)
    {

        //ボタンの引数によってタイムラインを指定して再生
        switch (id)
        {
            case 1:
                // 再生したいタイムラインをPlayableDirectorに再生させる
                director.Play(timelines[0]);                
                break;
            case 2:
                // 再生したいタイムラインをPlayableDirectorに再生させる
                director.Play(timelines[1]);                
                break;
            case 3:
                // 再生したいタイムラインをPlayableDirectorに再生させる
                director.Play(timelines[2]);                
                break;
        }
    }
}
[RequireComponent(typeof(PlayableDirector))]

を付けることで、このスクリプトをゲームオブジェクトに割り当てた際に
必要なPlayableDirectorというコンポーネントを自動的に同じオブジェクトへ追加します。
自分でPlayableDirectorコンポーネントを付けても良いのですが、
付け忘れ防止のため書いています。

5-2.インスペクター設定

空のオブジェクトを作成し、名前をEventManagerに変えて 先ほど作ったスクリプトを割り当てます。

f:id:marumaro7:20210302070341p:plain

5-3.タイムライン割り当て

EventManagerの配列にそれぞれのタイムラインを割り当てます。 f:id:marumaro7:20210302053659p:plain

5-4.SignalReceiverコンポーネント追加

シグナルの信号を受け取るSignalReceiverを追加します。
SignalReceiverはPlayableDirectorで再生されているタイムラインの
シグナルを受け取るものです。

f:id:marumaro7:20210302070859p:plain

5-5.SignalReceiver設定

今回はシグナルが配置されたタイミングで
SignalScriptのSignalScriptTest()メソッドをを実行したいので
このように設定します。 f:id:marumaro7:20210302071146p:plain

5-6.ボタンの配置

ボタンを押した時にタイムラインを切り替えて再生したいので
ボタンを3つ配置します。

f:id:marumaro7:20210302054048p:plain

5-7.ボタンの設定

ボタンにEventManagerオブジェクトのEventManagerスクリプト>EventPlayを割り当てます。 引数はボタンごとに1、2、3を割り当てます。

f:id:marumaro7:20210302071519p:plain

6.実行確認

タイムラインが動いているのを見るには
ゲームビューのボタンを押してから
EventManagerオブジェクトをクリックすると確認できます。
(最初からEventManagerオブジェクトをチェックしていると
一旦他のオブジェクトなどをクリックする必要があります。)

おわりに

Signal Trackというのをタイムラインに配置して実行したかったのですが、
タイムラインを再生してから、タイムラインのSignal TrackにSignalReceiverを
割り当てないと実現できなさそうでした。

実行中に割り当てる方法がわからなかったのでわかる方教えてください。

参考

www.ame-name.com teratail.com

国名別で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リリース直後から広告を表示できるようにします。
この記事では、私がメディエーション設定を実装した際の
"つまづいたこと"を中心に書いていきます!

前準備

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

説明書
Integrating Unity Ads with Mediation  |  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レビュー