以前タイミングが同じ時ノーツを横並びにしたいと質問させて頂いた者です。質問タイトルが長くて恐縮ですが、以前から悩まされていることが二つあり、同時押しの時に対応するボタンを押しても片方が反応せず流れていってしまう問題と、16分など狭い間隔で同じボタンを2回連打する配置の時後続のノーツが巻き込まれて勝手に判定されてしまう問題です。
###起きている問題
・横一列に並んだノーツを同時押しで処理する際、片方が反応しないでそのまま画面外へ流れていってしまう
・16分のリズムでボタンを押す際、同じレーン上でこの操作を行うと後ろにあるノーツが勝手に判定されてしまう
###エラーメッセージなど
エラーメッセージはありませんが、反応しない原因は配列を使用してタイミングデータとノーツ番号を記録しており、一個判定されると次のノーツへ判定が移る仕組みを使用していることではないかと考えています。
□□と並んでいるとき、左側が先に生成される場合左のノーツに当てられた番号1を先に処理する流れとなっているため、同時のタイミングで押すと右側の2が割り当てられたノーツの処理をする流れになっていないせいで1だけ反応し2での無反応が起こるということです。
巻き込まれることについては、一瞬この判定プログラムを停止させることでどうにかしたいと考えています(同時に反応しているのではなく、後続のノーツは一瞬遅れて消えているため)
###目標
同時押しをする際、二つのノーツを同時に処理できるような組み方をしたいです。また処理部を一瞬停止させるなど追加の処理を駆使して後続のノーツを巻き込まないように調整したいです。
###使用コード
C#
1if(Input.GetKey(KeyCode.G) && noterean==0){ 2//左端のレーンにノーツがある時Gキーを押す 3 //(スコアを増やす・音を鳴らす・捌かれたノーツを消す) 4 a+=1; 5 //aは現在のノーツ番号を示しています 6} 7//以下別のレーン番号とキー全て同様の処理
開発環境 Unity2019.1.5f1 VisualStudio
<1/22追記> 実際の使用コードを載せさせて頂きます。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class rejudge : MonoBehaviour 7{ 8 //曲をセット 9 public GameObject mus1; 10 public GameObject mus2; 11 public GameObject mus3; 12 13 GameObject sc; 14 GameObject co; 15 GameObject cm; 16 GameObject notesystem; 17 GameObject aud; 18 GameObject han; 19 renotego goscript; 20 AudioSource to; 21 22 Animation hante; 23 24 int tes; 25 //ノーツ情報 26 float notetim; 27 int noterean; 28 int notetyp; 29 float timer; 30 31 int a, b; 32 33 public AudioClip don; 34 private AudioSource dk; 35 36 public static int sa = 0; //スコア 37 public static int cx = 0; //コンボ 38 public static int max; 39 public static int mima = 0; //ミス有での最大コンボ 40 public static int keij; 41 public static int soumiss; 42 public static int sougre; 43 public static int resa() 44 { 45 return sa; 46 } 47 public static int recx() 48 { 49 return cx; 50 } 51 public static int remima() 52 { 53 return mima; 54 } 55 public static int reju() 56 { 57 return keij; 58 } 59 public static int resou() 60 { 61 return soumiss; 62 } 63 public static int regre() 64 { 65 return sougre; 66 } 67 68 void Start() 69 { 70 tes = Selectmode.mode; 71 sa = 0; 72 cx = 0; 73 74 timer = 0; 75 soumiss = 0; 76 keij = 0; 77 sougre = 0; 78 79 //判定表示 80 han = GameObject.Find("判定A"); 81 hante = han.GetComponent<Animation>(); 82 han.GetComponent<Text>().text = ""; 83 84 //選択された曲の番号 85 b = Trackscrolle.selectedtracknumber; 86 87 88 notesystem = GameObject.Find("5Rmanager"); 89 goscript = notesystem.GetComponent<renotego>(); 90 a = goscript.f; 91 switch (b) 92 { 93 case 3: 94 aud = mus1; 95 break; 96 case 4: 97 aud = mus2; 98 break; 99 case 5: 100 aud = mus3; 101 break; 102 default: 103 Debug.Log("存在しない曲情報です"); 104 break; 105 } 106 to = aud.GetComponent<AudioSource>(); 107 108 sc = GameObject.Find("Score"); 109 GameObject sp = GameObject.Find("S"); 110 co = GameObject.Find("chainsuu"); 111 cm = GameObject.Find("conbo!"); 112 113 if (tes == 1) 114 { 115 sc.GetComponent<Text>().text = "-"; 116 } 117 118 co.SetActive(false); 119 cm.SetActive(false); 120 121 //効果音 122 dk = gameObject.GetComponent<AudioSource>(); 123 dk.clip = don; 124 } 125 126 void Update() 127 { 128 timer = to.GetComponent<AudioSource>().time; //曲開始からの時刻 129 float perfectnumMin = -0.2f; //パーフェクト判定エリアの上限(タイミング+この数値) 130 float perfectnumMax = 0; //パーフェクト判定エリアの下限(タイミング+この数値) 131 float okMin = -0.1f; //グレートエリア上状限(タイミング-(パーフェクト上限+この数値)) 132 float okMax = 0.1f; //グレートエリアの下限(タイミング+(パーフェクト下限+この数値)) 133 134 if (tes == 0) 135 { 136 notetim = goscript.seikaku[a];//読み込まれた譜面データをこちらにも移動 137 noterean = goscript.rea[a]; 138 notetyp = goscript.type[a]; 139 140 if (notetim + perfectnumMin < timer && timer < notetim + perfectnumMax) 141 //パーフェクト判定 142 { 143 if (Input.GetKey(KeyCode.G) && noterean == 0) //レーン番号と対応したキーの入力 144 { 145 sa += 130; 146 cx += 1; 147 dk.Play(); //clipの音を再生 148 keij += 1; 149 Destroy(goscript.noteGo[a]); 150 151 a += 1; 152 } 153 //以下H~Lキー全て同じ処理 154 155 if (cx > 4) 156 { 157 co.SetActive(true); 158 co.GetComponent<Text>().enabled = true; 159 cm.SetActive(true); 160 cm.GetComponent<Text>().enabled = true; 161 } 162 163 164 165 } 166 else if (notetim + perfectnumMin + okMin < timer && timer < notetim + perfectnumMax + okMax) //グレート判定 167 { 168 if (Input.GetKey(KeyCode.G) && noterean == 0) //レーン番号と対応したキーの入力 169 { 170 if (notetyp == 1) 171 { 172 sa += 70; 173 cx += 1; 174 dk.Play(); 175 sougre += 1; 176 han.GetComponent<Text>().text = "Great!"; 177 hante.Play(); 178 Destroy(goscript.noteGo[a]); 179 a += 1; 180 } 181 if (notetyp == 2) 182 { 183 sa += 130; 184 cx += 1; 185 dk.Play(); 186 keij += 1; 187 han.GetComponent<Text>().text = "Perfect!"; 188 hante.Play(); 189 Destroy(goscript.noteGo[a]); 190 a += 1; 191 } 192 } 193 //以下H~Lキーまで同一 194 if (cx > 4) 195 { 196 co.SetActive(true); 197 co.GetComponent<Text>().enabled = true; 198 cm.SetActive(true); 199 cm.GetComponent<Text>().enabled = true; 200 } 201 202 } 203 else if (notetim + perfectnumMax + okMax < timer) //ミス処理 204 { 205 mima = cx; 206 cx = 0; 207 han.GetComponent<Text>().text = "Miss"; 208 hante.Play(); 209 210 soumiss += 1; 211 a += 1; 212 213 } 214 215 sc.GetComponent<Text>().text = sa.ToString(); //スコア表示 216 co.GetComponent<Text>().text = cx.ToString(); //コンボ表示 217 218 } 219 220} 221
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。