質問編集履歴

4

質問の追加

2021/05/19 14:00

投稿

YDK
YDK

スコア63

test CHANGED
File without changes
test CHANGED
@@ -392,8 +392,210 @@
392
392
 
393
393
 
394
394
 
395
+ ```C#
396
+
397
+ /// <summary>
398
+
399
+ /// 譜面データを読み込むクラス
400
+
401
+ /// </summary>
402
+
403
+ public class LoadManager : MonoBehaviour
404
+
405
+ {
406
+
407
+ /// <summary> 譜面が保存されている場所 </summary>
408
+
409
+ string filePath = "/Users/sasuke/Documents/FonePaw/Notes/シャイニングスター.json";
410
+
411
+ public string FilePath { get { return filePath; } }
412
+
413
+ /// <summary> 楽曲名 </summary>
414
+
415
+ public string Name { get; private set; }
416
+
417
+ /// <summary> レーンの総数 </summary>
418
+
419
+ public int MaxBlock { get; private set; }
420
+
421
+ /// <summary> 1分間に四分音符が何拍なるか </summary>
422
+
423
+ public float BPM { get; private set; }
424
+
425
+ /// <summary> 譜面の開始位置 </summary>
426
+
427
+ public int Offset { get; private set; }
428
+
429
+ /// <summary> Noteクラスのメンバ変数を保持する </summary>
430
+
431
+ public List<MusicDTO.Note> Notes { get; private set; }
432
+
433
+ /// <summary> 1拍の内にプレイカーソルが何ライン進むか </summary>
434
+
435
+ public List<int> LPB { get; private set; } = new List<int>();
436
+
437
+ /// <summary> 拍子番号 </summary>
438
+
439
+ public List<int> Num { get; private set; } = new List<int>();
440
+
441
+ /// <summary> レーンの番号 </summary>
442
+
443
+ public List<int> Block { get; private set; } = new List<int>();
444
+
445
+ /// <summary> Notesの種類 </summary>
446
+
447
+ public List<NoteType> Type { get; private set; } = new List<NoteType>();
448
+
449
+ /// <summary> ノートが判定ラインに重なるタイミング </summary>
450
+
451
+ public List<float> NoteJudgTiming { get; private set; } = new List<float>();
452
+
453
+ /// <summary> 小節の数 </summary>
454
+
455
+ public float NumberOfMeasures { get; private set; }
456
+
457
+ /// <summary> 一小節に掛かる時間(秒) </summary>
458
+
459
+ public float OneBarTime { get; private set; }
460
+
461
+ /// <summary> 一拍に掛かる時間(秒) </summary>
462
+
463
+ public float OneBeatTime { get; private set; }
464
+
465
+ MusicDTO.EditData musicalData;
466
+
467
+
468
+
469
+ void Awake()
470
+
471
+ {
472
+
473
+ LoadNotesData();
474
+
475
+ PropertyInitializer();
476
+
477
+ SubstituteMusicalScoreData();
478
+
479
+ }
480
+
481
+
482
+
483
+ /// <summary>
484
+
485
+ /// 譜面の小節数、一小節、一拍に掛かる時間を格納
486
+
487
+ /// </summary>
488
+
489
+ public void PropertyInitializer()
490
+
491
+ {
492
+
493
+ NumberOfMeasures = musicalData.BPM / 4f;
494
+
495
+ OneBarTime = 60f / NumberOfMeasures;
496
+
497
+ OneBeatTime = OneBarTime / 16f;
498
+
499
+ }
500
+
501
+
502
+
503
+ /// <summary>
504
+
505
+ /// 譜面からNotesの情報を取得して格納する
506
+
507
+ /// </summary>
508
+
509
+ public void LoadNotesData()
510
+
511
+ {
512
+
513
+ try
514
+
515
+ {
516
+
517
+ FileInfo file = new FileInfo(filePath);
518
+
519
+ using (StreamReader sr = new StreamReader(file.OpenRead()))
520
+
521
+ {
522
+
523
+ musicalData = JsonUtility.FromJson<MusicDTO.EditData>(sr.ReadToEnd());
524
+
525
+ }
526
+
527
+ }
528
+
529
+ catch (FileNotFoundException e)
530
+
531
+ {
532
+
533
+ Debug.LogError(e + "指定されたファイルが見つかりませんでした\n");
534
+
535
+ }
536
+
537
+ }
538
+
539
+
540
+
541
+ /// <summary>
542
+
543
+ /// 譜面データをプロパティに代入する
544
+
545
+ /// </summary>
546
+
547
+ public void SubstituteMusicalScoreData()
548
+
549
+ {
550
+
551
+ Name = musicalData.name;
552
+
553
+ MaxBlock = musicalData.maxBlock;
554
+
555
+ BPM = musicalData.BPM;
556
+
557
+ Offset = musicalData.offset;
558
+
559
+ foreach (var data in musicalData.notes)
560
+
561
+ {
562
+
563
+ LPB.Add(data.LPB);
564
+
565
+ Num.Add(data.num);
566
+
567
+ Block.Add(data.block);
568
+
569
+ NoteJudgTiming.Add(data.num * OneBeatTime);
570
+
571
+ }
572
+
573
+ Notes = musicalData.notes;
574
+
575
+ }
576
+
577
+ }
578
+
579
+ ```
580
+
581
+
582
+
395
583
   **追記**
