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

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

アプリ開発覚え書き

【Unity】AndroidとiOSで処理を分ける方法

すぐ見れるようにメモ

公式 docs.unity3d.com

private void Start()
    {
#if UNITY_ANDROID //アンドロイドだったら処理

        //Androidの処理を書く

#endif //アンドロイドの処理範囲終わり


#if UNITY_IOS //iOSだったら処理

        //iOSの処理を書く

#endif //iOSの処理範囲終わり
    }

#if UNITY_IOS
の代わりに #if UNITY_IPHONEでもできるが非推奨なので使用しない!!




おまけ #elseを使ってそれ以外の動作を指定することも可能

#if UNITY_ANDROID
   //Androidの処理
#else
   //Android以外の処理
#endif

【Unity】これでラムダ式への耐性アップ!ラムダ式の記述方法まとめ

はい!今回は勉強した過程を書いていきます!
ラムダ式の存在は知っていましたが、読み方がなにもわからない"まる"です。

サンプルコードが読めないと処理が把握できないので、
重い腰を上げて勉強することにしました。
STEPを踏んで勉強の過程を残していきます。

ラムダ式とは

ざっくりいうと"要点だけ書いた関数の書き方"と理解しています。

ラムダ式書き方

まずusing Systemを追加する。

using System;

・引数無し 戻り値無しの関数の場合

Action型の変数に関数を入れてその変数に括弧()をつけて実行する。

Action aaa  = () => { 実行したい処理 }; 
aaa();


・引数有り 戻り値無しの関数の場合

Action型の変数に関数を入れてその変数に括弧()をつけて実行する。
引数の型はActionの直後に<>で記述する。

Action<引数の型> aaa  = (引数の型 引数の変数) => { 実行したい処理}; 
aaa(引数);


・引数無し 戻り値有りの関数の場合

Func型の変数に関数を入れてその変数に括弧()をつけて実行する。
Funcの直後に<>をつけてその中に戻り値の型を記述する。

Func<戻り値の型> aaa  = () => { return○○ }; 
Debug.Log(aaa());//戻り値をもっているので好きな変数に入れたりする


・引数有り 戻り値有りの関数の場合

Func型の変数に関数を入れてその変数に括弧()をつけて実行する。
Funcの直後に<>をつけてその中に引数の型、戻り値の型の順で記述する。

Func<引数の型,戻り値の型> aaa  = (引数の型 引数の変数) => 
{
 実行したい処理
 return○○ 
}; 
Debug.Log(aaa(引数の値));//戻り値をもっているので好きな変数に入れたりする

注)
引数が複数の場合、戻り値の型の記入は最後に記述する。
<第一引数の型,第二引数の型,・・・・・・,戻り値の型>

(ラムダ式を使ううえで、先にデリゲートの考え方を覚えた方がいいようです。)

ポイント

戻り値が無い場合はAction
戻り値が有る場合はFunc
を使うことだけ覚えておく。

サンプルコード

サンプル1 引数無し 戻り値無し 関数

・ 通常の関数の書き方

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

public class Ramudatest : MonoBehaviour
{    
    void Start()
    {
        aaa();
    }

    private void aaa()
    {
        Debug.Log("通常 引数無し 戻り値無し 関数");
    }      
}


ラムダ式での書き方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//ラムダ式を使用する場合 追加

public class Ramudatest : MonoBehaviour
{    
    void Start()
    {
        Action aaa = () =>{Debug.Log("ラムダ式 引数無し 戻り値無し 関数");};
        aaa();        
    }
}

サンプル2 引数有り 戻り値無し 関数

・通常の関数の書き方

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

public class Ramudatest : MonoBehaviour
{
    void Start()
    {       
        Test1(5);
    }

    private void Test1(int number)
    {
        Debug.Log(number*2);
    }
}


ラムダ式での書き方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//ラムダ式を使用する場合 追加

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Action<int> aaa = (int number) => { Debug.Log(number*2);};
        aaa(5);
    }
}

サンプル3 引数無し 戻り値有り 関数

・通常の関数の書き方

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

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Debug.Log(Test1());
    }

    private int Test1()
    {
        return 1;
    }
}


ラムダ式での書き方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//ラムダ式を使用する場合 追加

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Func<int> aaa = () => { return 1; };
        
        Debug.Log(aaa());//返り値確認
    }
}

サンプル4 引数有り 戻り値有り 関数

・通常の関数の書き方

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

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Debug.Log(Test1(6));
    }

    private int Test1(int number)
    {
        number = number * 3;
        return number;
    }
}

ラムダ式での書き方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//ラムダ式を使用する場合 追加

