🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

2回答

3677閲覧

Unity 「画面フリックの処理」と「長押しの処理」競合しない方法。

rrr66

総合スコア16

C#

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

Unity

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

0グッド

1クリップ

投稿2019/09/05 17:41

キャラクターが自動で走行していて、左右にフリックするとその方向に移動、上にフリックするとジャンプするゲームを作っています。このゲームに画面をタップしている間はキャラクターが減速する機能を付けたいのですが、フリックしたときも減速してしまいます。フリックしたときには減速しないようにしたいのですが、どのようにすればいいのか解りません。減速する機能は画面全体に透明なボタンを設置し、押している間はspeedZを5、離している間はspeedZを10になるようにしてあります。下記がキャラクターをコントロールするスクリプトになります。
関係ない部分も含まれていますが、どこが必要な部分でどこが不必要な部分なのかが解らなかったため、すべて載せてあります。
もし解決策が解る方がいましたらどうかよろしくお願いします。(_ _)

C#

1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4 5public class Yuko_sum_humanoidController : MonoBehaviour 6{ 7 bool push = false; 8 9 public Vector3 touchStartPos; 10 public Vector3 touchEndPos; 11 public string Direction; 12 bool oneplay; 13 14 const int MinLane = -2; 15 const int MaxLane = 2; 16 const float LaneWidth = 1.0f; 17 const int DefaultLife = 3; 18 const float StunDuration = 0.5f; 19 private int coin = 0; 20 21 CharacterController controller; 22 Animator animator; 23 24 Vector3 moveDirection = Vector3.zero; 25 int targetLane; 26 int life = DefaultLife; 27 float recoverTime = 0.0f; 28 29 public float gravity; 30 public float speedZ; 31 public float speedX; 32 public float speedJump; 33 public float accelerationZ; 34 35 public AudioClip CoinGet; 36 37 public int Life() 38 { 39 return life; 40 } 41 42 public int Coin 43 { 44 get { return this.coin; } 45 private set { this.coin = value; } 46 } 47 48 public bool IsStan() 49 { 50 return recoverTime > 0.0f || life <= 0; 51 } 52 53 void Start() 54 { 55 // 必要なコンポーネントを自動取得 56 controller = GetComponent<CharacterController>(); 57 animator = GetComponent<Animator>(); 58 } 59 60 void Update() 61 { 62 if (push == true) 63 { 64 speedZ = 5; 65 } 66 67 if (push == false) 68 { 69 speedZ = 10; 70 } 71 72 { 73 Flick(); 74 } 75 // デバッグ用 76 if (Input.GetKeyDown("left")) MoveToLeft(); 77 if (Input.GetKeyDown("right")) MoveToRight(); 78 if (Input.GetKeyDown("space")) Jump(); 79 if (Input.GetKeyDown(KeyCode.JoystickButton6)) MoveToLeft(); 80 if (Input.GetKeyDown(KeyCode.JoystickButton7)) MoveToRight(); 81 if (Input.GetKeyDown(KeyCode.JoystickButton3)) Jump(); 82 83 if (IsStan()) 84 { 85 // 動きを止め気絶状態からの復帰カウントを進める 86 moveDirection.x = 0.0f; 87 moveDirection.z = 0.0f; 88 recoverTime -= Time.deltaTime; 89 } 90 else 91 { 92 // 徐々に加速しZ方向に常に前進させる 93 float acceleratedZ = moveDirection.z + (accelerationZ * Time.deltaTime); 94 moveDirection.z = Mathf.Clamp(acceleratedZ, 0, speedZ); 95 96 // X方向は目標のポジションまでの差分の割合で速度を計算 97 float ratioX = (targetLane * LaneWidth - transform.position.x) / LaneWidth; 98 moveDirection.x = ratioX * speedX; 99 } 100 101 // 重力分の力を毎フレーム追加 102 moveDirection.y -= gravity * Time.deltaTime; 103 104 // 移動実行 105 Vector3 globalDirection = transform.TransformDirection(moveDirection); 106 controller.Move(globalDirection * Time.deltaTime); 107 108 // 移動後接地してたらY方向の速度はリセットする 109 if (controller.isGrounded) moveDirection.y = 0; 110 111 // 速度が0以上なら走っているフラグをtrueにする 112 animator.SetBool("Running@loop", moveDirection.z > 0.0f); 113 } 114 115 public void PushDown() 116 { 117 push = true; 118 } 119 120 public void PushUp() 121 { 122 push = false; 123 } 124 125 // 左のレーンに移動を開始 126 public void MoveToLeft() 127 { 128 if (IsStan()) return; 129 if (controller.isGrounded && targetLane > MinLane) targetLane--; 130 } 131 132 // 右のレーンに移動を開始 133 public void MoveToRight() 134 { 135 if (IsStan()) return; 136 if (controller.isGrounded && targetLane < MaxLane) targetLane++; 137 } 138 139 public void Jump() 140 { 141 if (IsStan()) return; 142 if (controller.isGrounded) 143 { 144 moveDirection.y = speedJump; 145 146 // ジャンプトリガーを設定 147 animator.SetTrigger("Jumping@loop"); 148 } 149 } 150 151 // CharacterControllerにコンジョンが生じたときの処理 152 void OnControllerColliderHit(ControllerColliderHit hit) 153 { 154 if (IsStan()) return; 155 156 if (hit.gameObject.tag == "Enemy") 157 { 158 // ライフを減らして気絶状態に移行 159 life--; 160 recoverTime = StunDuration; 161 162 // ダメージトリガーを設定 163 animator.SetTrigger("Damaged@loop"); 164 165 // ヒットしたオブジェクトは削除 166 Destroy(hit.gameObject); 167 } 168 if (hit.gameObject.tag == "Coin") 169 { 170 coin++; 171 172 // Destroy(hit.gameObject);// 173 174 AudioSource.PlayClipAtPoint(CoinGet, transform.position); 175 } 176 } 177 178 private void OnTriggerEnter(Collider collision) 179 { 180 // 物体がトリガーに接触しとき、1度だけ呼ばれる 181 Destroy(collision.gameObject); 182 coin++; 183 AudioSource.PlayClipAtPoint(CoinGet, transform.position); 184 } 185 186 void Flick() 187 { 188 if (Input.GetKeyDown(KeyCode.Mouse0)) 189 { 190 touchStartPos = new Vector3(Input.mousePosition.x, 191 Input.mousePosition.y, 192 Input.mousePosition.z); 193 } 194 195 if (Input.GetKeyUp(KeyCode.Mouse0)) 196 { 197 touchEndPos = new Vector3(Input.mousePosition.x, 198 Input.mousePosition.y, 199 Input.mousePosition.z); 200 GetDirection(); 201 } 202 } 203 204 void GetDirection() 205 { 206 float directionX = touchEndPos.x - touchStartPos.x; 207 float directionY = touchEndPos.y - touchStartPos.y; 208 //xがyより絶対値が大きい時。 209 if (Mathf.Abs(directionY) < Mathf.Abs(directionX)) 210 { 211 if (30 < directionX) 212 { 213 //右向きにフリック 214 Direction = "right"; 215 216 } 217 if (-30 > directionX) 218 { 219 //左向きにフリック 220 Direction = "left"; 221 } 222 //yがxより絶対値が大きい時。 223 } 224 else if (Mathf.Abs(directionX) < Mathf.Abs(directionY)) 225 { 226 if (30 < directionY) 227 { 228 //上向きにフリック 229 Direction = "up"; 230 } 231 if (-30 > directionY) 232 { 233 //下向きのフリック 234 Direction = "down"; 235 } 236 } 237 else 238 { 239 //タッチを検出 240 Direction = "touch"; 241 } 242 switch (Direction) 243 { 244 case "up": 245 //上フリックされた時の処理 246 Jump(); 247 break; 248 249 case "down": 250 //下フリックされた時の処理 251 break; 252 253 case "right": 254 //右フリックされた時の処理 255 MoveToRight(); 256 break; 257 258 case "left": 259 //左フリックされた時の処理 260 MoveToLeft(); 261 break; 262 263 case "touch": 264 //タッチされた時の処理 265 break; 266 } 267 268 } 269}

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

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

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

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

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

guest

回答2

0

画面に指が触れた時点では、それがタップなのかフリックなのかを判断することは不可能です。
ということで取ることのできる対策としては、

  • 移動してフリックと判断された時点で、画面に指が触れた時点に画面を戻す
  • 減速の動作はフリックと判断できるまで待つ
  • フリックと判断された時点で減速を止めるだけ
  • タップで減速、あるいはフリックで減速しないというインターフェースをあきらめる
  • 別にフリックで減速してもいいやん、と開き直る

というぐらいでしょうか。

投稿2019/09/05 23:55

y_waiwai

総合スコア88038

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

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

0

ベストアンサー

長押しって何秒以上押すことが長押しなんでしょうか?
ほんの一瞬でも触れるだけで長押しとして判定するのなら、
長押しせずにフリックすることは不可能ですよね

では、フリックと長押しの違いとして、フリックは何秒ぐらいで画面から指を離すんでしょうか
あるいは、長押しはどのぐらいの移動距離以下で、フリックはどのぐらいの距離を指が移動するんでしょうか
いろんな端末を想定するのなら、タブレットと小型端末ではこの距離も変わってきますね

長押しを、一定秒数以上画面に触れることで、指の移動距離が一定値以下であること
このように定義して、この一定秒や一定距離をテストプレイを繰り返していい感じの値を探す必要があります

投稿2019/09/05 19:25

izmktr

総合スコア2856

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問