読者です 読者をやめる 読者になる 読者になる

Roba Memo - Unity , Blender

素人のUnity覚書と奮闘記

アルファベットのボタンを作る

概要

脱出ゲームでよく使う、アルファベットを合わせて解錠するやつ。
f:id:nico-taniku:20170410122037p:plain:w300
タップでAから順番に変わり、ZまできたらAに戻る。
でもZまでタップするのは大変なので、長押ししたら早送りみたいに切り替わるようにしたい!

ボタンの配置

ボタンの配置はこんな感じ。
ボタン画像の上に、テキストを被せて配置。
テキストには最初の文字となる”A”を入力しておく。
f:id:nico-taniku:20170410122120p:plain:w300

スクリプト

//メンバ変数
    public Text[] alphabet_text;
    bool down = false;
    float speed = 0.2f;
    float passtime;
    string alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int target;

//Down時のメソッド
    public void AlphabetBtnDown (int i)
    {
        target = i;
        down = true;
    }

//Update
    void Update ()
    {
        if (down) {
            passtime -= Time.deltaTime;
            if (passtime <= 0.0) {
                passtime = speed;
                SetAlphabet ();
                AudioManager.instance.PlaySE (0);//効果音
            }
        }
    }

//Up時のメソッド
    public void AlphabetBtnUp ()
    {
        passtime = speed;
        down = false;
    }

//タップ時のメソッド
    public void AlphabetBtnClick ()
    {
        AudioManager.instance.PlaySE (0);
        SetAlphabet ();
    }

    void SetAlphabet ()
    {
        int i = alphabets.IndexOf (alphabet_text [target].text);
        i++;
        if (i == alphabets.Length) {
            i = 0;
        }
        alphabet_text [target].text = alphabets.Substring (i, 1);
        Global.instance.drawer_answer [target] = i;
        Global.instance.OnSave ();
    }

//Enterボタンのメソッド
    public void AlphabetEnter ()
    {
        if (alphabet_text [0].text == "R" &&
            alphabet_text [1].text == "O" &&
            alphabet_text [2].text == "B" &&
            alphabet_text [3].text == "A") {
            //解錠
        } else {
            //間違っていた場合
        }
    }

設定

テキスト配列を作成し、テキストを割り当てる。
f:id:nico-taniku:20170410122313p:plain:w300

各ボタンにDown / Up / Clickを設定する。
Down時のメソッドには引数があるので、ボタンの番号を設定する。(左から0〜)
これは、押されたボタンに該当するテキストを判定するためのint変数になる。
f:id:nico-taniku:20170410122338p:plain:h300

説明

長押しとタップの判定

アルファベットを、clickなら一つずつ、Downなら順番に送り、Upで止まるようにしたい。
順番にアルファベットを表示する処理をUpdate関数で行うことにした。
イベントの感知はUnityのほうでやってくれるのだが、Updateは毎フレーム処理を繰り返すため、長押しなのかタップなのかをUpdate内で判定する必要がある。

単純にフラグで判定してみることにした。
変数downが、そのフラグとなる。

Down時 : down = true;
Up時 : down = false;

変数passtimeは、DownしてからUpdateの処理を実行するまでの秒数になる。
この値を設定するための変数がspeedになる。
サンプルでは0.2fに設定されている。
このタイムラグの間にUpが実行されれば、クリックということになる。

Downイベント発生

down=true

passtimeのカウントダウン開始

0.0以下になったら、passtimeを初期値に戻して、次のアルファベットを表示する

down=trueの間は、再びカウントダウンを開始する。

Upイベント発生

down=false;
passtimeを初期値に戻しておく。