Skip to content
第03回 リズムゲーム2

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列を確認し、整数の値を保ち、負の値と変換できない文字列を拒否する点を読みます。

csharp
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;
}