>
UnityでURPのPost ProcessingのDepth of Fieldをスクリプトで動的に変更する方法を紹介します。
TimelineでDepth of Fieldの値をアニメーションさせることはできません。スクリプトから変更する必要があります。
Post Processingの適用方法が数年前と今とで異なって、ネットで調べた記事のコードをそのまま使っても動きませんでした。色々な記事の内容をかいつまんで、以下のコードでようやく動きました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
//using UnityEngine.Rendering.PostProcessing;
using UnityEngine.Rendering.Universal;
public class DofController : MonoBehaviour
{
[SerializeField] private GameObject cameraObj;
private Transform cameraTransform;
[SerializeField] private GameObject lookAtPointObj; //カメラのLook At用の空のオブジェクト
private Transform lookAtPointTransform;
[SerializeField] private Volume volume;
private DepthOfField dof;
void Start()
{
cameraTransform = cameraObj.transform;
lookAtPointTransform = lookAtPointObj.transform;
volume.profile.TryGet<DepthOfField>(out dof);
}
void Update()
{
float distance = Vector3.Distance(lookAtPointTransform.position, cameraTransform.position);
dof.focusDistance.value = distance;
Debug.Log("distance: " + distance);
}
}
なお、URPのPost Processingの適用方法については、以下の動画を参考にしてください。
ちなみに、Depth of FieldでTransparentのマテリアルを適用しているオブジェクトが正しいボケ方をしない問題について、現在、解決策を調査中です。解決したら記事にします。