Unity を検索

Unity 2020 LTS の Cinemachine 2.6 が実現する魔術:比類なき正確さ、ワークフロー、さらにその先へ

2021年11月26日 カテゴリ: テクノロジー | 11 分 で読めます
シェア

Unity プロジェクトでは、すべてのものをカメラのレンズを通して見ることになります。そのため、映さなくていいものはカメラの画角の外に置く必要があります。こうした処理の大部分はレンダリングパイプライン(ライト、シャドウ、フォーカス、カラー)で表現されますが、カメラの位置、動き、タイミングなど、他の側面も重要な要素です。

Cinemachine は Unity のバーチャルカメラオペレーターで、カメラが必要な時に必要な場所で確実にアクションを捉えるためのツールです。Cinemachine はゲームとアニメーション、および 2D と 3D の両方に対応しており、カメラをよりスマートにして、アクションや感情を常にレンズで捉えられるようにしてくれます。

ここでは Cinemachine の最新の開発の一部をご紹介します。まず、Cinemachine 検証済みパッケージになりました(こちらの意味については後述)。新しいバージョンでは、面白く便利な機能やサンプルを提供しています。また、Unite Now ではライブ講演を予定しており、こちらは皆さんの自宅にいながら参加できます。

Cinemachine の最前線について語るライブ講演

日本時間 5 月 29 日午前 1 時(5 月 28 日 25 時)に開催されるライブ講演にぜひご参加ください。こちらの講演は、Unity が無料で開催しているオンライン学習セッション、デモ、クリエイターのストーリーなどから構成される「Unite Now」シリーズの 1 つです。 この講演では、最も要求の高いお客様の中から数名を招き、Cinemachine を使ってどのように成果を上げているのかについてお話を伺います。講演の後にはライブで質疑応答のパートがあります。この講演に参加するにはこちらからご登録ください。

ライブでご視聴できない方も、後から YouTube で録画を見ることができます。

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

Cinemachine 2.5 は Unity 2020.1 で検証済みに

Cinemachine は Unity のパッケージとして、またそれ以前はアセットストアのアセットとして、長い間提供されてきました。「検証済み」のパッケージとして、社内の QA やユーザーによる検証を通してその実力を証明してきました。

「検証済み」の意味

ある機能を取り出してみたとき、それがすべてのユースケースをカバーしているということはありえません。ただし、検証済みになったということは、Unity として数多くのユースケースを考慮してきたということ、そして考慮したケースが引き続きサポートされるよう、バグ修正が優先的に行われるということを示します。Cinemachine チームは常にユーザーへのコミットメントについて非常に真剣に考えています。また、支援が必要なときに Unity のフォーラムで質問していただくことも歓迎しています。

また、検証が行われたことで、将来プロジェクトのテンプレートや教材に同梱された Cinemachine によってより良いサービスを提供できるようになることが期待できるようになりました。

シーンの中でカメラを正確に配置することで、ショットのブロッキングやフレーミングがより簡単で直感的になり、制作のワークフローがスピードアップします。

新機能:インパルス伝播

ゲームでも映画でも、デジタルカメラを使った仕事でリアリズムを実現するために重要なエフェクトは、環境内のアクションによってカメラが揺れるエフェクトです。現実世界ではこれを逆に気にしてしまい、ステディカムなどのツールを使ってこのエフェクトを抑えてしまいがちです。しかし、環境と視聴者の視点との間のつながりが弱いと、バーチャルの世界は硬直した、反応しないもののように見えてしまいます。

Unity では、カメラの動きをシーン内の物理的なアクションに結びつける方法をいくつか提供しています。その 1 つがインパルスで、Noise Setting(手ぶれを発生させるパターン)、Impulse Source(外乱を発生させるワールド内の場所)、Impulse Listener(外乱の影響を受けるもの)から構成されます。なお、リスナーはカメラである必要はありませんので、このシステムを使って他の物体にノイズを加えることもできます(下の例を参照)。Cinemachine 2.6 では、このツールに伝播速度の設定が追加され、外乱の発生とリスナーへの外乱への影響の発生の間で、タイミングの調整を行うことができます。伝播速度が新たなレイヤーとして加わり、表現のリアリティがさらに増しました。

この例では、まず伝搬速度を低めに設定して、エフェクトをはっきりと見られるようにしてから、より現実的な爆発のエフェクトに近づけて見せるために伝搬速度を上げています。

