Search Unity

Cinemachine 2.6 のもたらす精密な制御、改善されたワークフロー、それらが実現するカメラワーク

, 5月 22, 2020

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

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

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

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

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

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

Cinemachine 2.5 は Unity 2020.1 で検証済みに

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

「検証済み」の意味

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

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

Cinemachine 2.6 プレビュー版

バージョン 2.5 のコードが固まってすぐ、チームはバージョン 2.6 の作業を開始しました。これは現在プレビュー版のステータスです。このバージョンでは新機能もいくつか搭載されますが、それ以上に便利と思われるのが新しいサンプルです。このサンプルを使って、3 人称視点のシューティングゲームにおけるエイミングや、2 つの照準の操作など、重要なユースケースのサンプルを実行するところから、Cinemachine を始めることができます。

新しいプロジェクトを作るには、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 フォーラムのユーザーから提案されたもので、カメラが関心のある点に近づくまで、標的(プレイヤーのアバターなど)に向かって移動するという、非常に一般的なユースケースになります。カメラが関心のある点に近づくのに合わせて、その点にカメラが寄っていくという動きになります。以下、その方法について説明しますが、まずは動画をご覧ください。

このユースケースでは、バーチャルカメラは単一のオブジェクトに焦点を当てているのではなく、CinemachineTargetGroup に焦点を合わせています。Target グループは Cinemachine の非常に便利で汎用性の高い抽象化です。Target グループを使うと、カメラを 1 つの物に向けるのではなく、複数の物に向けることができます。これは例えば、冒険者のパーティが広い範囲に散らばっていても、全員を画面に入れておきたい場合などに便利です。

また、グループ内の各標的にはウェイトを設定できるので、他のターゲットよりもウェイトが大きいものにカメラを向けさせることができます。このサンプルでは、このウェイトを動的に制御することで、オブジェクトに近づいたときにカメラを磁石のように吸い寄せさせることができることを示します。

2 つの非常にシンプルなクラスが、この動きを実現します。CameraMagnetTargetContoller(CameraMagnets ゲームオブジェクトにアタッチ)と CameraMagnetProperty(各 CameraMagnet ゲームオブジェクトにアタッチ)です。CameraMagnetProperty は、Target グループ内でのウェイトを制御するための近接度と強さを設定します。その後、CameraMagnetTargetContoller は、すべての「磁石」になりうるオブジェクト群をループします。プレイヤー自体もこの「磁石」になりうるオブジェクト群に加えられ、定数のウェイト値 1 が与えられます。カメラを引き付けるオブジェクトがない場合、カメラの視点はアバターを中心に動くように設定されます。しかし、プレイヤーが CameraMagnet に近づいてくると、CameraMagnet がカメラをより強く引っ張るようになり、カメラの視点を重要な場所に引き寄せます。

改善点: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 時)から開催します。ご登録は今すぐ行っていただけます。ご予定を合わせて、ぜひライブでご視聴ください。

29 replies on “Cinemachine 2.6 のもたらす精密な制御、改善されたワークフロー、それらが実現するカメラワーク”

Wow! really nice stuff!

I think Cinemachine is the best thing unity have right now and I like to see that it is improving even more.

Really hoping the 2D Confiner constraint can get some love soon. It’s…pretty janky with Confine Screen Edges on, or at least unintuitive beyond my grasping. ANd the docs don’t help… :/

Hi Sirius,

Thanks for the feedback. Give us a post over on the forum (https://forum.unity.com/forums/cinemachine.136/) and lay out the problem you’re facing. We take problems of usability (and indeed jankiness!) pretty seriously. If we understand the nature of the jank we can either help you understand it and/or prioritize an appropriate fix.

Looks promising, as always with Cinemachine.
I suppose tho, that it’s gonna be exclusive to 2020 ? No plans for backport to 2019.3/4 ? That’s also the point of packages, not to be too much bound by the need to update to core engine update right ? :)

I’ll start with this warning: you should always be careful with unverified packages. 2.5 is verified for 2020.1, and we expect 2.6 to be verified for 2020.2. Choosing to work outside those boundaries for production work is a risk. That said, our testing so far suggests that the risks of using 2.6 in 2019.3 are relatively low. We tend to do a lot of testing/playing in 2019.3 and as of this writing our sense is that 2.6 and 2019.3 play very well together.

I’m on Unity 2020.1.0b9 and have Cinemachine 2.6.0-preview.5 and Input System 1.0.0 verified installed. How do I get the Cinemachine Input Provider script? I don’t see it anywhere in the packages.. I also don’t see the Cinemachine.AxisState.IInputProvider interface…..

Sorry, this should have been made explicit in the main text. The addition of the input management is super new. So new, in fact, that the version of 2.6 that includes that code hasn’t yet hit our production servers. Look for it in 2.6.0-preview.6.

Cinemamachine really needs a virtual camera input that is my phone, where I control its position, rotation, and gives me remote video.

Thanks for pointing this out. I’ll ask the team to look into what’s going on here.

This looks pretty awesome.

Is it possible to use Cinemachine for Virtual Cinematography in the sense that the virtual camera’s pose (position and rotation) is based on data from a real-world input device? If so, how?

My idea is to use either a 6 degree of freedom VR Controller/Trackers, AR Trackers/Markers, or simply a mobile device using AR/gyroscope as the pose input for the Cinemachine camera.

Thank you.

Indeed it is. We have made some internal projects that do just that. Virtual cameras can be configured to be “passive” – i.e. without procedural positioning logic. Then, their transform can be controlled externally like any 3D object, either through script, or transform hierarchy, or whatever.

Where Cinemachine brings in extra magic is that these passive virtual cameras, by virtue of being part of the Cinemachine ecosystem, can participate in blends, have procedural noise added, respond to impulses, have custom postprocessing effects, etc.

Looks cool! But the explanation for finding the samples will be super confusing for beginners. If this is installed through package manager, the samples need to be imported through package manager first (on the Cinemachine package) before they can be found in the hierarchy.

Apologies for the jittery videos folks. Transcoding error. We’re fixing them right now.

Love seeing updates about these things, makes me wanna try cinemachine again. But most of those videos were useless when sped up so much

Comments are closed.