のにっき

【Unity】GamePackageRegistrybyGoogleがImport出来ないときの対処法

Google Play In-app Reviewを実装しようとしたときにうまく動かなかったので対処法を記事にします。
※環境が同じ人は試してみてください

環境

・Unity:2020.3.17f1
・GooglePlayPlugins:v1.5.0

問題

ScopedRegistryにGoogleのRegistryを登録する工程でつまずく
※以下、作業工程と現象
PackageManagerに以下のRegistryを登録

Name : Game Package Registry by Google
URL: https://unityregistry-pa.googleapis.com
Scope : com.google

登録後、再起動しても何をしても
PackageManagerにGoogle LLCが表示されない
※Unityの過去バージョン(2019.4.26)だと表示されるので手順に問題はなさそう

対応

以下リンクで必要なパッケージがDLできるので、直接DLしてImportした
github.com
色んな項目に応じてUnityPackageが置かれてあるので
必要なものをDLしてください。

以上、PackageManagerを使わずにライブラリの追加を行う方法でした。

【Unity】ボタン表示切り替え用拡張スクリプト

Unityでボタンを実装する時、表示切り替えの実装が面倒くさくなったので
汎用処理をまとめたスクリプトを作成しました。

ソース

ボタンのinteractableの切り替えを監視して、
画像、文字の表示を切り替える拡張機能になります。
github.com

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class ButtonInteractiveDisp : MonoBehaviour
{
    //Button内オブジェクト
    [SerializeField] protected Button btnSet = null;
    [SerializeField] Image imgSet = null;
    [SerializeField] TextMeshProUGUI txtSet = null;
    //定数:ボタン背景画像 ※画像はInspectorで設定
    [SerializeField] Sprite sprBackOn = default;
    [SerializeField] Sprite sprBackOff = default;
    //定数:ボタンテキスト色
    Color clrTextOn = new Color32(0, 0, 0, 255);
    Color clrTextOff = new Color32(255, 255, 255, 255);

    /// <summary>
    /// オブジェクト内のButtonコンポーネントを検索して設定
    /// </summary>
    protected void FindTransform() => btnSet = btnSet == null ? GetComponent<Button>() : btnSet;
    /// <summary>
    /// ResetイベントはInspectorの設定からも発行できる
    /// </summary>
    private void Reset()
    {
        FindTransform();
        InitDisp();
    }
    /// <summary>
    /// 起動時に表示の初期化とイベント設定を行う
    /// </summary>
    void Start()
    {
        InitDisp();
        //ボタンのinteractableプロパティの切り替わりイベント設定
        btnSet.ObserveEveryValueChanged(btn => btn.interactable)
        .Subscribe(isOn =>
        {
            UpdateDisp(isOn);
        })
        .AddTo(this);
    }
    /// <summary>
    /// ボタン表示初期化処理
    /// </summary>
    private void InitDisp()
    {
        //Buttonコンポーネント取得済み判定
        if (btnSet == null) { return; }
        //ボタン内にImage,Textがあればコンポーネント取得
        imgSet = (Image)btnSet.targetGraphic;
        txtSet = GetComponentInChildren<TextMeshProUGUI>();
        //ボタンの各状態での色をすべて白に設定する
        Color defColor = new Color32(255, 255, 255, 255);
        ColorBlock cb = btnSet.colors;
        cb.selectedColor = defColor;
        cb.highlightedColor = defColor;
        cb.disabledColor = defColor;
        cb.selectedColor = defColor;
        cb.pressedColor = defColor;
        btnSet.colors = cb;
        //現在のinteractableに合わせて表示設定
        UpdateDisp(btnSet.interactable);
    }
    /// <summary>
    /// ボタン表示更新
    /// </summary>
    /// <param name="isOn">interactable設定</param>
    private void UpdateDisp(bool isOn)
    {
        Sprite sprBack;
        Color clrText;
        string textValue = "";
        //背景内容取得
        if (isOn)
        {
            sprBack = sprBackOn;
            clrText=clrTextOn;
            textValue = "ボタン:有効";
        }
        else
        {
            sprBack = sprBackOff;
            clrText = clrTextOff;
            textValue = "ボタン:無効";
        }
        //背景変更
        if (imgSet != null)
        {
            imgSet.sprite = sprBack;
        }
        //文字変更
        if (txtSet != null)
        {
            txtSet.color = clrText;
            txtSet.text = textValue;
        }
    }
}

