자작음 게임의 악보 데이터에 대해 고민

11677 단어 JSONCSVUnity

결론



우선 이번에는 텍스트 데이터와 악보 데이터로 사용하고 싶기 때문에 ↓ 중에서 알고 사용하기 쉬운 CSV로 대응시키기로했습니다

.txt
.html
.htm
.xml
.bytes
.json
.csv
.yaml
.fnt
Unity 텍스트 자산

전제



소리 게이는 노트라고 하는 판정을 음악을 들으면서 리듬 좋게 누르는 것으로 득점이 가산되어 갑니다

노트를 호출하는 타이밍을 기록한 파일을 악보 데이터라고합니다.
악보 데이터에는 노트의 타이밍 외에 노트의 종류나, 속도 등을 매입하기도 합니다

타이밍 정보



타이밍을 호출하는 방법은 두 가지가 있다고 생각합니다.
시간 지정 또는 소절 지정입니다.
※그 밖에도 있을 것 같으면 코멘트해 주세요

소절 지정 json



처음에는 소절 지정 json 파일을 만들려고 생각했습니다.
notes{
[[ノーツの種類,ノーツのレーン,速度][ノーツの種類,ノーツのレーン,速度]]//1小節目
[ノーツの種類,ノーツのレーン,速度]...//2小節目
}


처럼 생성하려고

장점



・소절마다의 관리가 편하다

단점



· bpm이 바뀌는 노래는 만들기 어렵다.

왜 사용하지 않았습니까?



json 파일을 for 또는 foreach로 돌리는 것이 어려웠습니다.

json은 [key : value]처럼 값이 존재합니다.
{notus:
[key:value,key:value],
[key:value,key:value],
[key:value,key:value]}


처럼 만들 수 있습니다.
value를 추출하여 노트를 생성합니다.
//jsonファイルの読み込み
var textAsset = Resources.Load("譜面.json") as TextAsset;

var jsonText = textAsset.text;
JsonNode json = JsonNode.Parse(jsonText)

//jsonを辞書に入れる
Dictionary<string,object> dic_json = json["notes"].Get<Dictionary<string,object>>();
foreach (var notes in json["notes"])
{
    long note = notes["note"].Get<long>();
    for (int i = 0; note > i; i++)
       //インスタンスからノーツを生成
    }
}

※비늘 기억
이것의 나쁜 점은 note또한 foreach에서 변수에 추가하고 호출하면
[0:1,1:1,2:2]

같은 목록으로 나오기 때문에 훨씬 더 귀찮습니다.
그리고, 여기에서는 JsonNode를 사용하고 있습니다만, Unity 표준의 JsonUtility를 사용하면 형태를 만들지 않으면 안 되므로 소리 게이와 같은 데이터의 최대량이 바뀌는 것에는 적합하지 않습니다

시간 지정 CSV



CSV는 0 행에 노래 정보를 추가하고 노트 정보를 뒤에 추가했습니다.
노트 정보에 대한 자세한 내용은
ノーツの種類(番号),ノーツのレーン,ノーツが来る時間,ノーツの速度(元bpm* 基本的に1)

입니다


장점



・실장이 간단
· 확장 가능

단점



・보면 제작의 난이도가 심한 무즈
//ファイル読み込み
csv_read("../譜面.csv");

music_name = csvDatas[0][0];
bpm = float.Parse(csvDatas[0][1]);
all_notes = int.Parse(csvDatas[0][2]);
offset = double.Parse(csvDatas[0][3]);
//インスタンスをリストに追加
GameObject_all_notes.Add(new GameObject[]{ notes1, notes2, notes3, notes4, notes5 });
for (int i = 1; i < csvDatas.Count; i++)
{
    _type = int.Parse(csvDatas[i][0]);
    _lane = int.Parse(csvDatas[i][1]);
    _time = float.Parse(csvDatas[i][2]);
    _speed = float.Parse(csvDatas[i][3]);
    Generate =  GameObject_all_notes[int.Parse(csvDatas[i][0])][int.Parse(csvDatas[i][1])];

    Generate.GetComponent<notes>().set_up_notes(_time, _speed);
    Instantiate(Generate, new Vector3(Generate.transform.position.x, Generate.transform.position.y, Generate.transform.position.z + (_speed * public_speed * 10) * _time), Quaternion.identity);
}

이것은 현재 사용하고 있는 코드(의 간략판)
이쪽은 비교적 확장성도 있어 간단한 노트를 생성할 수 있으므로 좋다
그러나 인스턴스를 생성 할 때 노트의 속도와 타이밍을 계산해야합니다.

그런 다음 물체의 가속도를 끄지 않으면 점점 어긋납니다.

좋은 웹페이지 즐겨찾기