Fungusの基本的な使い方に関しては第1回の記事で解説しておりますので、まだの方はそちらからお読み下さい。
前回は会話ウィンドウや選択肢のUIを作り変えてみました。
今回は制限時間付きの選択肢やQTE(一定時間内にキーを入力しなくてはならないイベント)といったリアルタイム性のあるイベントを実装していきたいと思います。
制限時間付きの選択肢を作る
Menu Timerコマンドを使うことで選択肢に時間制限を設けることができます。一連のMenuコマンドのどこかに紛れ込ませておけば機能します。
Duration欄は制限時間の秒数を、Target Block欄には時間切れになった際に飛ぶブロックを指定します。
プレイして確認してみましょう。以下のように選択肢の下に残り時間ゲージが表示され、空になると時間切れ用のブロックに飛びます。
QTEを作る
今回は一定時間内に指定されたキーを1回入力することで展開が分岐する、という単純なQTEを作ってみたいと思います。
先にQTE用のUIを作っておきます。Unity全体のメニューから「GameObject」→「UI」→「Text」を選択するとテキストのUIを生成できます。それを選択してInspectorビューに移り、Rect Transformコンポーネントで位置を、Textコンポーネントでフォントの種類やサイズを調整してください。
押すキーを示すテキストと、残り時間を示すテキストの2つを作っておきます。
またこのまま表示すると見えにくいので、半透明の背景もつけておきます。「GameObject」→「UI」→「Panel」と選択してパネルを作り、やはり大きさを調節し、先ほどのテキスト2つをその下に入れます。
だいたい下図のようになるのではないかと思います。ゲーム開始直後から表示されていては困るので、パネルを非アクティブ化して隠しておいてください。
さて中身の実装に移りたいと思います。まず、今回作るQTEがどのような仕組みで動くのかを考えてみましょう。QTEは「制限時間以内に、画面に表示されたキーを入力させるイベント」です。これを分解するような形で必要なパーツを考えてみると、以下のようになります。
- 時間制限の仕組み
- 残り時間を保持する変数
- 残り時間変数を継続的に減らす仕組み
- 残り時間変数が0になった時に時間切れ用の処理に飛ぶ仕組み
- キーの入力を常に受け付け、入力が成功したら成功用の処理に飛ぶ仕組み
- 入力すベきキー(と残り時間)を画面に表示する仕組み
1つずつ考えていってみましょう。残り時間を保持する変数は普通に作ってSet Variablesで値を入れればよいですね。変数を継続的に減らすにはループが使えます(Loop RangeでもWhileでもOK)。ただし普通にループするだけだと一瞬で残り時間が0になってしまうので、短いウェイトを入れます。そして残り時間が0になったらループを抜けて、時間切れ用の処理に飛べばよいでしょう。
キーの入力受け付けもループの中で行います。これはGetKeyコマンドを使います。
Key Code欄で受け付けたいキーの種類を選択します。種類が多いのですが見ればだいたい分かるかと思います。今回は↑キー(Up Arrow)を指定してみます。Key Query Type欄は今回はDownに指定してください。初期値のStateのままだと指定されたキーを押しっぱなしにしてQTEに突入したときにもクリア扱いになってしまいます。Out Value欄は受け付けた結果を入れるInteger型の変数を指定します。受け付けた場合は1が入ります。
最後に入力すべきキーと残り時間の表示ですが、これはSet Activeコマンドで先ほどのテキストを乗せたパネルをアクティブにし、Set Textコマンドで中身を書き換えればOKですね。ループの外側で入力すべきキーを、内側で残り時間を書き換えます。
方針がまとまったので、実際に組んでみましょう。下図のようになるかと思います。
起動してQTEが機能しているのを確かめてみましょう。
今回は制限時間付きの選択肢や、QTEといったリアルタイム性のあるイベントの作り方について取り扱いました。
次回はセリフや指示を並べたテキストから会話イベントを展開してくれるConversationコマンドについて解説する予定です。