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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

0回答

978閲覧

UnityでロングタップをしすぎたらOUTになるプログラムを組みたい。

ichigo_0308

総合スコア41

Unity

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

0グッド

0クリップ

投稿2020/09/29 08:50

<実現したいこと>

ロングタップをしすぎたら(誤差が許容範囲を超えたら)if文でfalseになるようにしたい。

<エラー>

なぜか許容範囲より誤差が大きくなってもtrueになる。

<ソースコード>

C#

1using System; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6using UnityEngine.SceneManagement; 7 8 9public class GameScript : MonoBehaviour 10{ 11 // ロングタップ判定で使用する変数 12 float longTapTime = 2.0f; // 実行直後は、longTapTimeを過ぎると、ロングタップとみなされる 13 // 1回目の問題が終わると、タップする目標時間 14 float nowTapTime; // タップし始めてから現在までの時間 15 float nowTapTime2; 16 float safeTime = 0.5f; // 目標時間に対して許容される誤差 17 bool isLongtap; // ロングタップ中かどうか(タップする時間がlongTapTimeを越えるとtrueになる) 18 bool isLongtapclear; // ロングタップが終わったか 19 float outTime; 20 float outTime2; 21 22 // ゲームで使用する変数 23 int challengecount; // 挑戦回数 24 int clearcount=0; // クリアした回数 25 int level; // 難易度 26 bool startflag = false; // ゲーム開始されていたらtrue。開始前(カウントダウン中も含む)ならfalse; 27 public string count; // 秒読みで表示する値 28 29 // デバッグ用表示テキスト 30 private Text countText; // カウントダウン表示 31 private Text Text1; // longTapTime表示(ロングタップとみなされる時間) 32 private Text Text2; // safeTime表示(タップ時間の許容誤差) 33 private Text Text3; // clearCount表示(クリアした回数) 34 private Text Text4; // nowTapTime(現在のタップ時間) 35 private Text Text5; // nowTapTime2(判定後のタップ時間) 36 private Text Text6; // 説明のText 37 public string Text1s; // longTapTime 38 public string Text2s; // safeTime 39 public string Text3s; // clearCount 40 41 public Slider slider; 42 public AudioClip clearClip; 43 public AudioClip outClip; 44 public AudioSource audioSource; 45 public bool Startb=false; 46 public bool gameStartB = false; 47 bool stopstart; 48 // Start is called before the first frame update 49 void Start() 50 { 51 52 // 表示するTextのセット 53 countText = GameObject.Find("CountText").GetComponent<Text>(); 54 Text1 = GameObject.Find("LongtapTimeText").GetComponent<Text>(); 55 Text2 = GameObject.Find("SafeTimeText").GetComponent<Text>(); 56 Text3 = GameObject.Find("clearcount").GetComponent<Text>(); 57 Text4 = GameObject.Find("NowTapTime").GetComponent<Text>(); 58 Text5 = GameObject.Find("結果text").GetComponent<Text>(); 59 60 61 level = PlayerPrefs.GetInt("level"); 62 kabe(); // レベルに合わせて許容誤差を計算 63 count3(); // カウントダウン開始 64 65 // Textの初期値 66 Text1s = longTapTime.ToString(); 67 Text2s = safeTime.ToString(); 68 Text3s = clearcount.ToString(); 69 70 } 71 72 // Update is called once per frame 73 void Update() 74 { 75 Text1.text = "目標:"+Text1s; 76 Text2.text = "許容範囲:" + Text2s; 77 Text3.text = "clearcount: " + Text3s; 78 Text5.text = null; 79 if (startflag) 80 { 81 gameStartB = true; 82 // ゲームが開始されていたら.... 83 Text1.text = "目標:" + Text1s; 84 Text2.text = "許容範囲:" + Text2s; 85 Text3.text = "clearcount: " + Text3s; 86 if (Input.GetMouseButton(0)) 87 { 88 slider.maxValue = longTapTime; 89 slider.value = nowTapTime; 90 // ボタンが押されていたら... 91 isLongtapclear = false; // ロングタップが終わっていない状態にして 92 Text1.text = "目標:" + Text1s; 93 Text2.text = "許容範囲:" + Text2s; 94 Text3.text = "clearcount: " + Text3s; 95 nowTapTime += Time.deltaTime; // 秒数をカウント 96 Text4.text = nowTapTime.ToString(); 97 98 // タップし続けた時間が規定値を超えたらロングタップとして扱う 99 if (nowTapTime >= longTapTime && !isLongtap) 100 { 101 isLongtap = true; // ロングタップしたフラグを立てる // Prefabの作成 102 Debug.Log("Long Tap"); 103 } 104 105 106 107 } 108 else if (Input.GetMouseButtonUp(0)) 109 { 110 // 「ボタンが離されたら、時間を測って、結果表示」をUpdate()内で行うため、 111 // WaitASecond()から以下の部分を移動 112 outTime = longTapTime - safeTime; 113 outTime2 = longTapTime + safeTime; 114 if (safeTime<(nowTapTime-outTime) &&(safeTime<(nowTapTime+outTime2) &&!isLongtapclear)) 115 116 { 117 nowTapTime2 = nowTapTime; 118 audioSource.PlayOneShot(clearClip); 119 isLongtapclear = true; 120 Debug.Log("tapclear!"); 121 longTapTime = UnityEngine.Random.Range(2, 6); 122 Text1.text = Text1s; 123 clearcount += 1; 124 Text3.text = "clearcount: " + Text3s; 125 Text1s = longTapTime.ToString(); 126 Text2s = safeTime.ToString(); 127 Text3s = clearcount.ToString(); 128 challengecount = challengecount + 1; 129 if (challengecount > 10) 130 { 131 PlayerPrefs.SetInt("clearcount", clearcount); 132 SceneManager.LoadScene("ResultScene"); 133 } 134 startflag = false; 135 stopstart = true; 136 137 } 138 else 139 { 140 nowTapTime2 = nowTapTime; 141 audioSource.PlayOneShot(outClip); 142 Debug.Log("OUT"); 143 challengecount = challengecount + 1; 144 if (challengecount > 10) 145 { 146 PlayerPrefs.SetInt("clearcount", clearcount); 147 SceneManager.LoadScene("ResultScene"); 148 } 149 stopstart = true; 150 151 } 152 153 154 // クリックを終えたら初期化 155 nowTapTime = 0; 156 isLongtap = false; 157 } 158 if(Input.GetMouseButtonUp(0)&&!isLongtap) 159 { 160 161 startflag = false; 162 stopstart = true; 163 } 164 } 165 if (Input.GetMouseButtonDown(0) && !startflag&&gameStartB) 166 { 167 Startb = true; 168 } 169 else if(!startflag&&gameStartB) 170 { 171 Startb = false; 172 } 173 if(stopstart&&Startb) 174 { 175 count3(); 176 } 177 else if(stopstart&&!Startb) 178 { 179 Text5.text = nowTapTime2.ToString(); 180 } 181 } 182 public void kabe() 183 { 184 185 if(level==1) 186 { 187 safeTime = 0.75f; 188 } 189 if(level==2) 190 { 191 safeTime = 0.5f; 192 } 193 if(level==3) 194 { 195 safeTime = 0.25f; 196 } 197 198 Debug.Log(safeTime); 199 } 200 201 public void count3() 202 { 203 stopstart = false; 204 count = "3"; 205 countText.text = count; 206 Invoke("count2", 1); 207 } 208 public void count2() 209 { 210 count = "2"; 211 countText.text = count; 212 Invoke("count1", 1); 213 } 214 public void count1() 215 { 216 217 count = "1"; 218 countText.text = count; 219 Invoke("start", 1); 220 } 221 public void start() 222 { 223 count = "start!"; 224 countText.text = count; 225 Invoke("startsetting", 1); 226 } 227 public void startsetting() 228 { 229 countText.text = ""; 230 startflag = true; 231 232 } 233 234 235}

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

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

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

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

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

sakura_hana

2020/09/30 00:09

どの変数をtrue/falseにしたいのですか? 例えば「isLongtap」が対象なら、許容範囲より誤差が大きくなったらfalseになるコードがどこにも無いので当然falseになりません。
ichigo_0308

2020/10/02 07:33

true/falseではありませんでした。私はif文のことを指したくてtrue/falseと書きました。編集します。
U_U_Jenkins

2020/10/07 04:08

正直に言いますと、bool型を多用しているので何が何だかわかりません。 また、UIに関する処理とタップ関係の処理、 纏めてしまうと情報量がエグくなって分かりづらいです。 綺麗なコーディングが出来ないのであれば バグ部分の該当箇所がわかるようもう少し工夫してください。 自分で書いたコードなので自分でこの部分がおかしいと思った部分を抜擢するとか出来たはずです。 例えば 「なぜか許容範囲より誤差が大きくなってもtrueになる。」 これはつまり、 if (safeTime<(nowTapTime-outTime) &&(safeTime<(nowTapTime+outTime2) &&!isLongtapclear)) を指していますか?これすら分かりづらい。 また、あなたのやってる行為はほぼ丸投げです。 ソースコード貼って、〇〇したい。なぜかエラーになる。 だけだと、回答者は少ないと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問