使い方

スクリプトをボタンに設定する前に、Inspectorに画像を設定しておきます。
ここで設定しておくと、ボタンに設定したときに自動的に画像が設定されるので楽です。

f:id:apuridasuo:20210904214658j:plain
Inspector設定

次に、このソースをButtonオブジェクトに設定します。
この時、自動的にButton,Image,Textのコンポーテントを取得します。
後は、ボタンのinteractableが切り替わるたびに
ソースに記述された表示に自動的に切り替わるようになります。

f:id:apuridasuo:20210904215108g:plain
ボタンの挙動

表示はソースの内容から自由に変更できます。
Startイベントの中身を変更することで拡張機能を増やすことも可能です。

プライバシーポリシー シンプルGPS記録2021

プライバシーポリシー 2021/08/27

本アプリ「シンプルGPS記録2021」は、個人情報保護の重要性を認識し、以下の方針に則り適切な個人情報の保護に努めます。

(定義)

このプライバシーポリシー(以下、本プライバシーポリシーといいます)は、私が提供する位置記録アプリ「シンプルGPS記録2021」(以下、本アプリケーションといいます)における利用者情報の取り扱いを定めたものです。

(取得される情報の項目、取得方法、利用目的)

私は、本アプリケーションのご利用に際して、次の利用目的の達成に必要な範囲で下記に記載する利用者情報をアプリケーション経由で自動的に取得し、取り扱います。

ご利用端末のGPS機能及びその他の位置情報測位機能を利用した位置情報及びその取得時刻、その状態

取得方法:アプリケーションによる自動取得
利用目的:本アプリケーション内で地図上に表示する為。 ご利用者様が識別されない形式での位置情報統計データ活用の為

(情報収集モジュール)

当社で配信するアプリでは、広告配信を目的として以下の広告配信事業者がご利用者の情報を自動取得する場合がございます。この情報から個人が特定されることはありません。取得する情報、利用目的、第三者への提供等につきましては、以下の広告配信事業者のアプリケーション・プライバシーポリシーのリンクよりご確認ください。
AdMob(Google Inc.)
https://policies.google.com/technologies/ads

(同意)

本アプリケーションは、本プライバシーポリシーをご確認頂き、内容を理解した上でご利用ください。ご利用者様は、本アプリケーションをインストールする際に、本プライバシーポリシーをご確認ください。

(利用の終了)

本アプリケーションの利用を終了し、利用者情報の送信を停止したい場合には、本アプリケーションをアンインストールしてください。

(本プライバシーポリシーの変更)

私は、法令の変更等に伴い、本プライバシーポリシーを変更することがあります。
私は、本アプリ-ケーションのバージョンアップに伴って、利用者情報の取得項目の変更や追加、利用目的の変更、第三者提供等について変更がある場合には、ダウンロード前に通知し、重要なものについては、インストール前もしくはインストール時にあらためて同意を取得させて頂きます。

(利用者情報の取り扱いに関する問い合わせ窓口)

本サービス及び本アプリケーションにおける私が取得する情報の取り扱いに関して、ご意見・ご要望がございましたら、下記までご連絡くださいますようお願いします。
Mail:apuridasuo1192@gmail.com 

【Unity】IOS14.6からmailtoで改行コードが使えなくなった対策

Unityでメーラー機能を実装するとき、mailtoを使っていた人に悲報です。
IOS14.6以降、mailtoで改行コードが認識されない仕様になりました。
改行コード'%0D%0A'を使用すると、改行されない上に<BR>が表示されてしまいます。
developer.apple.com
詳細は上記サイトに載っていますが、

iOS 14.6以降のmailtoリンクでは、HTMLなどのリッチコンテンツのサポートが削除されました

とのことです。。。改行すらサポートしないのは致命的すぎませんか?
と思っちゃうのは私がハッカーに悩まされたことがないからでしょうか。。。
ということで今回はmailtoを利用していたメーラー機能に
IOSのみ別のやり方で、改行のサポートを行う実装方法を紹介します。

作成したアセット公開

