前記事
スクリプトごと使いまわしできる 数字ボタン その1:ベースボタンの作り方
スクリプトごと使いまわしできる 数字ボタン その2:ボタンの使い方
その1で作成した、NumberButtonクラスの説明をメモ。
NumberButton.cs
using UnityEngine; using System.Collections; using UnityEngine.UI; public class NumberButton : MonoBehaviour { [SerializeField][Header ("答え")]string answer; [SerializeField][Header ("ボタン識別番号 0〜")]int btnNumber; [SerializeField][Header ("長押し判定するまでの秒数")]float longPress = 0.5f; [SerializeField][Header ("文字を送る速度")]float speed = 0.2f; [SerializeField][Header ("Dictionary Key")]string keyName; //3つのテキスト Text[] texts; //長押しかどうか bool flag = false; //Updateの待機時間カウント用 float passtime; //加算ボタンを押したかどうか bool next = false; void Awake () { //テキストの取得 texts = new Text[3]; for (int i = 0; i < texts.Length; i++) { texts [i] = transform.Find ("mask/Text" + i).GetComponent<Text> (); } //初期化 passtime = longPress; } void Start () { //Dictionaryに追加 if (!Global.instance.NumberButtonDictionary.ContainsKey (keyName)) { int[] array = new int[answer.Length]; for (int i = 0; i < array.Length; i++) { array [i] = 9; } Global.instance.NumberButtonDictionary.Add (keyName, array); } //テキストの初期表示 int first = Global.instance.NumberButtonDictionary [keyName] [btnNumber]; for (int i = 0; i < texts.Length; i++) { texts [i].text = first.ToString (); first++; if (first == 10) { first = 0; } } } void Update () { if (flag) { passtime -= Time.deltaTime; if (passtime <= 0.0) { passtime = speed; SetNumber (); } } } public void OnDown (bool nextFlag) { flag = true; next = nextFlag; SetNumber (); //効果音 AudioManager.instance.PlaySE (0); } public void OnUp () { flag = false; passtime = longPress; next = false; } void SetNumber () { if (next) { int value = int.Parse (texts [0].text); for (int i = 0; i < texts.Length; i++) { value++; if (value == 10) { value = 0; } texts [i].text = value.ToString (); if (i == 0) { Global.instance.NumberButtonDictionary [keyName] [btnNumber] = value; } } } else { int value = int.Parse (texts [2].text); for (int i = texts.Length - 1; i >= 0; i--) { value--; if (value < 0) { value = 9; } texts [i].text = value.ToString (); if (i == 0) { Global.instance.NumberButtonDictionary [keyName] [btnNumber] = value; } } } } public bool OnEnter () { bool ans = false; string str = ""; //効果音 AudioManager.instance.PlaySE (0); foreach (int value in Global.instance.NumberButtonDictionary [keyName]) { int num = value + 1; if (num == 10) { num = 0; } str += num.ToString (); } if (answer == str) { ans = true; } return ans; } }
長押し処理について
OnDown()を実行
↓
flag=trueにする。
数字送りを1回実行する。
↓
Update()にて、カウントダウン開始。
longPress変数で設定した秒数が経過したら、speedで設定した速度で、数字送り(SetNumber())を開始。
↓
OnUp()イベントをキャッチ
longPressで設定した秒数内であればクリックになる。
↓
flag=falseになり、数字送りが停止。
↓
passtime変数を初期化しておく。
SetNumber()について
next変数は、trueなら加算、falseなら減算となる。
text0に表示されている数字を取得。
↓
for文にて、その数値を加算(または減算)する。
10(または0以下)なら0(または9)に設定してテキストに表示する。
text0ならDictionaryに数値を保管する。
例えば、text0の数字が9で、加算の場合
i=0
value=text0=9 に、+1して value=10 になる。
10なら0にするので、value=text0=0 になる。
i=1
value=0に、+1して、value=text1=1 になる。
といった感じ。
OnEnter()について
str変数に、Dictionaryの数字を[0]から順に+1して、4桁なら4桁の数字を代入する。
Dictionaryの数値は、text0の数値になるが、text1の数字が現在の値となるので+1している。
答え合わせをして、その結果を戻り値として返す。