そういうのがいいブログ

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

アプリ開発覚え書き

【Unity】テキストのコピー機能を実装する方法

モバイル端末でインプットフィールドのテキストを
うまくコピーできなかったのでメモ

実装方法

下記スクリプトの関数をボタンに割り当てる

using UnityEngine;
using UnityEngine.UI;

public class CopyText : MonoBehaviour
{
    [SerializeField] private Text copyTarget_text;//コピーするテキストをアタッチ

 //この関数をボタンに割り当て
    public void CopyTextButton()
    {
        GUIUtility.systemCopyBuffer = copyTarget_text.text;
    }
}

参考

kan-kikuchi.hatenablog.com

【Unity】スクリプトから影を消す

参考記事の影を消す設定
スクリプトから実行するのに時間がかかったのでメモ

参考

tsubakit1.hateblo.jp

スクリプト

using UnityEngine.Rendering;
private SkinnedMeshRenderer skinnedMeshRenderer;
                //SkinnedMeshRendererを取得
                 skinnedMeshRenderer = gameObject.GetComponent<SkinnedMeshRenderer>();                
                skinnedMeshRenderer.shadowCastingMode = ShadowCastingMode.Off;//ライティング>投影>オフに変更 using UnityEngine.Rendering;が必要
                skinnedMeshRenderer.receiveShadows = false;//ライティング>影を受ける>オフ

【Unity】iOS実機確認中のXcode エラー UnityGfxDeviceWorker (32): EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1450 MB, unused=0x0)

エラー内容

開発中のアプリで新機能を実装してiPhone8実機確認中(Xcodeにログが出る状態)にエラー発生
2回同じ内容で試して最初の文字だけ違っているが、たぶん同じ内容
端末は固まったり、落ちる

Xcode上のエラー内容
UnityGfxDeviceWorker (32): EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1450 MB, unused=0x0)

Thread 1: EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1450 MB, unused=0x0)

調査内容

・ネットで調査>メモリが単純に少ないというコメント発見
・モデルを外部から読み込んだ時に発生する
・私が所持しているAndroid端末はメモリ4GBで同じ処理をしても落ちない
・iPhone8のメモリは2GB

原因はおそらくメモリ不足
iPhoneiPadのメモリを調査したところ
最近の端末は3GB以上なので2GB以下は制約をつけてリリースすることにした。

メモリサイズ取得 hiyotama.hatenablog.com

引用元: 【最新版】iPhone/iPadのメモリ(RAM)容量一覧【歴代全機種】 | iPadBoy

f:id:marumaro7:20210322073248p:plain

f:id:marumaro7:20210322073603p:plain

おわりに

3GB、4GB、6GBでどうなるか試したい
どの端末を買うかが悩ましい・・・

【Unity】実機でフレームレートを確認しながら解像度を変更する

参考記事をまとめて実施したかったのでメモ

解像度変更

・ボタンのUI作成
・ボタンにpublic void ChangeRate(int RefreshRate)を割り付け引数設定が必要
・テキストの作成
・このスクリプト public Text fpsText にテキストオブジェクトのアタッチが必要

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

public class RateCheck : MonoBehaviour
{
    //テスト用 解像度変更 RefreshRateは60まで 小5 微15 中30 大60
    //ボタンを作り、ボタンの引数に5、15、30、60を設定した
    //参考 https://kan-kikuchi.hatenablog.com/entry/UnityTips3
    public void ChangeRate(int RefreshRate)
    {
        float screenRate = (float)1024 / Screen.height;
        if (screenRate > 1) screenRate = 1;
        int width = (int)(Screen.width * screenRate);
        int height = (int)(Screen.height * screenRate);
        Screen.SetResolution(width, height, true, RefreshRate);
    }


    //フレームレートチェック
    //参考 https://ekulabo.com/frame-rate-time
    public Text fpsText;// フレームレートを表示するテキストです。   
    private int frameCount;// Update()が呼ばれた回数をカウントします。   
    private float elapsedTime;// 前回フレームレートを表示してからの経過時間です。    

    void Update()
    {
        // 呼ばれた回数を加算します。
        frameCount++;

        // 前のフレームからの経過時間を加算します。
        elapsedTime += Time.deltaTime;

        if (elapsedTime >= 1.0f)
        {
            // 経過時間が1秒を超えていたら、フレームレートを計算します。
            float fps = 1.0f * frameCount / elapsedTime;

            // 計算したフレームレートを画面に表示します。(小数点以下2ケタまで)
            string fpsRate = $"FPS: {fps.ToString("F2")}";
            fpsText.text = fpsRate;

            // フレームのカウントと経過時間を初期化します。
            frameCount = 0;
            elapsedTime = 0f;
        }
    }
}

参考

kan-kikuchi.hatenablog.com

ekulabo.com

Screen-SetResolution - Unity スクリプトリファレンス

【Unity】iOS実機 Profilerを見る手順(Wifi接続)

この記事を参考に実機で確認しようとしたら
Unity 2019.3.15f1では微妙に項目が違っていたの
違う点だけメモ

light11.hatenadiary.com

ビルドセッティングチェック項目

f:id:marumaro7:20210322052111p:plain

iPhone選択画面

f:id:marumaro7:20210322052355p:plain

