7 / 7 譜面の変更を確かめて仕上げる
一つずつ条件を変えてデータと動作の対応を説明し、自分で作った譜面を繰り返し試せる状態にします。
予想した違いを順に確かめる
作った譜面を保管してから、次のうち三つを選びます。結果を予想し、一つずつ変更して、予想と実行結果を記録してください。
| 変更 | 観察すること |
|---|---|
| 休符を1行追加する | 後続ノーツの時刻 |
| コメントを1行追加する | 同じノーツの時刻 |
| 同じ行の別レーンへ1を追加する | 同時押しとノーツ数 |
| offsetを0.1増やす | 譜面全体の時刻とBeat表示の位相 |
| Speedだけを変える | 見た目の速度と判定時刻 |
| 演奏中にRを押す | 曲、ノーツ、判定件数の初期化 |
比較が終わるたびに、その変更を元へ戻してから次を試します。CSVを編集するときはPlayを止め、保存と再Import後にPlayします。offsetを戻す操作も、次の条件を同じ基準で比べるために必要です。
自分で次の区間を作る
最初の区間とは違う2〜4拍分を作ってください。拍・半拍の間隔、休符、同時押しから二つを選びます。今回編集する対象はCSVだけです。
どの音へ合わせるか、Tick数はいくつか、何行必要かを決めてから書きます。遊んだ後に「押す間隔が分かりやすかった場所」と「次の入力を準備しにくかった場所」を一つずつ挙げ、配置の理由を説明してください。得点の高さだけで完成を判断しません。
動く状態を残す
比較用のBPM、offset、速度を元へ戻し、採用する譜面の変更だけを残します。最初から最後まで演奏し、同時押し、見逃し、再挑戦を確かめてください。Errorが出た場合は、行番号のあるCHECK CHARTと参照を知らせるCHECK SETUPを分けて調べます。
CSVはプロジェクト内のTextAssetとして使います。ビルド済みのゲームへ後から置いた外部CSVを読む機能は、この基本課題に含みません。音源を共有する場合は、前のステップで確認した利用条件と文書もそろえます。
データと仕組みの役割を説明する
ChartParserは文字列をTickの配列へ変換し、ChartData.CompileはTickを判定時刻へ変換します。その結果を使う表示と判定の担当は、NoteSpawnerとHitJudgeです。
この分担があるので、譜面を変える人が表示や判定のコードを書き直す必要はありません。次のビジュアルノベルでは、同じようにテキストの台本を、動作済みの会話システムへ渡します。
基本課題の後で、得点・コンボ、追加レーン、入力時刻の補正、譜面編集画面などから発展を選べます。レーンを増やす場合は、CSV、UI、Input Action、判定の接続が変更の対象です。
- 変更前の予想と、実行後の結果を三つ記録した。
- 手順を自分で選び、異なる区間の譜面を作った。
- パース、時刻の変換、表示、判定の分担を説明できる。
- 比較用の値を戻し、最初から再挑戦できる状態を残した。
参考実装
参考実装
自分で実装して譜面を試した後に、ParseNoteRowの一例を比較してください。4列を確認し、整数の値を保ち、負の値と変換できない文字列を拒否する点を読みます。
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;
}