映像作品でよくある、ぼけてる画面のピントが合っていく演出をやってみたいなと思い格闘した記録です。正しい方法かは分かりませんが、スクリプト無しで出来るようになりました。
フォーカスイン、フォーカスアウトというやつです。
手前と奥に交互にピントが合うようにしています。
出来た方法
結局は力業になってしまいました。ポストプロセス設定を2つ用意し、ウェイトの数値をAnimationで変化させました。
- 3D(URP)でプロジェクトを作り、3Dキャラクターを準備
- キャラクターがピンクになっていたら直す
- ポストプロセス(Global Volume)を導入
- Grobal Volume(とプロファイル)を複製し、Depth of focusの数値をずらしておく
- Animationで、優先されているGlobal Volumeのウェイトを1から0へ切り替える
こんな感じです。
詳細
こんなかんじで表示されるようにGlobal Volumeとプロファイルをそれぞれ用意しました。
優先度を上げておいたGlobal Volumeにアニメーションを追加し、ウェイトの値が変わるようにしました。この例では0~1秒は1、2~3秒は0にしました。
このウェイトの値をビジュアルスクリプティングで変更する方法がずっと分からなくて(ノードを出す方法すら分からなくて)調べていたのに、アニメーションであっさり変更できました。
アニメーションは難しいイメージがあり避けていましたが、印象が変わりました。
この方法ならゲームの途中でも変更できそうです。
出来なかった方法
ポストプロセスのDepth of focus(被写界深度)のfocus distanceの数値を直接ゲームの途中で変更できないか調べていたのですが、結局できませんでした……。
C#の記事はいくつか出てきましたが、これをビジュアルスクリプティングでやろうとして徒労に終わりました。
C#で出来るのであればVisual Scriptingでもできないことはないと思いますが、ノードを出せず、それっぽいノード「set forcus distance」を出せたところで数値を変更できず惨敗。float parameterとは何だったのか……。floatではないのか……。また、最初はURPではないプロジェクトで行っていて、キネマシーンの導入など色々試して泥沼でした。
自動で焦点を合わせるもっと簡単な方法があると思うのですが……。
被写界深度に囚われていたけどシェーダ―とか別の方法で対応できるのかも……。
おわりに
ポストプロセス周りのことはここ数年で大きなアップデートがあったようで、情報が混在していて混乱しました。今回初めてURPでのポストプロセスを試してみて、今までのとはかなり異なっている印象でした。新しいURPは日本語対応していて嬉しい! 英語のまま使っている方が多そうですが、初心者ユーザーにはその配慮が助かります。
フォーカスインとアウトは映像作品では一般的なので、おそらくもっと簡単に使う方法があるのだと思います……。
過程はともあれ、やりたかった演出を再現できたのでOKです。