そういうのがいいブログ

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

アプリ開発覚え書き

【Unity】Animator 現在再生中のステート長さを取得する2つの方法

Animatorについてメモ

現在再生中のステート長さ(時間)を取得します。

1つ目 ステートの再生スピードによって取得結果が変わる

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

public class Animetest : MonoBehaviour
{

    [SerializeField] private Animator animator;//Animator型の変数を宣言 Animatorコンポーネントをアタッチしておく
    private AnimatorStateInfo animator_stateinfo1;//AnimatorStateInfo型の変数を宣言
    private float state_time01;//float型の変数を宣言 ステートの時間取得用


    void Start()
    {
        animator_stateinfo1 = animator.GetCurrentAnimatorStateInfo(0);//現在のステートの情報を取得 引数0はレイヤーの番号
       
        state_time01 = animator_stateinfo1.length;//ステート長さを取得
        //ちなみにここで取得した値は再生スピード設定をふまえた時間
        //再生スピードが2倍なら本来の時間より半分になる        


        Debug.Log(state_time01);//コンソールに表示
    }
}

docs.unity3d.com

2つ目 ステートの再生スピードによって取得結果が変わらない

追記:ステート長さというより再生中のアニメーションクリップの長さを取得
   といったほうが良いですね。

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

public class Animetest : MonoBehaviour
{    
    [SerializeField] private Animator animator;//Animator型の変数を宣言 Animatorコンポーネントをアタッチしておく
   
    private AnimatorClipInfo[] animator_clipinfo1;//AnimatorClipInfo型の変数を宣言
    private float state_time01;//float型の変数を宣言 ステートの時間取得用


    void Start()
    {       
        animator_clipinfo1 = animator.GetCurrentAnimatorClipInfo(0);//現在のアニメーションクリップの情報を取得 引数0はレイヤーの番号
        
        state_time01 = animator_clipinfo1[0].clip.length;

        Debug.Log(state_time01);//コンソールに表示
    }
}

docs.unity3d.com

Unity本を出版しました!

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


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

【Unity】シネマシーン アセットストアから削除 それでもインストールする2つの方法 Cinemachine

環境:Unityバージョン 2020.1.1f1

カメラワークに便利そうな"シネマシーン"

使ってみよう思ったら、アセットストアに無い!!!(涙目)

シネマシーン

このことをツイッターでつぶやいたら、

幸運にもインストールする方法を教えていただいたので共有します。

なんて優しい世界...

インストール方法1

1.パッケージマネージャーを開く

ウインドウ→パッケージマネージャー

パッケージマネージャー開く

2.パッケージマネージャー設定

「Packages:In Project」ボタンを押す→「Unity Registry」を選択

unity registry

3.パッケージ一覧から探す

一覧にあるはずです。 シネマシーン探す

インストール方法2

1.パッケージマネージャーを開く

ウインドウ→パッケージマネージャー

パッケージマネージャー開く

2.パッケージマネージャー設定

GitHubのURL指定でPackageを導入できるようにする

パッケージマネージャー→左上の+ボタン→Add package from git URL...

パッケージマネージャー

3.URL入力

Add package from git URL...を選択すると

URLを入力する欄が現れるので

シネマシーン入力

com.unity.cinemachine
と入力→「追加」ボタン

入力後しばらく待つと...

シネマシーンが表示され勝手にPackagesフォルダに入ります!!

シネマシーン出現

勝手に

おわりに

他のパッケージをインストールする時にも使えるので、下記リンクの保存をオススメします。

参考 helpdesk.unity3d.co.jp

【Unity】ログインボーナスを作ってみる ローカル保存

ログインボーナスはサーバーから時間を取得した方が不正を防止できますが、

今回コスト面を考えて、

サーバー無しで不正ログインを検出する完全オレオレログインボーナスを作りました。

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


public class LoginBonus : MonoBehaviour
{
    private enum LOGIN_TYPE
    {
        FIRST_USER_LOGIN, //初回ログイン
        TODAY_LOGIN,      //ログイン
        ALREADY_LOGIN,    //ログイン済
        ERROR_LOGIN       //不正ログイン
    }

    private int todayDate = 0;
    private int lastDate;
    private LOGIN_TYPE judge_type;


