Roba Memo - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

スクリプトごと使いまわしできる 数字ボタン その3:スクリプトの説明

前記事
スクリプトごと使いまわしできる 数字ボタン その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している。
答え合わせをして、その結果を戻り値として返す。