前提・実現したいこと
3*3のマスの上をフリック入力に応じて上下左右に一マスずつ移動させたい
発生している問題・エラーメッセージ
キャラクターが止まらずに移動し続けてしまう
試行錯誤した結果どうにかこうにか想定する動きをするようにはなったがプログラム上問題がないのかが初心者の自分では分からないため改善案(それに繋がる考え方)を教えてほしい
該当のソースコード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { private Vector3 pos; // プレイヤー座標 private Vector3 touchStartPos; //フリック開始地点の座標 private Vector3 touchEndPos; //フリック終了地点の座標 private string Direction; //フリック方向を代入する変数 private bool isMove; //フリックを感知した場合trueにその後一連の処理が終わったらfalse // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (isMove) { Move(); } //フリックを感知するとMoveが呼び出される else { Flick(); } //フリックを感知していない時及びMove処理終了後Flickが呼び出される } void Flick() { //操作を入力しつつGetDirectionを呼び出す 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); GetDirection(); } } void GetDirection() { //入力された座標情報からフリック方向を判別 float directionX = touchEndPos.x - touchStartPos.x; float directionY = touchEndPos.y - touchStartPos.y; if (Mathf.Abs(directionY) < Mathf.Abs(directionX)) { if (30 < directionX) { //右フリック Direction = "right"; } else if (-30 > directionX) { //左フリック Direction = "left"; } } else if (Mathf.Abs(directionX) < Mathf.Abs(directionY)) { if (30 < directionY) { //上フリック Direction = "up"; } else if (-30 > directionY) { //下フリック Direction = "down"; } } else { //タッチ Direction = "touch"; } if (Direction == null || Direction == "touch") { return; } //フリック以外の操作を感知した場合ここで処理が終了 isMove = true; //フリックの場合trueを返してMoveを呼び出す } void Move() //プレイヤーキャラの移動 一マスずつ(指定量だけ)移動させたい { pos = transform.position; switch (Direction) { case "up": if (pos.y >= 1.5) //中段もしくは上段にいる時 { if (pos.y <= 4.45) //上段でストップ { pos.y += 3f; //動かす量 } } else { //下段にいる時 if (pos.y <= 1.45) //中段でストップ { pos.y += 3f; } } break; case "down": if (pos.y <= 1.5) //中段下段にいる時 { if ( pos.y >= -1.45) //下段でストップ { pos.y -= 3f; } } else { //上段にいる時 if (pos.y >= 1.55) //中段でストップ { pos.y -= 3f; } } break; case "right": if (pos.x >= 1.5) //中列もしくは右列にいる時 { if (pos.x <= 4.45) //右列でストップ { pos.x += 3f; } } else { //左列にいる時 if (pos.x <= 1.45) //中列でストップ { pos.x += 3f; } } break; case "left": if (pos.x <= 1.5) //左列中列にいる時 { if (pos.x >= -1.45) //左列でストップ { pos.x -= 3f; } } else { //右列にいる時 if (pos.x >= 4.45) //中列でストップ { pos.x -= 3f; } } break; case "touch": Debug.Log("touch"); break; } transform.position = pos; isMove = false; //Update内のMove呼び出しをストップしFlickを呼び出す。これを書かないとMoveが呼び出され続けてしまう? } } ```C# ```参照したサイト様 フリック操作 [リンク](https://qiita.com/pilkul/items/e8864882b3f7e59b05e3) [リンク](https://note.com/08_14/n/nafc374d02a83) オブジェクトを止める方法 [リンク](https://teratail.com/questions/93794)(二点間の距離) [リンク](https://teratail.com/questions/143461)(指定の位置) ### 試したこと 0. 移動前の座標と移動後の座標を比較して一定の距離がある場合対象の動きを止める←移動後(移動中)の座標が分からず断念 0. 直接座標を指定して移動させる←現在位置を参照できず断念(斜め移動になってしまう) 0. 座標に条件を付ける←現在試している(今回記載の)やり方、条件2の処理を完了した後に条件1を満たしてしまい条件1の処理まで行われてしまう 具体的には条件1if(pos.y >= 1.5){}、条件2if(pos.y < 1.5){} 条件2の処理をするとpos.y >= 1.5 となり条件2の処理の後に条件1の処理まで行われてしまう それに対しreturnで処理を中断する方法を試したが全ての条件で一切処理が行われなくなってしまい断念 ### 補足情報(FW/ツールのバージョンなど) Unity2020 3.2f1 Visual Studio 2019 for Mac
回答1件
あなたの回答
tips
プレビュー