質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1800閲覧

Unityでフリック操作に応じて一マスずつ移動させたい

Lulucaf

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/04/09 22:25

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyooo_

2021/04/10 23:36

・キャラクターが止まらずに移動し続けてしまう ・試行錯誤した結果どうにかこうにか想定する動きをするようにはなったが... とありますが、理想の動作は実装出来ている感じですかね?それとも、ある程度は動くけど、もっと理想に近づけたいって感じですか?
Lulucaf

2021/04/11 09:46

反応ありがとうございます。 わかりづらくてすみません。 一応理想の動き自体はできるようになったのですが、試行錯誤しているうちにたまたまできたようなもので、自分でもきちんと理解できていないためこれでやり方が合っているのかどうか(間違いに気付けず学習してしまうのが怖いため)、またもっと良いやり方があるのであればそのやり方を教えていただきたく質問した次第です。
guest

回答1

0

ベストアンサー

極論、バグ無く動けばそれが正解です。
ただ「ここをこう直したらもっと綺麗になりそう」という点を挙げます。


これだとMoveをUpdate内で呼ぶ意味が感じられません。GetDirectionの最後で呼べばいいのでは。
(Update内に置くということはif文で制御しないと何度も呼ばれます)


プレイヤーの位置管理について、どのマスにいるかをVector2で管理してもいいと思います。
左下を(0,0)、右上を(2,2)として、
例えば右にフリックされた時はmas.x += 1;、但し2を超えていたら2のままとする。
最終的にtransform.position = new Vector3(mas.x * 1.5f, mas.y * 1.5f, 0.0f);などとすれば各マスが示す座標に移動出来るかと。


あとintとfloatとdoubleが混在しているので型を気にする癖を付けた方がいいです。
(計算式で使った時に混乱する恐れがあります)
if (30 < directionX)if (30.0f < directionX)(30はint)
if (pos.y >= 1.5)if (pos.y >= 1.5f)(1.5はdouble)

投稿2021/04/11 10:38

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lulucaf

2021/04/11 13:35

とてもわかりやすい回答をありがとうございます。 こちらの求めている答え+αのところまで触れてくださったのでベストアンサーにいたしました。 初めは投稿をするか迷いましたが自分では気付けないところまでご指摘くださったので質問をして良かったと思いました。 ご指摘の点についてよく反芻したいと存じます。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問