Samples をダウンロードしたら、プロジェクトのフォルダー階層を Assets > Samples > Cinemachine > 2.6.0-preview.5 > Cinemachine Example Scenes > Scenes > Impulse > ImpulseWave とたどるとサンプルシーンが見つかります(注意:記事執筆時点の情報。今後バージョン番号は変更される可能性があります)。

新しいサンプル:3 人称エイミングリグ

3 人称視点のシューティングのようなゲームの大きな難点の一つは、キャラクターの視点とプレイヤーのカメラとの間にわずかに(しかし重要な)ズレがあることです。このようなゲームをプレイしたことがある人なら誰でも、角や障害物の後ろに隠れて、攻撃のタイミングを待っているときに、このズレを感じたことがあると思います。しかし、カメラがうまく管理されているゲームでは、おそらく問題になることはないでしょう。

Cinemachine 2.6 ではこの問題に関するサンプルが追加されています。プロジェクトのフォルダー階層を Assets > Samples > Cinemachine > 2.6.0-preview.5 > Cinemachine Example Scenes > Scenes > AimingRig > AimingRig とたどるとサンプルが見つかります(バージョン番号は異なる可能性があります)。

上の動画では、3rd Person Follow Behavior と Cinemachine 3rd Person Aim コンポーネントを使って、このようなリグを構築する方法を紹介しています。このコンポーネントは、キャラクターがどこを見ているかを示すレチクルとしてスプライトを参照し、そのレチクルの位置を決めるためにレイキャストを使います。動画では、カメラの視点(大きい方の円)とキャラクターが見ている場所(小さい方の円)の違いがわかります。これはわずかなズレですが、プレイヤーが照準を判断する際には重要な要素となります。

また、Cinemachine 3rd Person Aim コンポーネントには、レイキャストで無視するフィルターと、レイを飛ばす距離を制限するための距離設定が用意されています。

新しいサンプル:Dual-target リグ

もう 1 つの一般的な使用例としては、戦車や自動車、アバターなどのゲームオブジェクトを追跡する形でカメラの位置を動かしたいが、同時に戦車の照準など、関心のある地点を表す別のオブジェクトを追いかけることで視点を動かしたい場合があります。エイミングリグと同様にレチクルを設定しましたが、これは一連の制限内でマウスを間接的に追いかけます。そのため、レチクルを追跡するバーチャルカメラが置かれています。下のビデオをチェックしてください。

このサンプルはプロジェクトのフォルダーを Assets > Samples > Cinemachine > 2.6.0-preview.5 > Cinemachine Example Scenes > Scenes > DualTarget > DualTarget とたどると見つかります(バージョン番号は異なる可能性があります)。

これは Cinemachine で間接的な方法を使い、複雑な動作を作り出せることを示す好例です。サンプル内には 2、3 個の動く部分が見当たります。

  • CM Dual Target Virtual Camera は Player オブジェクトを追跡しますが、視点は AimTarget Moved by Mouse オブジェクトの方を向いています。
  • Gun Points at AimTarget オブジェクトには PointAtAimTarget というシンプルなスクリプトがアタッチされており、AimTarget Moved by Mouse オブジェクトに銃を向けるようになっています。
  • AimTarget Moved by Mouse オブジェクトは、このオブジェクト以外のすべてのものから見られています。このオブジェクト自体には MoveAimTarget スクリプトがアタッチされています。

カメラが Player オブジェクトの後を追いかけていくのは非常に自己説明的な動きです。Player がどこに行っても、カメラは適切なオフセットで追従します。同様に、Look At Behavior は、カメラがレチクルを見ていることを保証します。Dead Zone と Soft Zone の各パラメーターは、ほぼフレーム全体を覆うように(そして双方がまったく同じ値に)設定されていることに注意してください。レチクルが画面端に近づいたときだけカメラが反応します。

銃にアタッチされている PointAtAimTarget スクリプトは、その名前通りの挙動を取ります。すなわち、銃が標的の方を常に向いているようにします。

MoveAimTarget スクリプトだけ、やや複雑な構造になっています。3 人称アニメーションのセットアップの場合と同様に、(レチクルの)スプライトを参照し、どこまでレイを飛ばすか、レイをフィルタリングするレイヤーとタグについての情報を持っています。さらに、どの入力の次元が動作を変えるかといった、レチクルの動作を調整するための詳細を追加しました。

新しいサンプル:カメラを引き付ける磁石

