5 / 7 CSVの行をノーツの時刻へつなぐ
1行を4レーンの整数へ変換し、休符を含むTickの順番を保ったまま、判定時刻へ換算します。
文字列を値に変換する
パース、parseは、文字列を決めた規則に従って読み、プログラムで扱う値へ変換することです。配布済みのChartParser.Parseは、設定行を読み、notesの後の行をParseNoteRowへ渡します。
編集するのはAssets/UNSLOW/RhythmGame/Scripts/ChartParser.csのParseNoteRowです。戻り値は、そのTickの4レーンを表すint[]です。0は休符、正の整数はノーツの種類を表します。現在のゲームでは正の値をすべて通常ノーツとして再生します。
1行を4列に分ける
開始版のメソッドの中身を、次へ置き換えます。Splitで分けた列数を確かめてから、各列を整数へ変換します。必要なusing System.Globalization;はファイルの先頭に用意されています。
private static int[] ParseNoteRow(string line, int lineIndex)
{
var cells = line.Split(',');
if (cells.Length != RhythmGame.LaneCount)
throw Error(lineIndex, $"ノーツは{RhythmGame.LaneCount}列です。");
var lanes = new int[RhythmGame.LaneCount];
for (var lane = 0; lane < RhythmGame.LaneCount; lane++)
{
if (!int.TryParse(cells[lane].Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture,
out lanes[lane]) || lanes[lane] < 0)
throw Error(lineIndex, $"レーン{lane + 1}は0以上の整数で指定してください。");
}
return lanes;
}Trimは前後の空白を除きます。TryParseは整数に変換できたかを返し、値をout lanes[lane]へ保存します。変換できない値と負の整数は、配布済みのErrorで行番号を付けたエラーにします。lineIndexは0から数える位置で、表示する行番号には1を足しています。
保存してUnityへ戻り、Consoleのコンパイル結果を確認します。Playを止めた状態でChart SourceのUse Csvをオンに戻してください。Playして開始すると、CSVのノーツが表示されます。CHECK CHARTが残る場合は、表示された行と列数、整数の書き方を確認してください。
休符の行を残してから時刻へ変換する
呼び出し側のParseは、返された配列をListへ追加し、最後に配列へ変換します。次は読み取り用の抜粋です。
ticks.Add(ParseNoteRow(line, index));
// 全行の読み取り後
chart.Ticks = ticks.ToArray();Listは要素を追加できる入れ物です。Ticks[tick][lane]の一つ目の添字でTick、二つ目でレーンを選びます。休符の配列も残るため、行の順番と時間の順番が対応します。
この配列をNoteDataへ変換するのが、実装済みのChartData.Compileです。NoteData.csで次の計算を探してください。
var secondsPerTick = 60.0 / Bpm / TicksPerBeat;
var time = Offset + tick * secondsPerTick;同じTickの各レーンに同じtimeを使います。休符もTickを進めますが、NoteDataを作るのは正の値だけです。表示と判定へ渡す段階では、CSVから来たか練習譜面から来たかを区別する必要はありません。
小さな譜面で予想と結果を比べる
Playを止め、元のCSVを作業用フォルダーへコピーして保管します。設定行を残し、notes以下を次の4行へ置き換えて保存してください。実行前に、ノーツの個数と同時押しの時刻を予想します。
1,0,0,0
0,0,0,0
# コメントは時間を進めない
0,1,1,0
0,0,0,0再Import後にPlayすると、3音が表示されます。同時押しはTick 2なので、時刻はoffset + 2 × 1 Tickの秒数です。休符を1行増やした場合とコメントを増やした場合を別々に試し、予想した違いを確認します。
一つの1を2へ変えてもノーツは出ます。整数をそのまま保存し、現在の再生処理では正の値を通常ノーツとして扱うためです。確認後は保管した元の譜面へ戻してください。
エラーの行を見つけて戻す
ノーツ行を3列にする、-1を書く、文字を書く、のいずれかを試します。CHECK CHARTの行番号から直し、4列の0以上の整数へ戻します。CHECK SETUPならCSVの内容より先に、Sceneの参照やAudio Clipとの一致を確認してください。
- 4列の文字列を整数配列へ変換できる。
- 休符を残し、同じ行を同じ時刻へ変換する理由を説明できる。
- 予想した個数と時刻を確認し、元のCSVへ戻した。
- 入力ミスの行を見つけて修正できる。