github.com
アセットの内容は上記URLで公開しています。
ソースファイルと説明を一緒に見ていただけるとわかりやすいと思います。

ソース紹介【IOSプラグイン

mailtoに変わるメーラー機能を利用します。
MessageUIフレームワークMFMailComposeViewControllerを利用することで、
アプリケーション内でメールの作成や送信ができます。
IOS専用のプラグインになるのでObject-C形式で呼び出します。
▼MailerPlugin.mm

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

@interface SocialWorker : NSObject<UIDocumentInteractionControllerDelegate, MFMailComposeViewControllerDelegate>
@property(nonatomic, retain) UIDocumentInteractionController *_dic;
@end

@implementation SocialWorker
/**
 * メール投稿
 * @param to 宛先
 * @param subject タイトル
 * @param message メッセージ
 */
- (void)postMail:(NSString *)to subject:(NSString *)subject message:(NSString *)message {
    if([MFMailComposeViewController canSendMail]) {
        MFMailComposeViewController *vc = [[MFMailComposeViewController alloc] init];
        vc.mailComposeDelegate = self;
        [vc setToRecipients:[to componentsSeparatedByString:@","]];
        [vc setSubject:subject];
        [vc setMessageBody:message isHTML:NO];
        [UnityGetGLViewController() presentViewController:vc animated:YES completion:nil];
    } else {
    }
}

/** 
 * メール結果
 */
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [UnityGetGLViewController() dismissViewControllerAnimated:YES completion:nil];
}

@end

/**
 * Unityから呼び出されるネイティブコード
 */
extern "C" {
    static SocialWorker *worker =[[SocialWorker alloc] init];
    UIViewController *UnityGetGLViewController();
    void UnitySendMessage(const char *, const char *, const char *);
    static NSString *getStr(char *str){
        if (str) {
            return [NSString stringWithCString: str encoding:NSUTF8StringEncoding];
        } else {
            return [NSString stringWithUTF8String: ""];
        }
    }
    void postMail(char *to, char *subject, char *message){
        [worker postMail:getStr(to) subject:getStr(subject) message:getStr(message)];
    }
}
プラグイン設定

.mmファイルはプロジェクトのAssets直下のPlugins/iOSフォルダに配置します。
ファイル作成後、Inspectorで以下の画像の設定を行います。

f:id:apuridasuo:20210628010705p:plain
メーラープラグイン設定

ソース紹介【Unity呼び出し】

上記で作成したプラグインC#で呼び出します。
▼OpenMailer.cs

public class OpenMailer 
{
    /// <summary>
    /// ネイティブプラグイン定義
    /// </summary>
#if UNITY_IPHONE
        [DllImport("__Internal")]
        private static extern void postMail(string to, string subject, string message);
#endif

    public void OpenMailerBase(string Address,string Kenmei, string Message)
    {
#if UNITY_IOS
            postMail(Address, Kenmei, Message);
#else
        string kenmeiOff = System.Uri.EscapeDataString(Kenmei);
        string messageOff = System.Uri.EscapeDataString(Message);
        string Url = $"mailto:{Address}?subject={kenmeiOff}&body={messageOff}";
        Application.OpenURL(Url);
#endif
    }
}

IOSのみ、プラグインを呼び出します。
他のプラットフォームはmailto機能できちんと改行されますので大丈夫です。
あとは宛先等の情報を引数にOpenMailerBaseを呼び出せばOKです。
※以下、呼び出す関数のサンプルコード

    void MakeMailer()
    {
        string to = "testAddressTo@gmail.com";
        string kenmei = "件名:テスト";
        string message = "▼本文\r\n" +
        "----------------------------\r\n" +
        "\r\n\r\n" +
        "----------------------------";
        OpenMailer mailCls = new OpenMailer();
        mailCls.OpenMailerBase(to, kenmei, message);
    }

参考サイト

SocialWorkerのプラグインはメール機能だけでなく、
TwitterやFaseBook連携も行っているようですので多機能でおすすめです!
github.com

【Unity】PyasicMaterial使用時、オブジェクトが跳ね返らないときの対処法

UnityでPyasicMaterialを使用してオブジェクトに跳ね返りの設定を行ったとき、
思ったように跳ね返らなかった場合の対処法をまとめます。
※弱い力で衝突した時に跳ね返らなくて悩んでる人は対策③必見!

