この短い動画では、Unityでダイナミックなデフォーカス効果を作成する方法をお見せします。カメラの視野の中心にあるオブジェクトにのみフォーカスし、それ以外をぼかす効果です。
動画の書き起こし
こんにちは、みなさん!この短い動画では、Unityでダイナミックなデフォーカス効果を作成する方法をお見せします。カメラの視野の中心にあるオブジェクトにのみフォーカスし、それ以外をぼかす効果です。
今、ぼかしを誇張して最終的な効果を表示していますが、この効果はカスタマイズ可能で、すぐにそのやり方を説明します。

この動画とスクリプトは、Unity 2022 と Universal Rendering Pipeline を使用して作成しました。
スクリプトを正しく使用するには、Main Camera に Volume コンポーネントを追加する必要があります。これにより、Depth of Field サブコンポーネントにアクセスできます。

Defocus コンポーネントのモードを Bokeh に変更する必要があります。このモードでは、フォーカスポイントの距離や他の効果を指定でき、最終的な効果がよりリアルになります。

次に、Focus Distance と Aperture のパラメータを有効にしましょう。

Focus Distance に関しては、ゲームプレイ中に C# スクリプトでこの値を変更するため、デフォルトの値を使用します。
Aperture パラメータについては、値が低いほど選択的フォーカス効果が強くなり、被写界深度が浅くなる点に注意してください。
最初にお見せした例では、効果を意図的に誇張するために値を 2.4 に設定しましたが、もちろんプロジェクトに適した値は、いくつかテストを行った後に設定する必要があります。
スクリプトの実装コードをお見せする前に、その動作について簡単に説明します。
スクリプトは、カメラから仮想シーン内のフレームの中心に向かって Raycast と呼ばれる見えない光線を投射します。
その光線が Collider コンポーネントを持つオブジェクトに当たると、そのオブジェクトがカメラからどれだけの距離にあるかを計算し、その値を Depth of Field サブコンポーネントの Focus Distance フィールドに書き込みます。
操作自体は非常にシンプルですが、オブジェクトを検出するためには Collider コンポーネントが必要であることを覚えておいてください。キャラクターの動きを妨げたくない場合は、これらのオブジェクトを Trigger モードに設定することも可能です。

では、Dynamic Defocus と名付けた非常に簡単な C# スクリプトを見てみましょう。
スクリプトを正しく実行するためには、Rendering モジュールと Rendering Universal モジュールをインポートする必要があります。

定義したプライベート変数は、Volume コンポーネントとその Depth of Field サブコンポーネントにアクセスして、パラメータを変更するためだけに使用します。

具体的には、Volume と Depth of Field の変数はスクリプトの Start 関数内で初期化されます。

Update 関数の中では、実行の各フレームごとに Raycast 光線が投射されます。

衝突したオブジェクトは hit 変数に書き込まれますが、ユーザーが背景や Collider コンポーネントを持たないシーンの一部にフォーカスしている場合など、オブジェクトが存在しないこともあります。
このため、hit 変数の Distance 値を Depth of Field コンポーネントの Focus Distance パラメータに割り当てる前に、hit の Collider が null でないことを確認する必要があります。
光線が当たったオブジェクトの名前は、hit 変数の Collider コンポーネントにアクセスし、次にそのコンポーネントから Game Object、そして最終的に名前にアクセスすることで取得できます。
スクリプトを保存した後、プロジェクトでいくつかテストを行い、Aperture パラメータの値を調整して、希望する結果が得られるようにしてください。
この短い動画がお役に立てたら嬉しいです!またお会いしましょう!