     void Start()
    {
        DateTime now = DateTime.Now;//端末の現在時刻の取得        
        todayDate = now.Year * 10000 + now.Month * 100 + now.Day;//日付を数値化 2020年9月1日だと20200901になる

        //前回ログイン時の日付データをロード データがない場合はFIRST_USER_LOGINで0
        lastDate = PlayerPrefs.GetInt("LastGetDate", (int)LOGIN_TYPE.FIRST_USER_LOGIN);


        //前回と今回の日付データ比較
        
        if (lastDate < todayDate)//日付が進んでいる場合
        {
            judge_type = LOGIN_TYPE.TODAY_LOGIN;
        }        
        else if (lastDate == todayDate)//日付が進んでいない場合
        {
            judge_type = LOGIN_TYPE.ALREADY_LOGIN;
        }
        else if (lastDate > todayDate)//日付が逆転している場合
        {
            judge_type = LOGIN_TYPE.ERROR_LOGIN;
        }


        switch (judge_type)
        {
            //ログインボーナス
            case LOGIN_TYPE.TODAY_LOGIN:

                //初ログインボーナス lastDateに0が入っていたら処理実行
                if (lastDate == (int)LOGIN_TYPE.FIRST_USER_LOGIN)
                {
                    //初ログインボーナス処理
                }
                else
                {
                    //普通のログインボーナス処理
                }               

                break;

            //すでにログイン済み
            case LOGIN_TYPE.ALREADY_LOGIN:
                //なにもしない
                break;

            //不正ログイン
            case LOGIN_TYPE.ERROR_LOGIN:
                //不正ログイン時の処理
                break;
        }

        //今回取得した日付をセーブ
        PlayerPrefs.SetInt("LastGetDate", todayDate);
        PlayerPrefs.Save();
    }
}

【Unity】アプリストア掲載上限容量とアプリ容量軽くする施策まとめ

アプリ開発用にメモ

前知識

インストールにWifiが必要な容量

Google Play 100MB以上
App Store 200MB以上

掲載上限サイズ

Google play 100MB
 ただし、拡張ファイルを使用すればプラス4GB増やせる
 拡張ファイルは1アプリにつき2つまで、
 拡張ファイルは1つにつき2GBまで

App Store 4GB
 

削減内容

docs.unity3d.com

テクスチャのマックスサイズを変更

Max Sizeを変更 見栄えが許容できるまで落とす

メッシュ圧縮

メッシュ圧縮
(アニメーションデータのModelにも項目があるが容量は変化しなかった)

f:id:marumaro7:20200819071025p:plain:w200

アニメーション圧縮

最適になっていればOK

f:id:marumaro7:20200819070635p:plain:w200

テクスチャのアトラス化

kan-kikuchi.hatenablog.com

APP Bundleを使う (Google playのみ)

takoyaking.hatenablog.com

Google Playでどうしてもサイズ100MBを超えるときは

拡張ファイルを使う

「アプリケーションバイナリを分割」にチェック
これでも100MBを超える時は最初のシーンを容量の少ないものにする。

f:id:marumaro7:20200820064616p:plain:w300

Unity公式 docs.unity3d.com

公式アップロード方法

support.google.com

注意点

blog.ariari.biz

ついでにパフォーマンス向上

kan-kikuchi.hatenablog.com

【Unity】ユニティチャントゥーンシェーダー UTS2.0メモ

モバイルアプリ開発用に引用メモ

説明書

github.com

シェーダーの分類大枠

UTS2には、大きく分けて2つの系統のシェーダーがあります。

DoubleShadeWithFeather

UTS2の標準シェーダーです。
2つの影色(Double Shade Colors)と、
各々のカラーの境界にぼかし(Feather)を入れることができます。

ShadingGradeMap

高機能版のUTS2シェーダーです。
DoubleShadeWithFeatherの機能に加えて、
ShadingGradeMapという特別なマップを持つことができます。


UnityChanToonShader/Mobileフォルダ内のシェーダー

Mobileフォルダ内には、モバイルやVRコンテンツ向けに、
ほぼルックが替わらない程度に軽量化したシェーダーが入ってます。
モバイル版では、軽量化のために以下の仕様に制限しています。

・リアルタイムディレクショナルライト1灯のみの対応に制限しています
 (複数のライトや、リアルタイムポイントライトには反応しません)。