対策①:PyasicMaterial(2D)の設定を確認

そもそも跳ねない。跳ね方がおかしい時に確認
・Bounciness
0だと跳ねない。1だと力が減らずに跳ねる。無限に跳ねさせるなら1に設定する
Bounce Combine: ※3Dのみ
Maximumに設定すると力が減らずに跳ねる。

対策②:Rigidbody(2D)の設定を確認

オブジェクトが壁をすり抜けるときに確認
・Collision Detection
デフォルトは「Discrete」。壁をすり抜けるバグが発生してなかったらこのままでOK!
壁抜けが発生している場合は「Continuous」を設定する

対策③:Project Settings → Physics(2D)の設定を確認

オブジェクトが壁に埋まる。うまく跳ね返らなかったりするときに確認
3DならBounce Threshold、2DならVelocity Threshold
跳ね返りのしきい値
簡単に言うと、設定値より低い力でぶつかったら跳ね返らないようにする。
上手く跳ね返らないときは0を設定する。

【Unity】デバッグ時にWaitForSecondsがうっとうしい時の対処法

Unityでデバッグを行っている時、
様々な場面で組み込んでいるWaitForSecondsの設定
アニメーション等で使用していると思うのですが、
デバッグの時はウェイトをスキップしてすいすいデバッグしたい!
と思う事があったので方法をまとめます。

ソースコード

    /// <summary>
    /// ウェイト付き関数
    /// </summary>
    /// <returns></returns>
    public IEnumerator Set_CzStart()
    {
        Debug.Log("ウェイト前");
        yield return new WaitForSeconds(GetWtTime(10.0f));
        Debug.Log("ウェイト後");
    }

    /// <summary>
    /// タイマー値取得
    /// </summary>
    /// <param name="SetTimer">設定したい秒数</param>
    /// <returns>デバッグ判定後秒数</returns>
    public static float GetWtTime(float SetTimer)
    {
#if Def_WaitDebug
        return 1f;
#else
        return SetTimer;
#endif
    }

この記述方法でウェイト時間をデバッグ時のみ1秒に短縮できるようになります。
WaitForSecondsに秒数を設定する時に関数を挟む感じです。

ウェイト時間の切り替え方法は、

#define Def_WaitDebug

上記のDefine設定をソースファイルの一番上に記入するかどうかで
切り替えることが出来ます。
記入する・・・ウェイト時間=1秒になる
記入しない・・ウェイト時間=設定秒になる

UnityEngineなどのソースは書き換えができなかったので
デバッグ用に新たに関数を作りました。
付け焼刃感が凄いですが、スイスイデバッグの参考にしてみてください。

【VS】KeyDownイベントが発生しない場合の対策

Windowsフォームアプリの設定の話です。
ショートカットキーの機能を組む時に知っておくととても便利です。

本当にイベントが発生していないのか?

KeyDownイベントにブレークを貼って
イベント処理が通っているかどうか確認しましょう。
イベント内の処理のせいで、イベントは正常に発生しているのに
処理が動いていない場合は処理を直せば解決です。

フォームに対してイベントを設定しているか?

KeyDownイベントを設定している対象を確認しましょう。
フォームに対してではなく、
ボタン等のコントロールに対してイベント設定を行っていると
そのコントロールにフォーカスがあっている状態でしかイベントが発生しません。
必ずフォームに対してイベント設定を行いましょう。

KeyPreviewプロパティをTrueにする

フォームのプロパティ内の「KeyPreview」の項目をTrueに変更しましょう。
デフォルト設定ではフォーム以外のコントロールにフォーカスが当たった状態だと
フォームに設定したKey系イベントが発生しないです。
(フォーカスに当たったコントロールのKey系イベントが発生します)
そこで、KeyPreviewをTrueに変更することで、
フォーム内のどこにフォーカスが当たっていても、
フォームのKey系イベントが発生するようになります。
※順番は、
「フォームのKey系イベント」→「フォーカス当たってるコントロールのイベント」
という順番になります

以上です。
KeyPreviewプロパティは知らないと
全部のコントロールにKey系イベントを設定するという
パワープレイに走ってしまうので是非、ご活用ください。