ぬるーむ

Unity初心者が誰もが知っているゲームの模倣をしています。個人的な備忘録ですが、入門書を読み終えたばかりの初心者の方は「こんなへなちょこでもいいのか!」「俺の方がうまく作れる」と作成意欲がわいたりするかもしれません。

Unityでテトリスを作ってみた 3


スポンサードリンク

キー入力処理を修正

入力処理にGetDownKeyを使っている為、キーを押しっぱなしで操作することができない。左右に素早く操作する必要があるときなど連打しなければならないのはやりづらい。市販のゲームやエディタにあるようなキーを長押しすると押しっぱなしができるようにする。

  • 毎フレーム、押されたキーのフラグを立て、押されなかったキーのフラグを消す。
  • フラグの立っているキーが入力されたとき
    • 最初の入力なら入力カウントを1にして入力を受け付ける。
    • 2度目以降の入力なら入力カウント1増やす。入力カウントが規定値未満なら入力をキャンセルし、規定値以上なら入力を受け付ける。
      f:id:Nullsuke:20200927134145p:plain
      キー長押し入力
public static class KeyInputReceiver
{
    //この回数以上長押しで入力されたら入力を受け付ける
    private static readonly int limit = 10;
    //押されたキーのフラグ
    private static Dictionary<KeyCode, bool> keyMap = 
    new Dictionary<KeyCode, bool>();
    //キーが押された回数
    private static Dictionary<KeyCode, int> counter = 
    new Dictionary<KeyCode, int>();

    //毎フレーム、押されたキーのフラグを立てる
    public static void Update()
    {
        if (Input.anyKey || Input.anyKeyDown)
        {
            foreach (KeyCode keyCode in Enum.GetValues(typeof(KeyCode)))
            {
                if (Input.GetKey(keyCode))
                {
                    keyMap[keyCode] = true;
                }
                else keyMap[keyCode] = false;
            }
        }
        else keyMap.Clear();
    }

    //長押し入力
    public static bool GetKeyLongDown(KeyCode keyCode)
    {
        bool current;

        if (keyMap.TryGetValue(keyCode, out current) && current)
        {
            int cnt;

            if (counter.TryGetValue(keyCode, out cnt))
            {
                cnt++;
                counter[keyCode] = cnt;

                if (cnt >= limit) return true;
                else return false;
            }
            else
            {
                counter[keyCode] = 1;
                return true;
            }
        }
        else
        {
            if(counter.ContainsKey(keyCode))
            {
                counter.Remove(keyCode);
            }

            return false;
        }
    }
}

Unityでテトリスを作ってみた 4