【Unity】InputField入力フォームで数字や文字を取得

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

InputFiledで数字を取得して、画面切り替えで初期化されずに保持するインターバルタイマー

Unityでゲーム開発を進めていくと、プレイヤーに文字や数字を入力してほしい場面があります。

ユーザーが入力した数字や文字列を取得するには、
「Unity」標準搭載のUI「InputField」を使用します。

「InputField」を使った入力フォームから転送されるデータは、
シーンを切り替えたときに保持されません。

入力した数字をもう一度初めから定義されず、
削除されてしまい開発がなかなか進まないことがあるかと思います。

本記事では、「InputField」の使い方と初期化されてしまうデータを保持する方法を紹介します。

本記事は次の人におすすめ
  • 「InputField」の使い方を知りたい。
  • ユーザーが入力した数字や文字列を取得して保持する。
スポンサーリンク

InputField

InputField」とは、ユーザーにデータを入力を求めるときに使用します。

「Unity」にはボタンやテキストなど様々なUIがありますが、
「InputField」は編集が可能であることが大きな特徴です。

使用用途
  • ユーザー名やログイン情報の入力:ユーザー名を入力、ログインシステム
  • チャットシステム:オンラインゲームで、ユーザー同士のやり取り
  • プレイヤー設定:キャラクターの情報をカスタマイズできるシステム
  • ゲーム内アンケートやクイズ:ユーザーからのフィードバック、クイズの解答入力。

使い方

早速、「InputField」の使い方を確認しましょう。
HierarchyウィンドウからUIを選択し、「InputField」「Text」追加してください。

テキストは特別な理由がなければ、「textmeshpro」を推奨します。
初めに設定が必要ですが、拡張性や制御しやすいです。

textmeshproの使い方を紹介しています。

さらに、Assetウィンドウにて新規スクリプトを作成して、以下のソースコードを書いてください。

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

public class Input : MonoBehaviour
{
    public InputField IF;
    public Text txt;

    void Start()
    {
        IF = IF.GetComponent<InputField>();
        txt = txt.GetComponent<Text>();
    }

    public void InputText()
    {
        txt.text = IF.text;
        txt = IF ;////InputFieldのテキストを入れる。
    }
}

InputField「IF」に、InputField。
UIテキスト「txt」に「Text」をそれぞれアタッチしてください。

inspectorウィンドウにて、
InputFieldオブジェクト「OnValueChanged」と「OnEndEdit」が設定できます。

「OnValueChanged」は文字の変更をしたとき、
「OnEndEdit」は入力が確定した(Enterキーを押す)ときに出力されます。

それでは、実際の動作を確認します。
以下の動作は、「OnEndEdit」を採用しています。

もっとも基本的なInputFieldの使い方です。

ユーザーからの入力を受けとって、インターバルタイマーを作成

先ほどは、「InputField」の使い方を確認しました。

「InputField」を使い、ユーザー(利用者)が入力した数字を取得して、
カウントするインターバル機能付きタイマーを作成します。

今回の動作はスクリプトを3つ「Setting.cs」・「Main.cs」・「Break.cs」を使用します。

1.1.ソースコード

こちらのソースコードは、ユーザー(利用者)が「InputField」に入力した数字を取得するスクリプトを作成します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//UIを適用
using UnityEngine.SceneManagement;//シーン切り替えに必要

public class Setting : MonoBehaviour
{
    public InputField WorkingIF;
    public InputField SetIF;
    public InputField BreakIF;
    public Text WorkingTxt;
    public Text SetTxt;
    public Text BreakTxt;
    public Text Attention;
    public static float WorkingNum;
    public static float SetNum;
    public static float BreakNum;

    void Start()
    {
        WorkingIF = WorkingIF.GetComponent<InputField>();
        WorkingTxt = WorkingTxt.GetComponent<Text>();
        SetIF = SetIF.GetComponent<InputField>();
        SetTxt = SetTxt.GetComponent<Text>();
        BreakIF = BreakIF.GetComponent<InputField>();
        BreakTxt = BreakTxt.GetComponent<Text>();
    }

    public void InputText()
    {
        //テキストにinputFieldの内容を反映
        WorkingTxt.text = WorkingIF.text;
        SetTxt.text = SetIF.text;
        BreakTxt.text = BreakIF.text;

        WorkingNum = int.Parse(WorkingTxt.text);
        Set = int.Parse(SetTxt.text);
        BreakNum = int.Parse(BreakTxt.text);
        Debug.Log("作業時間:::" + WorkingNum);
        Debug.Log("セット数:::" + SetNum);
        Debug.Log("インターバル:::" + BreakNum);
    }

    //全て入力して動作する
    public void Btn()
    {
        if (WorkingNum > 0 && Setnum > 0 && BreakNum > 0)
        {
            SceneManager.LoadScene("Main");
        }
        else
        {
            Attention.text = "全て入力してください!";
        }

    }
    //UIボタンを押してUnityを終了させる。
    public void BtnExit()
    {
        Application.Quit();
    }
}

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

