【Unity】InputFieldで入力データを取得し、保持する

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

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

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

また、「InputField」に入力されたデータは、シーンを切り替えたようなときに、データは外れます。つまり、データが転送されますが、保持されないです。
入力した数字をもう一度初めから定義されず、削除されてしまい、開発がなかなか進まないことがあるかと思います。


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

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

InputField

InputField」とは、前述したようにユーザーにデータを入力を求めるときに使用します。
「Unity」にはボタンやテキストなど様々なUIがありますが、「InputField」は編集が可能であることが大きな特徴です。

また、入力されて受け取った名前や変数(スコア)などはUIテキストを使用して、表示することができます。

使い方

早速、「InputField」の使い方を確認しましょう。

HierarchyウィンドウからUIを選択し、「InputField」「Text」追加してください。

さらに、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」を使って、ユーザー(利用者)が入力した数字を取得して、カウントするインターバル機能付きタイマーを作成します。

今回の動作はスクリプトを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();
    }
}

思い通りのゲームが作れない

Unityでゲーム開発しているけど完成しない。
技術的な壁や知識不足が原因で、思い描いたゲームを実現するのは難しいです。

しかし、Udemyは動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。

初夏のセール開催中!(5月23日まで)
対象のコースが1300円から。

Unityのはじめの一歩としておすすめ。開発例に物理挙動やアニメーションを使用しているので、今後の開発が円滑になる。

トランプを題材にした講座。カードゲームやボードゲーム開発に応用可能

UnityエンジンのインストールやC#の文法に加えて、App StoreとGoogle Playにゲームをリリース方法を解説。

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の時は、時間が経過します。また、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」で設定できます。

カウントダウンタイマーはPythonを使って作ることもできます。こちらからあわせてご覧ください。

この記事を書いた人

プロフィール

アリッシア

                 

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

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

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