public class Ramudatest : MonoBehaviour
{
    void Start()
    {
        Func<int, int> aaa = (int number) =>
        {
            number = number * 3;
            return number;
        };

        Debug.Log(aaa(6));//戻り値をもっているので好きな変数に入れたりする
    }
}

省略した書き方

次の条件の時に一部を省略して書くことができます。
・引数が1つの場合()と型を省略できる。
・メソッド部分が1行の場合{}を省略できる。

実際にこちらのコードを省略してみます。

Action<int> aaa = (int number) => { Debug.Log(number * 2);};


・引数が1つの場合()と型を省略できる

Action<int> aaa=number=> { Debug.Log(number * 2);};


・メソッド部分が1行の場合{}を省略できる。

Action<int> aaa=number=>Debug.Log(number * 2);



また、引数が複数の場合、型のみ省略することができます。
・引数2つの基本コード

Action<int,float> aaa = (int number,float kazu) => { Debug.Log(number*kazu*2);};

・型のみ省略

Action<int, float> aaa = (number,kazu) => { Debug.Log(number * kazu * 2);};


・さらに、メソッド部分が1行なので{}を省略。

Action<int, float> aaa = (number,kazu) =>Debug.Log(number * kazu * 2);

おわりに

戻り値が無い場合はAction
戻り値が有る場合はFunc
を使うことだけ覚えておく。

有効な使い方はまだ見えていませんが、
ある程度ラムダ式のコードに心の耐性がついた気がします!
実際コードを読む場面では、省略されて書かれていることがほとんどなので、
省略のところは要チェックですね。

参考

squmarigames.com

【Unity】InputFieldのテキストをスクリプトから変更する 

問題点

InputFieldのテキスト(ユーザーの入力が反映されるテキスト)
が普通にText型を参照しただけでは変更できなかったのでメモ

インンプットフィールド

解決策

InputField型の変数を使う

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

public class TextChangeTest : MonoBehaviour
{
    //InputField型の変数を宣言 対象のInputFieldのオブジェクトをアタッチする
    [SerializeField] private InputField TestInputField;
   
    void Start()
    {
        //インプットフィールドのテキスト変更
        TestInputField.text = "インプットフィールドのテキスト変更";
    }

}

【Unity】ボタン 「通常、ハイライト時、押し込み時、選択時、無効時」の各状態色をスクリプトから動的変更する方法

ボタン状態による色変更をするスクリプトのメモ

半年前に参考にした元サイトが見つかりませんでした。すいません。

ボタンの色は、
”ボタンコンポーネント”の中の”ColorBlock”の中の”変数”を変更することで色変更できます。

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


 ///【機能】 ボタン状態による色変更
 ///【第一引数】色を変更したいボタン
 ///【第二引数】変更したい色(new Color32(byte a,byte b,byte c,byte d)) 
 ///【第三引数】色を変更したい状態(0:normalColor 1:highlightedColor 2:pressedColor 3:selectedColor 4:disabledColor)
    private void ButtonStateColorChange(Button button, Color32 color, int changeState)
    {
        ColorBlock colorblock = button.colors;
        switch (changeState)
        {
            case 0://normalColor
                colorblock.normalColor = color;
                break;
            case 1://highlightedColor
                colorblock.highlightedColor = color;
                break;
            case 2://pressedColor
                colorblock.pressedColor = color;
                break;
            case 3://selectedColor
                colorblock.selectedColor = color;
                break;
            case 4://disabledColor
                colorblock.disabledColor = color;
                break;
        }
        button.colors = colorblock;
    }



    //例-----------------------------------------------------

    [SerializeField] private Button stage_button;//ボタンコンポーネントの変数を宣言 変更したいボタンをアタッチ
    private Color32 button_color;//Color32型の変数を宣言


    private void Start()
    {
        //色設定
        button_color = new Color32(10, 40, 255, 255);

        //設定した色をstage_buttonを押した時の色へ設定
        ButtonStateColorChange(stage_button, button_color, 3);
    }

【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 = "変更後の文字列";        
    }
}

追記

有効なイベントシステムを↓で取得できるようなので少し改善

EventSystem.current;

使い所:導入したアセット等にEventSystemコンポーネントが入っていた時

イベントシステムが2つ以上あった場合、どちらか1つしか有効にならず、
無効なイベントシステムを参照している可能性があるため、
有効なイベントシステムを使う必要がある.

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

public class ChangeButtonText : MonoBehaviour {

    // eventSystem型の変数を宣言 
    private  EventSystem eventSystem;
   
    //GameObject型の変数を宣言 ボタンオブジェクトを入れる箱
    private GameObject button_ob;

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

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



    //ボタンにこの関数を割り当てて使用
     public void ChangeButtonTextName()
    {
        //有効なイベントシステムを取得
        eventSystem=EventSystem.current;

        //押されたボタンのオブジェクトをイベントシステムの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