ビックセール開催中(10月25日まで)
対象のコースが1800円から(最大94%OFF)

多彩な講座から自分に合った講座を探そう!

最大94%OFF

終了まで

時間




1.2.解説

初めに名前空間へ、UIを利用できるように「using UnityEngine.UI;」の導入をします。
他にも、シーン切り替えするための「using UnityEngine.SceneManagement;」を追加します。

これらを入力を忘れるとエラーが発生するので、注意してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//UIを適用
using UnityEngine.SceneManagement;//シーン切り替えに必要

続いて、変数を定義します。

ユーザーが入力する数値は、作業時間「Working系」、セット数「Set系」・休憩時間の「Break系」の3つになります。

InputField「WorkingIF」・「SetIF」・「BreakIF」はそれぞれの数値を入力します。
UIテキスト「WorkingTxt」・「SetTxt」・「BreakTxt」はそれぞれ「InputField」に入力した数値をテキストとして表示します。
静的(static)なfloat型変数「WorkingNum」・「SetNum」・「BreakNum」はそれぞれのInputField入力された数値は数字ではなく、文字として認識されるので、数字に変換する必要があります。

public InputField WorkingIF;
public InputField SetIF;
public InputField BreakIF;
public Text WokingTxt;
public Text SetTxt;
public Text BreakTxt;
public Text Attention;
public static float WorkingNum;
public static float SetNum;
public static float BreakNum;

また、Start()と関数InputText()にて、
「InputField」が動作するようにそれぞれのUIテキストを適用させます。

string型変数(文字列)やUIテキストをint型変数(数字)に変更するためには、
以下のような構文を使用します。

i = int.Parse(Char.text);
j = int.Parse("1");

変数「i」にUIテキスト「Char」を、変数「i」に文字「1」を数値に変更したものを代入しました。

    void Start()
    {
        WorkingIF = WorkingIF.GetComponent<InputField>();
        WorkingTxt = WorkingTxt.GetComponent<Text>();
        SetIF = SetIF.GetComponent<InputField>();
        Settxt = Settxt.GetComponent<Text>();
        BreakIF = BreakIF.GetComponent<InputField>();
        Breaktxt = Breaktxt.GetComponent<Text>();
    }

    public void InputText()
    {
        //テキストにinputFieldの内容を反映
        WorkingTxt.text = WokingIF.text;
        SetTxt.text = SetIF.text;
        BreakTxt.text = BreakIF.text;

        WorkingNum = int.Parse(WorkingTxt.text);
        SetNum = int.Parse(SetTxt.text);
        BreakNum = int.Parse(BreakTxt.text);
        Debug.Log("作業時間:::" + WorkingNum);
        Debug.Log("セット数:::" + SetNum);
        Debug.Log("インターバル:::" + BreakNum);
    }

最後に、関数Btn()にて、InputField「WorkingIF」・「SetIF」・「BreakIF」を全て埋めて動作する。

つまり、静的(static)なfloat型変数「WorkingNum」・「SetNum」・「BreakNum」が0よりも大きいときに動作して、
少なくとも1つが0より小さいときは全て入力するように警告を促すテキストを表示します。

関数BtnExit()は、Unityの動作を終了させます。
ただし、デバック状態では稼働せず、Unityをビルドすると適応されます。

  //全て入力して動作する
    public void Btn()
    {
        if (WorkingNum > 0 && SetNum > 0 && BreakNum > 0)
        {
            SceneManager.LoadScene("Main");
        }
        else
        {
            Attention.text = "全て入力してください!";
        }

    }
  //UIボタンを押してUnityを終了させる。
    public void BtnExit()
    {
        Application.Quit();
    }

本ソースコードによって次のような動作が可能です。
入力された数値がConsoleウィンドウに表示されることが確認できます。

2.1.ソースコード

こちらのソースコードは前述したコード「Setting.cs」で受け取った作業時間・セット数値を画面に表示し、1秒ずつ変化させます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;//シーン切り替えに必要

public class MainTime : MonoBehaviour
{
    public Text MainTimer;
    public Text SetTimer;
    public Text Btntxt;
    public static int MainSeconds;//画面に時間を表示
    float WorkingTime = Setting.WorkingNum;//入力された数値を保持する
    float SetTimes;
    public static bool Flag = true;

    // Update is called once per frame
    void Update()
    {
        SetTimes = Setting.BreakNum - 1;
        SetTimer.text = SetTimes.ToString();

        if (Flag == true)
        {
            WorkingTime -= Time.deltaTime;//1秒ずつ減少
            MainSeconds = (int)WorkingTime + 1;
            MainTimer.text = MainSeconds.ToString();
        }

        if (MainSeconds == 0)
        {
            SceneManager.LoadScene("Break");
        }

    }
    public void CountBtn()
    {
        if (Flag == false)
        {
            Btntxt.text = "Start";
            Flag = true;
        }
        else if (Flag == true)
        {
            Btntxt.text = "Stop";
            Flag = false;
        }
    }


