さて先日から、UnityのInput系統の動作検証をつづけておりマス。
先日の段階でですね…
キーを押す ↓ 何のキーが押されたか確認する →正解のキーの場合は、『正解だよッ!!(・∀・)』 →不正解のキーの場合は、『不正解だッ!!ヽ(`Д´#)ノ』
このスクリプトって無理くさい?(;・∀・) という結論に達したのですが、
頭の体操がてら、実装できないもんかな? とちょっと考えてみました。
そういうわけでちょっと調べてみたところ、『Input.anyKey』という関数を発見。
公式リファレンスはこちらです。
現在何らかのキーまたはマウスボタンが押されているかどうか
なるほど。これをうまい具合に使ってあげれば、
最初のスクリプトも再現できるんじゃね? と思いまして。
そう思って、先日のコードのInput.GetKeyDownのところに、
以下のように手を加えてみました。
//結果表示
if(Input.anyKey){
if(Input.GetKeyDown(word.Substring(count,1))){
Debug.Log ("Input.GetKeyDown'"+word.Substring(count,1)+"'だよっ(`・ω・´)");
count=count+1;
//文字数を超えたらゼロに戻す
if(count>=countMax){
count=0;
}
}
}
else{
Debug.Log ("ブッブー!! 不正解だよッ!!ヽ(`Д´#)ノ");
}
要はInput.anyKeyでキーが押されてるかどうかを取得。
押された時は、押されたキーが正解のキーかどうかを確認する…という算段です。
これで走らせてみたところ……
こんな感じで、正解のキーを押しても不正解の判定が出ます。
うーん…この『Input.anyKey』という関数は、
どうやら『押している間はtrueを返し続ける』という機能なようですね。
ならばということで、さらに手を加えたコードがこちら。
色々と手を加えているので、コード全体を載せます
using UnityEngine;
using System.Collections;
public class InputTest : MonoBehaviour {
//各種変数設定
private string word="abcdefg"; //問題文字列
private int count=0; //現在の文字
private int countMax=0; //文字の最大数
private bool keyStatus; //キーの状況
// Use this for initialization
void Start () {
//文字数確認
countMax=word.Length;
//キーの状況を設定
keyStatus=false;
}
// Update is called once per frame
void Update () {
//結果表示
if(!keyStatus && Input.anyKey){
if(Input.GetKeyDown(word.Substring(count,1))){
Debug.Log ("Input.GetKeyDown'"+word.Substring(count,1)+"'だよっ(`・ω・´)");
count=count+1;
//文字数を超えたらゼロに戻す
if(count>=countMax){
count=0;
}
}
else{
Debug.Log ("ブッブー!! 不正解だよっ!!ヽ(`Д´#)ノ");
}
}
//キーの状況設定
keyStatus=Input.anyKey;
}
}
これで走らせてみたところ、以下の様な結果になりました。
うん。いい感じですね。上々です。
キチンと正解のキーの時は正解判定だけ、
不正解の時は不正解のときだけ…て反応でした。
コードのキモは、前のフレームの時のキーの状況を保存しておいて、
『前のフレームではキーは押されてない&今のフレームではキーが押されてる』
という場合のみに反応するようにしてあることです。
これを使えば不正解の反応も出来るので、
例えば『正解の時はピンポン!! 不正解の時はブッブー!! て音を鳴らす』
て感じの機能を持たせることも出来ますね~。
なんて上機嫌で構えてたら、コード補完機能で、こんなのを見つけました。
……(´・ω・`)
しかもInputの公式リファレンスには、
『Input.anyKey』のすぐ下に『Input.anyKeyDown』ありますね…
なんで気が付かなかったのか…(´・ω・`)
一応ですね…この『Input.anyKeyDown』を使えば、
以下のように、最初のコードのままでもOKです。
//結果表示
if(Input.anyKeyDown){
if(Input.GetKeyDown(word.Substring(count,1))){
Debug.Log ("Input.GetKeyDown'"+word.Substring(count,1)+"'だよっ(`・ω・´)");
count=count+1;
//文字数を超えたらゼロに戻す
if(count>=countMax){
count=0;
}
}
}
else{
Debug.Log ("ブッブー!! 不正解だよッ!!ヽ(`Д´#)ノ");
}
うーん…なんという無駄な努力……(´・ω・`)
まぁ、頭の体操をしたと自分に言い聞かせておきます……(´・ω・`)