396
584
 
397
585
  使用している譜面制作エディタはこちらになります。
398
586
 
399
587
  [NoteEditor](https://baba-s.hatenablog.com/entry/2018/04/16/085900)
588
+
589
+
590
+
591
+ **追記2**
592
+
593
+ 譜面データを変数に格納して管理するクラスがあり、
594
+
595
+ ノートの番号ごとに判定ラインに重なる時間を保持していて、その値をNoteクラスで使いたいのですが、
596
+
597
+ Noteクラスが一つ一つのノートにアタッチされているので、ノートごとにそのノートに紐づいた値を
598
+
599
+ 取得することができませんでした。この場合管理の仕方が間違っているのでしょうか。
600
+
601
+ 使いたい変数はNoteJudgTimingです。

3

文法の追加

2021/05/19 14:00

投稿

YDK
YDK

スコア63

test CHANGED
File without changes
test CHANGED
@@ -389,3 +389,11 @@
389
389
  }
390
390
 
391
391
  ```
392
+
393
+
394
+
395
+  **追記**
396
+
397
+ 使用している譜面制作エディタはこちらになります。
398
+
399
+ [NoteEditor](https://baba-s.hatenablog.com/entry/2018/04/16/085900)

2

コードの修正

2021/05/10 09:08

投稿

YDK
YDK

スコア63

test CHANGED
File without changes
test CHANGED
@@ -102,11 +102,13 @@
102
102
 
103
103
  // 一小節に掛かる時間(秒)
104
104
 
105
- float barPerSecond = 60f / numberOfMeasures;
105
+ float oneBarTime = 60f / numberOfMeasures;
106
106
 
107
107
  // 一拍に掛かる時間(秒) => ノーツの間隔
108
108
 
109
- float beatPerSecond = barPerSecond / 4;
109
+ float oneBeatTime = oneBarTime / 16f;
110
+
111
+
110
112
 
111
113
  //Vector3 judgLinePos = judgmentLine.position;
112
114
 

1

文法の追加

2021/05/10 08:53

投稿

YDK
YDK

スコア63

test CHANGED
File without changes
test CHANGED
@@ -10,6 +10,14 @@
10
10
 
11
11
  上手くいきませんでした。どなたかわかる方がいましたら回答よろしくお願いします。
12
12
 
13
+
14
+
15
+ **追記**
16
+
17
+ ObjectPoolクラスを追加しました。
18
+
19
+
20
+
13
21
  ```C#
14
22
 
