コルーチンを修正して、ピース生成後に
フリック入力を復帰できるように修正しました。
これでOKと思っていたのですが…
PC上でテストをしていると違うバグが発生し始めました。
マウスをカチカチと連打しながらフリックしていると
Consoleにエラーの表示が…

座標の読み取りで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から一括でピースに動作指示を出せると、
もう少し処理も楽になるかもしれません。
処理方法を工夫する必要があるので、時間が掛かりそうですが、
考えてみたいと思います。
この記事へのコメント