    public void Reset()
    {
        SceneManager.LoadScene("Setting");
    }
}

2.2.解説

名前空間は、コード「Setting.cs」と同様なので、説明は省略します。

変数を定義します。

UIテキスト「MainTimer」・「SetTimer」 ・「Btntxt」はそれぞれ残り時間・残りセット数・残り時間を再開(Start)と停止(Stop)を表示します。
静的なint型変数「MainSeconds」はfloat型変数「WorkingTime」で保持しているコード「Setting.cs」にて入力されたWorkingNumを代入します。

同様に、 float型変数「SetTimes」は残りセット数の数値を代入します。

public Text MainTimer;
public Text SetTimer;
public Text Btntxt;
public static int MainSeconds;//画面に時間を表示
float WorkingTime = Setting.WorkingNum;//入力された数値を保持する
float SetTimes;
public static bool Flag = true;

つづいて、Update()内で、セット数を表示します。
if関数で、静的なbool型変数「Flag」がtrueの時は、時間が経過します。

数字は文字列として変換をしないと認識できないです。

変数を文字列と認識する方法(.ToString())について紹介しています。

また、int型変数「MainSeconds」が0になるとインターバルを表示する画面「Break」にシーンを切り替えます。

 void Update()
    {
        SetTimes = Setting.BreakNum - 1;
        SetTimer.text = SetTimes.ToString();

        if (Flag == true)
        {
            WorkingTime -= Time.deltaTime;//1秒ずつ減少
            MainSeconds = (int)WorkingTime + 1;
            MainTimer.text = MainSeconds.ToString();
        }

        if (MainSeconds == 0)
        {
            SceneManager.LoadScene("Break");
        }

    }

最後に、関数CountBtnでUIボタンを押下すると静的なbool型変数「Flag」をtrue・falseにして、
状況に応じてUIテキスト「Btntxt」をStart,Stopに変えます。

また、関数Resetにて「Setting」のシーンへ切り替えます。

 public void CountBtn()
    {
        if (Flag == false)
        {
            Btntxt.text = "Start";
            Flag = true;
        }
        else if (Flag == true)
        {
            Btntxt.text = "Stop";
            Flag = false;
        }
    }


    public void Reset()
    {
        SceneManager.LoadScene("Setting");
    }

本ソースコードによって次のような動作が可能です。

シーン「Setting」にて取得した作業時間を1秒ずつ減らします。
また、セット数は1小さい状態で表示します。

3.1.ソースコード

こちらのソースコードは前述したコード「Setting.cs」で受け取ったインターバル時間・セット数を画面に表示します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;//シーン切り替えに必要

public class Break : MonoBehaviour
{
    public Text BreakTimer;
    float SetTimes;
    public Text Btntxt;
    public Text SetTimer;
    float BreakTime = Setting.BreakNum;
    public static int BreakSeconds;

    // Update is called once per frame
    void Update()
    {
        SetTimes = Input.SetNum - 1;
        SetTimer.text = SetTimes.ToString();
        if (Timer.Flag == true)
        {
            BreakTime -= Time.deltaTime;
            BreakSeconds = (int)BreakTime + 1;
            BreakTimer.text = BreakSeconds.ToString();
        }
        if (BreakSeconds == 0)
        {
            SceneManager.LoadScene("Main");
            Input.SetTimes--;
        }
        if (Input.SetNum == 0 && SceneManager.GetActiveScene().name == "Break")
        {
            SceneManager.LoadScene("Setting");
        }
    }

    public void BreakBtn()
    {
        if (Timer.Flag == false)
        {
            Btntxt.text = "Start";
            Timer.Flag = true;
        }
        else if (Timer.Flag == true)
        {
            Btntxt.text = "Stop";
            Timer.Flag = false;
        }
    }

    public void BreakReset()
    {
        SceneManager.LoadScene("Setting");
    }
}

3.2.解説

変数を定義します。
ソースコード「Main.cs」と同様にします。

public Text BreakTimer;
float SetTimes;
public Text Btntxt;
public Text SetTimer;
float BreakTime = Setting.BreakNum;
public static int BreakSeconds;

つづいて、Update内にて、変数「BreakSeconds」が0になると、変数「SetTimes」を1減らします。さらに、変数「SetTimes」が0になると、「Setting」にシーンを切り替えます。

以降のコードは「Main.cs」と同様です。

本ソースコードによって次のような動作が可能です。

「Setting」で取得したインターバルの数値を1ずつ減らします。

また、Startと表示されていると進み、Stopでは、停止します。
Resetを押すとSettingへ強制切り替えします。

まとめ

InputFiledはユーザーに数字や文字を入力してもらいたいときに使います。

この時、文字の保持の仕方はinputFieldオブジェクトの「OnValueChanged」と「OnEndEdit」で設定できます。

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする
タイトルとURLをコピーしました