【Unity】2048 操作系でバグが発生

ピース生成の際にバグが発生しておりましたが、
コルーチンを修正して、ピース生成後に
フリック入力を復帰できるように修正しました。

これでOKと思っていたのですが…

PC上でテストをしていると違うバグが発生し始めました。

マウスをカチカチと連打しながらフリックしていると
Consoleにエラーの表示が…
2048㊽.jpg
座標の読み取りでIndexOutOfRangeExceptionのエラーです。

ピースの移動時にポジションを消去するのですが、
消去後の座標を読み取ると計算コードが狂ってしまいます。

フリック入力時にピース配列を読み取っているのですが、
この部分で座標の読み取りを失敗しているようです。


//フリックが入力中か判断する
if (input)
{
return;
}

//タッチの始点を取得
if (Input.GetKeyDown(KeyCode.Mouse0))
{
touchStartPos = new Vector3(Input.mousePosition.x,
Input.mousePosition.y,
Input.mousePosition.z);
//移動前のピース配置取得
GetAxis();
}
//タッチの終点を取得
if (Input.GetKeyUp(KeyCode.Mouse0))
{
touchEndPos = new Vector3(Input.mousePosition.x,
Input.mousePosition.y,
Input.mousePosition.z);
input = true;
GetDirection();
}

なぜ読み取りエラーが発生するのか考えてみました。

・input = trueの前に再度、Input.GetKeyDownが呼び出される
・ピースによりクリック判定のタイミングがズレている
・タップ判定の際、inputを即falseにしてReturnしている

一つ目は、処理速度を計ってないので分からないのですが、
keyUpした瞬間にフラグが立つので考えにくいかなと思っています。

ピースのクリック判定のタイミングがズレると言うのは、
一度目のkeyDownは、そんなに大きい影響はないのですが、

ピースの処理は、結構複雑で重いので、ピース毎に読み取り速度が
バラつき連打すると処理が遅いピースで誤作動していると考えられます。

タップ判定については、これが一番の要因だろうと思っているのですが、
タップ後の復帰は即行っているのですが、ピース毎の処理バラつきにより、
復帰した物と復帰してない物が混在しているのでは?と考えています。


個々のバラつきを抑える為に
input = trueのタイミングをInput.GetKeyDown内で行いたいのですが、
クリックした瞬間に if (input){ return; } が働く為、
クリック操作が出来なくなってしまいます。

また、タップ判定の復帰を全ピースで揃える必要があるので、
悩んでおります。(_ _ ??)/◇ ワカラン・・・

コルーチンを使えばできるのですが、
多用しすぎるのも処理が重くなる要因なので…

操作系は、設計から見直した方がいいのかもしれません。

フリック入力のコントロールは難しいですね~(T^T) ヒック

GameManagerから一括でピースに動作指示を出せると、
もう少し処理も楽になるかもしれません。


処理方法を工夫する必要があるので、時間が掛かりそうですが、
考えてみたいと思います。

この記事へのコメント