参考

qiita.com

【忙しい人向け】AdMob税務情報の提出 アプリ開発者要対応!

f:id:marumaro7:20210312004007p:plain

はじめに

詳しいことは他の方にまかせて、誤解を恐れずざっくり書きます。
・米国の法律改正でAdMob(AdSense)の収入から24%の税金が引かれます
・税務情報を申請すれば税金24%は免除
・用意するものはマイナンバー(マイナンバーカードである必要は無し)
・入力自体は10分くらい

対応は自己責任でお願い致します。 詳しく知りたい方は一番下の参考の項目を見てください。

<追記>
再提出することになったので、
一番下の追記部分を確認してから実行ください。

申請方法

1.Google AdSenseのページに遷移

AdSenseのページ>お支払い>設定を管理する f:id:marumaro7:20210311224718p:plain

2.アメリカの税務情報

下の方にある「アメリカの税務情報」をクリック f:id:marumaro7:20210311225718p:plain

3.税務情報の追加

f:id:marumaro7:20210311225935p:plain

4.米国の税務情報

・個人
・いいえ
・W-8BEN(個人用の入力フォーム)
を選択し、「W-8BENフォームの記入を開始する」を押す。 f:id:marumaro7:20210311230544p:plain

5.W-8BEN納税フォーム

5-1.納税者番号

・個人名(英語) (例)Taro Yamada
・国籍>日本
・外国のTIN>マイナンバーを入力(12桁)
f:id:marumaro7:20210311231642p:plain

5-2.住所

英語表記で入力が必要なのでこのサイトを参考に入力しました。
(住所を書く順番は日本語と英語で逆になるのでサイトの使用を推奨です。)
住所を英語表記に簡単変換 - 君に届け!

f:id:marumaro7:20210311233344p:plain

5-3.租税条約

租税条約下で源泉徴収に適用される軽減税率の請求を行っていますか?

・はい
・「米国との租税条約の適用のある国の居住者」にチェック
・国>日本
f:id:marumaro7:20210311233751p:plain

特別な料率や条件

ご自分の使用しているサービスをチェックいれて設定してください。
今後のために全部設定しておけばOKです。
「条項と段落」は選択式になっていますが一つしか選べませんでした。
源泉徴収率は「0%(軽減税率)」を選んでください。

f:id:marumaro7:20210311234048p:plain

5-4.書籍のプレビュー

チャック入れて次へ f:id:marumaro7:20210312001333p:plain

5-5.納税証明

名前(英語) f:id:marumaro7:20210311234927p:plain

5-6.米国内で行っている活動とサービス、および宣誓供述書

米国内で行っている活動とサービス

いいえ f:id:marumaro7:20210311235702p:plain

税務上の地位の変更に関する宣誓供述書

注意)この項目はAdMob(AdSense)の支払いを受け取ったことがあるか無いかで変わります。

・支払いを受け取ったことがない方 f:id:marumaro7:20210312000043p:plain

・支払いを受け取ったことがある方 f:id:marumaro7:20210312000329p:plain

5-7.送信!

送信すると
こんな画面になるので「新しいフォームを送信」 f:id:marumaro7:20210312002000p:plain

「新しいフォームの作成を開始」 f:id:marumaro7:20210312002107p:plain

6.確認

こんなメールが届いたら完了です!
お疲れ様でした!

f:id:marumaro7:20210312002843p:plain

おわりに

ツイッターでYoutuber向けの記事しかみかけなかったので
これからアプリ開発を始める方に伝われば良いなと思い書きました。


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

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

追記<2021年9月9日> 税務情報再提出の連絡

6ヶ月たって再提出のメールが来ました。

税務情報で記入した名前は英語表記でしたが、
支払いプロファイルはがっつり漢字を書いていたのがいけなかったようです。

f:id:marumaro7:20210909234522p:plain:w400

修正1

Adsenseのページの
・「設定を変更する」
・「ユーザー数:1」
のところが漢字で書いていたので、
Taro Yamadaのように名前 名字のローマ字表記で申請した内容に書き換えました。
f:id:marumaro7:20210909235830p:plain:w500

また、メールで指摘されていませんが、住所の方も日本語表記にしていたので
一応申請した内容に直し、メールの手順で再提出しました。

修正2

GooglePlayで課金設定している場合、
お支払いプロファイルを別途設定していると思います。
こちらについても同様に申請内容と同じ英語表記へ直し、再提出しました。

f:id:marumaro7:20210910002747p:plain:w200

参考

www.iscle.com

www.youtube.com

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

はじめに

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

手順概要

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

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

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


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

タイムラインを複数作成

同様にタイムラインを2つ新規作成します。
名前はTimelineTest2とTimelineTest3にしました。

2.Signalを新規作成

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

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

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

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

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

マーカーボタンを押してマーカーウインドウを表示します。

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

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

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

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

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

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

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

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に変えて 先ほど作ったスクリプトを割り当てます。

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

EventManagerの配列にそれぞれのタイムラインを割り当てます。

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

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

5-5.SignalReceiver設定

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

5-6.ボタンの配置

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

5-7.ボタンの設定

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

6.実行確認

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

おわりに

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

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

Unity本を出版しました!

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


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

参考

www.ame-name.com teratail.com