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

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

「定年後の収入に不安を感じる30代会社員」のリアル成長記録

厳選!私が実際に役に立ったUnity,iOS おすすめ動画講座【随時追加】

f:id:marumaro7:20200624224539p:plain

はじめに

みなさんプログラミングの勉強どうやって進めていますか??

私のおすすめは断然これ!


Udemy です。

友人から教えてもらったのですが、一流講師の講座が時間を選ばず受けられます。

セール時には1000円台から受講できるので本を買うより安くコスパ最強です。

エンジニアにマンツーマンで教えてもらおうと思うと、
1時間2500円が相場なので、それを考えると定価で購入してもお得だと思ってます。
とはいうものの、副業するならコストはできるだけ抑えたいので購入はセール時が狙い目です。

質問し放題に加えて、30日間返金保障なので安心して購入できます。

Udemyというか動画教材の欠点としては、
あとで見返すときに「確認したいところがわからない」
ということがあるので、Qiitaやブログなどでメモを残しておくと良いかもしれません。

Udemyでは細かくセクションごとに分かれ探しやすくなっていますが、
それでも不思議、私は探す笑

私が実際に役に立ったUdemyのおすすめ講座を紹介します。

Unity教材

Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】

Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】

【感想】
Unity教材で迷ったらこれで間違いなし! marumaro7.hatenablog.com ↑こちらの記事でも紹介しましたが、Unityの基礎だけでなく、
超つまづきやすいAndroidiOSのリリース手順まで解説しています。
なんですかこれ、、、神ですか?

Unity3D入門の決定版!RPG開発の基本をUnityインストラクターと共に進めるハンズオンコース【スタジオしまづ】

Unity3D入門の決定版!RPG開発の基本をUnityインストラクターと共に進めるハンズオンコース【スタジオしまづ】

【感想】
Unityで3Dをやりたいならこれ!
基礎から学ぶので初心者でも安心♪

Unityゲーム開発入門:Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法【スタジオしまづ】

Unityゲーム開発入門:Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法【スタジオしまづ】

【感想】
自分でマリオみたいなゲームが作れる幸せ!
マリオメーカーよりも自由に!

[初心者向け] Blender 2.8でアニメーションを作成して Unity で動かすまでの30分講座

[初心者向け] Blender 2.8でアニメーションを作成して Unity で動かすまでの30分講座

【感想】
3Dモデルに命を吹き込む!
Unity×Blenderで制作の幅が広がります。
Blenderのインストールは事前に必要です。

Unity2Dパズルゲーム開発入門:Admob広告実装と高速にスマホゲームを量産する実践テクニック講座【スタジオしまづ】

Unity2Dパズルゲーム開発入門:Admob広告実装と高速にスマホゲームを量産する実践テクニック講座【スタジオしまづ】

【感想】
とにかく量を作る!
なるほど量産テクニックです。

Unityインストラクターが教えるシャドウバースのような本格2Dカードゲーム開発コース【スタジオしまづ】

Unityインストラクターが教えるシャドウバースのような本格2Dカードゲーム開発コース【スタジオしまづ】

【感想】
Unityのチュートリアルをなにかしらやったことある人向けです。
カードゲームの基礎はここに。

iOS教材

【iOS13対応】未経験者がiPhoneアプリ開発者になるための全て iOS Boot Camp

【iOS13対応】未経験者がiPhoneアプリ開発者になるための全て iOS Boot Camp

【感想】
ベストセラーだけあって初心者でもわかりやすい
Firebaseとの連携も解説されているのが個人的に嬉しいポイントです。

おわりに

Unity教材全部スタジオしまづやないか!と思いました?
だってわかりやすいんだもの、、、

【Unity】配列の中の配列 Listでジャグ配列を使う際の初期化の方法

Listを二重に使った際のメモ

初期化はこちら

//配列[1]の中の配列を初期化
Test_List[1] = new List<int>();


テストで作ったスクリプト

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


