InputFiledで数字を取得して、画面切り替えで初期化されずに保持するインターバルタイマー
Unityでゲーム開発を進めていくと、プレイヤーに文字や数字を入力してほしい場面があります。
ユーザーが入力した数字や文字列を取得するには、
「Unity」標準搭載のUI「InputField」を使用します。
「InputField」を使った入力フォームから転送されるデータは、
シーンを切り替えたときに保持されません。
入力した数字をもう一度初めから定義されず、
削除されてしまい開発がなかなか進まないことがあるかと思います。
本記事では、「InputField」の使い方と初期化されてしまうデータを保持する方法を紹介します。
- 「InputField」の使い方を知りたい。
- ユーザーが入力した数字や文字列を取得して保持する。
InputField
「InputField」とは、ユーザーにデータを入力を求めるときに使用します。
「Unity」にはボタンやテキストなど様々なUIがありますが、
「InputField」は編集が可能であることが大きな特徴です。
使い方
早速、「InputField」の使い方を確認しましょう。
HierarchyウィンドウからUIを選択し、「InputField」と「Text」追加してください。
テキストは特別な理由がなければ、「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は、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 【Unity C# ゲーム開発超入門】7つのミニゲームを作っておぼえる!UnityとC#講座
Unityで頻出の機能を実際のゲーム作りで学習。
何か作りたい、今後の開発で役立てたい初心者におすすめ
- 【Unity C# ゲーム開発初心者レベルアップ】7つのトランプゲームを作っておぼえる!UnityとC#講座
トランプやボードゲーム作りに特化している講座。
テーブルゲームを作りたい人におすすめ。
- 【全行程を網羅!最初に学びたい総合学習】Unityワールド制作講座
Unityワールド制作の全工程を学習できる講座。
RPGを作りたい人におすすめ。
- Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】
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」で設定できます。