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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

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

Q&A

解決済

1回答

1864閲覧

Unityで音ゲーを作る際の曲とテンポについて

web11

総合スコア52

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

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

0グッド

0クリップ

投稿2020/06/21 14:41

編集2020/06/21 16:11

音ゲー作る際json形式で値を読み込んでテンポ(timing)と位置(type)で管理しようとしたのですが、一般的にbpm?というもので管理するのが良いのでしょうか?

現在はjsonで取得したタイミングの値をDOTweenで遅延処理をしてインスタンスを作成してボタンを出現させていますが、この方法だと処理として悪いのでしょうか?
解答よろしくおねがいします。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using DG.Tweening; 6using System; 7 8 9 10public class GameManager : MonoBehaviour 11{ 12 public GameObject Touch_Button; 13 public GameObject ButtonCanvas; 14 public GameObject Touch_Button_on; 15 16 public AudioClip PlayMusic; 17 18 private AudioSource audioSource; 19 20 GameObject[] Button_Array = new GameObject[16]; 21 [SerializeField] string FileName; 22 23 int count = 0; 24 25 // Start is called before the first frame update 26 void Start() 27 { 28 29 audioSource = gameObject.GetComponent<AudioSource>(); 30 31 float button_width = Touch_Button.GetComponent<RectTransform>().sizeDelta.x; 32 float button_height = Touch_Button.GetComponent<RectTransform>().sizeDelta.y; 33 34 35 36 for (int i = 0; i < 4; i++) 37 { 38 for (int x = 0; x < 4; x++) 39 { 40 //インスタンスを作成してButtonCanvasの子にする 41 GameObject button_prefab = Instantiate(Touch_Button, new Vector3(-381 + (x * (button_width + 2)), -552 + (i * (button_height + 2)), 0), Quaternion.identity); 42 button_prefab.transform.SetParent(ButtonCanvas.transform, false); 43 Button_Array[count] = button_prefab; 44 count++; 45 // Debug.Log(button_prefab.transform.localPosition.x); 46 47 } 48 } 49 50 51 52 loadChart(); 53 54 55 56 57 58 59 } 60 61 62 // Update is called once per frame 63 void Update() 64 { 65 66 } 67 void loadChart() 68 { 69 70 audioSource.PlayOneShot(PlayMusic); 71 72 73 // 入力ファイルはAssets/Resources/FileNameのjson 74 75 // FileNameをテキストファイルとして読み取り、string型で受け取る 76 string inputString = Resources.Load<TextAsset>(FileName).ToString(); 77 78 79 // 上で作成したクラスへデシリアライズ 80 MusicJson musicJson = JsonUtility.FromJson<MusicJson>(inputString); 81 MusicArray musictArray = JsonUtility.FromJson<MusicArray>(inputString); 82 GameObject Note; 83 84 85 int type_num = 0; 86 for (int i = 0; i < musictArray.notes.Length; i++) 87 { 88 DOVirtual.DelayedCall(musictArray.notes[i].timing, () => 89 { 90 //インスタンス作成 91 Note = Instantiate(Touch_Button_on, new Vector3(Button_Array[musictArray.notes[type_num].type].transform.localPosition.x, Button_Array[musictArray.notes[type_num].type].transform.localPosition.y, 0), Quaternion.identity); 92 Note.transform.SetParent(ButtonCanvas.transform, false); 93 Note.SetActive(true); 94 type_num++; 95 // こちらに実行する処理 96 } 97 ); 98 99 } 100 101 102 //Debug.Log(musicJson.title); 103 } 104} 105 106 107 108 109 110 111[Serializable] 112public class MusicArray 113{ 114 public MusicJson[] notes; 115} 116 117[Serializable] 118public class MusicJson 119{ 120 public string title; 121 public float timing; 122 public int type; 123} 124 125 126

json

1{ 2 "title": "music01", 3 "bpm": "163", 4 "notes": [ 5 {"timing": "1.5f", "type": "0"}, 6 {"timing": "2.5f", "type": "2"}, 7 {"timing": "3.5f", "type": "3"}, 8 {"timing": "4.5f", "type": "4"}, 9 {"timing": "5.5f", "type": "5"}, 10 {"timing": "6.5f", "type": "7"}, 11 {"timing": "7.5f", "type": "9"} 12 ] 13}

イメージとしてjubeatという音ゲーのようなものを作成したいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

それぞれのメソッドと言葉の意味を考えましょう。

DOVirtual.DelayedCallは「何秒後かに何かする」メソッドです。
つまり指定する値は「秒」単位です。

timingが「秒(曲開始後、何秒経過したか)」単位であるならこのままで構いません。
ですが「テンポ(曲開始後、何拍経過したか)」なら、時間(秒)に変換する必要があるので、BPMが必要です。
(BPM=1分間に何拍あるか。なので60 / bpm * timingで「秒」単位での値が取得出来る。なおbpmはfloatにしないと計算結果がおかしくなるので注意)

投稿2020/06/22 07:41

sakura_hana

総合スコア11427

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

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

web11

2020/06/22 16:56

解答ありがとうございます。 すみません、凄い馬鹿な質問だと思うのですが、何秒経過したかの時間「timing」とbpm をかけると拍子の時間がでて、「timing」で無理やりテンポの良いタイミングを探らずに、適当?な値でテンポの良い音ゲーが作れるということでしょうか?
sakura_hana

2020/06/24 00:51

何を仰っているのかよく分かりません。プログラムにおいては「テンポの良い」など抽象的な言葉は不要です。 JSONファイルは要は「譜面」です。 同じ楽曲でも難易度によってノーツが多かったり少なかったりすると思いますが、その密度や配置を決めるのはあなた次第です。 この譜面をどのように作るかは自分で考えるか調べてください。 (ノーツ記録用のシステムを作って曲に合わせてキーを叩くとか、音源の波長を分析してノーツが置かれそうなポイントを機械的に探すとか?)
web11

2020/06/24 04:32

すみません、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問