public class TestScript : MonoBehaviour
{
    public List<List<int>> Test_List = new List<List<int>>()//リストの宣言
    {
      // Listの中にListを追加して初期化
      new List<int>(),//[0]の中の配列
      new List<int>(),//[1]の中の配列
      new List<int>(),//[2]の中の配列
    };


    void Start()
    {    
        Debug.Log("配列[0]の中の配列[0~2]に5,6,7をいれる");
        for (int i = 0; i < 3; i++)
        {
            Test_List[0].Add(i+5);
            Debug.Log(Test_List[0][i]);
        }

        Debug.Log("配列[1]の中の配列[0~5]に8,9,10,11,12,13をいれる");
        for (int n = 0; n < 6; n++)
        {
            Test_List[1].Add(n+8);
            Debug.Log(Test_List[1][n]);
        }

        Debug.Log("配列[2]の中の配列[0~8]に10,11,12,13,14,15,16,17,18をいれる");
        for (int p = 0; p < 9; p++)
        {
            Test_List[2].Add(p+10);
            Debug.Log(Test_List[2][p]);
        }

        Debug.Log("配列[0]の中の配列[1]は" + Test_List[0][1]);
        Debug.Log("配列[1]の中の配列[1]は" + Test_List[1][1]);
        Debug.Log("配列[2]の中の配列[1]は" + Test_List[2][1]);

        //配列[1]の中の配列を初期化
        Debug.Log("配列[1]の中の配列を初期化");
        Test_List[1] = new List<int>();

        //配列0の中の配列の中を全部見る
        Debug.Log("配列[0]の中身");
        for (int i1 = 0; i1 < Test_List[0].Count; i1++)
        {
            Debug.Log(Test_List[0][i1]);
        }

        Debug.Log("配列[1]の中身");
        for (int n1 = 0; n1 < Test_List[1].Count; n1++)
        {
            Debug.Log(Test_List[1][n1]);
        }

        Debug.Log("配列[2]の中身");
        for (int p1 = 0; p1 < Test_List[2].Count; p1++)
        {
            Debug.Log(Test_List[2][p1]);
        }
    }
 }

参考

ict119.com

smdn.jp

【Unity】押したボタンを取得してその子のテキストを変更する方法

押したボタンを取得してその子のテキストを変更する方法(タイトル長い)
を開発用にメモ

using System;
using UnityEngine;
using UnityEngine.EventSystems;//追加
using UnityEngine.UI;//追加

public class ChangeButtonText : MonoBehaviour {

    // eventSystem型の変数を宣言 インスペクターにEventSystemをアタッチして取得しておく
    [SerializeField] private  EventSystem eventSystem;
   
    //GameObject型の変数を宣言 ボタンオブジェクトを入れる箱
    private GameObject button_ob;

    //GameObject型の変数を宣言 テキストオブジェクトを入れる箱
    private GameObject NameText_ob;

    //Text型の変数を宣言 テキストコンポーネントを入れる箱
    private Text name_text;



    //ボタンにこの関数を割り当てて使用
     public void ChangeButtonTextName()
    {
        //押されたボタンのオブジェクトをイベントシステムのcurrentSelectedGameObject関数から取得 
        button_ob = eventSystem.currentSelectedGameObject;
        
        //ボタンの子のテキストオブジェクトを名前指定で取得 この場合Text100と名前が付いているテキストオブジェクトを探す
        NameText_ob = button_ob.transform.Find("Text100").gameObject;

        //テキストオブジェクトのテキストを取得
        name_text = NameText_ob.GetComponent<Text>();

        //テキストを変更
        name_text.text = "変更後の文字列";        
    }
}

参考

note.com

dkrevel.com

【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】シネマシーン アセットストアから削除 それでもインストールする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を入力する欄があわれるので

シネマシーン入力

と入力→「追加」ボタン

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

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

シネマシーン出現

勝手に

おわりに

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

参考 helpdesk.unity3d.co.jp