15
23
  /// <summary>
@@ -221,3 +229,161 @@
221
229
  }
222
230
 
223
231
  ```
232
+
233
+ ```C#
234
+
235
+ /// <summary>
236
+
237
+ /// オブジェクトを生成して使い回すクラス
238
+
239
+ /// </summary>
240
+
241
+ public abstract class ObjectPool : MonoBehaviour
242
+
243
+ {
244
+
245
+ /// <summary> PoolするObject </summary>
246
+
247
+ GameObject poolObj;
248
+
249
+ /// <summary> PoolしたObjectを格納するList </summary>
250
+
251
+ List<GameObject> poolObjList;
252
+
253
+
254
+
255
+ /// <summary>
256
+
257
+ /// オブジェクトプールを作成
258
+
259
+ /// </summary>
260
+
261
+ /// <param name="obj"> Instance化するObject </param>
262
+
263
+ /// <param name="pos"> Instance化する位置 </param>
264
+
265
+ /// <param name="angle"> Instance化する角度 </param>
266
+
267
+ protected void CreatePool(GameObject obj, Vector3 pos, Quaternion angle)
268
+
269
+ {
270
+
271
+ poolObj = obj;
272
+
273
+ poolObjList = new List<GameObject>();
274
+
275
+
276
+
277
+ var newObj = CreateNewObject(pos, angle);
278
+
279
+ //newObj.gameObject.SetActive(false);
280
+
281
+ poolObjList.Add(newObj);
282
+
283
+ }
284
+
285
+
286
+
287
+ /// <summary>
288
+
289
+ /// 未使用のObjectを探す
290
+
291
+ /// </summary>
292
+
293
+ /// <param name="pos"> Instance化する位置 </param>
294
+
295
+ /// <param name="angle"> Instance化する角度 </param>
296
+
297
+ /// <returns></returns>
298
+
299
+ protected GameObject GetUnusedObject(Vector3 pos, Quaternion angle)
300
+
301
+ {
302
+
303
+ // 使用中でないものを探す
304
+
305
+ foreach (var obj in poolObjList)
306
+
307
+ {
308
+
309
+ if (obj.gameObject.activeSelf == false)
310
+
311
+ {
312
+
313
+ obj.gameObject.SetActive(true);
314
+
315
+ return obj;
316
+
317
+ }
318
+
319
+ }
320
+
321
+
322
+
323
+ // 全て使用中だったら新しく作って返す
324
+
325
+ var newObj = CreateNewObject(pos, angle);
326
+
327
+ newObj.gameObject.SetActive(true);
328
+
329
+ poolObjList.Add(newObj);
330
+
331
+ return newObj;
332
+
333
+ }
334
+
335
+
336
+
337
+ /// <summary>
338
+
339
+ /// Objectが足らなかった場合、新しくInstance化する
340
+
341
+ /// </summary>
342
+
343
+ /// <param name="pos"> 位置 </param>
344
+
345
+ /// <param name="angle"> 角度 </param>
346
+
347
+ /// <returns> Instance化したObject </returns>
348
+
349
+ GameObject CreateNewObject(Vector3 pos, Quaternion angle)
350
+
351
+ {
352
+
353
+ var newObj = Instantiate(poolObj, pos, angle);
354
+
355
+ newObj.name = poolObj.name + (poolObjList.Count + 1);
356
+
357
+ return newObj;
358
+
359
+ }
360
+
361
+
362
+
363
+ /// <summary>
364
+
365
+ /// PoolしたObjectを全て削除する
366
+
367
+ /// </summary>
368
+
369
+ protected void DeleteAllPoolObject()
370
+
371
+ {
372
+
373
+ foreach (var poolObj in poolObjList)
374
+
375
+ {
376
+
377
+ Destroy(poolObj);
378
+
379
+ }
380
+
381
+
382
+
383
+ poolObjList.Clear();
384
+
385
+ }
386
+
387
+ }
388
+
389
+ ```