実現したいこと
・Unity2Dでオブジェクトをタップ→上下左右いずれか一か所に何もなければその箇所に移動
という処理をしたいです。
以下の左側のように、下一か所だけ空いている場合はオブジェクトが下に移動してくれるのですが、
画像右側のように斜め方向(2)に空いた箇所があると、そこに斜め移動してしまいます。これを斜め移動せず、真っすぐの方向(1)に移動するようにしたいです。
該当のソースコード
private void PieceMoving() { //上にRayを飛ばす RaycastHit2D hitUp = Physics2D.Raycast(transform.position + Vector3.up, Vector2.up, 0.1f); //下にRayを飛ばす RaycastHit2D hitDown = Physics2D.Raycast(transform.position + Vector3.down, Vector2.down, 0.1f); //右にRayを飛ばす RaycastHit2D hitRight = Physics2D.Raycast(transform.position + Vector3.right, Vector2.right, 0.1f); //左にRayを飛ばす RaycastHit2D hitLeft = Physics2D.Raycast(transform.position + Vector3.left, Vector2.left, 0.1f); //上に何もなければ上に移動する if (!hitUp) { transform.position += new Vector3(0, 1.5f, 0); Debug.Log("上に移動した"); } //下に何もなければ下に移動する else if (!hitDown) { transform.position -= new Vector3(0, 1.5f, 0); Debug.Log("下に移動した"); } //右に何もなければ右に移動する else if (!hitRight) { transform.position += new Vector3(1.5f, 0, 0); Debug.Log("右に移動した"); } //左に何もなければ左に移動する else if (!hitLeft) { transform.position -= new Vector3(1.5f, 0, 0); Debug.Log("左に移動した"); } } private void OnMouseDown() { PieceMoving(); }
試したこと
以下のように各条件にフラグを立てて、フラグがfalseなら移動し、trueにする。のちにfalseに戻し…という風にしてみましたが、上手くいきませんでした。
else if (!hitLeft&&move==false) { transform.position -= new Vector3(1.5f, 0, 0); Debug.Log("左に移動した"); move = true; }
上記コードに至った経緯
else if文は上から順に条件を確認していき、途中で当てはまったらif条件を抜けるという解釈をしています。
そのため、自分のイメージでは、『上に何かあった→下に何かあった→右に何もなかった→移動→if文を抜ける』という形になるのではないかなと思っています。
なので、仮に下と斜め右下に二つ空いている箇所があっても、『上に何かあった→下に何もなかった→移動→if文抜ける』になるのでは?と疑問です。
それとも今の状況は、『上に何かあった→下に何もなかった→移動→if文抜ける』『上に何かあった→下に何かあった→右に何もなかった→移動→if文を抜ける』を同時に行ってしまっている感じなのでしょうか?
下に移動している最中に、右に何かあるかの判定をしちゃってるみたいな…。
ソースコードをどうすればよいのか、ご教授いただければ幸いです。
また、もしよろしければ、自分の解釈に関しても、誤っている点等ありましたら、そちらもご教授いただきたいです。よろしくお願いします!
※追記
頂いたコメントから検証したところ、PieceMoving()自体が二回呼ばれていることがわかりました。
そこで、本来はタッチするたびに移動させたいのですが、試しにPieceMoving()を一回だけ呼ぶ風にしてみました。
bool move=true; private void PieceMoving() { if(move==true) { //上にRayを飛ばす RaycastHit2D hitUp = Physics2D.Raycast(transform.position + Vector3.up, Vector2.up, 0.1f); //下にRayを飛ばす RaycastHit2D hitDown = Physics2D.Raycast(transform.position + Vector3.down, Vector2.down, 0.1f); //右にRayを飛ばす RaycastHit2D hitRight = Physics2D.Raycast(transform.position + Vector3.right, Vector2.right, 0.1f); //左にRayを飛ばす RaycastHit2D hitLeft = Physics2D.Raycast(transform.position + Vector3.left, Vector2.left, 0.1f); //上に何もなければ上に移動する if (!hitUp) { transform.position += new Vector3(0, 1.5f, 0); Debug.Log("上に移動した"); } //下に何もなければ下に移動する else if (!hitDown) { transform.position -= new Vector3(0, 1.5f, 0); Debug.Log("下に移動した"); } //右に何もなければ右に移動する else if (!hitRight) { transform.position += new Vector3(1.5f, 0, 0); Debug.Log("右に移動した"); } //左に何もなければ左に移動する else if (!hitLeft) { transform.position -= new Vector3(1.5f, 0, 0); Debug.Log("左に移動した"); } } move=false; } private void OnMouseDown() { PieceMoving(); }
これで一回オブジェクトに触った後、二回目触れてもPieceMoving()は呼ばれなくなりました。
しかし、一回触ったときに、PieceMoving()が二回呼ばれている感じになってしまいます。

回答1件
あなたの回答
tips
プレビュー