Unity を検索

スクリプティングでタイムラインをより創造的に活用しよう

2018年4月5日 カテゴリ: Engine & platform | 7 分 で読めます
シェア

Is this article helpful for you?

Thank you for your feedback!

タイムラインは、カットシーンや短編動画を作成するための強力なツールですが、それだけではありません!タイムラインを利用してゲームプレイとストーリーテリングを融合させ、ゲームのクオリティを一段階向上させる方法をご紹介します。

バージョン 2017.1 の公開をもって、Unity に新しく強力なツール「タイムライン」が搭載されました。すでに皆様も、タイムラインを活用した素晴らしい短編映像作品『Adam』 Episode 2・3(ニール・ブロムカンプ監督制作)や『Book of the Dead』(Unity 制作)、あるいはストーリーテリングにタイムラインを活用したゲームをご覧になったことがあるかもしれません。

ワクワクするような話ですが、ゲーム開発者としてタイムラインを見た時に私が抱いた問いは、「これは本当に単なるリニアシーケンシングツールに過ぎないのか?」というものでした。タイムラインはカットシーンの作成にしか使用できないのでしょうか?ゲームプレイを中断し、ストーリーを進めるための非インタラクティブなシーケンスを再生し、またゲームプレイに戻る ― ただそれだけなのでしょうか?

私はこの問いを持ちながら、タイムラインをクリエイティブな形で使用するための小さなデモを作成しました。ちょっとしたリアルタイムストラテジーゲームです。このゲームには、カスタムのタイムライントラックで作成した面白いエフェクトをいくつか含めました。そして、このデモの作成を通じて、上述の「問い」に対する答えを得ることができました ― つまりタイムラインは、少しのスクリプティングさえ行えば、カットシーンの作成だけにとどまらず、非常に多様な使い方ができるということです。

アセットについて

私の作成したデモを確認しながら本記事をお読みになりたい場合は、こちらからデモをダウンロードしてください。デモの名前は、Vision Summit 2017 の基調講演で使用されたデモ『A Mighty Kingdom』のアセットを使用していることから『A Terrible Kingdom』としました。(ただし、アセットはデモの目的に合わせて若干調整されています。)

活用案 1 ― タイムラインを停止する

簡単なケースから始めてみましょう。タイムラインにダイアログ UI の表示を組み込み、画面上のテキストをプレイヤーが読めるように自動的に停止させたいとしましょう。スペースキーが押されると、タイムラインが引き続き再生されます。

このコンテンツはサードパーティのプロバイダーによってホストされており、Targeting Cookiesを使用することに同意しない限り動画の視聴が許可されません。これらのプロバイダーの動画の視聴を希望する場合は、Targeting Cookiesのクッキーの設定をオンにしてください。

この機能は画面上のテキストと密接に関連しているので、Dialogue Track というカスタムトラックを作成しました。このトラックは、このゲームの UI マネージャーに接続します。各クリップが、表示するテキストと、それを停止するか否かを決定する単純なブール値を 1 つ、プロパティとして持っています。以下はクリップのインスペクターの画像です。

このトラックの各クリップが、ダイアログ UI と使用するテキストとそのサイズを UI マネージャーに指示します。さらに、GameManager に対してタイムラインを停止する指示と特定の参照を渡す指示を与え、(スペースキーが押された時に)どのタイムラインを復元再開するべきかを GameManager に把握させることができます。クリップが終了すると、そのクリップから UI マネージャーに対してダイアログボックス表示終了の指示が与えられます。

このように簡単なステップで、ダイアログの構築と、停止させる(あるいは停止させない)箇所の決定を、素早く行うことができるのです!(例えば、Andy が「Oi!」と叫ぶ箇所では、重要なテキストではないのでダイアログが停止されていません。)タイムラインは以下のように表示されます。

活用案 2 ― 非リニア・タイムライン

タイムラインを巻き戻したい時はどうすれば良いでしょうか。終了時点からの巻き戻しは、単純にループに設定すれば良いので簡単なことですが、それ以外の任意の時点から、特定の条件が満たされた時にのみ巻き戻したい場合はどうでしょうか。この場合には、非リニア・タイムライン(巻き戻しを時には行い、時には行わない)を使用できます。これはちょうど、if-else 命令文を含んでいるようなものであると考えてください。

この例では、嵐のアニメーション化を行うタイムラインを 1 つ作成しています。日の光が薄暗くなり、空に閃光が現れ、稲妻が地面に落ちて雨が降り始めます。

嵐は、単純に 1 つの連続したシーケンスとして作成されたものではなく、3 つの部分から構成されたものとして捉えてください。冒頭部には通常の天気からの「移行(transition in)」、終わりの部分には通常の天気への「移行(transition out)」があります。タイムラインの中間部には、ゲームプレイ中に再生される部分が残っています。Cinemachine クリップはないので、タイムラインから通常のゲームプレイカメラに制御が戻されることにご注目ください。

2 体のモンスターが生きている間はずっと嵐が続くようにします。タイムラインにイントロを再生させ、次にゲームプレイ部分を再生させ、アウトロに到達する直前で、特定の条件(モンスターが 2 体とも倒された)が満たされているかどうかを判定させます。モンスターが生き残っている場合はゲームプレイ部分が巻き戻されて引き続き再生されます。モンスターが 2 体とも倒された場合はアウトロのみが再生されます。

