🎮 字幕検知型ミニゲームを作ろう¶
「先生」という字幕が出たら5秒以内にボタンを押せ!¶
このチュートリアルでは 音声を映像のように扱い字幕を付ける
で作成したプロジェクトをそのまま引き続き使用します。
前のチャプターでは以下を完成させました:
- UI背景画像の設定
- 音声の読み込み
- Whisperによる字幕生成
- 翻訳字幕の作成
今回はその字幕を 実際のゲーム要素として活用し、
「特定の単語が出る → 制限時間で反応 → 成功/失敗で分岐」
という 小さなミニゲームシステムを作ります。
使用する例は以下の体験版です:
https://www.dlsite.com/home/work/=/product_id/RJ01323001.html
(ブルーアーカイブ カズサ / 体験版)
ブルーアーカイブでは主人公を 「先生」 と呼ぶため、
字幕検知の例として非常に適しています。
🧭 全体フロー(完成イメージ)¶
字幕に「先生」という単語が出現したら:
- グローバル変数 SenseiFlag ← 1
- ボタンUIを表示
- 5秒待機
- ボタンが押されたら成功
- 押されなければトラック終了(失敗)
1️⃣ 字幕タイプを先に変更する(重要)¶
今回のミニゲームでは 字幕の中に「先生」という単語が出現したタイミングを正確に検知 する必要があります。
しかし前のチャプターで作成した字幕は、デフォルトでは 一文が一度に表示されるタイプ です。
この方式だと「これから出てくる単語」が事前にすべて見えてしまい、
検知タイミングが正確でなくなる問題 が発生します。
そのため字幕タイプを TypeWriter(タイプライター方式) に変更する必要があります。
✔ TypeWriter 字幕の特徴¶
- 字幕が 全体の再生時間に合わせて一文字ずつ表示 される
- まだ表示されていない文字は検知できない
- よって「先生」が 現れる瞬間だけ を確実に捉えられる
- ミニゲーム・単語検知・呼吸シンクなどに最適
📌 TypeWriter への変更方法¶
- タイムラインで 音声をダブルクリック し音声編集画面へ移動
- 字幕リストへ
- Ctrl + A ですべての字幕を選択
- 右下の Animation → TypeWriter をクリックしてタイプ変更
(画像:caption_typewriter.png)
これで全字幕が一文字ずつ表示される方式になり、
単語出現の順序を正確に検知できます。
1️⃣ UIを作る(反応ボタン)¶
(画像:press_button_ui.png)
- UIタブ → 新規UI
- Button を中央へ配置
- テキスト: 「先生!」 または 「PRESS!」
前チャプターのUI作成方法と同じです。
TIP
中央寄せにするとミニゲームUIとして自然に表示されます。
2️⃣ グローバル変数を作成する¶
(画像:create_global_variable.png)
- 左側の リソース管理 → 変数
- +ボタン
- 名前:SenseiFlag
- 初期値:0
この変数は 今が入力待ち状態かどうか を判断する核心となります。
値の意味:
0 = 待機していない
1 = 「先生」検知済み → 5秒以内に押すモード
3️⃣ 字幕検知スクリプトを作成する¶
ここでは、字幕の中に 「先生」 という単語が含まれた瞬間に自動で実行される
検知スクリプトを作ります。
スクリプトの処理内容は以下の通りです:
- 字幕に「先生」が含まれるか判定
- 含まれていればグローバル変数 SenseiFlag ← 1
- 5秒待機
- 5秒以内にボタンが押されなければ失敗(トラック終了)
📌 スクリプト作成手順¶
- Scriptタブ → 新規スクリプト
- 名前:SenseiTrigger
- 以下の構造で作成
✔ 1段階目:「先生」が字幕に含まれているか判定¶
条件:
- 字幕に [先生] が含まれた場合
満たす場合:
- 変数 [SenseiFlag] を [1] に代入(0秒)
- 時間 [5秒] 待機
これにより、「先生」が出現した瞬間だけ SenseiFlag が1になります。
✔ 2段階目:5秒後も SenseiFlag が1なら失敗扱い¶
最初の条件の下に もう1つ条件文 を追加します。
条件:
- 変数 [SenseiFlag] が [1] と等しい場合
満たす場合:
- 現在のトラック時間を [420秒] に変更
※ 最後までジャンプして強制終了させるイメージ
つまりユーザーがボタンを押さなかった場合、
SenseiFlag は 1 のままなので失敗扱いになります。
📌 全体構造イメージ¶
(画像:subtitle_detect_script.png)
これと同じように組めば:
- 字幕に「先生」登場
- 5秒カウント
- 押されなければエンディングへジャンプ
という流れが完成します。
5️⃣ ボタンの Click スクリプトを作る¶
UI画面でボタンを選択:
右側 → Script → Click → 編集
以下の内容を構成します。
✔ 成功条件:SenseiFlag == 1¶
条件:SenseiFlag == 1
SenseiFlag ← 0
Sound(成功SE)を再生
ユーザーが制限時間内に押したという意味です。
✔ 遅かった場合:SenseiFlag == 0¶
(画像:subtitle_detect_button.png)
条件:SenseiFlag == 0
トラックジャンプ(失敗地点)
→ すでに失敗しているか、遅すぎた場合です。
🧪 全体フローまとめ¶
🔷 字幕検知スクリプト(SenseiTrigger)¶
SenseiFlag ← 1
UI Show
5秒待機
If SenseiFlag == 1:
Jump Track(end)
🔷 ボタンのClickスクリプト¶
If SenseiFlag == 1:
SenseiFlag ← 0
成功SE再生
Else:
Jump Track(end)
🎉 完成!¶
これでプロジェクトは次のように動作します:
- 字幕に「先生」が出現 → ボタンがポップアップ
- ユーザーは5秒以内に押す必要がある
- 押せば成功
- 遅れれば失敗
- beginner-audio-to-video で作った
「音声 + 字幕 + UI背景」プロジェクトに自然に拡張できる
この例は、VSPの多くの機能を組み合わせた
ミニゲーム型インタラクティブシステムの基本構造になります。