そういうのがいいブログ

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

アプリ開発覚え書き

【Unity】スクリプトからボタンを押す方法

アプリ開発備忘録用にメモ

「このボタンの処理をそのままこっちでも起動させたい!」って時に便利です。

コード

using UnityEngine;
using UnityEngine.UI;//追加
 
public class Test : MonoBehaviour 
{
 
    public Button test_button;//ボタン型の変数を宣言 起動したいボタンをアタッチ
 
    void Start()
    {
        test_button.onClick.Invoke();//起動したいボタンが入った変数.onClick.Invoke()
    }
}

Invoke()は遅延処理のイメージがあって引数として
括弧内に何かいれないといけないかなと思いましたが、不要でした。

参考

watablog.tech

【Unity】アニメーションをスクリプトから動的変更 Simple Animation 関数まとめ

自分用にSimple Animationの関数まとめ 

Simple Animationとは

tsubakit1.hateblo.jp

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

public class AnimeTest : MonoBehaviour
{

    private SimpleAnimation simpleAnimation;

    [SerializeField] private AnimationClip anime_clip;

    void Start ()
    {
        simpleAnimation = GetComponent<SimpleAnimation>();


        // デフォルトのクリップを再生する
        simpleAnimation.Play();

        // 特定のクリップを再生する
        simpleAnimation.Play("AAA");

        // アニメーションを停止する
        simpleAnimation.Stop();

        // 再生中のアニメーションを頭から流しなおす
        simpleAnimation.Rewind();

        // 1秒かけてAAAステートに遷移する
        simpleAnimation.CrossFade("AAA", 0.2f);


        //アニメとステート追加する
        simpleAnimation.AddState(anime_clip, "CCC");

        //前のアニメーションが終わった後に切り替える
        simpleAnimation.CrossFadeQueued("AAA", 0.2f, QueueMode.CompleteOthers);
        simpleAnimation.CrossFadeQueued("BBB", 0.2f, QueueMode.CompleteOthers);

        //アニメーション全停止 重要 CrossFadeQueuedでエラー出た時は直前に使う
        simpleAnimation.Stop();

    }
    
    void Update()
    {
        //Aキーを押すとデフォルトに設定したアニメーションの再生
        if (Input.GetKeyDown(KeyCode.A))
        {
            simpleAnimation.CrossFade("Default", 0.3f);
        }

        //Sキーを押すとステート名AAAのアニメーションを再生
        if (Input.GetKeyDown(KeyCode.S))
        {
            simpleAnimation.CrossFade("AAA", 0.3f);
        }




        //アニメーション終了の検出
        if (!simpleAnimation.isPlaying)
        {
            Debug.Log("アニメ終了");
        }
        else
        {
            Debug.Log("アニメ実行中");
        }
    }
}

【Unity】Animator 現在再生中のアニメーションクリップの名前を取得

Animatorメモ

現在再生中のアニメーションクリップの名前を取得 (ステート名ではない)

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 string clip_name;//string型の変数を宣言 アニメーションクリップ名前取得用


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

        clip_name = animator_clipinfo1[0].clip.name;//名前を取得
        
        Debug.Log(clip_name);//コンソールに表示
    }
}

【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