2048も完成したので、スマホにビルドしてみました。
開始早々、問題が発生しました!
タップするとピースがフリーズします。
(・_・;)エー
これは、原因が分からない状況でっす。
仮説を立ててみます。
・マウスと指ではポイントの面積が違う
・タッチ始点と終点の差が読み取れていない
・計算上、上下左右の値が同じだと判断できない
イマイチはっきりしません(T^T) ヒック
そもそもフリック量って、どれくらいあるのか分からないので、
調査する事にしました。
フリックの計算コードを見ると
終点-始点で差が30より大きい方を読み取っています。
Unity上では30でも、スマホ上では値が小さい事や
そもそもの読み取り座標が違うかもしれないので、
フリック調査用のアプリを作成しました。
スクリプトはこんな感じです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FlickManager : MonoBehaviour
{
private Vector3 touchStartPos; //タッチの始点取得変数
private Vector3 touchEndPos; //タッチの終点取得変数
private string Direction; //フリックの方向取得変数
public GameObject displayText;
public GameObject startXtext, startYtext;
public GameObject endXtext, endYtext;
public GameObject Lamp;
public GameObject flickX, flickY;
private Text disptext;
private Text startXtx, startYtx;
private Text endXtx, endYtx;
private Text flicktextX, flicktextY;
// Start is called before the first frame update
void Start()
{
disptext = displayText.GetComponent();
startXtx = startXtext.GetComponent();
startYtx = startYtext.GetComponent();
endXtx = endXtext.GetComponent();
endYtx = endYtext.GetComponent();
flicktextX = flickX.GetComponent();
flicktextY = flickY.GetComponent();
}
// Update is called once per frame
void Update()
{
EndMonitor();
Flick();
}
void Flick()
{
//タッチの始点を取得
if (Input.GetKeyDown(KeyCode.Mouse0))
{
touchStartPos = new Vector3(Input.mousePosition.x,
Input.mousePosition.y,
Input.mousePosition.z);
}
//タッチの終点を取得
if (Input.GetKeyUp(KeyCode.Mouse0))
{
touchEndPos = new Vector3(Input.mousePosition.x,
Input.mousePosition.y,
Input.mousePosition.z);
disptext.text = "";
Lamp.SetActive(false);
GetDirection();
}
}
void GetDirection()
{
bool root = false;
float directionX = touchEndPos.x - touchStartPos.x;
float directionY = touchEndPos.y - touchStartPos.y;
//フリック量を表示
flicktextX.text = Mathf.Abs(directionX).ToString();
flicktextY.text = Mathf.Abs(directionY).ToString();
//タッチ始点座標表示
startXtx.text = touchStartPos.x.ToString();
startYtx.text = touchStartPos.y.ToString();
//タッチ終点座標表示
endXtx.text = touchEndPos.x.ToString();
endYtx.text = touchEndPos.y.ToString();
if (Mathf.Abs(directionY) < Mathf.Abs(directionX))
{
if (30 < directionX)
{
disptext.text = "右";
}
else if (-30 > directionX)
{
//左向きにフリック
disptext.text = "左";
}
root = true;
}else if (Mathf.Abs(directionX) < Mathf.Abs(directionY))
{
if (30 < directionY)
{
//上向きにフリック
disptext.text="上";
}
else if (-30 > directionY)
{
//下向きのフリック
disptext.text="下";
}
root = true;
}
else
{
disptext.text = "タップ";
root = true;
}
//全ての分岐を飛ばした場合
if (root == false)
{
Lamp.SetActive(true);
}
}
void EndMonitor()
{
if (Application.platform == RuntimePlatform.Android)
{
if (Input.GetKeyDown(KeyCode.Escape))
{
Application.Quit();
}
}
}
}
フリック判定をテキスト表示できるようにして、
スマホで操作した時の実測値を表示します。
仮に全分岐を外れたら、赤ランプが点灯するようにしました。
Unity上で確認してみます。
再生できない場合、ダウンロードは🎥こちら
これで実測値やフリックの状態が分かるのでビルドします。
まずはフリックの状態を調べます。
フリック自体は問題ないようなのでタップします。
???
なぜかフリックの方向が無表示になってます。( ̄~ ̄;) ウーン
赤ランプも点灯してないので、
分岐内でフラグも拾ってるようです。
訳が分かりません。
Unityの方でも確認しましたが、タップ判定がでています。
訳が分からないので、画面をタップし続けていると
タップ判定がでました!
数値を見るとX0、Y0の時のみ出ています。
再現できるか数回試した所、
0、0の判定のみタップと判断されていました。
計算コードを見ても、フリック量が30より小さいとなっているので、
問題なさそうです。
正直原因はまったくわかりません。(;´o`)
タップで0、0なんて狙ってしかできません。
これではとても操作できない状況です。
色々と試していると
XYのどちらかが30以上になると反応してくれてます。
そこでフリックのスクリプトを修正する事にしました。
if (Mathf.Abs(directionX) < 30 && Mathf.Abs(directionY) < 30)
{
disptext.text = "タップ";
return;
}
if (Mathf.Abs(directionY) < Mathf.Abs(directionX))
{
if (30 < directionX)
{
disptext.text = "右";
}
else if (-30 > directionX)
{
//左向きにフリック
disptext.text = "左";
}
root = true;
}else if (Mathf.Abs(directionX) < Mathf.Abs(directionY))
{
if (30 < directionY)
{
//上向きにフリック
disptext.text="上";
}
else if (-30 > directionY)
{
//下向きのフリック
disptext.text="下";
}
root = true;
}
//全ての分岐を飛ばした場合
if (root == false)
{
Lamp.SetActive(true);
}
}
先にフリック量がXY共に30より小さい場合は
returnする事にしてみます。
上手く反応してくれると良いのですが…
無事にタップ判定がでました。
何度か試しましたが問題なくタップ判定が出ています。(^ё^) ♪♪
早速、2048のスクリプトを修正します。
//フリックの方向を取得
void GetDirection()
{
float directionX = touchEndPos.x - touchStartPos.x;
float directionY = touchEndPos.y - touchStartPos.y;
if (Mathf.Abs(directionX) < 30 && Mathf.Abs(directionY) < 30)
{
//タッチ判定なら
input = false;
return;
}
if (Mathf.Abs(directionY) < Mathf.Abs(directionX))
{
if (30 < directionX)
{
//右向きにフリック
Direction = "right";
DestinationR();
}
else if (-30 > directionX)
{
//左向きにフリック
Direction = "left";
DestinationL();
}
}
else if (Mathf.Abs(directionX) < Mathf.Abs(directionY))
{
if (30 < directionY)
{
//上向きにフリック
Direction = "up";
DestinationU();
}
else if (-30 > directionY)
{
//下向きのフリック
Direction = "down";
DestinationD();
}
}
else
{
//フリック量が30以上でXY同量なら
input = false;
return;
}
gameManager.Moving();
}
これで様子をみてみます。
ビルドしてゲーム開始です。
タップしてからフリック…
おお!
ちゃんと動いてます。(^-^)V イエー
一時はどうなるかと思いましたが修正できました。
しかし…
よくよく考えてみると
if(a<b)
{
処理Aを実行
}else if(b<a)
{
処理Bを実行
}else
{
処理Cを実行
}
これってaよりbが大きければAの処理
違った場合は、もしbよりaが大きければBの処理
どちらでもなければCの処理
って事ですよね。
処理Aの内容が
if (30 < directionX)
{
//右向きにフリック
Direction = "right";
DestinationR();
}
else if (-30 > directionX)
{
//左向きにフリック
Direction = "left";
DestinationL();
}
フリック量が30か-30で判断して処理となります。
処理後、当然分岐から出てしまいます。
となると、元の分岐がif (Mathf.Abs(directionY) < Mathf.Abs(directionX))
XとYのフリック量を比較して、Xが大きい場合
フリック量が30より大きいか
-30より小さいかで判断
条件にあってれば処理実行で分岐終了ですよね。
条件から外れていれば、そのまま分岐終了って事ですよね。
ならXがYよりフリック量が多くて
フリック量が30以下なら処理されないとなりますね~
YよりXが小さくて
XよりYが小さくて
どちらでもなければ…
X=Yの時にしか最後まで行かない事になります。
これ以上は、やめておきます。
頂き物にケチを付けるのは、10万年早いので。
マウス操作だと0、0の状況が簡単に出来ると分かりました。
いい勉強になりました~ ヽ(´▽`)/~♪
追記
2048のフリックのコードを修正した所で間違いがあったので、
修正しました。
フリック判定でX=Yの判定を、分岐の最後にしていましたが、
削除してました。
これが無いと、フリック量30以上でX=Yの条件が成り立つと、
ピースがフリーズします。
本編コードを修正したので確認下さい。
やはり初心者の発見だったので修正しても穴がありました。
コードを貰ったのに偉そうな事を言うもんじゃないですね。
(_ _(--;(_ _(--; pekopeko
この記事へのコメント