Time Machine トラック を開いてください。ここにあるクリップには 2 つの機能を持たせることができます。ひとつは名前付きのマーカ―としての機能(最初のクリップ参照)、もうひとつはタイムラインを特定のマーカーまたは時点に巻き戻し・早送りする機能です。これを、クリップの「アクション」と呼ぶことにしましょう。

クリップのプロパティでこの他に重要なのが「condition(条件)」です。これは、「always(常に)」、「never(クリップを実質的に無効にする)」、あるいは「if a group of units is dead(ユニットのグループが倒された)」に設定できます。モンスターが生き残っている場合にはタイムラインが巻き戻されます。

モンスターが 2 体とも倒された場合は進行が中断されることなくアウトロが再生されます。

(注)この「is-dead(倒された)」条件はこのゲーム固有の条件ですが、それぞれのゲームに合わせて、必要に応じてゲームプレイのロジックに組み込んで新しい条件を設定できます。「プレイヤーが特定の地点に到達しているか?」「プレイヤーが特定のリソースを十分な数収集したか?」など、可能性は無限です!

それでは、結果を見てみましょう。

このコンテンツはサードパーティのプロバイダーによってホストされており、Targeting Cookiesを使用することに同意しない限り動画の視聴が許可されません。これらのプロバイダーの動画の視聴を希望する場合は、Targeting Cookiesのクッキーの設定をオンにしてください。

嵐が始まり、ゲームプレイが再開され、嵐が続き、数回巻き戻されます。ご覧の通り、シームレスな巻き戻しです。その後モンスターが倒されると、数秒後に嵐が終わってゲームプレイが再び再開されます。

活用案 3 ― タイムラインをゲームシステムに接続する

面白くなるのはここからです。ここまでは、アニメーションをタイムライン上に載せていました。しかし、このアニメーションをゲーム中の他のシステムに従わせることができるとしたらどうでしょう?この RTS デモでは、常にアクティブになっている非常に重要なシステムがあります。それはゲーム AI です。このシステムは、ユニットを(ナビメッシュエージェントによって)移動させたり、Animator コンポーネントを制御してユニットが正しいアニメーション(歩き・待機・攻撃・死亡)を正しいタイミングで再生するようにするものです。

例えば、大きな戦闘の動きの演出を行いたいとしましょう。これは 2 つの方法で行えます。ひとつは、何十ものトラックを(ユニット毎に 1 つ)作成して、何百もの小さなアニメーションクリップ(攻撃・移動・攻撃・再移動・再攻撃・死亡)を追加する方法です。これら一つひとつを時間内に調整しなければならず、また空間内で適合させたい場合はオフセットを適用する必要があります。概して言えば、これは大変な作業です。

このデモでは、もうひとつの方法を使用しています。「AI Command」トラックがこれに当たります。このスクリプトされたトラックは、「Platoon」と名付けられた特殊なタイプをバインディング内に 1 つ取ります。Platoon は、ユニットの配列を 1 つ持った 1 つの小さなスクリプトに過ぎません。Platoon スクリプトにコマンドを送ると、そのコマンドが配列内の全てのユニットに「送信」されます。このデモでは実際にこれをゲーム内でのユニット選択に使用しており、選択されたユニットに応じて編隊を作成し、その編隊に対してマウスのコマンドを発行しています。

タイムラインの話に戻しましょう。特定の Platoon を AI Command トラックにリンクさせることで、特定のコマンド(特定の地点に移動して停止、特定の地点に移動して攻撃、特定の地点に移動して防御、特定のユニットを攻撃、あるいはその場で死亡など)のクリップを作成することができます。タイムラインが再生されると、その Platoon に所属するユニットがこれらのコマンドを受け、その時点で行っているアクションよりもそのコマンドを優先します。このようにして、タイムライン上で AI のコマンドの順序付けを行うことができるのです。

カメラショットをいくつか追加(もちろん Cinemachine を使用して!)すれば、数十ユニットによる大戦闘が 3 ~ 4 つの AI Command トラックのみで実現可能です。

それでは、結果の映像を見てみましょう。

このコンテンツはサードパーティのプロバイダーによってホストされており、Targeting Cookiesを使用することに同意しない限り動画の視聴が許可されません。これらのプロバイダーの動画の視聴を希望する場合は、Targeting Cookiesのクッキーの設定をオンにしてください。

まとめ

本記事が皆様の好奇心と創造力に火をつけることができたなら幸いです。次にタイムラインを開いた時には、「これを使ってどんな事ができるだろう?」と是非考えてみてください。クイックタイムイベントのシステムを作成してみますか?戦闘を丸ごとデザインしてみますか?弾幕シューティングゲームの弾丸のパターンを作成してみますか?(これは、私も試してみようと考えています。)

タイムラインを使ってできることは実に沢山あります。それは、少しの創造力と、ある程度のスクリプティングによって実現できます。皆様の創造力に富んだタイムライン活用案を、本記事のコメントや Twitter に是非お寄せください。楽しみにお待ちしています!

2018年4月5日 カテゴリ: Engine & platform | 7 分 で読めます

Is this article helpful for you?

Thank you for your feedback!