・ポイントライトへは、
 ベイク済みポイントライト+ライトプローブの組み合わせで対応します。
 その場合、GI_Intensity を適度に調整する必要があります。

通常版Toon_DoubleShadeWithFeathe系、Toon_ShadingGradeMap系各シェーダーとは
プロパティ互換がありますので、上記機能で十分な場合、
通常版と同名のMobile版シェーダーに切り替えるとレンダリングパフォーマンスが向上します。

Mobile/AngelRingフォルダ内には、「天使の輪」機能に対応したモバイル版シェーダーが入っています。 各シェーダーの基本機能は、通常版の同名のものと同じです。



シェーダー名による使い分け

シェーダー名の後ろ側には、Clippingなどの名前ブロックがあります。
これらは以下のような機能があることを示しています。

Clipping

クリッピングマスクを持てるシェーダー。
いわゆる「テクスチャの抜き」(カットアウトやディゾルブ)ができます。

TransClipping

同じくクリッピングマスクを持てますが、
マスクのα透明度(Transparency)を考慮した「テクスチャの抜き」ができます。
より綺麗な抜きができるぶん、負荷はClippingよりも高くなります。

StencilMask

ステンシルバッファによるパーツの透過を指定します。
「眉毛」パーツのアニメ的な表現で、常に「前髪」パーツよりも前面に表示したいような
場合などに使用するシェーダーです。必ずStencilOut系シェーダーと組み合わせて使います。

StencilOut

StencilMask系シェーダーと一緒に使います。
上の例だと、「眉毛」パーツを透過させる側である「前髪」パーツに設定するシェーダーです。

初期設定

File>Build Settings>Player Settings... より

Rendering Path⇒Forward
Color Space⇒Linear
を推奨します。リニアカラーの時、UTS2は最大限の能力を発揮できます。

リニアカラーへの設定変更 f:id:marumaro7:20200817080323p:plain

Rendering Pathはデフォルトでフォワードになっていた f:id:marumaro7:20200817081342p:plain

自分が使いそうな「Basic Shader Settings」メニュー

Culling Mode

ポリゴンのどちら側を描画しないか(カリング)を指定します。
・Culling Off(両面描画)
・ Front Culling(正面カリング)
・ Back Culling(背面カリング)
が選べます。
通常はBackで指定します。

Culling Offはノーマルマップやライティング表示がおかしくなる場合がありますので、
注意してください。

【Unity】Google Play リリース時設定は Android 10(API レベル 29)以上を対象にする必要有り

前回リリース設定時に少し時間とられたのでメモ

問題

グーグルプレイにリリースしようとしたら以下の警告が出て、申請できませんでした。

2020 年 8 月 3 日以降、新規のアプリは Android 10(API レベル 29)以上を
対象にする必要があります。

以下公式から引用

APIレベル29を対象

https://developer.android.com/distribute/play-policies?hl=ja

対策

ProjectSettings>Player>ターゲットAPIレベル>Automatic(highest installed)

Android10.0(API level 29)に変更するだけです。

API設定

Amazonアプリストア 棄却されました エラー内容

棄却

Amazonアプリストア 棄却

初めてAmazonアプリストアへ登録申請しました。

結果、棄却されてしまいました!!

中身を共有します。

marumaro7.hatenablog.com

棄却内容

棄却内容はこちら

Amazonコンテンツポリシーに準拠していないとのことです。

棄却

エラー内容を翻訳してみると

アプリにメタデータ[タイトル、アイコン、説明、スクリーンショット
キーワード]が含まれているため、コンテンツが別のモバイルアプリケーションの
コンテンツに似ているか、別の機能を提案しているため、
顧客を誤解させる可能性があります。

とのことでした。

脱出ゲームなのにRPGと書いているので誤解するでしょうね...

再提出

申請内容の中でRPGの脱出ゲームに関係ないような単顎は消して再申請しました!

結果

無事リリースすることができましたー。


Amazonさんから完了メールがきませんでした。(私だけ????)

1日経って「脱出 魔法勇者」で検索するとでてきました!!!

なんか嬉しい!!

魔法勇者

おわりに

Androidと同じノリで提出してしまいました。 Amazonさんちゃんとしてる(感心)