【Unity】スマホのフリック判定がおかしい

2019/10/19追記・修正 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 Vec…

続きを読む

【Unity】2048スコアの実装

2019/10/18追記 いよいよ最終のスコア実装でっす。 スコアの実装なんて今までの処理に比べたら楽勝ρ(^^ )♭ と高を括っていたのですが… 適当に実装して、PLAYしたらとんでも無い事になりました。 移動後に残っているピースの点数を合計していったら、 あっと言う間に天文学的数字に ( ゜.゜) ポカーン こんなスコアの入り方でしたっけ( ̄~ ̄;) ウーン 少し調べないと行けません。 Google先生にお伺いを立てたのですが、 どこにもスコア計算の情報が出ておりません。 更に調べると、どうやら結合したピースのみ得点するようです。 そら、全部のピースを合計したら天文学的数字になるはずでっす。 (~-~;)ヾ(-_-;) オイオイ 完全に舐めてました。 改めて実装していきます。 エディターでテキストのオブジェクトを設置から もはや適当に作ってますが、こんな感じで良いでしょう。 このテキストをスクリプトから操作すれば無問題。 スクリプトを修正していきます。 GameManager using UnityEngine.UI; public class GameManager : MonoBehaviour { private int SCORE=0; //スコア private int HI_SC…

続きを読む

【Unity】2048ゲームオーバーの判定

操作系の処理も完成して? バグとか出そうな気もするのですが… ま、完成したと言うことにします。 (;^o^) \(ToT )あんたほんとにそれでいいの いよいよ大詰めのゲームオーバーの処理を作って行こうと思います。 2048のゲームオーバーは ・全マスが埋まる ・ピースが動けない状態 この二つを判定する必要があるかと思います。 さて、どのタイミングで判定をするかが問題かと… ピース移動の度に呼び出すと重くなりそうですし、 ピース生成の度に呼び出すのもちょっと… 少しフローもどきを見て流れを考えます 全ての流れはSelectPosition()で終了を迎えます。 更にこのメソッド //空きマスからランダムに2カ所を選ぶ public void SelectPosition() { List<int> list = new List<int>(); int num = 2; int rot = 0; for(int i = 0; i < 16; i++) { if (Flag[i] == false) { list.Add(i); } …

続きを読む

【Unity】2048ピース移動中のフリックキャンセル

2019/10/15追記・修正 2019/10/18追記②・削除 フリック入力の調整ができました。 かなり複雑なので、うまく説明できないかもしれませんが、 書いていきたいと思います。 ピースの移動中にフリック入力ができてしまう! このスクリプトには致命的な欠陥です。 ピースのポジションを確認しながら移動計算を 行う為、移動中の座標を読み込むとエラーが発生します。 なのでフリック入力管理は必須事項でっす。 以前、ピースの移動判定、 Move=true なら入力をキャンセルしていましたが、 ピース毎にスピードが違い、先に停止したピースは、 入力を受け付けてしまう事になります。 ピース全体の動きを認識させるにはどうすればいいのでしょう… 少しコードの流れを見てみる事に… フローと呼べるほどの物でもないんですが、 流れを図にしてみました。 コードだけを見ていると分かりにくいのですが、 図にすると見えてきそうでっす(^ё^) ♪♪ 各ピースの共有部分は、GameManager側の移動検知~ピース生成までです。 フリック入力後、ピースが生成されるまでキャンセルを掛ければ対応できそうです。 まず、フリック入力を判断するようにしてみます。 PieceManager private bool input ; //フリックの入力フラグ …

続きを読む

【Unity】2048ピース移動後の自動生成

おおよそのピース移動時間が分かったので、 ピースの生成処理を作成していきます。 まず、ピースが移動開始したら生成用のメソッドを呼び出すのですが、 複数のピースが動くと、その数だけ生成が呼び出されます。 2個のピースが動いたら4個生成される事に 8個くらい動くとトンデモナイ事に(((p(>o<)q))) いやぁぁぁ なので、ピースからの信号を1つ受けたら 後は、無視できるようにします。 GameManager private bool signal = true; //コルーチン呼び出しフラグ //ピース移動の合図 public void PieceSignal() { if (signal) { signal = false; } } こんな感じにしておけば、一度だけ呼び出す事ができます。 これで移動の合図を受け取る事ができるので、 これを元にウェイトを掛けて処理を行います。 GameManager //ピース移動後から生成までのコルーチン IEnumerator WaitCreatePiece() { yield return new WaitForSeconds(waittime); …

続きを読む

【Unity】処理時間の計測

ランダムにピースを生成する所まではできました。 後はピース停止後に呼び出せばいいだけなのですが… 問題はピース毎に動きの早さが違う事です。 停止後、ポジションの更新を行う為、 移動中のピースのポジションは反映されません。 早いピースが生成を呼び出しても、移動中のピースがあれば、 ピース生成後に移動完了となってしまいます。 ピースの生成処理にウェイトを掛けるにしても、 どれくらいの秒数必要なのか考えないと行けません(_ _ ??)/◇ ワカラン・・・ そこで、今回は処理毎にどれくらいの時間が掛かるのか計測してみます。 まず、移動メソッドの内容を確認します。 ・フリック判定を検知 Moveをtrue にする ・FixedUpdateで Move=trueなら移動メソッドを呼び続ける ・移動先に到着 Moveをfalse にする こんな感じで成り立っています。 実はUpdateを使わず、FixedUpdateにしたのは、 違いがあるからなんです。 Update:毎フレーム呼び出し FixedUpdate:定期的に呼び出し Unityのフレームは60fpsだそうです。 しかし、フレームっていい加減ですよね~ 機種や性能に左右される… スマホなら30fpsに落ちるとかなんとか… なので、定期呼び出しのFixedUpdateで処理しました。 では、FixedUpdateの定期って、どれくらいでしょう。 調…

続きを読む

【Unity】2048空きマスをランダムに選ぶ

2019/11/15修正・追記 ここまで、手探りでコードを作ってきた為、 ブログに挙げたコードの修正が多くて申し訳ないです。 (_ _(--;(_ _(--; pekopeko 今日も前記事の修正を入れました。 出来たと思って、即ブログはやはり危険なようですね~(;^_^A アセアセ さて、本題に戻ります。 ピース移動は完成したので、いよいよピースの生成と行きたいのですが… 2048ではピースを二つ生成しないといけません。 空きマスからランダムに2カ所を選択する必要があります。 まず、空きマスを調べる所から始めます。 List<int> list = new List<int>(); for(int i = 0; i < 16; i++) { if (ポジションi==空きマス) { list.Add(i); } } こんな感じでList変数に取り出してみます。 以前、ピースの有無をFlag変数で保存しようと思っていましたが、 2次元配列なので、配列に変更します。 それに伴って修正箇所があるので、全て修正します。 GameManager private bool[] Flag = new boo…

続きを読む

【Unity】2048ピースの上限を決める

2019/10/9一部修正 移動から結合までの処理が出来るようになって、 初めてピースの上限が必要な事に気が付きました(-_-)ゞ゛ウーム ピースをクローン生成してる状況では、上限を設定する必要があります。 いろいろ調べて分かったのですが、ピースを固定した生成ではなくて 色パネルを準備して、数値を表示するやり方なら上限を設定しなくても 条件に合わせてパネル生成して数値を表示すれば無限に作れるみたいです。 今回はピース単位でプレハブから生成している為、 無限に作り出せない状況です。 なのでピースの上限を設定して行こうと思います。 ピースの移動は計算関数で行っています。 同ピースなら重なるように計算しているので、 Maxピースなら重ならないように処理するように変更します。 //右方向の移動計算 void DestinationR() { int temp = 0; int pos = 0; if (LineX<=2) { for (int i = 3; LineX<= i; i--) { if (AxisX[i] == 0) { pos++; …

続きを読む

【Unity】2048ピースの結合

2019/10/8追記・修正 ピースの移動が出来るようになったので、 当然のピース結合処理を作成します。 以前作った衝突判定です。 //コラインダーが何かに衝突 private void OnCollisionEnter2D(Collision2D collision) { Move = false; } ピース同士の接触で移動を停止していましたが、 必要が無くなりました。 衝突判定は生きているので、リサイクルして結合を作ってみます。 結合に必要な動きは ・同ピースが接触したら現ピースを消去 ・消去したピースの次番のピースを生成 でしょうか。 まず、同ピースしか重ならないのですが、 念のため同ピースなら消去を実装します。 private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "No" + PieceNo) { Destroy(this.gameObject); return; } } タグは1番ピースなら”No1”のようにピースNoをタグにします。 衝突ピースが同タグならオブジェクト消去です。 ピ…

続きを読む

【Unity】2048ピース移動の実装(その2)

2019/10/9追記・一部修正 ある程度、準備ができたので、 移動用の計算関数を導入して行こうと思います。 移動の処理は以前作った物を流用するのですが、 Moveがtrueの時に+15のtransformを行っており、 移動するマス数が分かっても、数値を直接入力する事が出来ません。 マス移動をPosition変数から座標を読み取っても、 移動処理を書き直さなくてはダメです。 非常に面倒なので、ここでMathf.Clampを利用したいと思います。 右移動のコマンドを例に posX = Mathf.Clamp(transform.localPosition.x + 15, Min, Max); 現座標+15が移動スピード Minが最小座標 Maxが最大座標 設定では、 Min=-150; Max=150; としているのですが、 この大小値にマス移動の数値を代入してやります。 例えば、Position0にあるピースが計算で2マス移動すると出た場合、 Max=50;としてやれば、それ以上は動かない事になります。 これを元に移動マスの計算を導入してみます。 まず、 private const float Min = -150; //移動範囲下限 private const float Max = 150; …

続きを読む