ビジュアルノベルで全文表示のクリックが、そのまま次のセリフへの送りにならないようにするには
全文表示、現在のセリフからの移行、選択肢画面への切り替えを別々に定義します。送り入力は受け取った時点の状態にだけ属し、処理後すぐに消費して、状態が変わっても再利用しません。架空の使者のセリフを例に、実装担当へ引き継げるクリック送りの状態表を作ります。

はじめに
クリックで残りの文字を表示した直後、そのまま次のセリフへ進んでしまうのを防ぐには、送り入力を受け取った時点の状態に従い、一度だけ処理するというルールを定めます。文字が表示途中なら全文表示だけを行い、全文が表示済みで移行が許可されている場合にだけ先へ進みます。現在のページから移行中なら入力は破棄し、後のために残しません。状態が変わっても、同じ入力を再び有効にしてはいけません。
以下では、使者のセリフを使って、実装担当へ引き継げるルールの書き方を示します。これは架空の教材例であり、実際のユーザー事例、実測結果、DramaForkの製品機能ではありません。また、いずれのエンジンの標準動作を示すものでもありません。
「文字の表示完了」と「現在のセリフからの移行」を分ける
使者のセリフは「手紙をお届けしました。夜が明けるまでは、どうか開けないでください」です。文字が少しずつ表示され、使者はドアのそばに立っています。読者の最初のクリックは、このセリフをすぐに全文読むためのものです。改めて二度目の送り操作をして初めて使者が退場し、その後で「手紙を開ける」「しまっておく」の二つの選択肢が表示されます。
まず、シナリオの横に三つの完了点を書き添えます。全文が見えること、読者が移行を要求したこと、退場演出が終わったことです。これらは続けて起こる場合があっても、曖昧な「セリフ終了」という一つの言葉で代用できません。そうしないと、文字の担当者が全文表示時に終了通知を送り、キャラクターの担当者がそれを受けて退場させ、さらにページまで切り替わる可能性があります。
この例では、使者の退場を「現在のセリフからの移行」に割り当てます。文字が自然に最後まで表示された場合も、クリックで全文表示した場合も、全文が見えるようになるだけで、使者は待ち続けます。したがって、付随するイベントをすべて全文表示に連動させるべきではありません。文字の表示完了を示す装飾は全文が見えた時点に結び付けることができますが、物語の進行位置を変える退場動作は明示的な送り操作に結び付けます。
ある言葉を理解するためにノック音が欠かせないなら、全文表示したときにその音をどう扱うかを別途記載します。ここでは全文表示後にその必須の音声提示を再生し、再生が終わるまで送り操作を受け付けないことにします。読者がすぐに先へ進めなくなる代わりに、全文表示のついでに必要な情報まで飛ばすことを防げます。
状態表で入力ができることを限定する
ここでいう「消費」とは、その入力の処理が完了し、後続の文字、キャラクター、選択肢が再利用できないことを指します。「次の入力」は、ボタンやキーを一度離した後の新しい押下でなければなりません。同じ押下から発生したリピート通知は含めません。
| 現在の表示状態 | 入力操作 | 消費結果 | 発生するイベント | 次の入力を受け付ける条件 |
|---|---|---|---|---|
| 現在のセリフが表示途中 | 新しい送り入力 | 現在のセリフを全文表示し、直ちに消費 | 全文が見える。退場は発生しない | 今回押したボタンやキーを離した後、新しい押下で送れる。必須の音声提示が終わっていなければ待機を続ける |
| 全文表示済みで、必須の音声提示が未完了 | 新しい送り入力 | 消費して破棄し、キューに入れない | 退場は発生しない | 音声提示が終わり、以前から押していたボタンやキーを離した後に、新しい入力を受け付ける |
| 全文表示済みで、移行可能 | 新しい送り入力 | 移行を要求し、直ちに消費 | このセリフの退場演出を一度だけ開始 | 移行中は送り入力を受け付けない |
| 現在のページから移行中 | クリック、キーのリピート通知 | 破棄し、次のページへ持ち越さない | 退場を繰り返さず、演出も飛ばさない | 移行先のページの準備が整い、以前から押していたボタンやキーを離した後に、入力の受付を再開 |
| 選択肢画面が表示された | 以前の入力のリリース、またはリピート通知 | 破棄 | 選択を確定しない | この画面が操作可能になってから始まった新しい操作を受け付ける |
| 選択肢画面が操作可能 | 新しい選択操作 | 選択肢のルールに従って処理 | 明示的に操作した選択肢だけを確定 | 確定後の移行先の状態に従って再判定 |
表の中で最も見落としやすいのは「破棄し、キューに入れない」です。退場中のクリックを保存し、ページの準備が整ってから実行すると、読者にはやはり勝手に先へ進んだように感じられます。引き継ぎでは「今は処理しない」を、明確な「破棄する」か「保持する」に置き換えてください。この例では破棄します。
使者のセリフに沿って一操作ずつ追う
第一段階では、画面に「手紙をお届けしました」だけが表示されています。読者がマウスボタンを押すと、入力を受け取った時点では文字が表示途中なので、セリフを全文表示するだけにとどめ、その入力を消費済みにします。処理終了時に全文が表示されていても、同じ入力で先へ進めるかを再判定しません。使者はドアのそばに立ったままです。
第二段階で、読者がマウスボタンを離します。これは先ほどの押下を終えるだけで、新たな送り操作ではありません。ボタンを離した時点でクリックを認識する実装でも、直前の押下と今回のリリースを一つの操作として扱い、それぞれで別の動作を実行してはいけません。
第三段階で、読者が再び押します。この時点では全文が表示され、移行も許可されています。先に移行中の状態へ切り替え、その後で使者の退場を開始します。そうすれば、演出を開始する途中で別の通知を受けても、移行中のルールに従って破棄するだけになり、同じ退場を再び開始できません。
第四段階で、使者がドアの外へ歩いている間に、読者がもう一度クリックします。このクリックはそのまま破棄します。退場が終わると二つの選択肢が表示されますが、直前の入力が読者に代わって「手紙を開ける」を選んではいけません。マウスボタンをまだ押している場合も、その後に離すだけでは選択を確定しません。
第五段階では、以前から押していたボタンやキーをすべて離し、選択肢画面が操作可能になっています。読者が改めて押し、選択肢への一回のクリックを完了して初めて「しまっておく」を確定します。この一連の机上確認で見るのは、各操作の帰属が明確であり、全文表示、退場、選択確定が同じ入力を共有していないことです。これは紙上での検討であり、実施済みのテスト報告ではありません。
一回のクリックと長押しは別々に定義する
この例では、マウス、タッチ、キーボードを「新しい操作が始まったときに、一度だけ有効になる」というルールに統一しています。押下とクリック完了のどちらをトリガーにするかはプロジェクトで決められますが、一つの操作で押したときに全文表示し、離したときにさらに先へ進めてはいけません。
キーの長押しも、読者が繰り返し送りの意思を示したことにはなりません。この例では最初の押下だけを受け付け、押している間のリピート通知はすべて無視します。一度離してから再び押したときだけ、次の入力として扱います。キーを押したまま選択肢画面に入っても、先へ進めたり、現在の選択肢を確定したりしません。
長押しによる連続読み進めが必要なら、開始方法、停止条件、選択肢に出会ったときの処理を別のルールとして定めます。通常の送りキーのリピート通知を、説明のない連続読み進め機能として扱ってはいけません。二つのルールが同じ入力元を使う場合は、現在どちらが受け取るかも指定する必要があります。
実際に二回素早くクリックした場合は、二つの操作です。一回目で全文表示し、二回目で移行することはあり得ます。この取り決めが解決するのは、一つの操作の重複利用です。意図しないダブルクリックをすべて防げるわけではありません。二回目のクリックが有効になるまで追加の待ち時間を設けるなら、別のルールとして記載し、意図的に速く読み進める操作も遅れるというトレードオフを受け入れる必要があります。
引き継ぎでは、順調に読めるかだけでなく境界条件を確認する
実装担当者には、表の各行について、入力を受け取る前の状態、入力の帰属、唯一の動作、処理後の状態を記入してもらいます。重点的に見る失敗箇所は三つです。全文表示後も送り判定へ進んでしまうこと、退場中の入力を保持してしまうこと、以前のページで始まった押下を選択肢画面が受け付けてしまうことです。それぞれ、今回の処理の終了時、画面遷移中、新しいページの入口で境界を徹底する必要があります。
文字が自然に表示し終わる瞬間とクリックがほぼ重なった場合も検討してください。この例では、読み進めのロジックが入力を受け取った時点の状態を基準にします。まだ表示途中なら全文表示し、表示済みなら先へ進みます。帰属を決めた後は、後続の通知によって変更しません。自然な表示完了後に読者のための猶予時間を設けたい場合は、有効条件として別途記載し、処理順序によって偶然実現することに頼らないでください。
この表は、手動で一つずつセリフを読み進める場合を対象としています。オート再生、読み返し、セーブデータのロードによる復帰、演出をスキップできるモードには、それぞれ開始時と終了時のルールを補う必要があります。引き渡し時には、セリフ、退場イベント、必須の音声提示、選択肢画面を同じ表に入れ、入力を受け取るすべての箇所で「この操作は誰に属し、処理はどこで終わるのか」に答えられるようにします。