このサンプルで動いているものは新機能のように見えますが、実は CinemachineTargetGroup の中でウェイトを使うサンプルを洗練したものです。このユースケースは Unity フォーラムのユーザーから提案されたもので、カメラが関心のある点に近づくまで、標的(プレイヤーのアバターなど)に向かって移動するという、非常に一般的なユースケースになります。カメラが関心のある点に近づくのに合わせて、その点にカメラが寄っていくという動きになります。以下、その方法について説明しますが、まずは動画をご覧ください。

This time, our virtual camera is not focused on a single object, but rather on a Cinemachine Target Group. Target Groups are an incredibly useful and versatile abstraction in Cinemachine. Instead of pointing a camera at one thing, a group allows you to point it at multiple things. This comes in handy when keeping a spread-out party of adventurers all in the shot.

But each target in the group also has a weight, so you can bias the camera toward objects with weights greater than others. In this example, we demonstrate how playing with that weight allows us to dynamically “magnetize” objects as we approach them.

Two simple classes make this magic happen: Camera Magnet Target Controller (attached to the Camera Magnet GameObject), and Camera Magnet Property (attached to each of the Camera Magnet GameObjects). Each Camera Magnet Property sets a proximity and strength to control its weight in the Target Group. The Camera Magnet Target Controller then loops through all of the magnets. 

Added into the mix is the player avatar itself, which has a constant weight value of one. If there are no magnets attracting the camera, the avatar “owns” the camera’s attention. But as the player approaches, the magnets pull strongly, drawing the attention toward these key positions.

改善点:Lookahead

Lookahead は、標的がどこに向かっているのかについて、より詳細な情報を与えてくれる強力な機能です。この機能がよりスムーズに動き、より予測能力を増し、より効率的に動作するよう改良されました。新しい実装では、より人間味のある表現が可能となりました。より多くのユーザーにこの機能を利用していただきたいと考えています。

改善点:入力システムのサポート強化

Cinemachine をカスタムの入力システム、あるいはサードパーティ製の入力システムと組み合わせて使い、カメラをコントロールすることはこれまでも可能でしたが、それを実現する方法は少し面倒で、簡単にはわからないようなものである場合がありました。グローバルのデリゲート CinemachineCore.GetInputAxis(string name)をオーバーライドして、カスタムの入力プロバイダー関数を指すようにしなければなりませんでした。これは今でもできますが、最良の方法でも最も効率的な方法でもなくなりました。

新しいインターフェースとして Cinemachine.AxisState.IInputProvider が用意されました。バーチャルカメラのビヘイビアがこのインターフェースを実装している場合、標準の CinemachineCore.GetInputAxis(string name)デリゲートの代わりに、そのビヘイビアが入力のクエリを引き受けます。

この方式の利点は、インターフェイスの呼び出しが文字列ベースではないこと、およびバーチャルカメラごとの実装を呼び出して個別のデータを持つことができるので、効率化や、特定のプレイヤーにマッピングするための設定が可能になることです。

Cinemachine 2.6 には、Unity の新しい入力システムのための実装サンプルも同梱されています。これをそのまま使っていただいて構いませんし、自分で作った入力プロバイダのテンプレートとしてもお使いいただけます。

新しい Input System パッケージがインストールされていれば、新しい CinemachineInputProvider コンポーネントをバーチャルカメラに追加することができます。これを使えば、カメラの入力を入力アクションのリファレンスに簡単にマッピングして、マルチプレイヤーの要件を満たすことができます。

最新情報をキャッチしよう

Cinemachine は、皆さんのゲームや映画、カットシーンを素晴らしいものにするために必要な機能をすべて備えています。また、新機能や改善点、サンプルが、皆さんのゲームをできるだけゴージャスにするために役立てば幸いです。今すぐ Cinemachine 2.6 プレビュー版をダウンロードしてください。

ご意見、ご感想や、うまく行った点、改善すべき点などをお聞かせください。また、Cinemachine フォーラムもご参加ください。皆さんの質問に答えたり、皆さんが必要な結果をお知らせしたりしています。

最後にもう一度お知らせです。Unite Now の番組として、Cinemachine のライブセッションを日本時間の 5 月 29 日午前 1 時(5 月 28 日 25 時)から開催します。ご登録は今すぐ行っていただけます。ご予定を合わせて、ぜひライブでご視聴ください。

Stay connected

We want to know what works for you, and how we can do even better. If you have any questions, feedback, or feature requests that can help guide the future of Cinemachine, please keep us posted on the forums.

2021年11月26日 カテゴリ: テクノロジー | 11 分 で読めます